Tutorial de exploits y shellcodes

Normalmente cuando uno busca información sobre exploits y shellcodes es frustrante darse cuenta que mucha de la información está bastante desactualizada y muchas veces no se explican a detalle ciertos pasos que para un novato son un reto resolver cuando se quiere llevar a la práctica lo aprendido.

Hoy encuentro una serie de posts referentes a un exploit en concreto en donde explican con cierto grado de detalle los pasos concretos a seguir y los conceptos que hay detrás de un exploit por stack overflow para la aplicación Easy RM to MP3 Conversion Utility.

Exploit writing tutorial part 1 : Stack Based Overflows

Exploit writing tutorial part 2 : Stack Based Overflows – jumping to shellcode

Exploit writing tutorial part 5 : How debugger modules & plugins can speed up basic exploit development

Exploit writing tutorial part 3 : SEH Based Exploits

Exploit writing tutorial part 6 : Bypassing Stack Cookies, SafeSeh, HW DEP and ASLR

Exploit writing tutorial part 3b : SEH Based Exploits – just another example

Exploit writing tutorial part 4 : From Exploit to Metasploit – The basics

Exploit writing tutorial part 7 : Unicode – from 0×00410041 to calc

Y sigue actualizándose.

Desmitificando RSA de 1025 bits

Cuando se habla de RSA, se suele especular o fantasear sobre supuesta tecnología ultrasecreta que pudieran tener las agencias de seguridad de los gobiernos de naciones poderosas como Rusia, China o EEUU. Sobre todo se especula que los módulos de 1024 bits podría ya ser factorizables en tiempos razonables. Por lo que muchos, incluyéndome, se preguntan ¿entonces de cuántos bits debería generar mis llaves si mis temores fueran ciertos?

El NIST, la agencia encargada de definir los estándares tecnológicos para las agencias federales de EEUU, establece que la información con vigencia menor a 2010 debe usar al menos 1024 bits, con vigencia menor a 2030 deberá usar al menos 2048 bits y con vigencia mayor a 2030 deberá usar 3072.

Bruce Scheiner por otro lado en 2002 ratificó una tabla publicada anteriormente por él mismo en donde establece los bits recomendados según seas un individuo, una corporación o el gobierno. Ahí estipula que para 2005 los individuos ya deberían usar llaves de 1280 bits, y el gobierno ya debería estar usando 2048 bits.

Algunos más “inteligentes” que los anteriores, dicen que todos exageran, y recomiendan 1025 bits, razonando superfluamente que eso duplica la complejidad de la factorización. Ese razonamieto surge de pensar que el mejor algoritmo de factorización es por “fuerza bruta” sobre los posibles factores, probando todos los números entre 2^{511} y 2^{512}-1 para factorizar un módulo de 1024 bits, pues sus factores primos son de 512 bits.

La realidad es otra, y desde hace tiempo, desde Fermat de hecho, existen métodos sublineales de factorización de enteros respecto al tamaño del entero y los mismos algoritmos son subexponenciales respecto al número de bits del entero. Por lo que aumentar un bit la llave no es tan drástico como aumentarlo en otros algoritmos como AES, como no es tan drástico multiplicar por dos el tamaño del entero, pues eso no duplicaría el tiempo necesariamente. ¿Pero qué tanto aumenta el tiempo un bit más?

Criba General de Campos Numéricos (GNFS)

GNFS es el mejor algoritmo de factorización de enteros, conocido a la fecha, para enteros de 130 digitos al menos (que son aproximadamente 432 bits). En 2005 el algoritmo se utilizó para romper el récord de factorización RSA para un entero de 640 bits, hazaña que fue llevada acabo por un equipo de investigación alemán. Lo interesante de este algoritmo es su complejidad, y en base a ella voy a realizar algunos cálculos para esclarecer qué tan fuerte es aumentar un bit más a un módulo RSA.

La complejidad del algoritmo está dada por

O\left(\displaystyle e^{\displaystyle \left(c+o(1)\right)ln (n)^{1/3}ln(ln(n))^{2/3} }\right)

