Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: kiriost en 7 Agosto 2011, 15:58 pm



Título: [C++] Downloader
Publicado por: kiriost en 7 Agosto 2011, 15:58 pm
Hace unos días terminé un downloader que hice para un troyano que estabamos armando con un colega que quedó en la nada.

Rattack iba a contener un sistema de ocultación mediante hooks a las APIs de Windows, pero al final no quedó implementado porque esa parte d código lo hizo mi colega, yo me encargué de la parte del servidor y del cliente y de las funciones del downloader. La página del proyecto Rattack es http://godsys.com.ar/rattack/ (http://godsys.com.ar/rattack/)

Estaba programado usando el API WinSock, pero le cambié algunas cosas para poder compilarlo en Linux, ya que el sistema de sockets no es muy diferente entre ambos sistemas.

Al troyano le implementé 2 clases de downloader: uno que descarga archivos desde un servidor web (mediante HTTP) y otro que envía archivos desde un cliente a un servidor programados por mí.

Aquí les traigo el código del Downloader HTTP:

Código
  1. /*
  2. Autor: Kiriost
  3. */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <sys/socket.h>
  8. #include <sys/types.h>
  9. #include <netinet/in.h>
  10. #include <netdb.h>
  11.  
  12. int main(int argc, char *argv[]) {
  13. if(argc != 4) {
  14. printf("TO USE: ./downloader www.host.com /file.exe saveas.exen");
  15. return 0;
  16. }
  17.  
  18. char *shost;
  19. char *sfile;
  20. char *ssave;
  21.  
  22. shost = argv[1];
  23. sfile = argv[2];
  24. ssave = argv[3];
  25.  
  26. int sock;
  27. struct sockaddr_in conn;
  28. struct hostent *host;
  29. char data[512];
  30. sprintf(data, "GET %s HTTP/1.1\nHost: %s\nUser-Agent: Mozilla/4.0\n\n", sfile, shost);
  31.  
  32. char buffer[1024];
  33. memset(buffer, 0, 1024);
  34. int numbytes;
  35. int bytes = 0;
  36. int i = 0;
  37.  
  38. sock = socket(AF_INET, SOCK_STREAM, 0);
  39. host = gethostbyname(shost);
  40.  
  41. conn.sin_family = AF_INET;
  42. conn.sin_port = htons(80);
  43. conn.sin_addr = *((struct in_addr *)host->h_addr);
  44. memset(&conn.sin_zero, 0, 8);
  45.  
  46. connect(sock, (struct sockaddr *)&conn, sizeof(struct sockaddr));
  47.  
  48. FILE *fp = fopen(ssave, "wb");
  49.  
  50. send(sock, data, strlen(data), 0);
  51.  
  52. for(;;) {
  53. recv(sock, buffer + i, 1, 0);
  54. i++;
  55. if(strncmp(buffer+i-4, "\r\n\r\n", 4) == 0) {
  56. break;
  57. }
  58. }
  59.  
  60. for(;;) {
  61. memset(buffer, 0, 1024);
  62. numbytes = recv(sock, buffer, 1024, 0);
  63. bytes += numbytes;
  64. printf("%d KB\n", bytes/1024);
  65. fwrite(buffer, sizeof(char), numbytes, fp);
  66. if(numbytes <= 0) {
  67. break;
  68. }
  69. }
  70.  
  71. printf("Bytes: %d\n", bytes);
  72. fclose(fp);
  73. close(sock);
  74. }

Lo que hace especificamente es conectarse al servidor web, enviarle una serie de comandos HTTP (GET) para pedirle un archivo, el servidor recibe los comandos, los procesa y comienza a enviarle el contenido del archivo. La aplicación, entonces, comienza a recibir el contenido, entonces crea un archivo nuevo donde guarda el contenido que le va llegando.

Compilación

Código
  1. gcc -o downloader_http downloader_http.c

Ejemplo de uso

Código
  1. ./downloader_http godsys.comxa.com /SDL.dll SDLdown.dll


Título: Re: [C++] Downloader
Publicado por: escabe en 7 Agosto 2011, 21:28 pm
Ese código contiene algunos errores tipográficos, corrígelos.  :D

Saludos.


Título: Re: [C++] Downloader
Publicado por: kiriost en 8 Agosto 2011, 19:07 pm
Tienes razon. Es que lo saque de mi blog y wordpress me convierte algunos carácteres como > < " :)


