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 dionaea
Si 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 dionaea
Enchainez 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 install
Par 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 pool
Et 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...

Les petits détails

Dionaea aborde certaines problématiques à sa manière et il y a quelques points notamment que vous devez connaitre. Dionaea upload les malwares introduits sur des sites d'analyse de code tels que Anubis et OnlineAnalyzer. Il est possible de paramétrer les urls en question dans la section submit de la conf. On a parlé de log, mais sachez également qu'il est possible de logguer tout ce petit monde dans une base de données sqlite. Pour cela, il vous faut le module python logsql, que vous pouvez trouver ici. Ce module va de pair avec le module readlogsqltree. Dionaea est un Honeypot. A ce titre, il peut être attaqué sur une plage de port dont il ne maîtrise pas le protocole. C'est ici que cela devient légalement délicat. De manière générale, le script nfq va créer, à la volée et suite à des interceptions d'handshakes tcp, crée le service demandé à la volée s'il reconnait le protocole. Cependant, dans le cas où le port n'est pas reconnu, le script nfq, de concert avec le module nfq, va renvoyer la requête à l'attaquant, sur le même port et l'utiliser afin de répondre à la requête initialement reçue. On appelle ça du mirroring. Des limites ont été apposées, afin qu'on ne se retrouve pas en recursive loop ni en DOS (lors d'un port scanning, par exemple). Cet aspect en particulier peut, selon les législations, être mal perçu, voir complètement illégal. Attention donc.

Conclusion

Dionaea permet d'apporter une réponse concise et automatisée à la question des exploits et des malwares uploadés pendant ces exploits. L'outil bénéficie d'une maturité avancée puisque le projet a vu ses premiers jour lors du Summer of Code 2009 et ses dernières modifications datent d'il y a seulement 5 heures. D'autre types d'Honeypot existent, d'autres techniques sûrement tout aussi compétentes, il ne reste donc plus qu'à vous faire la main dessus...
Vus : 2199
Publié par K-Tux : 59