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/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:
/*
Autor: Kiriost
*/
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
if(argc != 4) {
printf("TO USE: ./downloader www.host.com /file.exe saveas.exen");
return 0;
}
char *shost;
char *sfile;
char *ssave;
shost = argv[1];
sfile = argv[2];
ssave = argv[3];
int sock;
struct sockaddr_in conn;
struct hostent *host;
char data[512];
sprintf(data, "GET %s HTTP/1.1\nHost: %s\nUser-Agent: Mozilla/4.0\n\n", sfile, shost);
char buffer[1024];
memset(buffer, 0, 1024);
int numbytes;
int bytes = 0;
int i = 0;
sock = socket(AF_INET, SOCK_STREAM, 0);
host = gethostbyname(shost);
conn.sin_family = AF_INET;
conn.sin_port = htons(80);
conn.sin_addr = *((struct in_addr *)host->h_addr);
memset(&conn.sin_zero, 0, 8);
connect(sock, (struct sockaddr *)&conn, sizeof(struct sockaddr));
FILE *fp = fopen(ssave, "wb");
send(sock, data, strlen(data), 0);
for(;;) {
recv(sock, buffer + i, 1, 0);
i++;
if(strncmp(buffer+i-4, "\r\n\r\n", 4) == 0) {
break;
}
}
for(;;) {
memset(buffer, 0, 1024);
numbytes = recv(sock, buffer, 1024, 0);
bytes += numbytes;
printf("%d KB\n", bytes/1024);
fwrite(buffer, sizeof(char), numbytes, fp);
if(numbytes <= 0) {
break;
}
}
printf("Bytes: %d\n", bytes);
fclose(fp);
close(sock);
}
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óngcc -o downloader_http downloader_http.c
Ejemplo de uso./downloader_http godsys.comxa.com /SDL.dll SDLdown.dll