Título: Re: [C++] Downloader
Publicado por: oPen syLar en 9 Agosto 2011, 01:31 am
=D ... Interesante.. Pero.. Porque currar directamente con los headers HTTP.? Digo si piensas ampliar tu troyano con el pasar el tiempo va hacer mas tedioso a la hora de incluir funciones que tengan que ver con el HTTP

Se me ocurre que podrías implementar curl en tu prj... Es portable y de fácil manejo..


Título: Re: [C++] Downloader
Publicado por: El_Java en 9 Agosto 2011, 10:59 am
A mi personalmente me parece mas interesante la otra parte del downloader, la de pasar archivos de un ordenador a otro, pero bueno...

Por cierto, dime que se te ha olvidado poner el return 0; en el main porque has hecho un copy-paste, porque como tampoco lo tengas en el original mereces que te hundamos el pecho xD


Título: Re: [C++] Downloader
Publicado por: kiriost en 9 Agosto 2011, 18:57 pm
Húndeme lo que quieras jejeje...
Primero el código del downloader HTTP y el código para pasar de un ordenador a otro está en mi blog, en la sección proyectos Rattack.. Ahí puedes descargar al código fuente del "troyano" o downloader y puedes ver en command.c que se encuentran las funciones DownloaderHTTP y Download y Upload

Upload crea el servidor para enviar el archivo y lo deja a la escucha.
Downloader se conecta al servidor y espera que le envíe el archivo.

Segundo, el return lo he olvidado porque como dije antes DownloadHTTP es una función, y lo que hice aquí fue pasarla directamente al main agregándole algunas cosas, entre las que el return 0 no se encuentra :].

oPen syLar
: la idea era no recurrir directamente a ninguna librerías que me facilitara el trabajo como curl o la de wget, sino utilizar la librería de sockets nativa del sistema.


Título: Re: [C++] Downloader
Publicado por: Synth3tik0 en 12 Agosto 2011, 04:08 am
y el troyano tambien esta en c++?


Título: Re: [C++] Downloader
Publicado por: kiriost en 12 Agosto 2011, 22:11 pm
Todo está en C. C++ no porque no utilizamos clases ni las librerías de C++.

Además en C el ejecutable queda más liviano.

El servidor y el cliente están en C. Había pensado hacer el cliente en Java, pero al final quedo abandonado el proyecto  :rolleyes:


Título: Re: [C++] Downloader
Publicado por: Belial & Grimoire en 2 Noviembre 2011, 08:23 am
hola

Muy buen codigo para hacer descargas sencillas, pero hay algo que no entendi, espero me puedan ayudar con una explicacion porfavor

esta parte no la entiendo, se que recv, sus parametros son socket, *buffer, size, flags, pero porque en buffer le ponen + i? y porque en la longitud le ponen 1?

Código
  1. recv(sock, buffer + i, 1, 0);
  2. i++;

Acaso es para iniciar varios punteros a buffer?, y en longitud porque 1? que no deberia ser un tamaño mas grande?

y se que strncmp hace una comparativa, y usando "n", es una comparativa mas exacta, pero porque asi?

Código
  1. if(strncmp(buffer+i-4, "\r\n\r\n", 4) == 0)

como lo mencione al principio porque buffer le ponen +i y porque restarle 4, lo demas si entiendo que hace una comparativa y si es "\r\n\r\n", termina el loop, pero lo demas?

espero me puedan ayudar con una explicacion de eso porfavor

salu2


Título: Re: [C++] Downloader
Publicado por: El_Java en 2 Noviembre 2011, 16:05 pm
Lo de recv es porque recibe los datos de 1 en 1, de ahi que el tamaño sea 1, y no le pasa el buffer, le pasa un puntero a la posicion del buffer (buffer[0+i]).
Y strncmp, es así porque lo que el hace es comparar el buffer con "\r\n\r\n" recorriendo el buffer uno a uno, y le quita 4 para no producir un overflow al pasarse del tamaño del buffer, entiendes?

Un saludo! :D


Título: Re: [C++] Downloader
Publicado por: Belial & Grimoire en 2 Noviembre 2011, 20:59 pm
hola

gracias por la respuesta, dejame ver si entendi

quieres decir que le puedes decir a recv cuantos datos va ir recibiendo?, por ejemplo puedes decirle que reciba de 1 en 1, de 10 en 10 o de 512 en 512?

y entonces los datos se enviaran a la posicion de buffer llenandose en este caso de 1 en 1? y strncmp hara una comprarativa y para no provocar un overflow hace que no llegue a 1024, y si en 1020, la comparativa es "\r\n\r\n", se rompe el loop pasando a la siguiente instruccion?

espero haber etendido o a haberme acercado en algo?  :xD