Introduction à Dionaea : Honeypot et exploitation des attaques
Dionaea est un Honeypot proposé par Honeynet Project. Il est destiné à attirer les attaques, en piéger les artefacts et en les analysant afin d'offrir un moyen de s'en prémunir. Il se présente comme le successeur de Nepenthes et est écrit en Python.
Pour prétendre tout cela, Dionaea s'appuie sur une collection impressionnante d'outils et offre tout un panel d'option pour contraindre la portée des attaques et mieux exploiter les données.
Fonctionnement
La machine supportant Dionaea doit avant tout réagir positivement à toute forme de contact venant de l'extérieur et logguer toute tentative. Pour cela, il existe un module et un script python portant tous les 2 le même nom : nfq. Le module nfq gère la partie kernel tandis que le script nfq a pour tâche de simuler un service. Si vous voulez jeter un coup d'oeil à nfq.py, c'est par ici. Ce n'est pas tout de faire que la machine soit réceptive, il faut la sécuriser un minimum, afin que la manip' ne se retourne pas contre notre parc. Cette mission revient à libemu. Sa fonction première est d'émuler un processeur et de détecter, de profiler et parfois d'exécuter au sein d'un environnement distinct un shellcode. Cela permet, notamment dès le download du malware, de garder le contrôle sans faire de compromis sur les informations qui sont offertes. Les services de download ont été réécrits afin d'incorporer les possibilités offertes par libcurl tout en évitant de surcharger et donc potentiellement d'ouvrir une porte supplémentaire mais non voulue sur le serveur. Cette copie du malware sera stockée en local pour dissection mais peut être également soumise à des tiers parties afin d'en tirer le maximum d'information. Enfin, il s'agit de logguer l'attaque pour en avoir une vision plus synthétique. Dionaea peut logguer les évènements de manière traditionnelle, mais logguera beaucoup (trop) d'information pour être exploitable par une Communauté.Des notions d'incident et d'incident handler ont donc été définies afin de restreindre les informations à leur noyau et de lier l'évènement avec un handler qui permettra d'extraire les informations pertinentes et de les mettre à disposition sous un format qui vous arrange.
Mais passons tout de suite à la pratique !
Install et prise en main
Toute installation commence par un éventail de prérequis à valider, et pour Dionaea, ces prérequis sont assez conséquents, je ne détaillerais donc pas leurs installations dans la mesure où le site officiel définit bien ce qui faut installer et où. Certains aimeront zapper complètement l'install et jouer de suite avec Dionaea, et pour les apt-getters, il existe un script qui vous fait tout le travail ici. Si vous n'utilisez pas apt-get, remplacez simplement les lignes concernées par l'appel à votre gestionnaire de package. Passés les prérequis, il suffit de lancer un git clone pour pouvoir rapatrier les sources.$ git clone git://git.carnivore.it/dionaea.git dionaeaSi vous ne pouvez pas passer par git directement, une solution système D :
$ wget -r git.carnivore.it/dionaea.git dionaea.git $ git clone dionaea.git dionaeaEnchainez avec un :
$ cd dionaea $ autoreconf -vi autoreconf: Entering directory `.' autoreconf: configure.ac: not using Gettext autoreconf: running: aclocal autoreconf: configure.ac: tracing autoreconf: running: libtoolize --copy libtoolize: Consider adding `AC_CONFIG_MACRO_DIR([m4])' to configure.ac and libtoolize: rerunning libtoolize, to keep the correct libtool macros in-tree. libtoolize: Consider adding `-I m4' to ACLOCAL_AMFLAGS in Makefile.am. autoreconf: running: /usr/bin/autoconf autoreconf: running: /usr/bin/autoheader autoreconf: running: automake --add-missing --copy --no-force autoreconf: Leaving directory `.' ./configure --with-lcfg-include=/opt/dionaea/include/ \ --with-lcfg-lib=/opt/dionaea/lib/ \ --with-python=/opt/dionaea/bin/python3.1 \ --with-cython-dir=/usr/local/bin \ --with-udns-include=/opt/dionaea/include/ \ --with-udns-lib=/opt/dionaea/lib/ \ --with-emu-include=/opt/dionaea/include/ \ --with-emu-lib=/opt/dionaea/lib/ \ --with-gc-include=/usr/include/gc \ --with-ev-include=/opt/dionaea/include \ --with-ev-lib=/opt/dionaea/lib \ --with-nl-include=/opt/dionaea/include \ --with-nl-lib=/opt/dionaea/lib/ \ --with-curl-config=/opt/dionaea/bin/ \ --with-pcap-include=/opt/dionaea/include \ --with-pcap-lib=/opt/dionaea/lib/ \ --with-glib=/opt/dionaea $ make && make installPar défaut, dionaea s'installe sous /opt/dionaea. Du coup, le binaire est également à ce niveau, plus précisément sous /opt/dionaea/bin/. La configuration, quant à elle, sera facilement localisable dans /opt/dionaea/etc/conf/dionaea.conf. Pour le spectacle, lancez un petit
$ /opt/dionaea/bin/dionaea -l all,-debug -L '*' Dionaea Version 0.1.0 Compiled on Linux/x86 at Aug 16 2010 14:54:32 with gcc 4.4.1 Started on localhost running Linux/i686 release 2.6.31.13-server-1mnb [17082010 15:14:24] dionaea dionaea.c:574: glib version 2.22.2 [17082010 15:14:24] dionaea dionaea.c:578: libev api version is 3.9 [17082010 15:14:24] dionaea dionaea.c:593: libev backend is epoll [17082010 15:14:24] dionaea dionaea.c:596: libev default loop 0xb78a5300 [17082010 15:14:24] dionaea dionaea.c:602: OpenSSL 0.9.8k 25 Mar 2009 [17082010 15:14:24] dionaea dionaea.c:615: udns version 0.0.9 [17082010 15:14:24] modules modules.c:120: loading module curl (/opt/dionaea/lib/dionaea/curl.so) [17082010 15:14:24] modules modules.c:120: loading module emu (/opt/dionaea/lib/dionaea/emu.so) [17082010 15:14:24] modules modules.c:120: loading module pcap (/opt/dionaea/lib/dionaea/pcap.so) [17082010 15:14:24] modules modules.c:120: loading module nfq (/opt/dionaea/lib/dionaea/nfq.so) [17082010 15:14:24] modules modules.c:120: loading module python (/opt/dionaea/lib/dionaea/python.so) [17082010 15:14:24] modules modules.c:157: loaded module /opt/dionaea/lib/dionaea/curl.so name curl module 0x83af680 gmodule 0x83af620 config 0xb7894a93 prepare 0xb7894ae3 new 0xb7894b2a free 0xb7894e33 [17082010 15:14:24] modules modules.c:157: loaded module /opt/dionaea/lib/dionaea/emu.so name emu module 0x83afe00 gmodule 0x83af660 config 0xb73728fc prepare 0xb737294c new 0xb73729bf free 0xb7372a06 [17082010 15:14:24] modules modules.c:157: loaded module /opt/dionaea/lib/dionaea/pcap.so name pcap module 0x83b0508 gmodule 0x83afde0 config 0xb736d191 prepare 0xb736d1e1 new 0xb736daa8 free 0xb736dbcb [17082010 15:14:24] modules modules.c:157: loaded module /opt/dionaea/lib/dionaea/nfq.so name nfq module 0x83b0f50 gmodule 0x83b0ef0 config 0xb7369b5c prepare 0xb7369c3a new 0xb7369e99 free (nil) [17082010 15:14:24] modules modules.c:181: configure module 0x83af680 [17082010 15:14:24] modules modules.c:181: configure module 0x83afe00 [17082010 15:14:24] modules modules.c:181: configure module 0x83b0508 [17082010 15:14:24] modules modules.c:181: configure module 0x83b0f50 [17082010 15:14:24] nfq nfq.c:99: nfq on queue 0 [17082010 15:14:24] modules modules.c:193: prepare module 0x83af680 [17082010 15:14:24] modules modules.c:193: prepare module 0x83afe00 [17082010 15:14:24] modules modules.c:193: prepare module 0x83b0508 [17082010 15:14:24] pcap pcap.c:213: pcap version libpcap version 1.0.0 [17082010 15:14:24] modules modules.c:193: prepare module 0x83b0f50 [17082010 15:14:24] modules modules.c:206: new module /opt/dionaea/lib/dionaea/curl.so 0x83af680 fn 0xb7894b2a [17082010 15:14:24] curl module.c:634: curl version 7.20.0 features:idn,ipv6,largefile,ntlm,ssl,libz protocols:dict,file,ftp,ftps,http,https,imap,imaps,ldap,pop3,pop3s,rtsp,scp,sftp,smtp,smtps,telnet,tftp [17082010 15:14:24] modules modules.c:206: new module /opt/dionaea/lib/dionaea/emu.so 0x83afe00 fn 0xb73729bf [17082010 15:14:24] modules modules.c:206: new module /opt/dionaea/lib/dionaea/pcap.so 0x83b0508 fn 0xb736daa8 [17082010 15:14:24] modules modules.c:206: new module /opt/dionaea/lib/dionaea/nfq.so 0x83b0f50 fn 0xb7369e99 processors filter-emu config allow 0 protocol 0 = "smbd" 1 = "epmapper" 2 = "nfqmirrord" next emu config emulation limits files = "3" filesize = "524288" sockets = "3" sustain = "120" idle = "30" cpu = "120" steps = "1073741824" api connect host = "127.0.0.1" port = "4444" filter-streamdumper config allow 0 type 0 = "accept" 1 type 0 = "connect" protocol 0 = "ftpctrl" deny 0 protocol 0 = "ftpdata" 1 = "ftpdatacon" 2 = "xmppclient" next streamdumper config path = "var/dionaea/bistreams/" allow # protocol smbd epmapper nfqmirrord # type config emulation limits files = "3" filesize = "524288" sockets = "3" sustain = "120" idle = "30" cpu = "120" steps = "1073741824" api connect host = "127.0.0.1" port = "4444" allow # protocol # type accept # protocol ftpctrl # type connect deny # protocol ftpdata ftpdatacon xmppclient # type [17082010 15:14:24] dionaea dionaea.c:730: Installing signal handlers [17082010 15:14:24] dionaea dionaea.c:764: Creating 2 threads in poolEt il se met en attente de nouvelle connexion, sachez qu'il est également possible de le daemonizer via un -D.
Votre Honeypot est prêt ! Par défaut, il simulera un ftp, et un serveur de partage SAMBA, qui est sujet depuis tout petit sujet aux vulnérabilités. Il ne vous reste plus qu'à enrichir le tout et configurer les handlers que vous désirez activer, comme p0f par exemple, avant de relancer le tout et d'attendre patiemment vos joueurs...