Changeset 1579

Show
Ignore:
Timestamp:
02/28/08 21:49:03 (6 months ago)
Author:
oxff
Message:

fixed broken libcurl usage and server response interpretation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • honeytrap/trunk/src/modules/htm_submitMWserv.c

    r1578 r1579  
    1414 *   still to come... 
    1515 */ 
     16  
     17#define C(); { printf("%s:%u\n", __PRETTY_FUNCTION__, __LINE__); fflush(stdout); } 
     18  
    1619 
    1720#define _GNU_SOURCE 1 
     
    5053#define TSS_UNKNOWN     1 
    5154#define TSS_OK          2 
    52 #define TSS_HEARTBEAT   3 
    5355 
    5456#define ST_SUBMIT       1 
     
    6870 
    6971const char      *mwserv_url; 
     72char * submit_url; 
    7073 
    7174const char      *guid; 
     
    8790void plugin_unload(void) { 
    8891        unhook(PPRIO_SAVEDATA, module_name, "submit_mwserv"); 
     92        free(submit_url); 
    8993        return; 
    9094} 
     
    115119                if OPT_IS("mwserv_url") { 
    116120                        mwserv_url = value; 
     121                        asprintf(&submit_url, "%shoneytrap/submit-binary", mwserv_url); 
    117122                } else if OPT_IS("guid") { 
    118123                        guid = value; 
     
    167172 
    168173int response_code(const bstr *response) { 
    169         if (response->len >= 7 && memcmp(response->data, "ERROR: ", 7) == 0) return(TSS_ERROR); 
    170         if (response->len >= 9 && memcmp(response->data, "UNKNOWN: ", 9) == 0) return(TSS_UNKNOWN); 
    171         if (response->len >= 4 && memcmp(response->data, "OK: ", 4) == 0) return(TSS_OK); 
    172         if (response->len >= 11 && memcmp(response->data, "HEARTBEAT: ", 4) == 0) return(TSS_HEARTBEAT); 
    173         return(-1); 
     174        if (response->len >= 7 && memcmp(response->data, "UNKNOWN", 7) == 0) return(TSS_UNKNOWN); 
     175        if (response->len >= 2 && memcmp(response->data, "OK", 2) == 0) return(TSS_OK);  
     176        return(TSS_ERROR); 
    174177} 
    175178 
     
    178181        switch(response_code(response)) { 
    179182        case TSS_OK: 
     183                C(); 
    180184                logmsg(LOG_NOISY, 1, "SubmitMWServ - Server returned transfer status OK.\n"); 
    181185                return(TSS_OK); 
    182         case TSS_HEARTBEAT: 
    183                 logmsg(LOG_NOISY, 1, "SubmitMWServ - Server returned transfer status HEARTBEAT.\n"); 
    184                 return(TSS_HEARTBEAT); 
    185         case TSS_ERROR: 
    186                 logmsg(LOG_ERR, 1, "SubmitMWServ - Server returned transfer status ERROR.\n"); 
    187                 return(TSS_ERROR); 
    188186        case TSS_UNKNOWN: 
     187                C(); 
     188                logmsg(LOG_WARN, 1, "SubmitMWServ - Server returned status UNKNOWN.\n"); 
     189                return(TSS_UNKNOWN); 
    189190        default: 
    190                 logmsg(LOG_ERR, 1, "SubmitMWServ - Server returned status UNKNOWN.\n"); 
    191                 return(TSS_UNKNOWN); 
    192         } 
    193  
     191                { 
     192                        char buf[response->len + 1]; 
     193         
     194                        memcpy(buf, response->data, response->len); 
     195                        buf[response->len] = 0; 
     196                         
     197                        logmsg(LOG_ERR, 1, "SubmitMWServ - Server returned unexpected response \"%s\".\n", buf); 
     198                        return TSS_ERROR; 
     199                } 
     200        } 
    194201} 
    195202 
    196203int transfer_data(CURLM *mhandle, const bstr *response) { 
    197         int             max_fd, rv, handles, resp
     204        int             max_fd, rv, handles
    198205        fd_set          rfds, wfds, efds; 
    199206        struct timeval  select_timeout; 
     
    201208 
    202209        rv      = 1; 
    203         while(rv) { 
     210        while(rv >= 0) { 
    204211                FD_ZERO(&rfds); 
    205212                FD_ZERO(&wfds); 
     
    214221                max_fd = MAX(max_fd, sigpipe[0]); 
    215222 
    216                 select_timeout.tv_sec   = timeout
     223                select_timeout.tv_sec   = 1
    217224                select_timeout.tv_usec  = 0; 
    218225                 
     
    226233                        } 
    227234                        break; 
    228                 case 0: 
    229                         logmsg(LOG_WARN, 1, "SubmitMWServ Warning - Select timed out.\n"); 
    230                         if ((resp = check_response(response)) == -1) return(-1); 
    231                         else if (resp == 1) return(1); 
    232                         break; 
    233235                default: 
     236                 
    234237                        if (FD_ISSET(sigpipe[0], &rfds) && (check_sigpipe() == -1)) { 
    235238                                fprintf(stderr, "SubmitMWServ Error - Select failed.\n"); 
     
    239242                        handles = 0; 
    240243                        logmsg(LOG_DEBUG, 1, "SubmitMWServ - Data to process.\n"); 
     244                         
     245                         
    241246                        while(curl_multi_perform(mhandle, &handles) == CURLM_CALL_MULTI_PERFORM && handles); 
    242  
    243                         switch (resp = check_response(response)) { 
    244         printf("response is %u\n", resp); 
    245                         case TSS_UNKNOWN: 
    246                                 break; 
    247                         case TSS_OK: 
    248                                 return(1); 
    249                         default: 
    250                                 return(-1); 
     247                         
     248                         
     249                         
     250                        { 
     251                                CURLMsg * message; 
     252                                int messagesRemaining; 
     253                                 
     254                                while((message = curl_multi_info_read(mhandle, &messagesRemaining))) 
     255                                { 
     256                                        if(message->msg == CURLMSG_DONE) 
     257                                        { 
     258                                                if(message->data.result) 
     259                                                { 
     260                                                        logmsg(LOG_ERR, 1, "SubmitMWServ Error - %s\n", curl_easy_strerror(message->data.result)); 
     261                                                        return TSS_ERROR; 
     262                                                } 
     263                                                else 
     264                                                        return check_response(response); 
     265                                        } 
     266                                } 
    251267                        } 
    252                         break; 
    253268                } 
    254269        } 
     
    272287                return(NULL); 
    273288        } 
    274  
    275289         
     290                 
    276291        logmsg(LOG_NOISY, 1, "SubmitMWServ - Constructing HTTP form for request type %d.\n", type); 
    277292         
     
    296311        curl_easy_setopt(*curlhandle, CURLOPT_SSL_VERIFYHOST, 0); 
    297312        curl_easy_setopt(*curlhandle, CURLOPT_SSL_VERIFYPEER, 0); 
    298         curl_easy_setopt(*curlhandle, CURLOPT_URL, mwserv_url); 
     313        curl_easy_setopt(*curlhandle, CURLOPT_URL, submit_url); 
    299314        curl_easy_setopt(*curlhandle, CURLOPT_USERAGENT, "honeytrap " VERSION " (" MY_OS ", " MY_ARCH ", " MY_COMPILER ")"); 
    300315        curl_easy_setopt(*curlhandle, CURLOPT_WRITEDATA, response); 
    301316        curl_easy_setopt(*curlhandle, CURLOPT_WRITEFUNCTION, get_response); 
     317        curl_easy_setopt(*curlhandle, CURLOPT_TIMEOUT, timeout); 
    302318 
    303319        logmsg(LOG_DEBUG, 1, "SubmitMWServ - Creating multi handle.\n"); 
     
    339355                memset(&response, 0, sizeof(bstr)); 
    340356                 
     357                if (build_uri(&uri, attack->download[i]) == -1) { 
     358                        logmsg(LOG_ERR, 1, "SubmitMWServ Error - Unable to create URI: %m.\n"); 
     359                        return(0); 
     360                } 
     361                 
    341362                if ((pinfo = init_handle(&multihandle, &curlhandle, 
    342363                                attack->download[i].dl_payload.data, attack->download[i].dl_payload.size, 
     
    346367                } 
    347368 
    348                 if (transfer_data(multihandle, &response) == TSS_OK) 
     369                switch (transfer_data(multihandle, &response)) 
     370                { 
     371                case TSS_OK: 
    349372                        logmsg(LOG_NOTICE, 1, "SubmitMWServ - Sample is already present at %s, skipping submission.\n", mwserv_url); 
    350                 else 
     373                        free(response.data); 
     374                         
     375                        continue; 
     376                 
     377                case TSS_ERROR: 
    351378                        logmsg(LOG_ERR, 1, "SubmitMWServ Error - Hash test failed.\n"); 
     379                        free(response.data); 
     380                         
     381                        continue; 
     382                } 
    352383 
    353384                free(response.data); 
     
    356387                // submit sample 
    357388                logmsg(LOG_INFO, 1, "SubmitMWServ - Submitting sample to %s.\n", mwserv_url); 
    358  
    359                 if (build_uri(&uri, attack->download[i]) == -1) { 
    360                         logmsg(LOG_ERR, 1, "SubmitMWServ Error - Unable to create URI: %m.\n"); 
    361                         return(0); 
    362                 } 
    363389 
    364390                memset(&response, 0, sizeof(bstr));