donde c es una constante dada por la heurística utilizada en el algoritmo y n es el número a factorizar (no los bits del número). Carl Pomerance, creador del segundo mejor método de factorización, indica que en este caso c = \left( {\frac{64}{9}}\right)^{1/3} . Por otro lado tenemos que o(1) es una función asintótica que tiende a cero, por lo que para los cálculos se va a considerar como cero, pues Pomerance así lo toma.

Teniendo eso, lo que se puede hacer ahora es calcular el tiempo del algoritmo para factorizar un número de 1024 bits y comprarlo respecto al tiempo para factorizar uno de 1025 bits. Por lo que vamos a denotar T_{1024} al tiempo de 1024 bits y T_{1025} al tiempo de 1025 bits.

Sabemos que un número de 1024 bits se aproxima a 2^{1024} y uno de 1025 bits a 2^{1025}, por lo que se van a tomar esas aproximaciones para simplificar la exponenciación. Tenemos entonces que

\displaystyle\dfrac{\displaystyle T_{1025}}{\displaystyle T_{1024}} = \displaystyle\dfrac {k e^{\displaystyle c (ln (2^{1025})^{1/3}ln(ln(2^{1025}))^{2/3}) } } {k e^{\displaystyle c (ln (2^{1024})^{1/3}ln(ln(2^{1024}))^{2/3}) }}

donde k es la constante de la notación asintótica.

Por lo tanto tenemos que

\frac{T_{1025}}{T_{1024}} = 1.0259

Que es muy poco. Pues si el gobierno de algún país contara con los recursos para romper un módulo de 1024 bits en 24 semanas (6 meses), entonces romper uno de 1025 bits les llevaría casi 25 semanas. Esto en el mejor caso, puesto que la complejidad del algoritmo está dada en notación O, así que el algoritmo podría comportarse aún mejor de lo estimado y ser más rápido.

Si hacemos lo mismo y comparamos un módulo de 1024 respecto a uno de 1280, tenemos que \frac{T_{1280}}{T_{1024}} = 447.43. Que es bastante decente, y suponiendo que se pudiera factorizar el módulo de 1024 en una semana, entonces tardarían 8 años y medio en factorizar el de 1280; lo que le da bastante más confiabilidad a ese módulo que a uno de 1025. Aunque un cálculo más correcto sería considerando una ecuación diferencial porque la capacidad de cálculo no va a permanecer 8 años igual, va a ir aumentando.

Pragmáticamente hablando

Seguramente alguno va a desconfiar de este análisis, y necesitará una prueba más terrenal, sin tanta matemática. En ese caso lo invito a bajar un paquete que tenga implementado el algoritmo y factorice un número de unos 450 bits, que se puede hacer en un tiempo bastante decente (unos minutos) y vaya aumentando de bit en bit, para comparar los tiempos. Implementaciones hay varias y se pueden encontrar en la página de la wikipedia sobre GNFS.

La información sobreescrita no se puede recuperar, punto final

Hace unos días justamente, saltó a la duda si la información sobreescrita se podía recuperar con técnicas físicas, ya que con software es imposible. No pude resolver mi duda ya que desconozco los recursos con los que cuentan las empresas profesionales de recuperación de información; pero hoy leo que en el ICISS (International Conference on Information Systems Security) 2008, un equipo de investigación publicó un artículo en donde le pone punto final al asunto, y la conclusión a la que llegó es que: recuperar información sobreescrita es prácticamente imposible.

La leyenda urbana de que es inseguro borrar información sobreescribiéndola una vez siempre se escuchó de boca en boca, y se tomaba como un dogma de fe. Las herramientas de borrado seguro de información y los estándares de seguridad, dicen que para borrar información de manera segura se tienen que sobreescribir todos los bits 25 veces o más; lo que requiere tiempo y es simplemente una pérdida de tiempo.

