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

<channel>
	<title>GarmedSecurity</title>
	<atom:link href="http://garmedsecurity.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://garmedsecurity.com</link>
	<description>Blog de dmedianero</description>
	<lastBuildDate>Mon, 04 Mar 2013 17:13:50 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>Técnicas de evasión de bloqueo y rooteo en dispositivos Android</title>
		<link>http://garmedsecurity.com/2013/03/tecnicas-de-evasion-de-bloqueo-y-rooteo-en-dispositivos-android/</link>
		<comments>http://garmedsecurity.com/2013/03/tecnicas-de-evasion-de-bloqueo-y-rooteo-en-dispositivos-android/#comments</comments>
		<pubDate>Mon, 04 Mar 2013 17:13:07 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Forensic]]></category>
		<category><![CDATA[adb]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[root]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=2478</guid>
		<description><![CDATA[A la hora de afrontar un análisis forense de dispositivos Android, una de las dificultades a las que nos enfrentamos es a que dicho dispositivo se encuentre bloqueado. En el siguiente artículo repasaremos las estratégias más utilizadas para evadir dicho bloqueo, incluyendo los tipos de elevación de privilegios, necesarios en muchas ocasiones. Para comenzar, habría [...]]]></description>
				<content:encoded><![CDATA[<p>A la hora de afrontar un análisis forense de dispositivos Android, una de las dificultades a las que nos enfrentamos es a que dicho dispositivo se encuentre bloqueado. En el siguiente artículo repasaremos las estratégias más utilizadas para evadir dicho bloqueo, incluyendo los tipos de elevación de privilegios, necesarios en muchas ocasiones.</p>
<p>Para comenzar, habría que repasar los 4 tipos de bloqueo del dispositivo que Android nos proporciona:</p>
<p><strong>Slide (none)</strong><span style="font-size: 13px; line-height: 19px;">. Es el modo más básico, simplemente realizando el gesto del desplazamiento el dispositivo quedará desbloqueado.</span></p>
<p><strong>Pattern lock. </strong>En este modo se proporciona un patrón sobre los puntos marcados que debe seguirse para conseguir el desbloqueo del dispositivo. El único requisito sobre dicho patrón es que contenga al menos el paso por 4 puntos.</p>
<p><strong>PIN</strong>. En este modo el usuario debe introducir un código numérico para desbloquear el dispositivo.  El único requisito sobre el PIN es que conste de al menos 4 digitos.</p>
<p><strong>Password</strong>. En este modo el usuario debe introducir con código alfanumérico para desbloquear el dispositivo.  El único requisito sobre la contraseña es que conste de al menos 4 caracteres.</p>
<p style="text-align: left;">Los modos de bloqueo pueden configurarse desde las opciones generales, en el apartado de seguridad, en la opción &#8220;Screen lock&#8221;, como podemos ver a continuación:</p>
<p><a href="http://blog.buguroo.com/wp-content/uploads/2013/03/1_tipos_bloqueo.jpeg"><img class="aligncenter" alt="1_tipos_bloqueo" src="http://blog.buguroo.com/wp-content/uploads/2013/03/1_tipos_bloqueo.jpeg" width="216" height="353" /></a></p>
<p>Una vez clasificados los tipos, vamos a enumerar las diferentes aproximaciones para evadir estas protecciones: </p>
<p><strong>Smudge Attacks</strong>. En esencia se trata de ver las marcas físicas sobre la pantalla del dispositivo. Aunque a priori parezca un tanto cojido con los pelos, el hecho de tomar una fotografía de la pantalla y jugar con los cambios de colores, brillos, ponerla en negativo y demás pueden tener resultados muy satisfactorios. En el siguiente papper detallan esta aproximación desde una manera formal: <a title="Smudge Attacks" href="http://static.usenix.org/event/woot10/tech/full_papers/Aviv.pdf">http://static.usenix.org/event/woot10/tech/full_papers/Aviv.pdf</a><br />
<strong>Pattern Lock Crack</strong> Evadir esta protección es muy sencilla solo si se tiene acceso al modo debug del dispositivo rooteado. En patrón se almacena en el dispositivo en forma de hash en el fichero <em><strong>/data/system/gesture.key</strong></em>, como podemos ver a continuación:</p>
<p style="text-align: center;"><a href="http://blog.buguroo.com/wp-content/uploads/2013/03/2_gesturekey.jpeg"><img class="aligncenter  wp-image-10901" alt="2_gesturekey" src="http://blog.buguroo.com/wp-content/uploads/2013/03/2_gesturekey.jpeg" width="452" height="53" /></a></p>
<p>Si tenemos acceso ADB de root, podemos eliminar el fichero y crear uno nuevo vacío: <code> </code></p>
<blockquote><p>rm gesture.key<br />
touch gesture.key</p></blockquote>
<p>A partir de ese momento, cualquier gesto desbloqueará el dispositivo. Si no tenemos acceso al modo debug, es posible a través de la interfaz JTAG, el proceso está descrito en el siguiente enlace:<br />
<a href="http://forensics.spreitzenbarth.de/2012/02/28/cracking-the-pattern-lock-on-android/">http://forensics.spreitzenbarth.de/2012/02/28/cracking-the-pattern-lock-on-android/</a> </p>
<p><strong>Password Crack &amp;&amp; PIN Crack</strong> Evadir estas protecciones es muy sencillo solo si se tiene acceso al modo debug del dispositivo rooteado. La contraseña y/o PIN se almacena en el dispositivo en forma de hash en el fichero <em><strong>/data/system/password.key</strong></em>, como podemos ver a continuación:</p>
<p style="text-align: center;"><a href="http://blog.buguroo.com/wp-content/uploads/2013/03/3_passwordkey.jpeg"><img class="aligncenter  wp-image-10921" alt="3_passwordkey" src="http://blog.buguroo.com/wp-content/uploads/2013/03/3_passwordkey.jpeg" width="650" height="70" /></a></p>
<p>Si tenemos acceso ADB de root, podemos eliminar el fichero y crear uno nuevo vacío:</p>
<blockquote><p>rm password.key<br />
touch password.key</p></blockquote>
<p>A partir de ese momento, cualquier contraseña y/o PIN desbloqueará el dispositivo.<br />
La gracia visto lo visto es tener el dispositivo rooteado, pero rootear un dispositivo en el transcurso de un análisis forense entraña dificultades en el proceso, ya que el principio fundamental es que las modificaciones de la envidencia tiendan a cero. Vamos a repasar el proceso.<br />
Lo primero al acceder a un dispositivo es saber si somos root en el mismo, tal vez el usuario lo tiene rooteado. ¿Cómo saberlo manipulando lo menos posible el dispositivo? Lo más sencillo es conectar al mismo mediante ADB y ejecutar la siguiente sentencia:</p>
<blockquote><p>adb shell su</p></blockquote>
<p>Si como respuesta entramos a la shell, somos root, si obtenemos un &#8220;<em><strong>Permision denied</strong></em>&#8221; nos lo tenemos que ganar. Antes que nada, no pensemos que ser o no root es algo abosluto, en entornos Android tenemos diferentes tipos de rooteo, y no todos tienen las mismas implicaciones desde el punto de vista forense, por lo que debemos evaluar en cada caso cuál necesitamos y actuar en consecuencia.</p>
<p><strong>Root permanente</strong>. Es el más habitual. Entramos al dispositivo y somos root, ¿porqué? Normalmente es así porque se ha habilitado alguna ROM personalizada o se le han proporcionado al dispositivo binarios ARM para comandos como &#8220;<em><strong>su</strong></em>&#8220;. La referencia es <a title="XDA Developers" href="http://www.xda-developers.com/">XDA Developers.</a></p>
<p><strong>Root temporal</strong>. Se elevan privilegios solo hasta el renicio, normalmente tras aprovechar una vulnerabilidad en ejecución. Esta forma es ideal desde el punto de vista práctico, si bien entraña riesgos porque se va a modificar en dinámico, puede causar inestabilidad y aprovechar vulnerabilidades para elevar privilegios puede ser muy discutido desde el punto de vista del proceso.</p>
<p>A continuación indico un par de aplicaciones para conseguir este objetivo:</p>
<p><em>psneuter</em>. Aplicación que gana acceso a root utilizando una vulnerabilidad en Android. <a href="https://github.com/tmzt/g2root-kmod/tree/master/scotty2/psneuter">https://github.com/tmzt/g2root-kmod/tree/master/scotty2/psneuter</a></p>
<p><em>SuperOneClick</em>. Aplicación que reune múltiples exploits para rootear el dispositivo. <a href="http://shortfuse.org/?page_id=2">http://shortfuse.org/?page_id=2</a></p>
<p><em>Mercury</em>. Este framework de análisis dinámico incorpora exploits para rootear el dispositivo. <a href="http://labs.mwrinfosecurity.com/tools/2012/03/16/mercury/">http://labs.mwrinfosecurity.com/tools/2012/03/16/mercury/</a></p>
<p><strong>Root recovery</strong>. En este modo se habilita una particion de recuperación en el dispositivo que permite el acceso privilegiado solo cuando se carga dicha partición. Este tipo de rooteo es el más indicado para procedimientos forenses. La problemática es que cada fabricante maneja las particiones de recuperación de una manera diferente y en algunos casos no será trivial. A continuación dejo, por cortesía de <a href="https://twitter.com/hidark">@hidark</a>, a modo de ejemplo el proceso para el modelo <a href="http://www.asus.es/Eee/Eee_Pad/Eee_Pad_Transformer_TF101/">ASUS Transformer TF101</a>:</p>
<p>Arrancamos el dispositivo presionando los botones &#8220;<em>power</em>&#8221; y &#8220;<em>subir volumen</em>&#8220;, no ves nada en la pantalla, pero si la tienes conectada al PC puedes apreciar con un &#8220;dmesg&#8221; desde el PC que el dispositivo entró en modo APX:</p>
<p style="text-align: center;"><a href="http://blog.buguroo.com/wp-content/uploads/2013/03/5_apx_transformer.jpeg"><img class="aligncenter  wp-image-11031" alt="5_apx_transformer" src="http://blog.buguroo.com/wp-content/uploads/2013/03/5_apx_transformer.jpeg" width="553" height="99" /></a></p>
<p>Después ya se puede cargar un bootloader específico mediante wheelie (<a href="http://androidroot.mobi/2012/05/27/introducing-wheelie-nvflash-for-asus-transformer-tf101-b70/">http://androidroot.mobi/2012/05/27/introducing-wheelie-nvflash-for-asus-transformer-tf101-b70/</a>) y extraer las particiones mediante nvflash (<a href="http://forum.xda-developers.com/showthread.php?t=1676845">http://forum.xda-developers.com/showthread.php?t=1676845</a>). </p>
<p>Es importante tener en cuenta que este método ha de ser probado previamente en entorno de laboratorio para que la ejecución sobre la evidencia sea lo más limpia posible.</p>
<p>&#8211;</p>
<p><a href="https://twitter.com/dmedianero">Daniel Medianero</a></p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2013/03/tecnicas-de-evasion-de-bloqueo-y-rooteo-en-dispositivos-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hard and Soft Links in Windows 7</title>
		<link>http://garmedsecurity.com/2012/01/2267/</link>
		<comments>http://garmedsecurity.com/2012/01/2267/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 16:45:58 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Forensic]]></category>
		<category><![CDATA[SSOO]]></category>
		<category><![CDATA[hard]]></category>
		<category><![CDATA[link]]></category>
		<category><![CDATA[soft]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=2267</guid>
		<description><![CDATA[Hoy hablaremos de enlaces simbólicos y de enlaces duros. Pero nos centraremos en Windows 7. Efectivamente, aunque su uso no está muy extendido el sistema de Redmond tiene esta capacidad. Para ilustarla, mostraremos cómo crear estos enlaces y después, mediante procedimientos forenses, veremos en qué consiste cada uno de ellos. Enlaces duros (Hard Links) Un [...]]]></description>
				<content:encoded><![CDATA[<p>Hoy hablaremos de enlaces simbólicos y de enlaces duros. Pero nos centraremos en Windows 7. Efectivamente, aunque su uso no está muy extendido el sistema de Redmond tiene esta capacidad. Para ilustarla, mostraremos cómo crear estos enlaces y después, mediante procedimientos forenses, veremos en qué consiste cada uno de ellos.</p>
<p><strong>Enlaces duros (Hard Links)</strong></p>
<p>Un enlace duro o hard link es una copia total del fichero, entendiendo por total la copia de los metadatos asociados. En el caso de Windows 7 nos estamos refiriendo a la MFT (Master File Table) del fichero.</p>
<p>Imaginemos que tenemos un fichero llamado &#8220;<em>fichero.txt</em>&#8221; y queremos hacer un hard link, lo ejecutaríamos con el siguiente comando:</p>
<p><a href="http://blog.buguroo.com/wp-content/uploads/2012/01/11.jpeg"><img class="aligncenter" title="Hard Link" src="http://blog.buguroo.com/wp-content/uploads/2012/01/11-300x50.jpg" alt="" width="300" height="50" /></a></p>
<p>Como resultado tenemos un enlace duro en el fichero &#8220;<em>hard_link.txt</em>&#8221;</p>
<p><strong>Enlaces simbólicos (Soft Links)</strong></p>
<p>El enlace simbólico es un enlace al fichero original, no una copia del mismo. Imaginemos que tenemos un fichero llamado &#8220;<em>fichero.txt</em>&#8221; y queremos hacer un soft link, lo ejecutaríamos con el siguiente comando:</p>
<p><a href="http://blog.buguroo.com/wp-content/uploads/2012/01/12.jpeg"><img class="aligncenter" title="soft link" src="http://blog.buguroo.com/wp-content/uploads/2012/01/12-300x28.jpg" alt="" width="300" height="28" /></a></p>
<p>Como podemos apreciar en la imágen, no se ha creado por falta de permisos.Esto es debido a que ciertas aplicaciones no se comportan de manera segura en presencia de enlaces simbólicos, por lo que la creación de estos enlaces requiere el privilegio &#8220;SeCreateSymbolicLink&#8221;.</p>
<p>Lo ejecutamos desde una consola con privilegios de administración:</p>
<p><a href="http://blog.buguroo.com/wp-content/uploads/2012/01/13.jpeg"><img class="aligncenter" title="soft link" src="http://blog.buguroo.com/wp-content/uploads/2012/01/13-300x47.jpg" alt="" width="300" height="47" /></a></p>
<p>Como resultado tenemos un enlace duro en el fichero &#8220;<em>hard_link.txt</em>&#8220;. Si abrimos la carpeta que contiene los ficheros podemos apreciar algunas diferencias a simple vista:</p>
<p><a href="http://blog.buguroo.com/wp-content/uploads/2012/01/14.jpeg"><img class="aligncenter" title="explorador" src="http://blog.buguroo.com/wp-content/uploads/2012/01/14-300x88.jpg" alt="" width="300" height="88" /></a></p>
<p>Pero vamos a ver las implicaciones de manea forense. Es por ello que tomamos evidencia de toda la carpeta (miento, en realidad de una unidad NTFS que contiene dicha carpeta). Para ello utilizé la herramienta <a title="FTK Imager" href="http://accessdata.com/support/adownloads">FTK Imager</a> y el contenedor forense AFF (Advanced Forensic Format). Mi evidencia forense es el fichero &#8220;<em>links_w7.aff</em>&#8220;, que tiene la siguiente información:</p>
<blockquote><p>Created By AccessData® FTK® Imager 3.0.1.1467 110406</p>
<p>Case Information:<br />
Acquired using: ADI3.0.1.1467<br />
Case Number: Ejemplo hard and soft links<br />
Evidence Number: 001<br />
Unique description: links_w7<br />
Examiner: dmedianero<br />
Notes: Ejemplo hard and soft links</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>Information for C:\tmp\links_w7:</p>
<p>Physical Evidentiary Item (Source) Information:<br />
[Drive Geometry]<br />
Bytes per Sector: 512<br />
Sector Count: 18.432<br />
Source data size: 9 MB<br />
Sector count:    18432<br />
[Computed Hashes]<br />
MD5 checksum:    03d6fb63927ce8df2697a2ece063b13d<br />
SHA1 checksum:   d4717b8960afd3bb7bb07556cf2877a73855c180</p>
<p>Image Information:<br />
Acquisition started:   Thu Jan 05 16:40:53 2012<br />
Acquisition finished:  Thu Jan 05 16:40:56 2012<br />
Segment list:<br />
C:\tmp\links_w7.aff</p></blockquote>
<p>Para analizar la evidencia utilizaremos la conocida suite <a title="Sleuthkit" href="http://www.sleuthkit.org/">Sleuthkit</a>. Antes que nada, vamos a fijarnos en la MFT del fichero original, el fichero &#8220;fichero.txt&#8221;:</p>
<blockquote><p>$STANDARD_INFORMATION Attribute Values:<br />
Flags: Archive<br />
Owner ID: 0<br />
Security ID: 260  ()<br />
Created:        Thu Jan  5 16:37:16 2012<br />
File Modified:  Thu Jan  5 16:37:16 2012<br />
MFT Modified:   Thu Jan  5 16:37:27 2012<br />
Accessed:       Thu Jan  5 16:37:16 2012</p>
<p>$FILE_NAME Attribute Values:<br />
Flags: Archive<br />
Name: hard_link.txt, fichero.txt<br />
Parent MFT Entry: 5     Sequence: 5<br />
Allocated Size: 0       Actual Size: 0<br />
Created:        Thu Jan  5 16:37:16 2012<br />
File Modified:  Thu Jan  5 16:37:16 2012<br />
MFT Modified:   Thu Jan  5 16:37:16 2012<br />
Accessed:       Thu Jan  5 16:37:16 2012</p></blockquote>
<p>Notese que la salida está limitada a los atributos $Standard_Information y $File_Name por claridad. Contrastemos dichos datos con la MFT de nuestro enlace duro o hard link:</p>
<blockquote><p>$STANDARD_INFORMATION Attribute Values:<br />
Flags: Archive<br />
Owner ID: 0<br />
Security ID: 260  ()<br />
Created:        Thu Jan  5 16:37:16 2012<br />
File Modified:  Thu Jan  5 16:37:16 2012<br />
MFT Modified:   Thu Jan  5 16:37:27 2012<br />
Accessed:       Thu Jan  5 16:37:16 2012</p>
<p>$FILE_NAME Attribute Values:<br />
Flags: Archive<br />
Name: hard_link.txt, fichero.txt<br />
Parent MFT Entry: 5     Sequence: 5<br />
Allocated Size: 0       Actual Size: 0<br />
Created:        Thu Jan  5 16:37:16 2012<br />
File Modified:  Thu Jan  5 16:37:16 2012<br />
MFT Modified:   Thu Jan  5 16:37:16 2012<br />
Accessed:       Thu Jan  5 16:37:16 2012</p></blockquote>
<p>Como podemos apreciar es exactamente la misma MFT. A continuación mostramos la MFT del enlace simbólico &#8220;soft_link.txt&#8221;:</p>
<blockquote><p>$STANDARD_INFORMATION Attribute Values:<br />
Flags: Archive, Reparse Point<br />
Owner ID: 0<br />
Security ID: 264  ()<br />
Created:        Thu Jan  5 16:38:09 2012<br />
File Modified:  Thu Jan  5 16:38:09 2012<br />
MFT Modified:   Thu Jan  5 16:38:09 2012<br />
Accessed:       Thu Jan  5 16:38:09 2012</p>
<p>$FILE_NAME Attribute Values:<br />
Flags: Archive<br />
Name: soft_link.txt<br />
Parent MFT Entry: 5     Sequence: 5<br />
Allocated Size: 0       Actual Size: 0<br />
Created:        Thu Jan  5 16:38:09 2012<br />
File Modified:  Thu Jan  5 16:38:09 2012<br />
MFT Modified:   Thu Jan  5 16:38:09 2012<br />
Accessed:       Thu Jan  5 16:38:09 2012</p></blockquote>
<p>Como podíamos esperar todos los timestamps son posteriores. Un análisis pormenorizado nos llevaría a descubrir que en el soft link el atributo $Data ocupa 0 bytes, esto se debe, logicamente, a que es un enlace, no tiene contenido propio. La manera de &#8220;enlazar&#8221; se hace a través del atributo $Reparse_point, cuyo contenido muestro a continuación:</p>
<blockquote>
<pre>00000000:  0C00 00A0 3800 0000 1600 1600 0000 1600    ....8...........
00000010:  0100 0000 6600 6900 6300 6800 6500 7200    ....f.i.c.h.e.r.
00000020:  6F00 2E00 7400 7800 7400 6600 6900 6300    o...t.x.t.f.i.c.
00000030:  6800 6500 7200 6F00 2E00 7400 7800 7400    h.e.r.o...t.x.t.</pre>
</blockquote>
<p>Asique ya sabéis, los enlaces duros y simbólicos existen en Windows y aunque apenas sean utilizados, no por ello dejan de ser interesantes.</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2012/01/2267/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cómo ejecutar análisis estático de aplicaciones (apk) en Android</title>
		<link>http://garmedsecurity.com/2011/08/como-ejecutar-analisis-estatico-de-aplicaciones-apk-en-android/</link>
		<comments>http://garmedsecurity.com/2011/08/como-ejecutar-analisis-estatico-de-aplicaciones-apk-en-android/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 15:50:25 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Forensic]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[analisys]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dalvik]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[static]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=665</guid>
		<description><![CDATA[Hoy vamos a tratar un tema que está ganando popularidad en el ámbito del análisis estático de código, se trata de la auditoría de aplicaciones en Android. Como muchos sabéis una aplicación en Android está programada en JAVA por lo que se podría pensar (equivocadamente) que en esencia el análisis de código es un análisis [...]]]></description>
				<content:encoded><![CDATA[<p>Hoy vamos a tratar un tema que está ganando popularidad en el ámbito del análisis estático de código, se trata de la auditoría de aplicaciones en Android. Como muchos sabéis una aplicación en Android está programada en JAVA por lo que se podría pensar (equivocadamente) que en esencia el análisis de código es un análisis tradicional de JAVA. Esto no es así ya que han de tenerse en cuenta tanto la arquitectura de Android (Intents, Broadcast, Estados, etc) como la API SDK de interacción con los dispositivos (funciones de GPS, SMS, 3G, Escritura en SD, etc). Es decir, cambian dos aspectos fundamentales respecto al análisis tradicional de JAVA: los sinks y el dataflow.</p>
<p>El enfoque en el presente artículo no es hablar del análisis en sí (lo haremos próximamente) sino sobre cómo poder realizarlo sin tener las fuentes originales. Como es bien sabido, muy pocas aplicaciones en el Market oficial son OpenSource, por lo que el código no está disponible. Sin embargo si que podemos acceder a los ficheros apk, ya que son copiados a los dispositivos en la ruta &#8220;<strong>/data/apk</strong>&#8220;. En esta ruta se copian todas las aplicaciones que tenga instaladas el dispositivo (también las que se compran, antes del refund como bien sabe <a title="hidark twitter" href="https://twitter.com/#!/hidark">@hidark</a> <img src='http://garmedsecurity.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). </p>
<p>Tenemos por tanto acceso a la aplicación apk, ¿de qué nos sirve? la extensión apk es una variante de jar, por lo que podemos extraerla con la genial herramienta <a href="http://code.google.com/p/android-apktool" title="apktool">apktool</a>. Para ello seguiremos los siguientes pasos:</p>
<p><strong>1. Obtención del fichero AndroidManifest.xml</strong><br />
Para obtener este fichero a través del apk utilizamos la herramienta apktool con la opción <strong>b.</strong><br />
Este fichero contiene información esencial acerca de la aplicación. Para nuestra tarea la parte que nos interesa es la referente a los permisos que requiere, contenidos en el <a href="http://developer.android.com/guide/topics/manifest/uses-permission-element.html" title="uses-permission">apartado uses-permission</a>. Para una completa comprensión recomiendo leer la <a href="http://developer.android.com/guide/topics/manifest/manifest-intro.html" title="Manifest">amplia documentación oficial al respecto</a>.</p>
<p><strong>2. Adquirir el fichero jar</strong><br />
Para ello nos servimos de la herramienta <a href="http://code.google.com/p/dex2jar" title="dex2jar">dex2jar</a>. El funcionamiento de esta herramienta es el siguiente: traduce el fichero .dex (ejecutable de dalvik byetcode) a un fichero jar corriente.</p>
<p><strong>3. Extraer el fichero jar</strong><br />
Es tan sencillo como utilizar un descompresor normal y corriente.</p>
<p><strong>4. Acceso al código fuente</strong><br />
Al seguir el paso tres tendremos un directorio con ficheros .class de JAVA, los cúales pueden traducirse en sus .java correspondientes a través de herramientas como <a href="ttp://www.varaneckas.com/jad" title="JAD">JAD</a>, o incluso visualizarse directamente mediante herramientas como <a href="http://java.decompiler.free.fr/?q=jdgui" title="JD-GUI">JD-GUI</a>.</p>
<p>Hay que destacar que al hacer la decompilación se pierde mucha información, como nombre de variables, lo que dificulta el análisis manual del código. Normalmente se suele empezar por identificar ciertas funciones susceptibles de mal uso (funciones sink) y seguir el dataflow manualmente a través de entornos de desarrollo (Eclipse, NetBeans, etc).</p>
<p>Como hacer muchas veces lo mismo sin automatizar es pecado he preparado un pequeño script en bash que hace todo el proceso de manera automática, esto es:</p>
<p>1. Se definen en una variable del script las funciones que queremos localizar en el código JAVA resultante.<br />
2. Se ejecuta el script, que recibe dos parámetros: el fichero apk y directorio de salida<br />
3. Decompila el apk, extrae los permisos y ejecuta el grep análisis, dejando la salida en el fichero output.txt. Adicionalmente deja el código decompilado en el directorio de salida para su posterior revisión manual.</p>
<p>El script precisa logicamente tener instalado <a href="http://code.google.com/p/android-apktool" title="apktool">apktook</a>, <a href="http://code.google.com/p/dex2jar" title="dex2jar">dex2jar</a> y <a href="http://www.varaneckas.com/jad" title="jad">jad</a> con los ejecutables en el path.<br />
Está probado en Fedora, si hay algún problema por favor notificármelo a <a href="mailto:dmedianero@buguroo.com" title="dmedianero@buguroo.com">dmedianero@buguroo.com</a><br />
Podéis descargarlo desde el siguiente enlace:</p>
<p><a href="http://pastebin.com/SBu0bfky" title="bugdroid">http://pastebin.com/SBu0bfky<br />
</a></p>
<p>Un saludo !!</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/08/como-ejecutar-analisis-estatico-de-aplicaciones-apk-en-android/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WASC Static Analysis Tool Evaluation Criteria</title>
		<link>http://garmedsecurity.com/2011/08/wasc-static-analysis-tool-evaluation-criteria/</link>
		<comments>http://garmedsecurity.com/2011/08/wasc-static-analysis-tool-evaluation-criteria/#comments</comments>
		<pubDate>Wed, 17 Aug 2011 09:02:01 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Pentest]]></category>
		<category><![CDATA[SATEC]]></category>
		<category><![CDATA[static analysis]]></category>
		<category><![CDATA[WASC]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=578</guid>
		<description><![CDATA[Uno de los inconvenientes a la hora de decidirse por el uso de una herramienta de análisis de código estático es cómo evaluarla. El primer acercamiento es siempre el mismo: la que más detecte. Cuando ya te has estrujado los sesos mediante la arcaica técnica de &#8220;a prueba y error&#8221; te das cuenta de que [...]]]></description>
				<content:encoded><![CDATA[<p>Uno de los inconvenientes a la hora de decidirse por el uso de una herramienta de análisis de código estático es cómo evaluarla. El primer acercamiento es siempre el mismo: la que más detecte.<br />
Cuando ya te has estrujado los sesos mediante la arcaica técnica de &#8220;<em>a prueba y error</em>&#8221; te das cuenta de que la decisión depende completamente de lo que uno espere de la herramienta. Los auditores solemos ponernos en el lado del atacante, por lo que primamos la presencia de falsos positivos para evitar la presencia de falsos negativos. Que la herramienta detecte &#8220;<em>todo</em>&#8220;. que ya nosotros descartaremos lo que corresponda.</p>
<p>Como todo en la vida, visto en perspectiva se gana en claridad. Cuando entras en ecosistemas de cliente te das cuenta de que en multitud de ocasiones no entienden correctamente la implicación de las vulnerabilidades a pesar de que se les indiquen con exactitud las líneas, ficheros, etc y que aunque sean programadores no van a ser capaces de discernir un falso positivo de una vulnerabilidad real. De todo esto surge una importante duda: ¿cómo actuar?<br />
La respuesta es obvia: hay que ser flexible y permitir una parametrización que haga útil la herramienta a ambos tipos de usuarios. Problema resuelto, ¿o no?</p>
<p>Aún con los criterios definidos tomar la decisión de qué herramienta utilizar sigue siendo complicado. ¿cómo comparo varias herramientas? está claro que en el caso de las OpenSource tengo acceso a las mismas y puedo probar multitud de códigos con ellas, aún así salvo que tenga un análisis manual con qué comparar no puedo establecer un marco técnico unificado, y además extrapolar resultados de un puñado de códigos concretos no aporta una visibilidad real de la calidad técnica de una herramienta.<br />
Cada vez el agujero es más profundo, ¿debemos pensar en dejar de cavar? No, de hecho hay más miga, pensemos en que como indicabamos al principio, el criterio de valoración de una herramienta no debe consistir únicamente en la detección. De cara a que sea útil en los ecosistemas cliente hay un puñado de requerimientos importantes que no deben menospreciarse: integración de la misma en el ciclo de desarrollo, apoyo a la corrección de las vulnerabilidades detectadas, gestión de los resultados, parametrización de los informes, creación de reglas personalizadas y un largo etcétera.</p>
<p>Desde la organización <a href="http://www.webappsec.org/" title="WASC">WASC</a> (<em>Web Application Security Consortium</em>) han iniciado un proyecto para definir un criterio de evaluación de herramientas de análisis estático que tenga en cuenta estos requerimientos, se trata del <a href="http://projects.webappsec.org/w/page/41188978/Static%20Analysis%20Tool%20Evaluation%20Criteria" title="SATEC">SATEC</a> (<em>Static Analysis Tool Evaluation Criteria</em>). Desde <a href="http://buguroo.com" title="buguroo">buguroo</a> apoyamos estas iniciativas y formamos parte de las mismas.</p>
<p>Hasta el momento hay definido <a href="http://projects.webappsec.org/w/page/42093482/Static%20Analysis%20Tool%20Evaluation%20Criteria%20Workingand" title="Draft SATEC">un pequeño borrador</a> con las categorías, aunque por el momento está en fase muy alpha. Para apoyar el proyecto reomendamos seguir la <a href="http://lists.webappsec.org/mailman/listinfo/wasc-satec_lists.webappsec.org" title="SATEC MailList">lista de correo</a> creada a tal efecto, y estar atento al <a href="http://twitter.com/#!/wascupdates" title="twitter WASC">twitter ofifical de WASC</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/08/wasc-static-analysis-tool-evaluation-criteria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Parametrizando</title>
		<link>http://garmedsecurity.com/2011/06/parametrizando/</link>
		<comments>http://garmedsecurity.com/2011/06/parametrizando/#comments</comments>
		<pubDate>Mon, 27 Jun 2011 18:17:28 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Pentest]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Prepared]]></category>
		<category><![CDATA[sql inyection]]></category>
		<category><![CDATA[sqli]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=574</guid>
		<description><![CDATA[En los últimos artículos sobre SQL Injection hemos tratado siempre de dejar claro que uno de los métodos más eficaces para solventar este tipo de vulnerabilidades es realizar consultas parametrizadas. Si bien hemos querido dejar claro que hay que prestar atención a la implementación, puesto que el simple hecho de parametrizar no es efecitvo (no solo es hacerlo, [...]]]></description>
				<content:encoded><![CDATA[<div>
<p>En los últimos <a href="http://blog.buguroo.com/?tag=sql-injection">artículos sobre SQL Injection</a> hemos tratado siempre de dejar claro que uno de los métodos más eficaces para solventar este tipo de vulnerabilidades es <a href="http://blog.buguroo.com/?tag=preparedstatement">realizar consultas parametrizadas</a>.<br />
Si bien hemos querido dejar claro que <a href="http://blog.buguroo.com/?p=304">hay que prestar atención a la implementación</a>, puesto que el simple hecho de parametrizar no es efecitvo (no solo es hacerlo, es hacerlo bien).</p>
<p>Hoy quiero transmitir una idea clara, que no debe caer como una losa sobre los programadores, pero debe ser tenida en cuenta: <strong>No siempre es posible parametrizar</strong>. ¿Porqué?<br />
Las consultas parametrizadas o prepared statements solo sirven para datos, no funcionan en identificadores SQL o keywords. Es por ello que consultas como las siguientes pueden ser parametrizadas:</p>
<p>SELECT * FROM items WHERE producto = ?<br />
SELECT * FROM items WHERE producto LIKE ? ORDER BY precio</p>
<p>Mientras que consultas como estas otras no:</p>
<p><em><strong><code>SELECT * FROM ? WHERE producto = 'ebook'<br />
SELECT * FROM items WHERE producto LIKE 'parametro%' ORDER BY ?</code></strong></em></p>
<p>Tras ver esto la pregunta es obvia, si tengo una consulta que no puedo parametrizar, ¿qué hago? La respuesta no es simple ni genérica. Lo primero que hay que fijarse es en la consulta, ¿es necesario hacerla así? ¿puede reescribirse de manera que sí lo sea?<br />
Mi recomendación personal en caso de que no lo sea es que el parámetro que va a formar parte de la consulta y que constituye un keyword o identificador SQL sea &#8220;mapeado&#8221;, esto es, que a ser posible se controle como un entero y que se transforme en el dato deseado a través de dicho mapeo.</p>
</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/06/parametrizando/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ofuscando ataques SQLi</title>
		<link>http://garmedsecurity.com/2011/05/ofuscando-ataques-sqli/</link>
		<comments>http://garmedsecurity.com/2011/05/ofuscando-ataques-sqli/#comments</comments>
		<pubDate>Thu, 26 May 2011 09:50:26 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Pentest]]></category>
		<category><![CDATA[null byte]]></category>
		<category><![CDATA[obfuscation]]></category>
		<category><![CDATA[sql injection]]></category>
		<category><![CDATA[sqli]]></category>
		<category><![CDATA[unicode]]></category>
		<category><![CDATA[waf]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=571</guid>
		<description><![CDATA[Hoy repasaremos algunas técnicas de ofuscación de ataques. ¿Para qué es necesario ofuscar los ataques? En caso de filtrado, IDSs o WAFS puede ser la única manera de realizar con éxito una intrusión. Adicionalmente con estas técnicas dificultamos el análisis de las actuaciones a posteriori, ya que los logs serán más trabajosos de seguir. Repasaremos [...]]]></description>
				<content:encoded><![CDATA[<p>Hoy repasaremos algunas técnicas de ofuscación de ataques. ¿Para qué es necesario ofuscar los ataques? En caso de filtrado, IDSs o WAFS puede ser la única manera de realizar con éxito una intrusión. Adicionalmente con estas técnicas dificultamos el análisis de las actuaciones a posteriori, ya que los logs serán más trabajosos de seguir.</p>
<p>Repasaremos brevemente algunas de las técnicas más utilizadas en aplicativos web, centrándonos en ataques de tipo SQLi.</p>
<p><strong>+ Aprovechando case sensitive</strong></p>
<p>El filtrado más rudimentario es aquel basado en los caracteres utilizados. Normalmente las bases de datos son case-insensitive por lo que el resultado de las consultas, en el caso particular de ataques SQLi, no se verá afectado:</p>
<p><code><em><strong>Payload normal:</strong></em> ' or es_admin=1 --<br />
<em><strong>Payload ofuscado: </strong></em>' oR eS_aDmIn=1 --</code></p>
<p>Parece muy simple y tonto, pero esta técnica aún funciona en determinados sitios.</p>
<p><strong>+ Aprovechando comentarios inline</strong></p>
<p>En algunas ocasiones los filtros están basados en una sucesión de &#8220;or&#8221; (|| en el código) con los tags de la lista negra comparados, por limpieza de código el desarrollador añade un espacio entre estas sentencias sin darse cuenta de que ese espacio compromete la seguridad de su filtro. Vemos un estracto del código de filtrado:</p>
<p><code>stristr($variable, 'INSERT') || stristr($variable, 'UNION') || .......</code></p>
<p>Gracias a los comentarios inline es posible evadir este filtrado, lo vemos a continuación:</p>
<p><code><em><strong>Payload normal:</strong></em> ' or es_admin=1 --<br />
<em><strong>Payload ofuscado:</strong></em> '/**/or/**/es_admin=1/**/--</code></p>
<p>Notese que al introducir comentarios inline nos evitamos tener que utilizar espacios en la sentencia.</p>
<p><strong>+ Aprovechando ejecución dinámica de consultas<br />
</strong><br />
La ejecución dinámica de consultas es una característica de las BBDD que las permite recibir un string que contiene la consulta dentro de una función de la base de datos que ejecuta dicha consulta. Leído así uno no se entera de nada. La explicación es más simple, la base de datos recibe un string que aparentemente no es una consulta, pero que en ejecución se &#8220;transforma&#8221; en consulta.<br />
Con un ejemplo mejor, pensemos en ORACLE, si introducimos la siguiente sentencía:</p>
<p><code>'IN'||'SERT' </code></p>
<p>Es un string que no contiene una consulta, es al ejecutarse dinámicamente cuando la base de datos realiza la concatenación que tiene como resultado una consulta. Como ya imaginaréis esta funcionalidad se utiliza para evadir filtros.</p>
<p><code><strong><em>En MySQL:</em></strong> 'IN' 'SERT'<br />
<strong><em>En MS-SQL:</em></strong> 'IN'+'SERT</code>&#8216;</p>
<p>Otra variante muy utilizada es el uso de la función CHAR. Esta función recibe un número y en ejecucion se &#8220;transforma&#8221; en el caracter ASCII correspondiente a dicha tabla, por ejemplo:</p>
<p><code>CHAR(73)+CHAR(78)+CHAR(83)+CHAR(69)+CHAR(82)+CHAR(84)</code></p>
<p>Equivale a INSERT. Hay que tener en cuenta que en ORACLE esta función se invoca con CHR en lugar de CHAR. Por otro lado esta es una de las muchas funciones que pueden utilizarse, hay muchas (SUBSTR, TRANSLATE, etc)</p>
<p>+<strong> Aprovechando URL Encoding</strong></p>
<p>Es uno de los métodos más conocidos, hay muchas herramientas automáticas que nos permiten traducir nuestras consultas a encoding URL, UTF-8, etc, dejo algunos enlaces útiles:</p>
<p><a href="http://www.w3schools.com/TAGS/ref_urlencode.asp">http://www.w3schools.com/TAGS/ref_urlencode.asp</a><br />
<a href="https://www.owasp.org/index.php/Category:OWASP_CAL9000_Project">https://www.owasp.org/index.php/Category:OWASP_CAL9000_Project</a><br />
<a href="https://addons.mozilla.org/es-ES/firefox/addon/hackbar/">https://addons.mozilla.org/es-ES/firefox/addon/hackbar/</a></p>
<p><strong>+ Aprovechando Null Bytes<br />
</strong><br />
Esta técnica está enfocada a evadir WAFS. Los firewalls de aplicación tienden a estar programados en lenguajes nativos como C o C++. Es por ello que el uso de Null Bytes puede permitirnos evadir dichos dispositivos.<br />
Para una definición formal de este tipo de ataques recomiendo la lectura de las siguientes referencias:</p>
<p><a href="http://projects.webappsec.org/w/page/13246949/Null-Byte-Injection">http://projects.webappsec.org/w/page/13246949/Null-Byte-Injection</a><br />
<a href="http://hakipedia.com/index.php/Poison_Null_Byte">http://hakipedia.com/index.php/Poison_Null_Byte</a></p>
<p>A continuación un ejemplo de este tipo de ofuscación:</p>
<p><code><em><strong>Payload normal:</strong></em> ' or es_admin=1 --<br />
<em><strong>Payload ofuscado:</strong></em> %00' or es_admin=1 --</code></p>
<p><strong>+ Aprovechando anidación de expresiones<br />
</strong><br />
Algunos WAFS y filtros leen de izquierda a derecha y cuando encuentran una conincidencia con la lista negra la eliminan. El problema es cuando no lo realizan recursivamente, y podemos aprovecharnos de ello, veremos cómo:</p>
<p><code><em><strong>Payload normal:</strong></em> INSERT<br />
<em><strong>Payload ofuscado:</strong></em> ININSERTSERT</code></p>
<p>Un WAF o filtro con este problema eliminaria el tag INSERT, dejando el IN que hay delante y el SERT que hay detrás juntos, formando para nuestra satisfacción una sentencia INSERT</p>
<p>Hasta aquí el respaso de hoy, volveremos a hablar de técnicas de ofuscación en el futuro.</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/05/ofuscando-ataques-sqli/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Open Redirects desde una perspectiva defensiva</title>
		<link>http://garmedsecurity.com/2011/05/open-redirects-desde-una-perspectiva-defensiva/</link>
		<comments>http://garmedsecurity.com/2011/05/open-redirects-desde-una-perspectiva-defensiva/#comments</comments>
		<pubDate>Sun, 15 May 2011 22:42:20 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Pentest]]></category>
		<category><![CDATA[cwe]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[openredirect]]></category>
		<category><![CDATA[path transversal]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=568</guid>
		<description><![CDATA[Si pensamos en la vulnerabilidad Open Redirect, nos viene a la cabeza enseguida la palabra phishing. Esta vulnerabilidad es conceptualmente muy sencilla, si bien como veremos después, la manera de corregirla puede no serlo. Primero definamos formalmente Open Redirect, se trata de una vulnerabilidad que permite al atacante realizar una redirección arbitraria, debido fundamentalmente a [...]]]></description>
				<content:encoded><![CDATA[<p>Si pensamos en la vulnerabilidad Open Redirect, nos viene a la cabeza enseguida la palabra phishing. Esta vulnerabilidad es conceptualmente muy sencilla, si bien como veremos después, la manera de corregirla puede no serlo.<br />
Primero definamos formalmente Open Redirect, se trata de una vulnerabilidad que permite al atacante realizar una redirección arbitraria, debido fundamentalmente a que el aplicativo web delega la redirección en una variable controlada por el usuario.</p>
<p>Para ilustrarlo con un ejemplo, haremos referencia a una vulnerabilidad de este tipo muy conocida, la redirección arbitraria en el OWA de Microsoft Exchange Server 2003:<br />
<strong>SA14144</strong> &#8211; <a href="http://secunia.com/advisories/14144/">http://secunia.com/advisories/14144/</a></p>
<p>Hay varias maneras de realizar redirecciones: HTTP status code 3xx, javascripts, tags META, refresh header, etc pero hoy nos detendremos en uno de los más usuales: utilizar el propio código del aplicativo para realizar la redirección. Supongamos por ejemplo el siguiente código JAVA:</p>
<p><code><br />
<em><br />
</em></code></p>
<blockquote><p><em>public class RedirectServlet extends HttpServlet {<br />
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {<br />
String query = request.getQueryString();<br />
if (query.contains(&#8220;url&#8221;)) {<br />
String url = request.getParameter(&#8220;url&#8221;);<br />
response.sendRedirect(url);<br />
}<br />
}<br />
}</em>&nbsp;</p></blockquote>
<p><em> </em></p>
<p>Como podemos apreciar, el código está buscando una variable &#8220;<em><strong>url</strong></em>&#8221; en la petición, y en caso de encontrarla realiza una redirección al contenido de dicha variable mediante la función &#8220;<em><strong>sendRedirect</strong></em>&#8220;. Algo similar al caso del OWA.<br />
En la práctica esto produce que tengamos una URL similar a la siguiente:</p>
<p><code><em><br />
</em></code></p>
<blockquote><p><em>https://www.mibanco.com/exchweb/bin/auth/owalogon.asp?url=https://www.mibanco.com/exchange/&amp;reason=0 </em>&nbsp;</p></blockquote>
<p><em> </em></p>
<p>El proceso es el siguiente, al introducir las credenciales el usuario es redirigido a la URL contenida en la variable URL. Esto permite, por ejemplo, que un usuario malicioso podría construir la siguiente URL:</p>
<p><code><em><br />
</em></code></p>
<blockquote><p><em>https://www.mibanco.com/exchweb/bin/auth/owalogon.asp?url=https://www.bancofake.com/exchange/&amp;reason=0 </em>&nbsp;</p></blockquote>
<p><em> </em></p>
<p>En este caso, tras introducir las credenciales, el usuario sería redirigido a bancoface.com, habiendo sido víctima de un phishing. Al robo de credenciales hay que añadir que el daño a la imagen es irreparable, pensemos en titulares del tipo &#8220;<em><strong>una vulnerabilidad en mibanco facilita el fraude a sus propios clientes</strong></em>&#8220;.</p>
<p>A continuación, vamos a centrarnos en cómo solucionar esta vulnerabilidad. Volvemos al código inicial, pero fijándonos únicamente en las dos líneas que producen la vulnerabilidad:</p>
<p><code><em><br />
</em></code></p>
<blockquote><p><em>String url = request.getParameter(&#8220;url&#8221;);<br />
response.sendRedirect(url); </em>&nbsp;</p></blockquote>
<p><em> </em></p>
<p>Lo que está claro es, que el aplicativo no debe utilizar entrada de usuario, por lo que desde el código podemos realizar algunas aproximaciones a su solución:</p>
<p><strong>1. Filtrar la entrada.</strong><br />
Es posible aplicar filtros en base a expresiones regulares, si bien esta no debe ser una solución, sino una medida adicional de seguridad. La causa es que un filtro (especialmente los basados en listas negras) puede ser evadido.</p>
<p><strong>2. Restringir el uso de la variable de entrada.</strong><br />
Una opción interesante es no dejar bajo control del usuario el dominio destino, sino únicamente el path, en ese caso el usuario podría construir únicamente paths alterados. Si bien no es una solución elegante puede resultar efectiva, por ejemplo si implementáramos lo siguiente:</p>
<p><code><em><br />
</em></code></p>
<blockquote><p><em>String url = request.getParameter(&#8220;url&#8221;);<br />
response.sendRedirect(&#8220;https://www.mibanco.com/&#8221; + url); </em>&nbsp;</p></blockquote>
<p><em> </em></p>
<p>Un atacante no podría redirigir contra la URL maliciosa. No obstante es recomendable analizar en profundidad esta solución, ya que puede acarrear vulnerabilidades nuevas como <a href="https://www.owasp.org/index.php/Path_Traversal">Path Transversal.</a></p>
<p><strong>3. Mapeado de recursos.</strong><br />
Esta solución es más compleja pero muy efectiva, consiste en que el parámetro que se recoge es de un tipo numérico e internamente en el código del aplicativo se transforma en la URL destino mediante un mapeo. Si optamos por esta solución debemos forzar en el código que la entrada sea del tipo que esperamos y únicamente en el rango deseado.</p>
<p>Detectar estas vulnerabilidades no siempre es fácil, una auditoría de tipo caja negra con frecuencia no cubre la totalidad de las URLs y parámetros. Es por ello que es recomendable una auditoría de código a tal efecto. Herramientas como <a href="http://buguroo.com/productos/bugscout/">buguroo bugScout</a> tienen un alto ratio de detección de este tipo de vulnerabilidades, de manera automática y en multitud de lenguajes de programación.</p>
<p><strong>Referencias</strong>:</p>
<p>CWE-601: <a href="http://cwe.mitre.org/data/definitions/601.html">http://cwe.mitre.org/data/definitions/601.html</a><br />
OWASP: <a href="https://www.owasp.org/index.php/Open_redirect">https://www.owasp.org/index.php/Open_redirect</a><br />
WASC: <a href="http://projects.webappsec.org/w/page/13246981/URL-Redirector-Abuse">http://projects.webappsec.org/w/page/13246981/URL-Redirector-Abuse</a></p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/05/open-redirects-desde-una-perspectiva-defensiva/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Security updates con Fedora y Yum</title>
		<link>http://garmedsecurity.com/2011/04/security-updates-con-fedora-y-yum/</link>
		<comments>http://garmedsecurity.com/2011/04/security-updates-con-fedora-y-yum/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 10:17:05 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[SSOO]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[cve]]></category>
		<category><![CDATA[fedora]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[yum]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=557</guid>
		<description><![CDATA[Recientemente conversaba con @hidark sobre las actualizaciones en servidores, destacando la importancia de obetener estabilidad, para lo cual es necesario realizar unicamente actualizaciones de seguridad. En este sentido distribuciones como Slackware apuestan en su versión estable por aplicar unicamente actualizaciones relacionadas con la seguridad. Debian por el contrario lo deja en manos de los usuarios, [...]]]></description>
				<content:encoded><![CDATA[<p>Recientemente conversaba con <a href="https://twitter.com/#!/hidark">@hidark</a> sobre las actualizaciones en servidores, destacando la importancia de obetener estabilidad, para lo cual es necesario realizar unicamente actualizaciones de seguridad.<br />
En este sentido distribuciones como <a href="http://www.slackware.com/">Slackware</a> apuestan en su versión estable por aplicar unicamente actualizaciones relacionadas con la seguridad. <a href="http://www.debian.org/">Debian</a> por el contrario lo deja en manos de los usuarios, puesto que en función de los repositorios que tengan instalados tendrán unas u otras actualizaciones. ¿Cómo lo realiza <a href="http://fedoraproject.org/">Fedora</a>? Lo veremos a continuación.</p>
<p>Fedora instala por defecto repositorios denominados updates. A continuación muestro un extracto del fichero <strong><em>/etc/yum.repos/fedora-updates.repo</em></strong>: </p>
<p><code><br />
<blockquote><em>[updates]<br />
name=Fedora $releasever - $basearch - Updates<br />
failovermethod=priority<br />
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever/$basearch/<br />
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&#038;arch=$basearch<br />
enabled=1<br />
gpgcheck=1<br />
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch</em></p></blockquote>
<p></code></p>
<p>Como podemos apreciar no hay distinción en base a tipos de actualizaciones. ¿Quiere decir eso que no puedo realizar unicamente actualizaciones de seguridad en Fedora? La respuetsa es no. Como veremos sí es posible.</p>
<p><strong>Yum Secuirty Plugin</strong><br />
Para estas tareas tenemos un plugin de yum disponible. Para instalarlo simplemente ejecutamos el siguiente comando:</p>
<p><strong></p>
<blockquote><p>yum install yum-plugin-security</p></blockquote>
<p></strong></p>
<p>Para listar las actualizaciones de seguridad pendientes ejecutamos el siguiente comando:</p>
<blockquote><p><strong>yum list-sec</strong></p></blockquote>
<p>Y para realizar actualizaciones de seguridad sustituimos el clasico yum update por el siguiente comando:</p>
<p><code><br />
<blockquote><strong>yum update --security<br />
</strong></p></blockquote>
<p></code></p>
<p>Para más información y opciones es recomendable leer la <a href="http://docs.fedoraproject.org/en-US/Fedora/14/html/Security_Guide/sect-Security_Guide-CVE-yum_plugin-using_yum_plugin_security.html">guía de seguridad de Fedora</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/04/security-updates-con-fedora-y-yum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Metadatos: datos incrustados en la información pueden delatarnos</title>
		<link>http://garmedsecurity.com/2011/04/metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos/</link>
		<comments>http://garmedsecurity.com/2011/04/metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos/#comments</comments>
		<pubDate>Thu, 14 Apr 2011 15:38:43 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Forensic]]></category>
		<category><![CDATA[elreservado]]></category>
		<category><![CDATA[metadatos]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=554</guid>
		<description><![CDATA[Hace unos días escribí un artículo para ElReservado, Diario Digital Fundado por Fernando Rueda y que versó sobre servicios de inteligencia. El artículo íntegro se encuentra en la siguiente URL: http://www.elreservado.es/news/view/220-noticias-espias/1131-metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos A continuación reproduzco el texto del mismo: La información es uno de los activos más importantes de una entidad. Las causas de esta afirmación [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.elreservado.es/news/view/220-noticias-espias/1131-metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos">Hace unos días escribí un artículo para ElReservado</a>, Diario Digital Fundado por <a href="https://twitter.com/#!/fernando_rueda">Fernando Rueda</a> y que versó sobre servicios de inteligencia. El artículo íntegro se encuentra en la siguiente URL:</p>
<p><a href="http://www.elreservado.es/news/view/220-noticias-espias/1131-metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos">http://www.elreservado.es/news/view/220-noticias-espias/1131-metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos<br />
</a></p>
<p>A continuación reproduzco el texto del mismo:</p>
<p>La información es uno de los activos más importantes de una entidad. Las causas de esta afirmación son múltiples: la pérdida, sustracción o fuga de información hacia entidades competidoras les proporciona una clara desventaja, por no hablar de las pérdidas económicas. Casos hay cientos, por nombrar uno haremos referencia a la reciente batalla legal por espionaje industrial entre las multinacionales Nokia y Apple [1]. De lo que no cabe duda es de que tener la información adecuada de la competencia es tan inmoral como lucrativo para el beneficio propio.</p>
<p>¿Cómo se guarda la información? Desde hace ya varias décadas el cambio tecnológico nos lleva cada vez más hacia los soportes digitales. Desde el punto de vista de la protección de la información esto cambia el paradigma: la información sensible puede estar en un servidor en un sótano custodiado por fuertes medidas físicas de seguridad (guardias, accesos biométricos, etc) y sin embargo es posible acceder a la misma desde la otra punta del mundo a través de un hilo telefónico.</p>
<p>En la siguiente serie de artículos repasaremos algunas de las técnicas utilizadas actualmente para obtener información sensible desde el punto de vista de un atacante externo que no dispone, a priori, de contactos dentro de las entidades objetivo. Veremos cómo es posible obtener multitud de informaciones que no deberían ser accesibles, repasaremos también, algunos casos relacionados que han salido a la luz pública. </p>
<p>Comenzaremos con los Metadatos. Los metadatos son datos que hablan de datos [2]. Por ejemplo en un libro los datos referentes a su fecha y lugar de impresión, ISBN, etc. En el mundo electrónico los metadatos son información incrustada, por ejemplo en ficheros ofimáticos o imágenes, que aportan información acerca de los propios ficheros. Como veremos a continuación estos datos pueden ser inofensivos si bien en algunos casos pueden constituir una información muy valiosa.</p>
<p>Pongamos un ejemplo para verlo con claridad, descargamos de la web del CNI un documento pdf titulado “La inteligencia como respuesta a los nuevos retos de seguridad” [3]. Este documento es un simple pdf (portable document format), pero contiene más información de la que podemos ver abriéndolo con un visor de pdfs [3]. Utilizando herramientas públicamente disponibles podemos extraer dicha información, en este ejemplo utilizaremos unas herramientas denominadas Exiftool [5], que muestra la siguiente metainformación sobre el fichero:</p>
<p><em>File Name                       : ev_113.pdf<br />
Directory                        : .<br />
File Size                         : 85 kB<br />
File Modification Date/Time     : 2011:04:07 12:25:30+02:00<br />
File Permissions              : rw-rw-r&#8211;<br />
File Type                        : PDF<br />
MIME Type                     : application/pdf<br />
PDF Version                   : 1.6<br />
Linearized                      : No<br />
Tagged PDF                    : Yes<br />
XMP Toolkit                    : Adobe XMP Core 4.0-c316 44.253921, Sun Oct 01 2006 17:14:39<br />
Metadata Date                : 2008:12:30 10:19:19+01:00<br />
Format                          : application/pdf<br />
Document ID                  : uuid:3efef69a-98de-4f18-bace-7676164f5cb8<br />
Instance ID                    : uuid:a8953cc0-3ab1-4992-87e0-ba823d9f14c2<br />
Page Count                    : 19<br />
Language                       : ES<br />
Create Date                    : 2007:09:13 18:28:17Z<br />
Producer                        : Acrobat Distiller 4.0 for Windows<br />
Modify Date                    : 2008:12:30 10:19:19+01:00</em></p>
<p>Muchos de los campos son autoexplicativos, la información más significativa en este caso son las herramientas software utilizadas para la creación de este documento (Acrobat Distiller 4.0 for Windows) y las fechas de creación (2007:09:13 18:28:17Z) y de modificación (2008:12:30 10:19:19+01:00). En algunos documentos los datos pueden ser más jugosos, incluyendo usuarios del sistema operativo, rutas internas hacia las impresoras, versionado software utilizado por la entidad o los datos cruciales que veremos en dos casos prácticos.</p>
<p><strong>El caso Tony Blair y las armas de destrucción masiva<br />
</strong><br />
En el 2003 el ejecutivo de Tony Blair publicó un documento en el contexto de la Guerra de Irak y la supuesta existencia de armas de destrucción masiva [6]. El fichero en cuestión contenía multitud de metadatos en los que se podía comprobar la multitud de revisiones [7] que dicho documento había recibido por parte de miembros de su gabinete (con nombres y apellidos), quedando en evidencia la manipulación del mismo.</p>
<p><strong>Utilización de metadatos para capturar pederastas<br />
</strong><br />
El 18 de mayo del 2009 saltó la noticia de que un pederasta había sido detenido en Guipúzcoa [8]. La investigación en este caso tuvo mucho que ver con los metadatos de las fotografías que el pederasta colgaba en Internet. Muchas cámaras de fotos, incluidas las de los modernos teléfonos móviles, incrustan metadatos en las mismas, algunos de ellos son de vital importancia en estas investigaciones, estamos hablando de coordenadas GPS en las que se toma la fotografía, versión y modelo del dispositivo, etc.</p>
<p><strong>Buscando documentos<br />
</strong><br />
La manera más sencilla de acceder a documentos es a través de los propios buscadores. Por ejemplo en Google podemos afinar la búsqueda para que nos muestre solo determinados documentos. Imaginemos que queremos listar los documentos de Word con extensión .doc que ha indexado el motor de búsqueda en la página web del Ministerio de Defensa (mde.es), sería tan simple como introducir el siguiente texto en el campo de búsqueda:</p>
<p><em></p>
<blockquote><p>inurl:mde.es filetype:doc</p></blockquote>
<p></em><br />
A fecha del 7 de abril del 2011 podemos apreciar que aparecen 167 resultados/documentos.</p>
<p>Hay varias herramientas automáticas públicas destinadas a recopilar metadatos en documentos disponibles en Internet. Además de la ya mencionada Exiftool [5] una de las más utilizadas es la FOCA [8].  Existen igualmente multitud de herramientas para eliminar metadatos de los ficheros, desde el propio Microsoft Office 2007 [10] es posible eliminar metadatos haciendo click en “Menú Office -> Preparar -> Inspeccionar Documento”.<br />
Como conclusión, hay que prestar atención a este tipo de fugas de datos, ya que en algunos casos esta información puede ser muy perjudicial para la entidad que los expone. Y lo más peligroso es que en la mayoría de los casos las entidades no son conscientes de ello.</p>
<p><strong>Referencias:<br />
</strong><br />
[1] Nokia vuelve a denunciar a Apple: http://www.suite101.net/content/nokia-vuelve-a-denunciar-a-apple<br />
[2] Wikipedia: http://es.wikipedia.org/wiki/Metadato<br />
[3] La inteligencia como respuesta a los nuevos retos de seguridad: http://www.cni.es/comun/recursos/descargas/ev_113.pdf<br />
[4] Acrobat Reader: http://get.adobe.com/es/reader/<br />
[5] Exiftool: http://www.sno.phy.queensu.ca/~phil/exiftool/<br />
[6] Documento Tony Blair: http://www.computerbytesman.com/privacy/blair.doc<br />
[7] Microsoft Word bytes Tony Blair in the butt: http://www.computerbytesman.com/privacy/blair.htm<br />
[8] Detenido un pederasta por colgar fotos de amigos de sus hijos en internet: http://www.abc.es/20090518/nacional-sucesos/detenido-pederasta-colgar-fotos-20090518.html<br />
[9] FOCA: http://www.informatica64.com/foca/<br />
[10] Microsoft Office: http://office.microsoft.com/es-es/</p>
<p>Informa: Daniel Medianero, dmedianero@buguroo.com<br />
Security Consultant en Buguroo Offensive Security (<a href="http://www.buguroo.com">http://www.buguroo.com</a>)</p>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/04/metadatos-datos-incrustados-en-la-informacion-pueden-delatarnos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilizando PreparedStatements en PHP</title>
		<link>http://garmedsecurity.com/2011/04/utilizando-preparedstatements-en-php/</link>
		<comments>http://garmedsecurity.com/2011/04/utilizando-preparedstatements-en-php/#comments</comments>
		<pubDate>Mon, 11 Apr 2011 10:49:36 +0000</pubDate>
		<dc:creator>dmedianero</dc:creator>
				<category><![CDATA[Pentest]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[PreparedStatement]]></category>
		<category><![CDATA[sqli]]></category>
		<category><![CDATA[sqlinjection]]></category>

		<guid isPermaLink="false">http://garmedsecurity.com/?p=549</guid>
		<description><![CDATA[Como ya hemos hablado en alguna ocasión, la Inyección SQL, es una vulnerabilidad importante que hay que considerar a la hora de encarar una auditoría de código. En esta entrada, vamos a hablar de manera breve, de cómo implementar consultas parametrizadas en un entorno típico de servidores Linux: PHP con MySQL. En PHP hay decenas [...]]]></description>
				<content:encoded><![CDATA[<li>Como ya hemos hablado <a href="http://blog.buguroo.com/?p=304">en alguna ocasión</a>, la Inyección SQL, es una vulnerabilidad importante que hay que considerar a la hora de encarar una auditoría de código. En esta entrada, vamos a hablar de manera breve, de cómo implementar consultas parametrizadas en un entorno típico de servidores Linux: PHP con MySQL.</p>
<p>En PHP <a href="http://www.php.net/manual/en/book.mysqli.php">hay decenas de funciones para interactuar con Bases de Datos MySQL</a>. Es habitual encontrar implementaciones deficientes y de rápida programación (desde el punto de vista del programador). Por ejemplo, tenemos la siguiente página de login:</p>
<blockquote><p>
function login($usuario, $password) {<br />
$consulta = &#8220;select * from user where usuario = &#8216;$usuario&#8217; and password = &#8216;$password&#8217;&#8221;;<br />
$resultado= $db->query($consulta);<br />
if($db->count_rows($resultado)) {<br />
$row = $db->fetch_assoc($resultado);<br />
}
</p></blockquote>
<p>Como podemos apreciar, esta función no filtra los parámetros que recibe (aunque los mete entre comillas simples, de manera que delega la seguridad en las magic quotes) en principio es vulnerable, no obstante hay que rastrear desde dónde vienen los parámetros <em>$usuario</em> y <em>$password</em>, los encontramos en otro fichero con este aspecto:</p>
<blockquote><p>
$usuario = $_POST['usuario'];<br />
$password = $_POST['password'];
</p></blockquote>
<p>Como se puede observar, las variables se toman directamente de la entrada de usuario ¿Cómo solucionar esto? La respuesta son las consultas parametrizadas. </p>
<p>Las consultas parametrizadas realizan 3 pasos:</p>
<p><strong>1.</strong> Preparación de la consulta (método prepare)<br />
<strong>2. </strong>Paso de parámetros (método bind_param)<br />
<strong>3.</strong> Ejecución de la consulta (método execute)</p>
<p>A continuación muestro el código tal y como debería estar implementado:</p>
<blockquote><p>
function login($usuario, $password) {<br />
$sql = $db->prepare(&#8220;SELECT usuario, password FROM user WHERE usuario = ? AND password = ?&#8221;);<br />
$sql->bind_param($usuario, $password);<br />
$resultado= $db->query($consulta);<br />
$sql->execute();<br />
$sql->bind_result($this->user_id, $this->usuario, $this->password);<br />
$sql->fetch();<br />
&#8230;&#8230;..<br />
$sql->close();<br />
}
</p></blockquote>
<p>Tal y como viene indicado, en el prepare no se incluyen los parámetros, sino que se indican con el símbolo &#8220;<em>?</em>&#8220;. En <em>bind_param</em> se indican en órden los parámetros que serán pasados a la consulta y en el <em>execute</em> se ejecuta. Posteriormente se recogerían los datos con <em>bind_result</em>.</p>
<p>Hay que destacar que este es un ejemplo de libro. Para facilidad de entendimiento he omitido el control de errores sobre la consulta. En algunos casos no es posible establecer consultas parametrizadas, en cambio, en los que si, es recomendable el filtrado de los parámetros de entrada, por ejemplo, mediante librerías destinadas a tal efecto como <a href="http://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API">ESAPI de OWASP</a>.
</li>
]]></content:encoded>
			<wfw:commentRss>http://garmedsecurity.com/2011/04/utilizando-preparedstatements-en-php/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
