Making network protocols go crazy - Mot-clé - protocole2017-01-17T17:46:17+01:00grurn:md5:823289cecb88b10a72ab37a35928e25dDotclearQu'est-ce que l'attaque "Off-Path TCP Sequence Number Inference"urn:md5:14dd8cbb799c31f7b003e24821395a5e2012-07-12T14:20:00+02:002012-09-12T15:45:17+02:00grVulnérabilitéfirewallprotocoletcp <p>Je suis récemment tombé sur un papier intitulé <em>Off-Path TCP Sequence Number Inference Attack - How Firewall Middleboxes Reduce Security</em> [1]. Je ne connaissais pas la classification <em>Off-path</em>, ou littéralement, <em>hors du chemin</em>. Du coup, j'ai regardé de plus près le contenu de celui-ci.</p>
<p>[1] <a href="http://www.protocol-hacking.org/post/2012/07/12/" hreflang="en">http://web.eecs.umich.edu/~zhiyunq/pub/oakland12_TCP_sequence_number_inference.pdf</a></p>
<p>Ce papier propose une nouvelle attaque pour injecter un contenu dans une session <em>TCP</em>, depuis le coté client (en mode non-privilégié). La faute serait sur les <em>middle-boxes</em>, telles que nos chères modems ADSL, par exemple, ou autres firewalls <em>NAT</em>ant. Plus précisémment, celles faisant du suivi de session en se basant sur l' <em>ISN</em> (<em>Initial Sequence Number</em>) de <em>TCP</em>. C'est ici que serait la faille, ce numéro pourrait fuire à cause d'une fuite d'information accessible en <em>off-path</em>.</p>
<p>Pour qu'une session TCP ne soit pas facilement détournable, un numéro de séquence est généré aléatoirement (sur 32-bits). Si ce numéro venait à être prédictible, ou à fuire, un attaquant pourrait insérer un contenu dans la session. Bien sur, l'attaquant devra également connaitre les adresses IP source et destination, ainsi que les ports TCP source et destination.</p>
<p>Qu'est-ce que l' <em>off-path</em> ? C'est différent d'un <em>man-in-the-middle</em> dans le sens ou l'écoute se fait à coté de la communication. Ici, l' <em>off-path</em> se passe sur le poste client, via un malware. Par exemple, les informations IP/ports se trouvent en utilisant la commande <em>netstat</em>. Ensuite, un <em>side-channel</em> permet de découvrir l' <em>ISN</em> possible. Par l'envoi de segments <em>TCP</em> depuis l'extérieur (adresse IP spoofée) avec un <em>TTL</em> ajusté pour émettre un message d'erreur, et par la consultation des statistiques via le <em>/proc filesystem</em> en local, il est possible de savoir si le segment TCP est passé au travers du firewall (ou non). Si il est passé, l' <em>ISN</em> choisi est autorisé par le <em>firewall</em>. Toutes les infos en mains, l'injection dans une session existante est réalisable. Bon, après, il faut avoir le bon <em>timing</em>, mais des propositions concrêtes sont faites dans le papier [1] que je vous invite à lire.</p>
<p>Plus techniquement, un <em>firewall</em> peut avoir plusieurs politiques pour accepter un segment TCP <em>out-of-order</em>, c'est à dire accepter s'il fait bien partie d'une session établie. En gros, l' <em>ISN</em> est dans la fenêtre (<em>TCP window</em>) ou non. Mais pour connaitre cette fenêtre, le <em>firewall</em> doit aussi garder cet état (tailles de la fenêtre initiale) depuis l'initialisation de la connexion TCP. Evidemment, pour des raisons de performance, ce n'est pas fait dans tous les produits. Du coup, certains <em>firewall</em>s utilisent une fenêtre hardcodée de 1 000 000 000 (1G), par exemple. Ca réduit l'espace des possibles. Il y a d'autres méthodes de suivi de l' <em>ISN</em>, je vous invite à lire le papier.</p>
<p>En gros, tous les dispositifs se reposant sur le suivi de session utilisant l' <em>ISN</em> sont vulnérables de manière plus ou moins critique. Mais la contrainte pour exploiter cette menace est de taille, un malware (non privilégié) doit être installé sur le poste de la victime. Je serai un malware, je ferai autre chose qu'injecter du contenu dans une session <em>TCP</em> ;) genre installer un <em>plugin</em> navigateur Web pour avoir un accès lecture/écriture au contenu.</p>hubiC, maintenant vraiment ubiquitousurn:md5:d6ecd1c0b84490c2c50573ddb58901ec2012-01-29T18:02:00+01:002013-06-12T07:28:33+02:00grReversehubicnewsPerlprotocolereverse <p>Votre serviteur s'est intéressé au <em>cloud storage</em> tel qu'implémenté par <a href="http://www.ovh.fr/hubiC/" hreflang="fr" title="hubiC">hubiC</a>. Malheureusement, <a href="http://ovh.com/" hreflang="fr" title="OVH">OVH</a> ne fournit pas encore de binaire pour <em>Linux</em>. Eh oui, <em>OVH</em> a choisi de rendre disponible son espace de stockage uniquement via un client lourd. J'ai décidé d'analyser ce programme afin rendre ce <em>cloud storage</em> interopérable avec mon système (c'est légal).</p>
<p>Tout d'abord, certaines personnes arrivent à se connecter depuis Linux. Ces personnes possédaient un compte <em>CloudNAS</em>, le prédécesseur d<em>'hubiC</em>. Pour ces personnes, pas de problèmes. Pour les nouveaux arrivants (comme moi), le sytème de gestion des comptes d<em>'OVH</em> a changé. Un <em>WAS</em> (<em>Web Application Service</em>) est utilisé pour gérer les crédences d<em>'hubiC</em>. En analysant le programme <em>Windows</em>, je me suis aperçu que le client <em>hubiC</em> effectue 3 requêtes avant d'obtenir les informations qui serviront ensuite à la connexion <em>WebDAV</em>. Pour pouvoir se connecter, il est nécessaire d'avoir :</p>
<ul>
<li>l'URL du <em>WebDAV</em></li>
<li>le login du <em>WebDAV</em></li>
<li>le mot de passe du <em>WebDAV</em></li>
</ul>
<p>Les 3 requêtes sus-mentionnées sont destinées au serveur <em>ws.ovh.com</em> et permettent d'obtenir ces trois informations indispensables à la connexion <em>WebDAV</em>. Sans plus tarder, voici ces requêtes (en mode <em>raw</em>), toutes à destination de <em>ws.ovh.com</em> en <em>HTTPS</em> :</p>
<p>Requête POST nasLogin :</p>
<pre>
'POST /cloudnas/r0/ws.dispatcher/nasLogin HTTP/1.1'."\r\n".
'Content-Type: application/x-www-form-urlencoded'."\r\n".
'User-Agent: hubiC/1.0.9 (Windows NT 6.1; fr_FR)'."\r\n".
'Content-Length: 126'."\r\n".
'Connection: Keep-Alive'."\r\n".
'Accept-Encoding: gzip'."\r\n".
'Accept-Language: fr-FR,en,*'."\r\n".
'Host: ws.ovh.com'."\r\n".
''."\r\n".
'session=&params=%7B%20%22email%22%20%3A%20%22<login>%22%2C%20%22password%2
2%20%3A%20%22<password>%22%20%7D'."\r\n".
"\r\n";
</pre>
<p>Requête POST getNas :</p>
<pre>
'POST /cloudnas/r0/ws.dispatcher/getNas HTTP/1.1'."\r\n".
'Content-Type: application/x-www-form-urlencoded'."\r\n".
'User-Agent: hubiC/1.0.9 (Windows NT 6.1; fr_FR)'."\r\n".
'Content-Length: 54'."\r\n".
'Connection: Keep-Alive'."\r\n".
'Accept-Encoding:gzip'."\r\n".
'Accept-Language: fr-FR,en,*'."\r\n".
'Host: ws.ovh.com'."\r\n".
''."\r\n".
'session=<id>'."\r\n".
"\r\n";
</pre>
<p>Requête POST getCredentials :</p>
<pre>
'POST /cloudnas/r0/ws.dispatcher/getCredentials HTTP/1.1'."\r\n".
'Content-Type: application/x-www-form-urlencoded'."\r\n".
'User-Agent: hubiC/1.0.9 (Windows NT 6.1; fr_FR)'."\r\n".
'Content-Length: 54'."\r\n".
'Connection: Keep-Alive'."\r\n".
'Accept-Encoding: gzip'."\r\n".
'Accept-Language: fr-FR,en,*'."\r\n".
'Host: ws.ovh.com'."\r\n".
''."\r\n".
'session=<id>'."\r\n".
"\r\n";
</pre>
<p>Et voilà. Ca va renvoyer les trois précieuses informations.</p>
<p>Certains pourraient me demander : mais comment avez-vous fait pour avoir ces informations ? Le serveur d<em>'hubiC</em> est en <em>HTTPS</em> ; on ne peut pas écouter la conversation entre le client et le serveur. Effectivement, sauf que le client tourne sur mon système. Rien ne m'empêche de brancher un débuggeur sur mon programme sur ma machine. En deux mots : <a href="http://www.ollydbg.de/version2.html" hreflang="en" title="OllyDbg">OllyDbg</a>, <em>SSL_write</em>.</p>
<p>Bon, comme j'aime aussi le <em>Perl</em>, je fournis le programme qui permet de récupérer les précieux sésames :
<a href="http://www.protocol-hacking.org/public/hubic.pl" hreflang="en" title="hubic.pl">http://www.protocol-hacking.org/public/hubic.pl</a></p>
<pre>
% ./hubic.pl
Usage: ./hubic.pl -l login [-d] [-h]
% ./hubic.pl -l <mon_login_genre_une_adresse_email>
Password:
URL: https://cloudnas1.ovh.com/XXXXXXXXXX/
Login: cloudnas
Password: YYYYYYYYYY
mount -t davfs https://cloudnas1.ovh.com/XXXXXXXXXX/ /mnt
</pre>
<p>Maintenant, <em>hubiC</em> fonctionne sur tous les systèmes supportant un client <em>WebDAV</em>.</p>
<p><strong>UPDATE</strong> : la presse en parle :</p>
<ul>
<li><a href="http://www.pcinpact.com/news/68701-ovh-hubic-webdav-perl-script.htm" hreflang="fr" title="PCinpact">PCinpact</a></li>
<li><a href="http://www.journaldulapin.com/2012/02/02/utiliser-lhubic-dovh-avec-un-mac/" hreflang="fr" title="Journal du lapin">Journal du lapin</a></li>
<li><a href="http://www.presence-pc.com/actualite/hubic-mac-linux-46566/" hreflang="fr" title="Presence-PC">Presence-PC</a></li>
<li><a href="http://www.macworld.fr/2012/02/03/mac/hubic-accessible-directement-depuis-finder/524459/" hreflang="fr" title="Mac world">Mac world</a></li>
</ul>
<p><strong>UPDATE</strong> : autres versions du programme :</p>
<ul>
<li><a href="http://www.protocol-hacking.org/public/Hubic.py" hreflang="en" title="En Python, par Nicolas P">Hubic.py</a></li>
<li><a href="http://www.protocol-hacking.org/public/getHubicWebdavInfos.ps1" hreflang="en" title="En PowerShell, par Stephane OLIVIER">getHubicWebdavInfos.ps1</a></li>
</ul>http://www.protocol-hacking.org/post/2012/01/29/Hubic%2C-maintenant-vraiment-ubiquitous#comment-formhttp://www.protocol-hacking.org/feed/atom/comments/26