<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2544441785418935190</id><updated>2012-01-31T06:43:46.662+01:00</updated><category term='driver'/><category term='asm inline'/><category term='Ethernet'/><category term='ARP'/><category term='maths'/><category term='pi'/><category term='bof'/><category term='ida'/><category term='api'/><category term='noyau'/><category term='overflow'/><category term='rootkit'/><category term='ssdt'/><category term='cookie'/><category term='ddk'/><category term='Sniffing'/><category term='fpu'/><category term='détournement'/><category term='socket'/><category term='dépassement'/><category term='canary'/><category term='Réseau'/><category term='hooking'/><category term='setsockopt'/><category term='assembleur'/><category term='protection'/><category term='registre'/><title type='text'>Blog Sécurité Informatique</title><subtitle type='html'>Journal sur la sécurité informatique, programmation, réseaux, et sur l'actualité de la sécurité, essentiellement porté sur les systèmes Windows.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>10</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-424878248229002901</id><published>2007-08-06T14:40:00.000+02:00</published><updated>2007-08-08T12:05:13.266+02:00</updated><title type='text'>Shellcode IsProcessDebugged (25 octets)</title><content type='html'>&lt;span style="font-size:85%;"&gt;J'ai très récemment développer un nano-shellcode pour Win32, consistant à détecter si le process courant (dans lequel est injecté le shellcode) est en train d'être debuggé ; ce n'est pas d'un réel interêt lors d'une attaque, mais c'est intéressant :&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;br /&gt;char shellcode_dbg[] = "\x60\x33\xDB\x83\xC3\x18\x64\x8B\x03\x8B\x40\x30"&lt;br /&gt;                                          "\x0F\xB6\x40\x02\x8B\xFD\x83\xC7\x04\x29\x07\x61\xC3";&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Il ne fait pas plus de 25 octets (23 mais j'ai rajouté les instrucitons pushad et popad pour éviter un éventuel plantage), il récupère la valeur PEB-&gt;BeingDebugged qui indique si le processus est débuggé (== 1) ou non (==NULL), puis modifie la valeur de retour sauvegardée dans la pile avec cette valeur, ce qui fera que le programme crash si il est debuggé, ou continue son exécution normale si ce n'est pas le cas.&lt;br /&gt;&lt;br /&gt;PacketStorm :    &lt;a style="color: rgb(204, 0, 0);" href="http://packetstormsecurity.org/shellcode/shellcode-crash.c"&gt;http://packetstormsecurity.org/shellcode/shellcode-crash.c&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Il sera prochainement publié sur &lt;a href="http://www.milw0rm.com/"&gt;milw0rm&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-424878248229002901?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/424878248229002901/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=424878248229002901' title='10 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/424878248229002901'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/424878248229002901'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/08/shellcode-isprocessdebugged-25-octets.html' title='Shellcode IsProcessDebugged (25 octets)'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-7736291953079891530</id><published>2007-07-06T14:36:00.000+02:00</published><updated>2007-08-06T14:38:35.912+02:00</updated><title type='text'>BAC</title><content type='html'>&lt;span style="font-size:85%;"&gt;Une longue interruption, après le passage du baccalaureat...&lt;br /&gt;Des news seront de temps en temps postées sur ce blog...&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-7736291953079891530?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/7736291953079891530/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=7736291953079891530' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/7736291953079891530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/7736291953079891530'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/08/bac.html' title='BAC'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-2944282777652841923</id><published>2007-03-31T23:57:00.000+02:00</published><updated>2007-04-01T00:09:09.366+02:00</updated><title type='text'>Détection Sniffer : les sources - TECH</title><content type='html'>&lt;span style="font-size:85%;"&gt;Il y'a plus d'un mois, j'avais décrit grossièrement le protocole à suivre basé sur le protocole ARP afin de détecter à travers un réseau d'éventuelles utilisations de Sniffers (ou d'IDS) sur un des postes. J'avais développé auparavant un outil qui se chargeait de faire cela, avec une interface graphique (très mal faite ^^).&lt;br /&gt;&lt;br /&gt;Vous pouvez vous référez à mon billet précédent sur le sujet ou au papier de SecurityFriday : &lt;a href="http://www.blackhat.com/html/bh-usa-01/bh-usa-01-speakers.html#Daiji%20Sanai" target="_blank"&gt;Promiscuous node detection using ARP packets.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Source :     &lt;a href="http://touronster.free.fr/Dev/C%20-%20CPP/Network%20Map/"&gt;http://touronster.free.fr/Dev/C%20-%20CPP/Network%20Map/&lt;/a&gt;&lt;br /&gt;Et aussi &lt;a href="http://touronster.free.fr/Dev/C%20-%20CPP/Network%20Map/Promiscan.JPG"&gt;disponible un screenshot&lt;/a&gt;..&lt;br /&gt;&lt;br /&gt;Attention cependant, il est très loin d'être complètement fonctionnel, en effet il y'a des adresses IP codées en dur dans le source, que vous devrez modifier si vous souhaitez le faire marcher sur votre réseau (le source a été adapté à ma configuration réseau).&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.blackhat.com/html/bh-usa-01/bh-usa-01-speakers.html#Daiji%20Sanai"&gt;&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-2944282777652841923?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/2944282777652841923/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=2944282777652841923' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/2944282777652841923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/2944282777652841923'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/03/dtection-sniffer-les-sources-tech.html' title='Détection Sniffer : les sources - TECH'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-554336152861400754</id><published>2007-03-18T00:15:00.000+01:00</published><updated>2007-03-18T18:18:28.235+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cookie'/><category scheme='http://www.blogger.com/atom/ns#' term='ddk'/><category scheme='http://www.blogger.com/atom/ns#' term='bof'/><category scheme='http://www.blogger.com/atom/ns#' term='dépassement'/><category scheme='http://www.blogger.com/atom/ns#' term='canary'/><category scheme='http://www.blogger.com/atom/ns#' term='assembleur'/><category scheme='http://www.blogger.com/atom/ns#' term='driver'/><category scheme='http://www.blogger.com/atom/ns#' term='overflow'/><title type='text'>Sécurité de la pile avec compilateur DDK - TECH</title><content type='html'>&lt;span style="font-size:85%;"&gt;Voici un court article que j'ai écrit cet après-midi, qui explique les mécanismes de protection de la pile contres les attaques par dépassement de tampon, implémentés dans les fonctions internes des drivers compilés avec le DDK de Microsoft. Ce mécanisme (la technique du canary) est peu différent de celui implémenté par les compilateurs Visual Studio avec le Flag /GS, seules quelques petites différences subsistent.&lt;br /&gt;&lt;br /&gt;Article PDF :    &lt;a style="color: rgb(204, 0, 0);" href="http://touronster.free.fr/Blog/PDF/M%e9canisme%20Anti-BoF%20du%20Compilateur%20DDK.pdf"&gt;Mécanisme Anti-BoF du compilateur DDK&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-554336152861400754?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/554336152861400754/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=554336152861400754' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/554336152861400754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/554336152861400754'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/03/scurit-de-la-pile-avec-compilateur-ddk.html' title='Sécurité de la pile avec compilateur DDK - TECH'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-8334359189783280797</id><published>2007-03-09T20:14:00.000+01:00</published><updated>2007-03-18T17:59:41.054+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maths'/><category scheme='http://www.blogger.com/atom/ns#' term='pi'/><category scheme='http://www.blogger.com/atom/ns#' term='assembleur'/><category scheme='http://www.blogger.com/atom/ns#' term='asm inline'/><category scheme='http://www.blogger.com/atom/ns#' term='fpu'/><title type='text'>Détermination de PI avec FPU - FUN</title><content type='html'>&lt;a style="color: rgb(0, 0, 0);" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tiiDCWOHW0k/RfLSEKqJFuI/AAAAAAAAAC4/0WnZGk1-U8I/s1600-h/PI.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 56px; height: 45px;" src="http://2.bp.blogspot.com/_tiiDCWOHW0k/RfLSEKqJFuI/AAAAAAAAAC4/0WnZGk1-U8I/s320/PI.png" alt="" id="BLOGGER_PHOTO_ID_5040321902003427042" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;Récemment en cours de maths, on a abordé une méthode pour déterminer &lt;span style="color: rgb(102, 51, 255);"&gt;pi &lt;span style="color: rgb(0, 0, 0);"&gt;en utilisant les suites numériques dites adajacentes, c'est alors que j'ai proposé une méthode se basant sur les probabilités pour approximer la valeur de pi, grand moment de solitude pour moi, incompris par ma classe :-)&lt;br /&gt;&lt;br /&gt;Je refais face : je vais représenter plus en détail cette méthode simple d'approximation de pi, cette méthode n'est pas la mienne, c'est la méthode Monte Carlo. Démonstration.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Pour utiliser cette méthode, on se place dans une certaine figure : un carré de côté 1 contenant un quart de&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; cercle trigonométrique inscrit (de rayon 1). Techniquement, le principe est basé sur une génération aléatoire&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt; de coordonées de points dans le repère ayant pour origine un angle du carré.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a style="color: rgb(0, 0, 0);" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_tiiDCWOHW0k/RfHXUKqJFoI/AAAAAAAAACI/MVqMBZUBAeM/s1600-h/img1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_tiiDCWOHW0k/RfHXUKqJFoI/AAAAAAAAACI/MVqMBZUBAeM/s200/img1.png" alt="" id="BLOGGER_PHOTO_ID_5040046199462762114" border="0" /&gt;&lt;/a&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;Soit alpha le nombre de points du cercle et beta les points hors du cercle, ce quotient sera donc égale au quotient de l'aire du quart de cercle sur l'aire du carré,  soit l'égalité :&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tiiDCWOHW0k/RfLW_qqJFwI/AAAAAAAAADI/FmJ6Yg3M6j8/s1600-h/img1.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_tiiDCWOHW0k/RfLW_qqJFwI/AAAAAAAAADI/FmJ6Yg3M6j8/s400/img1.png" alt="" id="BLOGGER_PHOTO_ID_5040327322252154626" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;br /&gt;&lt;br /&gt;J'ai donc développé un court programme d'une centaine de ligne en C/Assembleur inline, qui se base donc sur une génération de coordonées aléatoires pour différents points dans le carré, ensuite il calcule la distance de chaque point pour définir s'il appartient oui ou non au quart de cercle, le calcul ne consiste donc seulement à calculer un pourcentage le plus précis possible, pour qu'on puisse par la suite le multiplier par 4 pour obtenir une approximation de PI.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;br /&gt;Vous pouvez régler dans le code source le nombre d'itération à effectuer (ce qui correspond au nombre de points générés) ; plus ce nombre est important, plus l'approximation de PI sera fine : la loi des grands nombres.  Cependant, si on augmente trop le nombre d'itérations, le résultat final sera incohérent, c'est un petit bug : il y'a un moment donné un &lt;span style="color: rgb(51, 51, 153);"&gt;integer overflow &lt;span style="color: rgb(0, 0, 0);"&gt;qui surgit, pour le corriger il faut modifier le type de la variable int i, par une variable de 64 bits ou plus suivant les envies...&lt;br /&gt;On pourrait aussi améliorer le code pour gérer plus de décimales.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Dans le code, j'ai préféré programmer les calculs sur les flottants en utilisant le FPU avec des blocs &lt;span style="color: rgb(102, 51, 255);"&gt;__asm &lt;span style="color: rgb(0, 0, 0);"&gt;(avec VS 2005 Express). une version distribuée du calcul pourrait être intéressant à développer : &lt;a href="http://touronster.free.fr/Blog/TXT/piproba.cpp.txt"&gt;source&lt;/a&gt;.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://touronster.free.fr/Blog/IMG/screenshot_piproba.jpg"&gt;Screenshot&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://touronster.free.fr/Blog/ZIP/piproba.zip"&gt;Source + Bin&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;a&gt;Monsieur Cyr si vous passez ...   ^_^&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-size:85%;" &gt;&lt;span style="color: rgb(102, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;br /&gt;PS : cela n'a rien à voir, une connaissance Mathieu Suiche a récémment publié un billet sur le blog MSDN de Microsoft, concernant les nouvelles conventions d'appels sous architecture 64 bits, voici le lien : &lt;a href="http://www.microsoft.com/france/msdn/visualc/introduction-convention-appel-64bits.mspx"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a&gt;&lt;/a&gt;&lt;a href="http://www.microsoft.com/france/msdn/visualc/introduction-convention-appel-64bits.mspx"&gt;Introduction aux Conventions  d'appels 64 bits&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-8334359189783280797?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/8334359189783280797/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=8334359189783280797' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/8334359189783280797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/8334359189783280797'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/03/dtermination-de-pi-avec-fpu-fun.html' title='Détermination de PI avec FPU - FUN'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tiiDCWOHW0k/RfLSEKqJFuI/AAAAAAAAAC4/0WnZGk1-U8I/s72-c/PI.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-2809409868187763914</id><published>2007-03-02T21:28:00.000+01:00</published><updated>2007-03-05T18:18:45.965+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='socket'/><category scheme='http://www.blogger.com/atom/ns#' term='détournement'/><category scheme='http://www.blogger.com/atom/ns#' term='Réseau'/><category scheme='http://www.blogger.com/atom/ns#' term='setsockopt'/><title type='text'>Détournement d'écoute des sockets sous Windows – TECH</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tiiDCWOHW0k/ReiL3wepX7I/AAAAAAAAAB8/DA9WUAK0idY/s1600-h/5966-babasse-ReseauxEthernet3D.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 108px; height: 108px;" src="http://3.bp.blogspot.com/_tiiDCWOHW0k/ReiL3wepX7I/AAAAAAAAAB8/DA9WUAK0idY/s200/5966-babasse-ReseauxEthernet3D.png" alt="" id="BLOGGER_PHOTO_ID_5037429973236408242" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;La plupart des développeurs le savent, pour donner la possibilité à une application de traiter des flux réseaux, on doit utiliser les sockets, qui sont en quelque sorte des descripteurs de connexion, un handle comme on en parle sous Windows. Pour la suite du billet, je vais considérer que vous savez les utiliser.&lt;br /&gt;&lt;br /&gt;Seulement, les systèmes NT peuvent présenter une faiblesse si on utilise mal ces sockets. En effet, les fonctionnalités systèmes de socket sont programmées de telle sorte que certaines sockets utilisées par un programme puissent être prioritaires vis-à-vis d'autres, suivant leur définition par le programme utilisateur. Concrétement, il est possible de définir l'adresse d'une socket par la valeur générique &lt;span style="color: rgb(102, 102, 204);"&gt;INADDR_ANY&lt;/span&gt;, cette valeur permet de définir une socket sur toutes les adresse d'une machine, c'est-à-dire que le programme utilisateur sera en mesure de récupérer des paquets réseaux à destination d'une des différentes adresses du système.&lt;br /&gt;&lt;br /&gt;C'est là qu'intervient le concept de priorité, en effet sur les systèmes NT, une socket définie sur une adresse spécifique sera priviliégiée au niveau de la déléguation des paquets réseau, comparé à une socket définie avec INADDR_ANY, si ces deux sockets sont définies sur un même port.&lt;br /&gt;&lt;br /&gt;Par exemple, si un programme utilise une socket définie avec INADDR_ANY, celui-ci pourra présenter une faiblesse. En effet, il serait possible de développer un petit programme d'écoute sur le même port que le programme vulnérable, mais cette fois-ci en définissant la socket sur une adresse spécifique et non générique. Le programme attaquant devra utiliser la fonction setsockopt appliquée sur sa socket en utilisant l'argument &lt;span style="color: rgb(102, 102, 204);"&gt;SO_REUSEADDR&lt;/span&gt;, afin de pouvoir binder sa socket sur la même adresse (et port) que ceux du programme vulnérable.&lt;br /&gt;&lt;br /&gt;Depuis les nouvelles versions de Windows, une nouvelle option pour les socket a été instaurée : c'est l'option &lt;span style="color: rgb(102, 102, 204);"&gt;SO_EXCLUSIVEADDR&lt;/span&gt;, que l'on applique au socket en question. Cette option empêche la définition d'une autre socket sur la même adresse réseau et même port, donc protège d'un détournement de l'écoute réseau d'un programme. Elle évite également de devoir définir plusieurs sockets sur toutes les adresses réseaux du système. Dorénavant, pensez à appliquer cette option à la socket que vous utilisez dans vos programmes pour plus de sécurité.&lt;br /&gt;&lt;br /&gt;Voici pour exemple un code présentant un très simple serveur vulnérable : &lt;a href="http://touronster.free.fr/Blog/TXT/server.cpp.txt"&gt;source&lt;/a&gt;. Pour tester la chose, on peut utiliser netcat, voici le résultat du test :&lt;br /&gt;&lt;br /&gt;On lance les deux serveurs...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cmd&gt; server -vuln&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cmd&gt; nc -p 1337 -L 192.168.0.4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On se connecte au système (port 1337)...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cmd&gt; nc 192.168.0.4 1337&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On remarque que l'on ne reçoit pas de message d'accueil de la part de notre serveur, on s'est donc connecté au serveur lancé via netcat, on peut le vérifier en envoyant un message au serveur.&lt;br /&gt;&lt;br /&gt;On relance ensuite un second test, avec l'option de sécurité -safe du serveur...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cmd&gt; server -safe&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;cmd&gt; nc -p 1337 -L 192.168.0.4&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;can't grabe 0.0.0.0:1337 with bind       &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En effet, netcat renvoie une erreur lors de l'éxecution de la fonction bind, car en effet netcat tente de bindersocket sur la même adresse que notre serveur de test qui a appliqué l'option &lt;span style="color: rgb(102, 102, 204);"&gt;SO_EXCLUSIVEADDRUSE&lt;/span&gt; sur sa socket. L'application server est donc sécurisé à ce niveau-là.&lt;br /&gt;&lt;br /&gt;Peu de malwares se basent sur cette technique d'attaque, celle-ci ne semble pas être très répandue mais mérite néanmoins une petite explication et prévention. Dorénavant, vous saurez quoi faire de votre socket...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(102, 0, 204);"&gt;Liens&lt;/span&gt; :&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://touronster.free.fr/Blog/ZIP/server.zip"&gt;Archive (source + binaire)&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://msdn2.microsoft.com/en-us/library/ms740621.aspx"&gt;Using SO_REUSEADDR and SO_EXCLUSIVEADDRUSE &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prochain billet : Appels systèmes Windows (SSDT) [SUITE]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(204, 0, 0);" href="http://touronster.free.fr/Blog/PDF/Socket_Hijack.pdf"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Version PDF du billet&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-2809409868187763914?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/2809409868187763914/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=2809409868187763914' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/2809409868187763914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/2809409868187763914'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/03/dtournement-dcoute-des-sockets-sous.html' title='Détournement d&apos;écoute des sockets sous Windows – TECH'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_tiiDCWOHW0k/ReiL3wepX7I/AAAAAAAAAB8/DA9WUAK0idY/s72-c/5966-babasse-ReseauxEthernet3D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-4745315009117307627</id><published>2007-02-21T13:03:00.000+01:00</published><updated>2007-02-24T20:25:22.437+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rootkit'/><category scheme='http://www.blogger.com/atom/ns#' term='ida'/><category scheme='http://www.blogger.com/atom/ns#' term='ssdt'/><category scheme='http://www.blogger.com/atom/ns#' term='noyau'/><category scheme='http://www.blogger.com/atom/ns#' term='hooking'/><title type='text'>La SSDT de Windows [INTRO] - TECH</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_tiiDCWOHW0k/Rd91S95bnkI/AAAAAAAAABk/h-3ZDbCHNLg/s1600-h/system-b-parch_madness_suite.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 107px; height: 107px;" src="http://4.bp.blogspot.com/_tiiDCWOHW0k/Rd91S95bnkI/AAAAAAAAABk/h-3ZDbCHNLg/s200/system-b-parch_madness_suite.png" alt="" id="BLOGGER_PHOTO_ID_5034871877137047106" border="0" /&gt;&lt;/a&gt;&lt;span style="font-size:85%;"&gt;Comme tout système d'exploitation, Windows possède certaines fonctions systèmes propres au noyau. Ce sont les appels systèmes, utilisées par les fonctions API de Windows. En effet, les API ne sont qu'une interface avec le noyau pour les programmes utilisateurs.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Comme exemple, l'appel de la fonction API &lt;span style="color: rgb(102, 102, 204);"&gt;CreateFile&lt;/span&gt; engendre une cascade d'appels de fonction. Lorsqu'un programme nécéssite un accés disque via l'appel CreateFile, cette API initialement exportée par la bibliothèque Kernel32.dll va par la suite faire appel à la fonction &lt;span style="color: rgb(102, 51, 255);"&gt;NtCreateFile&lt;/span&gt; exportée, elle, par &lt;span style="color: rgb(102, 51, 255);"&gt;NtDll.dll&lt;/span&gt;. Ces deux appels de fonction successifs sont réalisés dans le User Land.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Les appels systèmes interviennent à ce niveau-là. En effet, la transition API / Syscall va s'effectuer lors de l'exécution de l'API native &lt;span style="color: rgb(102, 51, 255);"&gt;NtCreateFile&lt;/span&gt;. Le rôle de l'API native (NtCreateFile dans ce cas) est de faire appel à une interruption spécifique à Windows, afin que la fonction noyau correspondante soit appelée ; elle effectue donc un appel système. On peut situer le code permettant cette transition :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;- Désassemblage de &lt;span style="color: rgb(102, 51, 255);"&gt;ZwCreateFile&lt;/span&gt; dans NtDll.dll (avec IDA Pro) :&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp | &lt;span style="color: rgb(102, 102, 102);"&gt;&amp;nbsp&amp;nbsp&amp;nbsp   public ZwCreateFile&lt;/span&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp | &lt;span style="color: rgb(102, 102, 102);"&gt; &amp;nbsp&amp;nbsp&amp;nbsp   ZwCreateFile proc near&lt;/span&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp |  &lt;span style="font-weight: bold;"&gt; &amp;nbsp&amp;nbsp&amp;nbsp  mov     eax, 25h&lt;/span&gt;                                                 &lt;span style="color: rgb(0, 153, 0);"&gt;    &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp    ; numéro de service (offset) pour la SSDT&lt;/span&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp |  &amp;nbsp&amp;nbsp&amp;nbsp   mov     edx, 7FFE0300h&lt;br /&gt;&amp;nbsp&amp;nbsp |  &lt;span style="font-weight: bold;"&gt; &amp;nbsp&amp;nbsp&amp;nbsp  call    dword ptr [edx]&lt;/span&gt;              &lt;span style="color: rgb(0, 153, 0);"&gt;   &amp;nbsp&amp;nbsp&amp;nbsp&amp;nbsp        ; appel de KiFastSystemCall&lt;/span&gt;&lt;br /&gt;&amp;nbsp&amp;nbsp | &amp;nbsp&amp;nbsp&amp;nbsp   retn    2Ch&lt;br /&gt;&amp;nbsp&amp;nbsp |&lt;span style="color: rgb(102, 102, 102);"&gt;  &amp;nbsp&amp;nbsp&amp;nbsp  ZwCreateFile endp&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;Ici, on a désassemblé ZwCreateFile, en effet NtCreateFile et ZwCreateFile sont toutes les deux exportées par NtDll.dll et pointent sur les mêmes instructions. On voit que ZwCreateFile stocke la valeur &lt;span style="color: rgb(102, 51, 255);"&gt;25h &lt;/span&gt;dans le registre &lt;span style="color: rgb(102, 51, 255);"&gt;EAX&lt;/span&gt;, puis par la suite effectue un appel de fonction, à l'adresse stockée dans [7FFE0300]. En réalité, cette instruction &lt;span style="color: rgb(102, 51, 255);"&gt;CALL&lt;/span&gt; est une interruption logicielle nécéssaire à l'appel de la fonction noyau qui gère les accés disques.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;En effet, lors de l'interruption logicielle, le processeur va rechercher dans l'&lt;span style="color: rgb(102, 51, 255);"&gt;IDT &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (Interrruption Descriptor&lt;/span&gt;&lt;span style="font-size:85%;"&gt; Table) le gestionnaire d'interruption correspondant à celle-ci. Dans notre cas, ce gestionnaire d'interruption se basera sur le registre EAX, dans lequel ZwCreateFile a stocké l'offset pour la &lt;span style="color: rgb(102, 51, 255);font-size:78%;" &gt;SSDT&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;En effet, il relèvera dans la SSDT (qui est un tableau de &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);"&gt;DWORD&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;span style="font-size:85%;"&gt; un pointeur de fonction correspondant au service d'accés disque. Toutes APIs natives possède cette forme, la différence réside dans la valeur qu'elles stockent dans le registre EAX, pour faire appel au bon service. Le graphique représente la cascade d'appels pour l'appel d'une API.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_tiiDCWOHW0k/Rd9qqt5bnjI/AAAAAAAAABQ/f8_yTmhml_U/s1600-h/mod.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_tiiDCWOHW0k/Rd9qqt5bnjI/AAAAAAAAABQ/f8_yTmhml_U/s200/mod.gif" alt="" id="BLOGGER_PHOTO_ID_5034860190531034674" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;Ce mécanisme d'appel aux fonctions noyau est similaire à celui mise en place dans les systèmes linux. En effet, ils possèdent une interruption (la &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);font-size:85%;" &gt;0x80&lt;/span&gt;&lt;span style="font-size:85%;"&gt;), qui permet de lancer des fonctions systèmes du noyau linux, pour cela il suffit de placer une valeur également dans le registre &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);font-size:85%;" &gt;EAX&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, correspondant à la fonction système souhaitée (telle que sys_execve, sys_open, sys_fork etc...).&lt;br /&gt;&lt;br /&gt;L'adresse de la SSDT est obtenue par l'intermédiaire d'un tableau de &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);font-size:85%;" &gt;ServiceDescriptorEntry&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, lui-même contenue dans la structure &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);font-size:85%;" &gt;ServiceDescriptorTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;. En effet, son adresse correspond à &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);font-size:85%;" &gt;SDT.ServDescEntry[0].ServiceTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;. L'adresse ce premier membre du tableau de structures ServiceDescriptorEntry peut-être obtenue par un symbole exporté par &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;ntoskrnl.exe&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, le noyau du système Windows, le symbole &lt;/span&gt;&lt;span style="color: rgb(102, 102, 153);font-size:85%;" &gt;KeServiceDescriptorTable&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, de là, on a directement accés au tableau de DWORD ; la SSDT.&lt;br /&gt;&lt;br /&gt;L'intégrité de cette SSDT est donc très importante, car le bon fonctionnement du système, des fonctions APIs en dépend. C'est sur cela que se base les &lt;/span&gt;&lt;span style="color: rgb(102, 51, 255);font-size:85%;" &gt;rootkits&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, en effet ils modifients la SSDT de façon à détourner les appels systèmes, de cette manière ils peuvent falsifier les données retournées par ces fonctions, dans le but de cacher leur activité (invisibilité de processus, de fichier / dossiers, de ports tcp / udp, etc...).&lt;br /&gt;&lt;br /&gt;Un logiciel anti-rootkit vérifie donc l'intégrité des entrées de la SSDT (donc les différents membres du tableau SDT.ServDescEntry[0].ServiceTable) à la recherche de d'entrées falsifiés (par d'éventuels rootkits).&lt;br /&gt;&lt;br /&gt;Cependant, de fausses alertes peuvent être soulevées, car en effet, les pare-feu (entre autres) utilisent le SSDT hooking afin de maintenir une protection et une surveillance.&lt;br /&gt;&lt;br /&gt;Différents outils peuvent vérifier l'intégrité de cette SDT dont&lt;a href="http://www.security.org.sg/code/KProcCheck-0.2beta1.zip"&gt; KProCheck&lt;/a&gt;, et aussi &lt;a href="http://www.rootkit.com/vault/fuzen_op/vice.zip"&gt;Vice&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Voici aussi une documentation intéressante : &lt;a href="http://3psilon.info/Les-rootkits.html"&gt;http://3psilon.info/Les-rootkits.html&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Prochainement, je travaillerai sur une source d'un driver illustrant ce billet, et un autre billet détaillant le mécanisme du kernel utilisé pour les syscalls Windows sera publié.&lt;br /&gt;&lt;br /&gt;&lt;a style="color: rgb(204, 0, 0);" href="http://touronster.free.fr/Blog/PDF/La%20SSDT%20de%20Windows%20%5bINTRO%5d.pdf"&gt;Version PDF du billet&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-4745315009117307627?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/4745315009117307627/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=4745315009117307627' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/4745315009117307627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/4745315009117307627'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/02/la-ssdt-de-windows-intro-tech_21.html' title='La SSDT de Windows [INTRO] - TECH'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_tiiDCWOHW0k/Rd91S95bnkI/AAAAAAAAABk/h-3ZDbCHNLg/s72-c/system-b-parch_madness_suite.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-7405689050320877327</id><published>2007-02-17T15:13:00.000+01:00</published><updated>2007-02-21T13:07:23.799+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Sniffing'/><category scheme='http://www.blogger.com/atom/ns#' term='Ethernet'/><category scheme='http://www.blogger.com/atom/ns#' term='ARP'/><category scheme='http://www.blogger.com/atom/ns#' term='Réseau'/><title type='text'>Méthode de détection de Sniffer - TECH</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_tiiDCWOHW0k/RdXNr6Uf8WI/AAAAAAAAAAM/aEM8z1sr-Ms/s1600-h/6542-babasse-Spyboot3D.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 108px; height: 108px;" src="http://2.bp.blogspot.com/_tiiDCWOHW0k/RdXNr6Uf8WI/AAAAAAAAAAM/aEM8z1sr-Ms/s200/6542-babasse-Spyboot3D.png" alt="" id="BLOGGER_PHOTO_ID_5032154312929702242" border="0" /&gt;&lt;/a&gt;Il s'agit ici d'une pratique qui consiste à détecter l'utilisation frauduleuse d'outils de sniffing, qui permettent la capture et l'analyse de paquets de données émis sur un réseau compromis (pour d'éventuelles captures d'identifiants). La grande différence réside sur le fait que cette détection s'effectue au niveau réseau et non local, autrement dit, il est possible de détecter sur un poste distant l'utilisation éventuelle d'un sniffer. Pour mieux comprendre cet article, quelques connaissances de base sur les en-têtes Ethernet et ARP sont nécéssaires :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 204);font-size:85%;" &gt;Liens :&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.frameip.com/entete-arp/"&gt;En-tête ARP &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.frameip.com/entete-ethernet/"&gt;En-tête Ethernet &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;Le principe est basé sur une "défaillance" au niveau des kernels de plusieurs OS : Linux(2.2/2.4/2.6) et Windows(9x/Me/2k/NT4/XP). En effet, lors d'une résolution ARP, l'en-tête Ethernet est remplie de telle sorte que le paquet soit envoyé en broadcast, vers tous les postes présents sur le réseau : soit le champ &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;Destination&lt;/span&gt;&lt;span style="font-size:85%;"&gt; affecté de la valeur &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;FF:FF:FF:FF:FF:FF&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (BROADCAST), afin que l'adresse IP puisse être résolue.&lt;br /&gt;&lt;br /&gt;Et c'est précisement avec ce champ &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;Destination&lt;/span&gt;&lt;span style="font-size:85%;"&gt; que l'on peut parvenir à déterminer si un poste utilise un sniffer. Il faut savoir que pour un paquet réseau, notamment pour un paquet Ethernet, avant qu'il parvienne à la stack réseau de kernel du système, il passe par plusieurs "contrôles". Il passe déjà un contrôle &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;Hardware&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, autrement dit un filtrage sur le périphérique réseau, qui détermine si le paquet lui est destiné ou non.&lt;br /&gt;&lt;br /&gt;Dans le cas d'un paquet Ethernet envoyé en &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;broadcast&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, ces paquets passeront tous le filtrage de la carte réseau. Ils devront ensuite passer le contrôle &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;sofware&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, situé au niveau du noyau, et c'est à ce niveau précis que peut s'effectuer une différentiation.&lt;br /&gt;&lt;br /&gt;En effet, le filtrage noyau n'est pas "complet", autrement dit, un paquet failsifié avec comme champ ethernet destination de valeur &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;FF:FF:FF:FF:FF:FE&lt;/span&gt;&lt;span style="font-size:85%;"&gt; passe aussi bien le filtrage qu'un destination de valeur FF:FF:FF:FF:FF:FF. On voit donc que le paquet falsifié peut donc aisément contourner le filtrage SOFTWARE, mais logiquement il ne devrait pas passer le filtrage &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;hardware&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (celui-ci n'accepte que l'adresse &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;MAC&lt;/span&gt;&lt;span style="font-size:85%;"&gt; lui étant affectée en usine, ou l'adresse broadcast).&lt;br /&gt;&lt;br /&gt;C'est là qu'intervient le &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;Sniffing&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, en effet un sniffer a pour rôle de configurer la carté réseau en mode &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;Promiscuous&lt;/span&gt;&lt;span style="font-size:85%;"&gt;, un mode qui permet de capturer tous les paquets réseaux circulant sur le même noeud que le poste en question. Ce mode permet donc d'annuler en quelque sorte le filtrage hardware de la cartes réseau.&lt;br /&gt;&lt;br /&gt;Par conséquent, en associant les deux filtrages, et la défaillance au niveau kernel, on en déduit qu'un paquet Ethernet falsifié peut donc être traité par la stack réseau du système, passant ainsi les contrôles software et hardware, mais uniquement dans le cas où la carte réseau du poste distant est en mode promiscuous, autrement dit lorsqu'un sniffer est en marche sur la machine.&lt;br /&gt;&lt;br /&gt;Une technique pour détecter si un poste du réseau est en mode promiscuous, consiste à envoyer une série de paquets Ethernet embarquant de l'ARP, avec pour champ&lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt; destination&lt;/span&gt;&lt;span style="font-size:85%;"&gt; la valeur &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;FF:FF:FF:FF:FF:FE&lt;/span&gt;&lt;span style="font-size:85%;"&gt; (broadcast falsifié), et en incrémentant la valeur de l'adresse IP du champ &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;Target Internet Address&lt;/span&gt;&lt;span style="font-size:85%;"&gt; de l'en-tête ARP à chaque nouveau paquet envoyé. Ensuite, lors de l'écoute pour réceptionner des paquets, tout paquets ARP comportant pour valeur &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;reply&lt;/span&gt;&lt;span style="font-size:85%;"&gt; du champ &lt;/span&gt;&lt;span style="color: rgb(102, 102, 204);font-size:85%;" &gt;operation&lt;/span&gt;&lt;span style="font-size:85%;"&gt; de l'en-tête ARP, seront donc des réponses à notre envoi de paquets successifs.&lt;br /&gt;&lt;br /&gt;Il suffit juste par la suite de relever dans ces paquets REPLY la valeur de l'adresse IP Source et de l'adresse MAC Source des postes qui nous ont répondu, et de là on en déduit qu'un logiciel sniffer est en marche sur ces machines.&lt;br /&gt;&lt;br /&gt;Cette technique n'est pas très répandue sur internet, on trouve peu d'articles, néanmoins un article est disponible sur le site de SECURITY FRIDAY, qui en ont fait une implémentation : PromiScan.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(102, 102, 204);font-size:85%;" &gt;Liens :&lt;/span&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.securityfriday.com/promiscuous_detection_01.pdf"&gt;Detection Of Promiscuous Nodes&lt;/a&gt;&lt;/span&gt; &lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.securityfriday.com/products/promiscan.html"&gt;PromiScan &lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;L'auteur de cette découverte est un chercheur en sécurité, que l'on peut retrouver chez &lt;a style="color: rgb(102, 102, 204);" href="http://www.safe-protect.com/"&gt;Safe-Protect&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Prochain billet :  Windows et la SSDT&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-7405689050320877327?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/7405689050320877327/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=7405689050320877327' title='26 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/7405689050320877327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/7405689050320877327'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/02/mthode-de-dtection-de-sniffer-tech.html' title='Méthode de détection de Sniffer - TECH'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_tiiDCWOHW0k/RdXNr6Uf8WI/AAAAAAAAAAM/aEM8z1sr-Ms/s72-c/6542-babasse-Spyboot3D.png' height='72' width='72'/><thr:total>26</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-149191058067044531</id><published>2007-02-12T16:14:00.000+01:00</published><updated>2007-02-21T13:12:44.130+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='registre'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='protection'/><category scheme='http://www.blogger.com/atom/ns#' term='hooking'/><title type='text'>API Hooking avec Registry Guard - TECH</title><content type='html'>&lt;span style="font-size:85%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.customxp.net/images/PngFactory/png/_thumb/registre_kavel_divers.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 105px; height: 105px;" src="http://www.customxp.net/images/PngFactory/png/_thumb/registre_kavel_divers.png" alt="" border="0" /&gt;&lt;/a&gt;Première vraie publication, et cette fois-ci un petit programme.&lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);font-size:85%;" &gt; Registry Guard&lt;/span&gt;&lt;span style="font-size:85%;"&gt; est un petit projet que j'ai développé l'an dernier en C/C++ avec API Win32. Il consiste en une démonstration de API Hooking via une DLL, en utilisant la méthode dite &lt;/span&gt;&lt;span style="color: rgb(51, 51, 153);font-size:85%;" &gt;IAT Patching&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;br /&gt;&lt;br /&gt;En effet, ce programme a pour but de détouner les appels aux API ayant relation avec la base de registre windows, ceci n'est qu'une ébauche qui a pour but de démontrer ce concept et cette méthode de hooking, il n'est pas fini, de nombreuses modifications pourraient y être apportées. Donc le hooking agit au niveau utilisateur (user level), sûrement qu'une prochaine version en &lt;span style="color: rgb(51, 51, 153);"&gt;kernel-level &lt;span style="color: rgb(0, 0, 0);"&gt;(développement d'un driver) sera développée.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 153);"&gt;Liens :&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 153);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://touronster.free.fr/Blog/RG/rg_live.jpg"&gt;Screenshot&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 153);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;a href="http://touronster.free.fr/Blog/RG/reghook_src.zip"&gt;Code Source&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.cppfrance.com/codes/REGISTRY-GUARD-BETA_38646.aspx"&gt;CPPFrance&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 51, 153);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold; color: rgb(51, 51, 153);"&gt;Aussi :&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.internals.com/articles/apispy/apispy.htm"&gt;Documentation sur l'API Hooking&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.cert-ist.com/fra/ressources/Publications_ArticlesBulletins/Environnement_Microsoft/ApiHooking/"&gt;Autre documentation du CERT&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;&lt;a href="http://www.cppfrance.com/code.aspx?ID=34640"&gt;WinAPIOverride32&lt;br /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 51, 153);font-size:85%;" &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Aussi, une documentation technique est en cours d'écriture, concernant la méthode utilisée dans Registry Guard pour le hooking. N'hésitez pas à me contacter.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;P&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;rochain billet :   Détection de sniffing basée sur ARP&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-149191058067044531?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/149191058067044531/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=149191058067044531' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/149191058067044531'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/149191058067044531'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/02/registry-guard-demo-hook.html' title='API Hooking avec Registry Guard - TECH'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544441785418935190.post-6394975472862052868</id><published>2007-02-11T22:04:00.000+01:00</published><updated>2007-02-20T23:25:34.975+01:00</updated><title type='text'>Ouverture du blog</title><content type='html'>&lt;span style="font-size:85%;"&gt;Bonjour, 11/02/2007, début des vacances à Toulouse, et ouverture de mon premier blog orienté sur la sécu, des projets et des news sur ce sujet sont à venir, des bouts de code, des exemples, des articles, des papers techniques, des liens, et quelques unes de mes créations... revenez souvent.&lt;br /&gt;&lt;br /&gt;Bonne visite.&lt;br /&gt;&lt;br /&gt;PS :  petite nomenclature pour les billets:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;TECH correspond à un article Technique&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:85%;"&gt;NEWS pour des billets concernant l'actualité dans la sécu&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544441785418935190-6394975472862052868?l=touronster.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://touronster.blogspot.com/feeds/6394975472862052868/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544441785418935190&amp;postID=6394975472862052868' title='9 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/6394975472862052868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544441785418935190/posts/default/6394975472862052868'/><link rel='alternate' type='text/html' href='http://touronster.blogspot.com/2007/02/ouverture-du-blog.html' title='Ouverture du blog'/><author><name>Guillaume</name><uri>http://www.blogger.com/profile/18210579783247472189</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry></feed>