Como bien es sabido mediante software la información sobreescrita no se puede recuperar, pero mediante hardware queda la duda. Por ello para desfalcar el mito, Craig Wright, experto en forensia, y su equipo, hicieron un estudio para analizar varios discos duros de distinta manufactura y edad. El estudio consistió en sobreescribir la información en condiciones controladas y luego estudiar las superficies de los platos con un Microscopio de Fuerzas Magnéticas. Así llegaron a la conclusión de que recuperar la información después de una sola sobreescritura tiene una probabilidad que tiende a cero; y, se habla en términos de probabilidad porque reconstruir un bit tiene una probabilidad de 56% y reconstruir un byte completo 0.97%; esto con discos nuevecitos. Pero la prueba más interesante, que fue llenar 32 veces el disco usando dd con /dev/random, para simular un disco usado, y luego sobreescribiendo todo con /dev/zero, arrojó aún menos probabilidad de recuperación.

Así que para borrar un disco duro ya no habrá que reformatear muchas veces el disco, ni comprar herramientas especializadas. Con una distribución Linux live, y un simple dd if=/dev/zero of=/dev/sda será suficiente. Pero si todavía no tienes confianza y crees que rasurarse muchas veces hace salir más barba o que las probabilidades son engañosas, aunque OpenSSL usa una prueba probabilística de primalidad, puedes usar /dev/urandom. Hacer más y perder tu tiempo ya es simplemente ser supersticioso.

[Resumen del artículo original]

El supuesto último gran fallo de Internet del 2008

Desde hace dos días he leído toda clase de barbaridades acerca del supuesto “más grande ataque a la infraestuctura de internet” de los últimos tiempos. Además de desacertado (pues ya se había previsto) es completamente amarillista llamarlo así, al día de hoy (31 de diciembre) los investigadores que publicaron el ataque informan que el problema ha sido corregido por VeriSign y los potenciales afectados han sido informados.

He aquí de algunos titulares amarillistas que he encontrado:

Vulnerabilidad en la infraestructura de clave pública
El algoritmo MD5, en peligro
Researchers hack VeriSign’s SSL scheme for securing Web sites
Cómo unos hackers rompieron la seguridad del SSL usando 200 PS3

Hasta sitios que considero de respeto, como Astalavista, cayeron en el juego. Yo preferí leer el reporte orginal de los investigadores e informar breve pero verdaderamente el ataque que realizaron.

Breve introducción

Como alguna vez explicamos, una parte de la seguridad en Internet se basa en el uso de certificados digitales, que dan certeza sobre la identidad de un servidor en Internet. Un equipo de investigadores recientemente publicó una demostración de un ataque que permitió falsificar indetectablemente un certificado digital, firmado por la empresa RapidSSL (filial de VeriSign), y que los navegadores aceptan como parte del círculo de confianza.

El ataque fue factible porque la empresa RapidSSL generaba las firmas digitales, de sus certificados digitales, usando el esquema ‘MD5 con RSA’. El algoritmo MD5 ya se considera inseguro desde hace largo tiempo. Anteriormente se han realizado demostraciones impresionantes, por ejemplo el famoso caso de Nostradamus en donde generaron distintos archivos PDF que tenían el mismo hash MD5. Además desde 2005 ya se había publicado un artículo en donde se exponía cómo usar colisiones MD5 para generar dos certificados digitales distintos que produjeran el mismo hash.

El ataque

Lo que hicieron estos investigadores, para falsificar el certificado, fueron principalmente dos cosas: predecir probabilísticamente cuál iba a ser el siguiente número de serie (del certificado generado por RapidSSL) y generar una llave pública que ocasionara colisiones MD5. La parte más dificil fue construir una llave pública que ocasionara colisiones y construir la llave privada a partir de la llave pública, pues es necesario firmar con la llave privada la petición de un certificado. Se requirió el poder de un clúster de 200 PS3 para hacer los cálculos, además de gastar 657 dólares en la compra de certificados para poder predecir el número de serie.

El alcance de este ataque, como bien dicen ellos, está limitado para aquellas CA (Autoridades Certificadoras) que generen certificados firmados con MD5, y la gran mayoría actualmente firma con SHA-1. Aunque SHA-1 ya no se considera seguro no se conocen ataques de este tipo, pero ellos recomiendan que se use al menos SHA-2 para generar las firmas, porque puede ser que en poco tiempo empiecen a surgir ataques parecidos a los de MD5 y sí va a ser entonces un problema grave para todo el mundo.

