Changeset 343

Show
Ignore:
Timestamp:
02/20/06 18:11:57 (3 years ago)
Author:
common
Message:

[x] this is current nepenthes trunk
- removes all autoconf files created by make dist (Makefile.in etc)
- adds nat capabilities to download-ftp
- adds module-bridge for fun with argos
- submit-gotek for mwcollect alliance
- log-prelude (its broken, but ... at least it made it to svn)

[x] Nepenthes.cpp
- collect information about compiling/running operating system (and compiler) with uname & praeprocessor foobar
looks like
Nepenthes Version 0.1.6
Compiled on FreeBSD/x86 at Feb 10 2006 20:57:04 with g++ 3.4.4 [FreeBSD] 20050518
Started on frickelbsd.nelke running FreeBSD/i386 release 6.0-RELEASE
- log exit reason to logfiles in signal handler, may need exception for sigfsze (file size exceeded)

[x] x-6
- free the mallocs

[x] vuln-kuang
- report the right remote ip, not the local ip

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • nepenthes/trunk/conf/nepenthes.conf.dist

    r341 r343  
    2424    "downloadcreceive.so",          "",                             "" 
    2525//    "downloadcurl.so",              "download-curl.conf",           "" 
    26     "downloadftp.so",               "",                             "" 
     26    "downloadftp.so",               "download-ftp.conf",            "" 
    2727    "downloadhttp.so",               "",                             "" 
    2828    "downloadlink.so",              "download-link.conf",           "" 
  • nepenthes/trunk/modules/download-ftp/CTRLDialogue.cpp

    r341 r343  
    390390        logDebug("%s","System ... \n"); 
    391391 
    392         // get local ip 
    393         int32_t sock = m_Socket->getSocket(); 
    394  
    395         // get name 
    396         socklen_t len = sizeof(struct sockaddr_in); 
    397         sockaddr_in addr; 
    398  
    399         getsockname(sock, (struct sockaddr *)&addr,&len); 
    400  
    401         logDebug("local ip is %s \n",inet_ntoa(addr.sin_addr)); 
    402  
    403         uint32_t ip = *(uint32_t *)&addr.sin_addr; 
     392        uint32_t ip; 
     393        uint16_t minport; 
     394        uint16_t maxport; 
     395 
     396        if ( g_FTPDownloadHandler->getRetrAddress() == 0 ) 
     397        { // no NAT settings 
     398                // get local ip 
     399                int32_t sock = m_Socket->getSocket(); 
     400 
     401                // get name 
     402                socklen_t len = sizeof(struct sockaddr_in); 
     403                sockaddr_in addr; 
     404 
     405                getsockname(sock, (struct sockaddr *)&addr,&len); 
     406 
     407                logDebug("local ip is %s \n",inet_ntoa(addr.sin_addr)); 
     408 
     409                ip =  *(uint32_t *)&addr.sin_addr; 
     410 
     411                minport = rand()%40000+1024; 
     412                maxport = minport + 1000; 
     413        } else 
     414        {       // nat settings, use external ip 
     415                ip = g_FTPDownloadHandler->getRetrAddress(); 
     416                minport = g_FTPDownloadHandler->getMinPort(); 
     417                maxport = g_FTPDownloadHandler->getMaxPort(); 
     418 
     419        } 
     420 
    404421        uint16_t port = 0; 
    405422 
    406         Socket *socket; 
    407         if ( (socket = g_Nepenthes->getSocketMgr()->bindTCPSocket(0,0,60,30)) == NULL ) 
    408         { 
    409                 logCrit("Could not bind port %u \n",port); 
     423        Socket *socket=NULL; 
     424 
     425 
     426        for (uint16_t i =minport; i<maxport;i++) 
     427        { 
     428                if ( (socket = g_Nepenthes->getSocketMgr()->bindTCPSocket(0,i,60,30)) != NULL ) 
     429                { 
     430                        if ( socket->getDialogst()->size() == 0 && socket->getFactories()->size() == 0 ) 
     431                        { 
     432                                logInfo("Found unused bind socket on port %i\n",i); 
     433                                break; 
     434                        } 
     435                } 
     436 
     437        } 
     438 
     439        if ( socket == NULL) 
     440        { 
     441                logCrit("Could not bind port in range %i -> %i \n",minport, maxport); 
     442                return; 
    410443        } 
    411444 
     
    416449 
    417450        char *nmsg; 
     451         
     452 
    418453        asprintf(&nmsg,"PORT %d,%d,%d,%d,%d,%d\r\n", 
    419454                        (int32_t)ip & 0xff, 
  • nepenthes/trunk/modules/download-ftp/Makefile.am

    r321 r343  
    1111pkglib_LTLIBRARIES = downloadftp.la 
    1212 
    13 downloadftp_la_SOURCES = CTRLDialogue.hpp FILEDialogue.hpp FTPContext.hpp download-ftp.hpp CTRLDialogue.cpp FTPContext.cpp FILEDialogue.cpp download-ftp.cpp 
     13downloadftp_la_SOURCES = CTRLDialogue.hpp CTRLDialogue.cpp         
     14downloadftp_la_SOURCES += FILEDialogue.hpp FILEDialogue.cpp         
     15downloadftp_la_SOURCES += FTPContext.hpp   FTPContext.cpp           
     16downloadftp_la_SOURCES += download-ftp.hpp download-ftp.cpp         
     17downloadftp_la_SOURCES += download-ftp.conf.dist 
    1418 
    1519downloadftp_la_LDFLAGS = -module -no-undefined -avoid-version 
  • nepenthes/trunk/modules/download-ftp/download-ftp.cpp

    r332 r343  
    4949#include "DNSManager.hpp" 
    5050#include "DNSResult.hpp" 
     51 
     52#include "Config.hpp" 
    5153 
    5254#ifdef STDTAGS  
     
    9698        g_Nepenthes = nepenthes; 
    9799        g_FTPDownloadHandler = this; 
     100        m_DNSCallbackName = "download-ftp dns callback"; 
     101 
     102        m_DynDNS = ""; 
     103 
     104        m_RetrAddress = 0; 
    98105} 
    99106 
     
    114121bool FTPDownloadHandler::Init() 
    115122{ 
     123        if ( m_Config == NULL ) 
     124        { 
     125                logCrit("%s","I need a config\n"); 
     126                return false; 
     127        } 
     128 
     129        StringList sList; 
     130        try 
     131        { 
     132                if (m_Config->getValInt("download-ftp.use_nat") == 1) 
     133                { 
     134                        sList = *m_Config->getValStringList("download-ftp.nat_settings.forwarded_ports"); 
     135                                if ( sList.size() == 2 ) 
     136                                { 
     137                                        m_MinPort = atoi(sList[0]); 
     138                                        m_MaxPort = atoi(sList[1]); 
     139                                } 
     140 
     141                                m_DynDNS = m_Config->getValString("download-ftp.nat_settings.dyndns"); 
     142 
     143                                logInfo("download-ftp nat settings; uses %s for external ip and ports %i->%i for transferr\n", 
     144                                                m_DynDNS.c_str(), 
     145                                                m_MinPort,  
     146                                                m_MaxPort); 
     147                } 
     148        } catch ( ... ) 
     149        { 
     150                logCrit("%s","Error setting needed vars, check your config\n"); 
     151                return false; 
     152        } 
     153 
    116154        m_ModuleManager = m_Nepenthes->getModuleMgr(); 
    117155        REG_DOWNLOAD_HANDLER(this,"ftp"); 
     
    164202        logPF(); 
    165203 
    166         uint32_t host = inet_addr(down->getDownloadUrl()->getHost().c_str()); 
    167  
    168         if ((int32_t)host == -1) 
    169         { 
    170                 logInfo("url %s has a dns as hostname, we have to resolve it \n", down->getUrl().c_str()); 
    171         g_Nepenthes->getDNSMgr()->addDNS(this,(char *)down->getDownloadUrl()->getHost().c_str(), down); 
    172                 return true; 
    173         }else 
    174         { 
    175                 logInfo("url has %s ip, we will download it now\n",down->getUrl().c_str()); 
     204        if ( m_DynDNS == "" ) 
     205        { 
     206                uint32_t host = inet_addr(down->getDownloadUrl()->getHost().c_str()); 
     207 
     208                if ( (int32_t)host == -1 ) 
     209                { 
     210                        logInfo("url %s has a dns as hostname, we have to resolve it \n", down->getUrl().c_str()); 
     211                        g_Nepenthes->getDNSMgr()->addDNS(this,(char *)down->getDownloadUrl()->getHost().c_str(), down); 
     212                        return true; 
     213                } else 
     214                { 
     215                        logInfo("url has %s ip, we will download it now\n",down->getUrl().c_str()); 
     216                        Socket *socket = g_Nepenthes->getSocketMgr()->connectTCPHost(down->getLocalHost(),host,down->getDownloadUrl()->getPort(),30); 
     217                        CTRLDialogue *dia = new CTRLDialogue(socket,down); 
     218                        socket->addDialogue(dia); 
     219                        FTPContext *context = new FTPContext(down,dia); 
     220                        dia->setContext(context); 
     221                        m_Contexts.push_back(context); 
     222                } 
     223        } else 
     224        { 
     225                logSpam("Resolving DynDNS %s for active ftp\n",m_DynDNS.c_str()); 
     226                g_Nepenthes->getDNSMgr()->addDNS(this,(char *)m_DynDNS.c_str(),down); 
     227        } 
     228        return true; 
     229
     230 
     231 
     232 
     233bool FTPDownloadHandler::dnsResolved(DNSResult *result) 
     234
     235        logInfo("url %s resolved \n",result->getDNS().c_str()); 
     236        uint32_t host = result->getIP4List().front(); 
     237        Download *down = (Download *) result->getObject(); 
     238        if ( result->getDNS() != m_DynDNS ) 
     239        { // resolved domain for a download 
    176240                Socket *socket = g_Nepenthes->getSocketMgr()->connectTCPHost(down->getLocalHost(),host,down->getDownloadUrl()->getPort(),30); 
    177241                CTRLDialogue *dia = new CTRLDialogue(socket,down); 
     
    180244                dia->setContext(context); 
    181245                m_Contexts.push_back(context); 
    182         } 
    183  
    184         return true; 
    185 
    186  
    187  
    188  
    189 bool FTPDownloadHandler::dnsResolved(DNSResult *result) 
    190 
    191         logInfo("url %s resolved \n",result->getDNS().c_str()); 
    192         uint32_t host = result->getIP4List().front(); 
     246        }else 
     247        { // resolved dyndns 
     248                m_RetrAddress = host; 
     249                // resolve domain for download 
     250                uint32_t host = inet_addr(down->getDownloadUrl()->getHost().c_str()); 
     251                if ( (int32_t)host == -1 ) 
     252                { 
     253                        logInfo("url %s has a dns as hostname, we have to resolve it \n", down->getUrl().c_str()); 
     254                        g_Nepenthes->getDNSMgr()->addDNS(this,(char *)down->getDownloadUrl()->getHost().c_str(), down); 
     255                        return true; 
     256                } else 
     257                { 
     258                        logInfo("url has %s ip, we will download it now\n",down->getUrl().c_str()); 
     259                        Socket *socket = g_Nepenthes->getSocketMgr()->connectTCPHost(down->getLocalHost(),host,down->getDownloadUrl()->getPort(),30); 
     260                        CTRLDialogue *dia = new CTRLDialogue(socket,down); 
     261                        socket->addDialogue(dia); 
     262                        FTPContext *context = new FTPContext(down,dia); 
     263                        dia->setContext(context); 
     264                        m_Contexts.push_back(context); 
     265                } 
     266        } 
     267        return true; 
     268
     269 
     270bool FTPDownloadHandler::dnsFailure(DNSResult *result) 
     271
    193272        Download *down = (Download *) result->getObject(); 
    194         Socket *socket = g_Nepenthes->getSocketMgr()->connectTCPHost(down->getLocalHost(),host,down->getDownloadUrl()->getPort(),30); 
    195         CTRLDialogue *dia = new CTRLDialogue(socket,down); 
    196         socket->addDialogue(dia); 
    197         FTPContext *context = new FTPContext(down,dia); 
    198         dia->setContext(context); 
    199         m_Contexts.push_back(context); 
    200  
    201         return true; 
    202 
    203  
    204 bool FTPDownloadHandler::dnsFailure(DNSResult *result) 
    205 
    206         logWarn("url %s unresolved \n",result->getDNS().c_str()); 
     273        logWarn("url %s unresolved, dropping download %s \n",result->getDNS().c_str(),down->getUrl().c_str()); 
     274 
     275         
     276        delete down; 
     277 
    207278        return true; 
    208279} 
     
    224295 
    225296        return false; 
     297} 
     298 
     299uint16_t FTPDownloadHandler::getMinPort() 
     300{ 
     301        return m_MinPort; 
     302} 
     303 
     304uint16_t FTPDownloadHandler::getMaxPort() 
     305{ 
     306        return m_MaxPort; 
     307} 
     308 
     309uint32_t FTPDownloadHandler::getRetrAddress() 
     310{ 
     311        return m_RetrAddress; 
    226312} 
    227313 
  • nepenthes/trunk/modules/download-ftp/download-ftp.hpp

    r332 r343  
    6464 
    6565                bool removeContext(FTPContext *context); 
     66 
     67                uint16_t getMinPort(); 
     68                uint16_t getMaxPort(); 
     69                uint32_t getRetrAddress(); 
    6670        protected: 
    6771                list <FTPContext *> m_Contexts; 
     72 
     73                // we need those vars for NAT active ftp 
     74                string  m_DynDNS; 
     75                uint16_t m_MinPort; 
     76                uint16_t m_MaxPort; 
     77                uint32_t m_RetrAddress; 
    6878        }; 
    6979 
  • nepenthes/trunk/modules/download-http/download-http.cpp

    r332 r343  
    143143bool HTTPDownloadHandler::dnsFailure(DNSResult *result) 
    144144{ 
    145         logWarn("url %s unresolved \n",result->getDNS().c_str()); 
     145        logWarn("url %s unresolved, dropping download\n",result->getDNS().c_str()); 
     146        Download *down = (Download *) result->getObject(); 
     147        if (down != NULL) 
     148        { 
     149                delete down; 
     150        } 
    146151        return true; 
    147152} 
  • nepenthes/trunk/modules/vuln-kuang2/Kuang2Dialogue.cpp

    r332 r343  
    131131                                logInfo("Kuang2 File upload requested %s %i\n",m_FileName.c_str(),m_FileSize); 
    132132                                m_State = KUANG2_FILETRANSFERR; 
    133                                 m_Download = new Download(msg->getRemoteHost(),"kuang2://foo/bar",msg->getRemoteHost(),"some triggerline"); 
     133                                m_Download = new Download(msg->getLocalHost(),"kuang2://foo/bar",msg->getRemoteHost(),"some triggerline"); 
    134134                                m_Buffer->clear(); 
    135135 
  • nepenthes/trunk/modules/x-6/x-6.cpp

    r341 r343  
    168168ConsumeLevel X6Dialogue::incomingData(Message *msg) 
    169169{ 
    170         char *message = strdup(msg->getMsg()); 
     170        char *freemessage = strdup(msg->getMsg()); 
     171        char *message = freemessage; 
     172 
     173        if (message == NULL) 
     174        { 
     175                return CL_ASSIGN; 
     176        } 
    171177 
    172178        for(uint32_t i=0;i < strlen(message);i++) 
     
    210216 
    211217        } 
    212         free(message); 
     218 
     219        if (freemessage != NULL) 
     220        { 
     221        free(freemessage); 
     222        } 
    213223 
    214224//      msg->getResponder()->doRespond("deine mutter\n",strlen("deine mutter\n")); 
  • nepenthes/trunk/nepenthes-core/src/Nepenthes.cpp

    r341 r343  
    4242#include <grp.h> 
    4343#include <dirent.h> 
     44#include <sys/utsname.h> 
    4445 
    4546#include "Nepenthes.hpp" 
     
    13311332    { 
    13321333        case SIGHUP: 
    1333                 printf("Got SIGHUP\nRereading Config File!\n"); 
     1334                logCrit("Got SIGHUP\nRereading Config File!\n"); 
    13341335                g_Nepenthes->reloadConfig(); 
    13351336                break; 
    13361337 
    13371338        case SIGINT: 
    1338                 printf("Got SIGINT\nStopping NOW!\n"); 
     1339                logCrit("Got SIGINT\nStopping NOW!\n"); 
    13391340                g_Nepenthes->stop(); 
    13401341                break; 
    13411342 
    13421343        case SIGABRT: 
    1343                 printf("%s\n", "Unhandled Exception"); 
     1344                logCrit("%s\n", "Unhandled Exception"); 
    13441345                exit(-1); 
    13451346                break; 
    13461347 
    13471348        case SIGSEGV: 
    1348                 printf("%s\n", "Segmentation Fault"); 
     1349                logCrit("%s\n", "Segmentation Fault"); 
    13491350                exit(-1); 
    13501351                break; 
    13511352 
    1352 #ifndef HAVE_MSG_NOSIGNAL 
    1353         // this wont work 
    1354         // at least it did not work for me when i wanted to ignore SIGWINCH this way 
    1355         // -- common 
    1356         case SIGPIPE: 
    1357                 printf("Ignoring %i\n", iSignal); 
    1358                 signal(iSignal,SIG_IGN); 
    1359                 break; 
    1360 #endif 
    13611353        default: 
    1362                 printf("Exit 'cause of %i\n", iSignal); 
     1354                logCrit("Exit 'cause of %i\n", iSignal); 
    13631355                g_Nepenthes->stop(); 
    13641356        } 
     
    13991391//  signal(SIGKILL,  SignalHandler);    //       9       Term    Kill signal 
    14001392        signal(SIGSEGV,  SignalHandler);        //      11       Core    Invalid memory reference 
     1393 
     1394/* I hate breaking this well formatted list,  
     1395 * but some systems lack 
     1396 * MSG_NOSIGNAL as send() option and  
     1397 * SO_NOSIGPIPE as setsockopt() feature 
     1398 * So we would get sigpipe when sending data on a closed connection ... 
     1399 * it sucks, but we have to ignore sigpipe on such systems (f.e. OpenBSD 3.8) 
     1400 */ 
     1401#if !defined(HAVE_SO_NOSIGPIPE) && !defined(HAVE_MSG_NOSIGNAL) 
     1402        signal(SIGPIPE,  SIG_IGN);              //      13       Term    Broken pipe: write to pipe with no readers 
     1403#else 
    14011404        signal(SIGPIPE,  SignalHandler);        //      13       Term    Broken pipe: write to pipe with no readers 
     1405#endif 
     1406                                                                                //  
    14021407        signal(SIGALRM,  SignalHandler);        //      14       Term    Timer signal from alarm(2) 
    14031408        signal(SIGTERM,  SignalHandler);        //      15       Term    Termination signal 
     
    14161421 
    14171422        signal(SIGBUS,   SignalHandler);        //   10,7,10     Core    Bus error (bad memory access) 
     1423         
    14181424#ifdef HAVE_SIGPOLL 
    14191425        signal(SIGPOLL,  SignalHandler);        //               Term    Pollable event (Sys V). Synonym of SIGIO 
     
    15661572} 
    15671573 
    1568 #ifdef __GNUG__ 
     1574 
     1575#if defined(__GNUG__) 
    15691576        #define MY_COMPILER "g++" 
    15701577/* 
    1571         #if ( __GNUC__ == 4 && __GNUC_MINOR__ == 0  ) // g++ 4 detection 
    1572                 #error "g++ 4 has bugs, dont use g++4 "  
    1573                 #error "nepenthes would compile using g++4, " 
    1574                 #error "but the async dns would fail as there is a bug somewhere outside nepenthes"  
     1578        #if ( __GNUC__ == 4 && __GNUC_MINOR__ == 0  && __GNUC_PATCHLEVEL__ <= 2 ) // g++ 4 detection 
     1579                #error "MAKE SURE TO READ THIS" 
     1580                #error "g++ 4 has bugs, dont use it"  
     1581                #error "nepenthes would compile using g++4, but it will segfault while running" 
    15751582                #error "refer to http://nepenthes.sourceforge.net/documentation:readme:faq:gcc_4 for more information" 
     1583                #error "if you got no other compiler feel free to remove this section by commenting it out" 
     1584                #error "but don't complain when it does not work" 
     1585                #error "you can find it in Nepenthes.cpp around line 1569, just search for 'g++ 4 detection'" 
    15761586        #endif 
    15771587*/       
     1588#elif defined(__CYGWIN__) 
     1589        #define MY_COMPILER "cygwin" 
     1590#else    
     1591        #define MY_COMPILER "unknown Compiler" 
     1592#endif 
     1593 
     1594 
     1595#if defined(__FreeBSD__) 
     1596#  define MY_OS "FreeBSD" 
     1597#elif defined(linux) || defined (__linux) 
     1598#  define MY_OS "Linux" 
     1599#elif defined (__MACOSX__) || defined (__APPLE__) 
     1600#  define MY_OS "Mac OS X" 
     1601#elif defined(__NetBSD__) 
     1602#  define MY_OS "NetBSD" 
     1603#elif defined(__OpenBSD__) 
     1604#  define MY_OS "OpenBSD" 
     1605#elif defined(_WIN32) || defined(__WIN32__) || defined(__TOS_WIN__) 
     1606#  define MY_OS "Windows" 
     1607#elif defined(CYGWIN) 
     1608#  define MY_OS "Cygwin\Windows" 
    15781609#else 
    1579         #define MY_COMPILER "unknown Compiler" 
    1580 #endif 
    1581  
     1610#  define MY_OS "Unknown OS" 
     1611#endif 
     1612 
     1613 
     1614#if defined(__alpha__) || defined(__alpha) || defined(_M_ALPHA) 
     1615#  define MY_ARCH "Alpha" 
     1616#elif defined(i386) || defined(__i386__) || defined(__i386) || defined(_M_IX86) || defined(_X86_) || defined(__THW_INTEL) 
     1617#  define MY_ARCH "x86" 
     1618#elif defined(__x86_64__) || defined(__amd64__) 
     1619#  define MY_ARCH "x86_64" 
     1620#elif defined(__ia64__) || defined(_IA64) || defined(__IA64__) || defined(_M_IA64) 
     1621#  define MY_ARCH "Intel Architecture-64" 
     1622#elif defined(__mips__) || defined(__mips) || defined(__MIPS__) 
     1623#  define MY_ARCH "MIPS" 
     1624#elif defined(__hppa__) || defined(__hppa) 
     1625#  define MY_ARCH "PA RISC" 
     1626#elif defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || defined(__ppc__) || defined(_M_PPC) || defined(__PPC) || defined(__PPC__) 
     1627#  define MY_ARCH "PowerPC" 
     1628#elif defined(__THW_RS6000) || defined(_IBMR2) || defined(_POWER) || defined(_ARCH_PWR) || defined(_ARCH_PWR2) 
     1629#  define MY_ARCH "RS/6000" 
     1630#elif defined(__sparc__) || defined(sparc) || defined(__sparc) 
     1631#  define MY_ARCH "SPARC" 
     1632#else 
     1633#  define MY_ARCH "Unknown Architecture" 
     1634#endif 
    15821635 
    15831636void show_loghelp() 
     
    15991652void show_version() 
    16001653{ 
     1654        struct utsname sysinfo; 
     1655        int i = uname(&sysinfo); 
     1656 
    16011657        printf("\n"); 
    16021658        printf("Nepenthes Version %s \n",VERSION); 
    1603         printf("Compiled on %s %s with %s %s \n",__DATE__, __TIME__,MY_COMPILER,__VERSION__); 
     1659        printf("Compiled on %s/%s at %s %s with %s %s \n",MY_OS,MY_ARCH,__DATE__, __TIME__,MY_COMPILER,__VERSION__); 
     1660 
     1661        if (i == 0) 
     1662        { 
     1663                printf("Started on %s running %s/%s release %s\n", 
     1664                           sysinfo.nodename, 
     1665                           sysinfo.sysname,  
     1666                           sysinfo.machine, 
     1667                           sysinfo.release 
     1668                           ); 
     1669        } 
     1670 
    16041671        printf("\n"); 
    16051672}