En el artículo original se puede encontrar el certificado y una página web de muestra para ver el certificado en funcionamiento. Pero los investigadores se cuidaron de que nadie le dé mal uso a su trabajo, por lo que hicieron que el certificado expirara en 2004 y no publicaron la llave privada. Potencialmente, si se pudiera llevar a cabo este ataque para cualquier certificado, cualquiera podría falsificar la conexión segura de un banco (por ejemplo) y de manera indetectable si se combina con un DNS poisoning o pharming.

Ext4

Como mencioné en una entrada anterior , Ext4 ya está listo para sustituir a Ext3 y el kernel más nuevo de Linux ya incluye soporte estable para él. Los sistemas de archivos Extended (Ext, Ext2,…) han sido históricamente usados por defecto en sistemas Linux y son herederos de los viejos sistemas de archivos Unix; aunque Linux soporta otros sistemas de archivos más modernos como ReiserFS y XFS. En esta entrada voy a explicar a grandes rasgos las mejoras de Ext4 respecto a Ext3.

Ext3 supuso una mejora respecto a Ext2 al introducir journaling. El journaling es una técnica mediante la cual se lleva un registro de las actividades en el sistema de archivos y facilita la recuperación del sistema de archivos después de una interrupción abrupta (como una falla eléctrica). Cuando se borra un archivo ocurren dos procesos principales: eliminación de la entrada del directorio que lo contiene y marcado de los bloques ocupados como bloques libres en el mapa de bloques; si no se completan los dos procesos el sistema de archivos puede quedar en un estado inconsistente; además detectar y recuperarse del fallo puede toma mucho tiempo, pero con journaling esto se puede hacer de manera más eficiente y segura.

No me voy a centrar en datos sensacionalistas sobre el tamaño de archivos que ahora soporta, o la cantidad de archivos que puede contener cada directorio, ya que eso NO es un diferenciador importante a la hora de comparar sistemas de archivos. Quiero enumerar las nuevas características y mejoras conceptuales que se introdujeron:

  • Extents: Los sistemas de archivos derivados de Unix (como Ext3) mantienen un esquema de mapeo de bloques para llevar el rastreo de bloques que pertecen a un archivo, por ejemplo un i-nodo mantiene una lista de bloques de un archivo. Para archivos grandes esto es ineficiente en tiempo y espacio pues el mapa de bloques es enorme, ya que los bloques son de tamaño fijo. Un extent es básicamente un espacio de bloques físicamente adyacentes que ahora se puede utilizar en el mapeo de un archivo; esto mejora el rendimiento, reduce el espacio y reduce la fragmentación.
  • Alojamiento multibloque: Cuando Ext3 quiere escribir información a disco, el alojador de bloques decide qué bloques libres van a ser usados para escribir los datos. El problema es que el sistema de Ext3 sólo permite alojar un bloque (4 Kb) a la vez; esto no sólo es ineficiente para el tamaño de los archivos que se manejan actualmente, también impide que se pueda optimizar la asignación de bloques pues el alojador de bloques no sabe de qué tamaño es todo lo que se va a escribir. Con el alojamiento multibloque se pueden pedir muchos bloques al mismo tiempo. Esta característica ayuda a reducir la fragmentación.
  • Alojamiento retartado: Esta característica ya viene incluida en sistemas de archivos modernos como XFS, ZFS y Reiser, y consiste en retardar el alojamiento de bloques lo más posible. Lo que pasa actualmente es que cuando un proceso pide escribir a disco, inmediatamente se asigna el bloque al que se va a escribir, aún si la información va a estar en caché un tiempo o si se va esperar un tiempo antes de escribir. Este método trae desventajas como cuando un proceso está escribiendo un stream, ya que no se sabe de qué tamaño va a ser el archivo finalmente. El alojamiento retardado asigna los bloques hasta que realmente se va a escribir a disco, lo que permite optimizar el alojamiento. Esta característica se combina perfectamente con las dos anteriores: extents y alojamiento multibloque; para mejorar el rendimiento y la fragmentación.
  • Defragmentación al vuelo: Aunque con las características anteriores la fragmentación se va a reducir en la mayoría de lo casos, ahora existe la opción de defragmentar el sistema de archivos al vuelo. Esto porque en sistemas de alta concurrencia la fragmentación es un gran problema y la leyenda urbana de que Ext3 se fragmenta poco es completamente falsa para un sistema de mediana concurrencia al disco duro. Esta característica no está disponible todavía en el kernel (2.6.28) pero existe una herramienta llamada e4defrag por el momento.
  • Prealojamiento persistente: Cuando una aplicación necesite reservar espacio en disco pero todavía no tenga los datos que se van a escribir, se puede prealojar el espacio en el sistema de archivos; esto es que se construyan las estructuras internas del sistema de archivos y se reserven los bloques necesarios. Por ejemplo lo que hacen los clientes P2P es escribir un archivo relleno de ceros del tamaño del archivo que van a bajar, pero esto es sucio e ineficiente. Con el prealojamiento este problema se soluciona y además se reduce la posibilidad de fragmentación.

Además se introdujeron otras mejoras en los i-nodos y en el journal. Un efecto colateral con todas las mejoras es que el fsck ahora va a ser mucho más rápido, por lo que ya no tendremos que desesperarnos cada vez que nuestro Debian necesite hacer un chequeo de disco.


[Fuente]

[Fuente2]

Nuevo kernel linux (2.6.28)

Normalmente no hacemos comentarios acerca de nuevas versiones del kernel, pero esta versión es diferente pues introduce dos cambios especialmente radicales que van a alterar el mundo linux.

La primera de ellas es la elimición de la etiqueta experimental al sistema de archivos Ext4. Con lo que ahora Ext4 es una opción estable para sutituir al viejo Ext3. Veremos en un próximo artículo las mejoras respecto a Ext3.

La segunda es la mejora del manejo de memoria en tarjetas gráficas, sustituyendo la vieja administración (ineficiente) que se remonta a la década de los 80, por un nuevo sistema de administración al nivel que se merecen los poderosos y modernos GPUs que tan en boga están últimamente.

Otras mejoras menores son el soporte para para protección contra golpes, que permite desmontar las unidades de disco en caso de caída, cuyo fin es dar esa funcionalidad en laptops que cuenten con discos duros con soporte para entrar inmediatamente en suspensión y acelerómetros que indiquen la caída. También se introdujo una mejora en el manejo general de memoria para eficientar el “swapping” en sistemas con una gran cantidad de memoria; ahora las páginas de memoria se guardan en tres listas diferentes que indican que tan factible es para una página ser “swappeada”, antes sólo estaban en una lista y cada que se quería hacer “swap” había que recorrer toda la lista de páginas buscando candidatos; por ejemplo, ahora las páginas de un ramfs están en una lista especial de páginas que no pueden ser “swappeadas”.

[Fuente]

Un excelente juego FPS gratis y libre

nexuizlogo

Últimamente he estado jugando con amigos un muy buen juego FPS llamado Nexuiz. El juego es libre (GPL) y tiene excelentes gráficas. Está basado en el motor de juego de Quake I, pero con texturas y efectos superiores a Halo 2, además es multiplataforma (Windows, Mac y Linux) y es portable (no requiere instalación). No utiliza DirectX, usa OpenGL.

screen

El juego está pensado para jugarse en red local o en algún servidor de internet (en línea). Soporta muchos modos de juego: Deathmatch , Team Deathmatch, Capture the Flag, Last Man Standing, entre otros. Maneja 9 diferentes armas. El tipo de juego es muy veloz y ágil.

Hay una comunidad muy importante desarrollando nuevos mapas para el juego. Tiene una consola muy parecida al antiguo Quake, así que muchos comandos siguen funcionando igual, pero hay una lista de comandos disponibles.

crennshd

Aquí dejo la última versión del juego junto con todo el pack de mapas incluido:

http://rapidshare.com/files/151846430/Nexuiz2.4.2.part1.rar
http://rapidshare.com/files/151845433/Nexuiz2.4.2.part2.rar
http://rapidshare.com/files/151846471/Nexuiz2.4.2.part3.rar
http://rapidshare.com/files/151846782/Nexuiz2.4.2.part4.rar
http://rapidshare.com/files/151846970/Nexuiz2.4.2.part5.rar
http://rapidshare.com/files/151838872/Nexuiz2.4.2.part6.rar

Para jugar sólo se tiene que descomprimir y en la carpeta del juego buscar el ejecutable. No es necesario hacer más.

Wiki del juego (manuales)

El último Windows UE

El mítico Windows UE, creado por un tal Bj, llegó a su fin después de la versión 7. Dejó un gran vacío para todo aquel harto de tener que bajar el ISO de Windows XP, crackearlo e instalar todo lo necesario y vital que no incluye Windows por defecto, como: Office, Nero y algún antivirus.

Pero la idea es tan buena que no podía morir, un proyecto tan útil después del gran fracaso de Windows Vista. Así que otra persona actualizó el último Windows UE para que incluyera el SP3, pero con varias deficiencias. Luego en junio de este año (2008) otra persona creó un nuevo Windows UE basado en la versión original, pero con los programas actualizados. Incluye:

Windows XP SP3, sin necesidad de licencia ni crack
.NET Framework
Firefox 3
MSN 8.5
Uploader de Imageshack
VirtualDesktop
Nero 8
Foxit Reader en lugar del Acrobat Reader Lite
aTube Catcher
Ares
Image Resizer
NOD32 3 en español
entre otros…

Se puede descargar en los siguientes links:

http://rapidshare.com/files/134945865/ZinowsUE_.part1.rar
http://rapidshare.com/files/134948725/ZinowsUE_.part2.rar
http://rapidshare.com/files/134951740/ZinowsUE_.part3.rar
http://rapidshare.com/files/134954578/ZinowsUE_.part4.rar
http://rapidshare.com/files/134957602/ZinowsUE_.part5.rar
http://rapidshare.com/files/134960746/ZinowsUE_.part6.rar
http://rapidshare.com/files/134963737/ZinowsUE_.part7.rar
http://rapidshare.com/files/134964219/ZinowsUE_.part8.rar

Password: byShepard

Una razón más para usar Linux y OpenOffice.org

¿Todavía sigues haciendo tus presentaciones en PowerPoint, con esos arcaicos efectos que impresionaban hace 7 años?

Ahora vengo a mostrarles lo que nos espera para la siguiente versión de OpenOffice.org 2.4, que será publicada en marzo de este año. Impress, el paquete para hacer presentaciones en OpenOffice, se aprovechará de las librerías OpenGL para añadir transiciones con efectos 3D; sólo bastará tener una tarjeta Nvidia o ATI, e instalar los drivers con aceleración gráfica para Linux.

Una muestra de los que nos espera:

Estas características sólo estarán disponibles para la Linux en un principio. Ya se puede bajar un adelanto en binario.

[Fuente] OOoNinja

Añado: Además me entero que Microsoft ha publicado la especificación de los formatos binarios usados desde 1997 hasta 2007 en su suite MS Office. Lo que implicaría que OpenOffice podría manipular y generar perfectamente documentos creados en Office.

¿Que no hay virus en Mac? Ya veremos…

Esta entrada podría ser polémica para los obtusos recalcitrantes fanáticos de Mac, pero es necesario informar sobre estas situaciones. Sólo mediante el conocimiento de los usuarios se puede evitar una infección en sus sistemas OSX.

Primero que nada, hablemos de la definición de virus de computadora, un virus de computadora es un programa capaz de instalarse en un sistema sin el conocimiento ni permiso del usuario, además es capaz de propagarse a otros sistemas. Dependiendo de su intención y forma de propagarse, pueden clasificarse con nombres oscurantistas como gusanos, troyanos o virus de macro, entre otros nombres. Algunos borraban archivos, dañaban discos duros, recolectaban información privada, o simplemente se propagaban sin hacer daño. ¿Pero todo acaba ahí?

(más…)