Mostrando entradas con la etiqueta exploits. Mostrar todas las entradas
Mostrando entradas con la etiqueta exploits. Mostrar todas las entradas

23 enero 2013

Antes de entrar en la parte técnica y llegar a la programación, donde seguramente muchos lectores dejen de leer, quiero hacer una pequeña introducción para todos los públicos.

En este artículo voy a escribir un poco sobre lo fácil que es burlar la protección de un antivirus sin tener que recurrir a técnicas complejas y algoritmos "vanguardistas" como encoders, polimorfismos, metamorfismos y demás ingenios, que muchas veces nos llevan a la falsa creencia de que un posible intruso o creador de malware debe ser un genio de los ordenadores, y como hay pocos genios es difícil que nos toque. De hecho un gran porcentaje de incidentes de seguridad se produce aprovechando vulnerabilidades o malware antiguos, que a priori todo antivirus detectaría fácilmente de no haber sido modificados.

Eso, sumado a la falsa seguridad que nos proporciona el software como los antivirus o firewalls hace que la gran mayoría de la gente no preste la atención que debiera a la seguridad de sus sistemas (ya no vamos a entrar en el recalcado tema de cómo escoger una buena contraseña).

Se invierten millones de euros en investigación de protecciones de seguridad informática y existe todo un gran mercado en torno a ello, pero al final del día el mejor antivirus, y la mejor protección que "podría" existir para nuestros ordenadores es el propio usuario (aunque desgraciadamente, todavía siga siendo lo contrario). Muchas veces me han pedido consejo para escoger un antivirus, o me han preguntado que antivirus utilizo, y cuando yo contestaba "ninguno" se quedaban un poco sorprendidos. Si bien hoy en día si utilizo, es verdad que he estado muchísimos años sin utilizarlos.

A lo que quiero llegar es que fuera del mundillo de la seguridad informática, se sigue confiando la seguridad un 100% a programas como los antivirus, la gente se siente protegida con ellos, lo cual es contraproducente. Pequeñas cosas como mantener actualizados todos nuestros programas, ser cuidadosos con las cosas que descargamos o controlar que servicios tenemos corriendo en nuestras máquinas en cada momento quedan relegados a un segundo plano (muchísima gente ni siquiera le da importancia a no actualizar), aunque no infalible, minimizan mucho los riesgos, convirtiendo un antivirus en una capa de protección más, y no en la más importante.

Dicho esto, y después de asustar un poco a los no iniciados (esa era la intención), entremos al lío.


De todos es sabido que los antivirus basan casi el 90% de su detección en la búsqueda de signatures, partes de código reconocibles como maliciosas o sospechosas se que van actualizando en sus bases de datos de firmas según se descubren nuevos virus o exploits.

Para camuflar este tipo de firmas en malware, una de las cosas que más se están utilizando son encoders de todo tipo, que manipulan ese código detectable convirtiendolo en otro diferente que hace la misma función, pero a la larga esos encoders se vuelven inefectivos porque siguen un patrón que puede detectarse con análisis heurístico. Incluso el famoso y polimórfico shikata ga nai es inefectivo hoy en día, por muchos pases que se apliquen.


Por regla general, un antivirus realiza el análisis de los archivos tanto cuando se escriben en disco como cuando son ejecutados, pero no monitoriza toda la ejecución del mismo, porque eso requeriría de unos recursos de los que una máquina normal hoy en día no dispone (imaginad que cada vez que se ejecutase un Photoshop u otro programa intensivo computacionalmente, el AV tuviese que monitorizar en todo momento todas las operaciones que realiza).

Sin embargo existen técnicas que le pueden poner las cosas muy difíciles a un antivirus, incluso a los análisis heurísticos, y que sólo un análisis exhaustivo por parte de un humano en un entorno sandbox podría detectar (algo impensable para la detección en tiempo real).

Algo de lo que adolecen los antivirus es que analizan los archivos independientemente, y no como un conjunto de archivos que forman una pieza de software. Y desgraciadamente deben hacerlo así para evitar multitud de falsos positivos.

Por ejemplo, en uno de los últimos exploits Java (CVE-2012-1723), compuesto por varias clases empaquetadas en un jar, detectaba la firma sólo en dos de ellas, donde se ejecutaban las funciones sospechosas, con lo que separando esas firmas en clases diferentes se podía anular la detección muy fácilmente.

Sin entrar en detalles, este exploit se basa en type confusion, asignando una clase con funciones que requieren privilegios de sistema a otra clase de distinto tipo que no los requiere, saltándose el sandbox java de ese modo. El antivirus detectaba el exploit en la clase que forzaba la confusión (llamemosle confusor), y en un par de líneas de código de otra clase, donde se creaba la instancia del confusor (probablemente para detectar variantes del exploit donde el confusor fuese diferente).

No fue necesario utilizar ningún tipo de ofuscación de clases sobre el exploit:

Para el confusor bastó con cambiar un bucle for de 100 iteraciones por 110 para que el antivirus ya no lo marcase como peligroso.

En cuanto a la clase donde se creaba la instancia de forma reflectiva, el AV lo detectaba cuando estas dos líneas aparecían juntas en el mismo archivo, pero separandolas de una manera extremadamente trivial, neutralizamos totalmente lo que el AV daba por sentado como malicioso:




Como se puede apreciar, realizando pequeñas modificaciones al código, y sobretodo separando las partes del código sospechosas en diferentes lugares es muy sencillo desaparecer de la lista de firmas del AV. De este modo y con un poco de creatividad podríamos ocultar incluso ROP chains, heap sprays...,  pilares de muchos exploits modernos.

Para continuar, y ya que hemos utilizado el exploit java para demostrar cómo evadir el antivirus durante la fase de explotación, vamos a ver como ocultar también un payload, ya que las shellcode más comunes suelen ser detectadas per se como firmas.

Hemos modificado el código del exploit de java para evitar el antivirus, pero en cuanto añadiesemos a la ecuación nuestra shellcode (por ejemplo un meterpreter https reverso), volvería a ser detectado. Dado que el exploit en java no nos limita en tamaño a la hora de weaponizarlo con un payload, y como ya nos hemos saltado el sandbox java, ¿por qué ejecutar la shellcode directamente desde el exploit, cuando podemos volcar un ejecutable a disco y lanzar la shellcode desde allí? Podría parecer una estupidez hacer una escritura a disco dando al AV una oportunidad extra de análisis, pero como veremos más adelante evitar la detección de la explotación asumiendo ese riesgo tiene sus ventajas si nos encargamos de ocultarlo bien en la fase post-exploit, donde contamos con más flexibilidad para hacerlo.


Como se puede apreciar, hemos convertido los binarios en cadenas de texto (los he truncado por legibilidad), los hemos almacenado en variables (separados en dos mitades), y los recodificamos a binario antes de escribirlos a disco, consiguiendo que el AV no los detecte al analizar el paquete Java.

Con eso ya estamos separando el payload del propio exploit (recordad, separación es la clave), pero tendremos que conseguir que el payload sea también indetectable.

Para ello vamos a utilizar varios trucos. En primer lugar, cogeremos nuestra shellcode y la partiremos en 2 mitades (una vez más). Con eso ya sería suficiente, pero para este ejemplo, además, he creado un sencillo "encoder" que hace rotaciones de bits en cada byte de la shellcode y luego los invierte, con la intención de camuflarla un poco. Así que ya tenemos dos mitades de nuestro meterpreter, previamente scrambled con el miniencoder.


Si sólo utilizaramos el encoder sobre la shellcode entera, el antivirus podría reconocerla con algo de heurística, pero de este modo aunque aplique la heurística a cada mitad, no se encontrará con la shellcode completa, con lo que no la reconocerá como firma.

Podríamos crear un sencillo ejecutable que lanzase esa shellcode, pero aquí vamos a utilizar otro truco para engañar aún más.

Crearemos un ejecutable normal (payload.exe), con una función trivial que no haría saltar jamás al antivirus, porque no realiza ninguna acción sospechosa, pero utilizaremos unas librerías dinámicas para sobreescribir esa función trivial con nuestra shellcode en tiempo de ejecución, y ya en memoria:



Debemos configurar el compilador para que no utilice el NX/XD (DEP) ni base dinámica (ASLR), de este modo la dirección de memoria que sobreescribiremos en nuestro programa no variará en cada ejecución, ni la memoria estará desorganizada por el ASLR, lo cual sería un problema para escribir secuencialmente.

Como veis, y para esta demostración, la función inofensiva() está compuesta por una serie de NOPs (o cualquier otra cosa), para hacerla más fácil de encontrar en nuestro debugger, y debe tener el tamaño suficiente para albergar nuestra shellcode una vez la sobreescribamos.

Lo ejecutamos en el debugger para localizar la dirección donde comienza dicha función:


Dado que en este caso el programa comienza a ejecutarse en 400000, nuestro offset para comenzar a sobreescribir será 53F0, que es el punto de entrada de la función.

Un análisis por parte del antivirus sobre el ejecutable no revelaría nada ya que el código de la shellcode no sobreescribe la función inofensiva() hasta que cargamos las librerías.

Como hemos partido la shellcode en 2 mitades, crearemos dos DLL (shellcode1.dat y shellcode2.dat), una con cada mitad (una vez más, separación), de este modo el AV aunque analice cada DLL en disco, no encontrará nada.



En MY_OFFSET establecemos la posición de memoria en tiempo de ejecución donde debe empezar a sobreescribir. Decodificamos nuestra media shellcode anteriormente “revuelta”, y la escribimos donde estaba la función inofensiva().

VirtualProtectEx, así como otras que permiten API hooking, es una de las funciones más vigiladas por un antivirus dado que abre las puertas a escribir en memoria en tiempo de ejecución, pero como hemos dicho antes, solo estamos escribiendo media shellcode, y es por esa razón por la que no saltará la alarma, y es a lo que me refería con que un antivirus escanea archivos independientes, y no como un conjunto.


También habréis notado que utilizo sleeps para pausar la ejecución. Es solo una sospecha personal infundada, pero aunque retrasa la ejecución del payload creo que algunos antivirus (especialmente los que quieren vendernos que casi no comen recursos al ordenador) dejan de analizar si el proceso que monitorizan es lento, especialmente si es un bucle, para ahorrar recursos y no interferir en la experiencia del usuario. Y también para tratar de que el AV no “relacione” una función con la anterior, aunque supongo que eso ya es un raciocinio humano que no se aplica a una máquina ;)


Para la segunda DLL, solo tenemos que cambiar la segunda mitad de la shellcode y el offset para continuar escribiendo en la posición donde terminó la primer mitad.

Algo que podríamos hacer para enrrevesarlo aún más (aunque para no complicarlo demasiado no lo hemos hecho aquí), sería empezar escribiendo la segunda parte de la shellcode, y luego la primera (simplemente invirtiendo el orden en el que hacemos el LoadLibrary), con lo cual nos curamos en salud ante un posible análisis secuencial de lo que estamos escribiendo en memoria.

Ya para terminar, vamos a añadir una capa más de separación, utilizando un ejecutable (spawner.exe) , el cual es el verdadero ejecutado por nuestro exploit java y que será el encargado de lanzar el payload (Nota: he hecho esto porque a día de escribir el código, el reverse https terminaba el proceso al cabo de unos minutos si no se establecía una conexión):




Este pequeño programa también es inofensivo a los ojos del AV, y lo único que hace es monitorizar si existe el proceso de nuestro payload, y si no es así, lo relanza.

Además, como hemos creado una entrada en el autorun del registro (lo cual podría resultar sospechoso para el AV), siempre es mejor que el "sospechoso" sea este nuestro spawner inofensivo, y no el que carga las librerías del payload.


Resumiendo:

  • Hemos lanzado nuestro exploit en java, ya modificado, con lo cual el antivirus no lo ha detectado. 

  • El exploit ha volcado 4 archivos al directorio temporal de Windows. El AV los analiza en el momento en que se escriben a disco. Dos de ellos son ejecutables inofensivos, con lo cual no los detecta. Los otros dos son las librerías donde está la shellcode, pero son dos archivos independientes, el AV tampoco detectará una shellcode completa. 

  • Se ejecuta nuestro lanzador inofensivo, el AV no lo detecta en la ejecución. Se ejecuta el payload lanzado, y el AV analiza qué trata de hacer (una función inofensiva), también analiza las DLL al cargarlas (pero cada una realiza la sobreeescritura por separado, tampoco las detecta). Llegado ese punto la shellcode ya está reemplazando la función inofensiva(), pero el AV ya no puede detectarlo, ya que para ello tendría que volver a analizar la ejecución completa del programa en memoria y darse cuenta que el código fue sobreescrito, algo que requeriría muchos más recursos, y que en un programa más complejo sería demasiado intensivo. 


Hemos engañado al antivirus sin rompernos la cabeza con algoritmos imposibles, simplemente separando código malicioso en diversos trozos y lugares, y ejecutandolo de una forma poco convencional (sobreescribiendo una función ya existente). Podríamos haber utilizado otros trucos sencillos, como crear un programa con un overflow deliberado y explotarlo para lanzar la shellcode (algo que el antivirus jamás se "imaginaría"), en lugar de integrarla en el propio programa como una función más.

En el hipotético caso de que esto fuese un malware real, ya conocido, y con las firmas añadidas a un antivirus, bastaría con partir en más trozos todavía el código para que el AV dejase de detectarlo, y se convertiría en el juego del gato y el ratón.


¿Soluciones? Pues es bastante complicado. Para que los antivirus pudiesen conseguir una detección robusta no basada en firmas conocidas deberían ser capaces de monitorizar todos los procesos que ocurren en una máquina en todo momento, de relacionar esos procesos entre si de forma racional, tendrían que ser capaces de descubrir automáticamente vulnerabilidades en los programas (sin saber de antemano que las tienen); en definitiva, ser una inteligencia artificial que a día de hoy solo es ciencia ficción. Y necesitarían utilizar prácticamente la totalidad de los recursos de la máquina dejando una pequeñísima parte para el resto de procesos.


----------------------------------------------------------------------------------------------------------------

Artículo cortesía de Antonio Rodríguez (MoebiuZ)
Leer más...

19 abril 2012

Mitigaciones de seguridad en EMETv2.1 (III de III)

Mitigaciones de seguridad en EMETv2.1 (I de III)
Mitigaciones de seguridad en EMETv2.1 (II de III)

Heap Spray

Es una técnica que consiste en copiar una shellcode muchas veces en memoria. Persigue como objetivo aumentar la probabilidad de éxito en la ejecución de la shellcode, debido a la dificultad que existe en conocer de antemano la posición exacta de la misma. Normalmente se hace uso de JavaScript o Flash para este fin.

EMET mitiga esta técnica preasignando las páginas de memoria virtual más utilizadas, lo cual evita que se pueda escribir la shellcode.



NULL page allocation

Mitigación que persigue como objetivo evitar problemas de seguridad con las referencias a NULL. Para conseguir este fin EMET preasigna la dirección 0x00000000.


EAF

Para comprender esta mitigación es necesario saber que Export Address Table (EAT) es un vector de punteros que contiene las direcciones de las funciones exportadas.

Existen shellcodes estáticas y dinámicas. Las primeras utilizan direcciones de memoria hardcodeadas, pero el problema es que éstas suelen cambiar con diferentes versiones de núcleos, idiomas, etc; amen de la dificultad de explotación si se usa ASLR. El hardcoding disminuye el nivel de éxito de ejecución de una shellcode. En cambio las shellcode dinámicas llaman a APIs de Windows, pero previamente deben obtener su dirección y para esto recorren la EAT de los módulos cargados. El comportamiento por defecto de la mayoría de las shellcodes es obtener la dirección base de kernel32.dll y después la del API GetProcAddress (y también LoadLibrary). Mediante ésta se obtiene la dirección de otras funciones.

Mediante EAF se filtra el acceso a la EAT de los módulos ntdll.dll y kernel32.dll permitiéndolo o denegándolo basándose en el código que intenta acceder. Para esto se usan puntos de ruptura hardware para interceptar operaciones de lectura, y Vectored Exception Handler para comprobar si la dirección origen del código que intenta acceder pertenece a un módulo. Cuando el punto de ruptura salta debido al acceso a EAT, EAF determina si el código que está accediendo es legítimo del proceso o malicioso que ha sido inyectado en el proceso mediante un exploit. Si detecta que es malicioso, entonces termina el proceso.

Para que la mitigación EAF funcione, EMET crea un nuevo hilo en el proceso. Por lo tanto no se aplica inmediatamenteal iniciarse, tarda unos milisegundos. Es importante recalcar que es una mitigación útil para prevenir la ejecución de la mayoría de las shellcodes, pero es relativamente fácil de evitar.

Existen varias formas de bypassear EAF:

  • EAF comprueba la localización de la instrucción que accede a EAT permitiendo su acceso si está dentro del segmento de código; sino termina el proceso. Por lo tanto se podría hacer que la shellcode usara instrucciones del segmento de código de un módulo cargado para leer memoria, de forma que se invoque desde la shellcode para leer EAT. En este caso el acceso pasaría como legítimo, aún habiendo sido invocado por la shellcode. Esto está explicado con mayor detalle en este enlace.

  • Como aquí se comenta, una forma de desactivar la protección EAF es poner a cero los registros debug del procesador mediante SEH, inhibiendo así los puntos de ruptura hardware. Esto sólo funciona si no tenemos activo /SAFESEH. Un ejemplo de código para inhibir EAF borrando el contenido de los registros debug sería éste. En vez de utilizar SEH para esto, hace uso de llamadas al sistema. Al utilizar syscalls no hace falta averiguar la dirección de memoria de una función accediendo a EAT, lo cual denegaría EAF. Tiene como inconveniente que no es portable, ya que el número de llamada al sistema puede cambiar con el Service Pack, etc. De hecho se advierte en el texto.


BottomUpRand

Utiliza 8 bits de entropía para aleatorizar la dirección base de diferentes secciones como stack, heap y otros. Esto permite incrementar la entropía de la dirección base de las DLLs, pasando de 15 a más de 200.

Mandatory ASLR preasigna la dirección base preferida de una DLL para forzar que se cargue en otra dirección. Si la dirección base está asignada, a esto se le llama DLL collided, y ahí es donde entra en juego Bottom Up Randomization.

Esta mitigación funciona reservando un número entre 0 y 256 de bloques de 64K mediante VirtualAlloc. Esto consume una porción de la parte más baja del espacio de direcciones. Windows asigna la dirección base de DLLs que colisionan buscando una región libre en en la parte más baja del espacio de direcciones, por lo tanto Bottom Up asegura que la dirección asignada sea aleatoria. Si no se hace uso de esta técnica de mitigación la parte más baja permanece prácticamente estática.


Artículo cortesía de David Montero 
Leer más...

05 abril 2012

Mitigaciones de seguridad en EMETv2.1 (II de III)

SEHOP

Excepciones en Windows

Primero de todo aclarar que una excepción es un evento que ocurre durante la ejecución de un programa. Para gestionar este evento es preciso hacer uso de código externo al flujo del programa que se estaba ejecutando. Existen dos tipos de excepciones: hardware y software. Las primeras son inciadas por la CPU, como una división por cero o acceso a una posición de memoria inválida; y las software son provocadas por aplicaciones o el operativo. Mediante el manejo de excepciones (SEH en Windows) es posible trabajar tanto con las de tipo hardware como software.

Un registro de excepción es una estructura que se compone de dos campos: un puntero al siguiente registro y un puntero al manejador de la excepción. Mediante el primer registro se consigue una lista enlazada de los registros de excepción, por lo tanto next SEH apunta al siguiente campo next SEH. El segundo campo es una dirección que apunta a la posición de memoria que contiene el código a ejecutar cuando se produce una cierta excepción.


Los registros de excepción se almacenan en la pila del hilo. Por lo tanto mediante un desbordamiento de pila el atacante puede sobreescribirla para modificar el puntero al manejador de excepción y next SEH.

Es importante tener en cuenta que cuando se salta al código del manejador de excepción se crea un marco de pila propio (Exception Dispatcher Stack). En este marco se almacena una estructura que entre otros datos contiene EstablisherFrame. Éste apunta al registro SE de la pila del programa, concretamente al campo next para poder seguir recorriendo la cadena.

En cada marco de pila correspondiente a una función sólo constan los punteros a manejadores de las excepciones de esa función. Por lo tanto los punteros al código de los manejadores de excepción están enlazados, pero siempre que sean los de la misma función.

Posición dentro del marco de pila de una función:


FS:[0], presente en Thread Information Block (TIB), apunta al principio de la cadena SEH, posición en la cual hay un registro SEH con sus dos punteros. El último registro de la cadena apunta a FFFFFFFF. Por lo tanto cuando una excepción ocurre, Windows mira en el Thread Environment Block (TEB) el comienzo de la cadena y la recorre hasta encontrar el manejador correspondiente. Si no existe se ejecuta el por defecto propio de Windows (UnhandledExceptionFilter). Éste pregunta al usuario si desea enviar un informe de error a Microsoft.

Cuando se produce una excepción el operativo recorre la cadena SEH. Dentro del código de excepción, filter_expression indica si se puede encargar de esa excepción o no. En el primer caso se ejecuta el código correspondiente, y si no se pasa al siguiente registro SE. En resumen, es dentro del código del manejador donde se decide si se puede manejar la excepción gracias a filter_expression.

El registro y eliminación de manejadores de excepción ocurre en tiempo de ejecución. Si en una función se declara un manejador, éste se añade al principio de la lista (LIFO) cuando se llame a la función; no antes. Previo a la invocación de la función, en la cadena sólo constará el manejador por defecto de Windows. De la misma manera, cuando se sale de una función se elimina el registro SEH correspondiente a la excepción o excepciones declaradas dentro de ella. Es decir, dependiendo de donde estemos en el código varían los registros SEH presentes en la lista.


Exploiting

Hay que sobreescribir el puntero al manejador que se va a utilizar para tratar una excepción. Esto hará que podamos saltar a nuestra shellcode en vez de al manejador de excepción correspondiente. Para esto vamos a utilizar la serie de instrucciones pop/pop/ret. El payload debe hacer lo siguiente:

  • lanzar una excepción.

  • sobreescribir next SEH con un jumpcode para saltar a la shellcode.

  • sobreescribir SE Handler con la dirección de una instrucción que haga que lleguemos a next SEH (pop/pop/ret en un módulo sin SAFESEH).

  • la shellcode tiene que estar situado después de SE Handler.


Mitigaciones

Para explotar una desbordamiento de pila mediante SEH, no podemos llegar a la shellcode simplemente saltando a lo que apunta un registro. Como medida de protección desde Windows XP SP1 se hace XOR de los mismos antes de que el manejador de excepción tome control, por lo tanto su contenido es 0. Es necesario llamar a un serie de instrucciones en una DLL (pop/pop/ret).

Existen dos formas de mitigar la sobreescritura de SEH:

  • recompilar el código de forma que los ejecutables compilados contengan metadatos útiles para la mitigación (flag /SAFESEH). A esta mitigación Microsoft le da el nombre de software DEP, ya que previene la ejecución de código. En este caso la CPU puede no implementar DEP, y por lo tanto no se hace uso del bit NX. No tiene nada que ver con la prevención de código en páginas de memoria; se basa en una técnica totalmente diferente.

  • SEHOP: trabaja de forma dinámica y no utiliza metadatos. Revisa que la lista de manejadores de excepción de un hilo sigue intacta hasta invocar al manejador. Cuando un atacante sobreescribe el puntero del manejador en la pila, suele sobreescribir previamente el campo next del registro SEH. Por lo tanto la lista enlazada se rompe y con ella la integridad de la cadena.

La mitigación SEHOP tiene lugar mediante dos pasos:

  • inserta un registro SEH simbólico al final de la lista de manejadores cuando el hilo se empieza a ejecutar. Debido a que los registros SEH se introducen siempre al comienzo de la cadena garantiza que el simbólico siempre estará al final.

  • cuando un manejador se va a ejecutar, se comprueba que se puede alcanzar el registro simbólico introducido. Si es así, se salta a la rutina de excepción. Si no se puede, se asume que la lista ha sido corrompida debido a una sobreescritura SEH y por lo tanto se finaliza la ejecución del proceso sin llamar al manejador.
Artículo cortesía de David Montero 
Leer más...

29 marzo 2012

Mitigaciones de seguridad en EMETv2.1 (I de III)

Introducción

EMET es una herramienta que mejora la protección de aplicaciones de terceros y binarios propios de Windows mediante siete técnicas de mitigación. Funciona inyectando una DLL (de 32 o 64 bits) en cada proceso de la aplicación protegida.

En este texto se habla varias veces de compilar con un cierto flag los fuentes de una aplicación. Aunque se utiliza ese término, la fase exacta sería la de enlazado y no de compilación.

Mitigaciones de seguridad


- DEP

Solución hardware y software para prevenir la ejecución de código en páginas de memoria que que no han sido marcadas explícitamente como ejecutables, ya que típicamente se usan para datos (stack, heap). Para esto marca como no ejecutables la pila y el heap, de forma que cualquier intento de ejecución de código en estas zonas será denegado a nivel de procesador. Para utilizar DEP la CPU debe soportar la desactivación de ejecución (XD en Intel y NX en AMD).

En principio sólo se podía hacer uso de DEP si una aplicación había sido compilada con el flag correspondiente /NXCOMPAT. EMET posibilita su uso sin necesidad de recompilar la aplicación; para esto llama a SetProcessDEPPolicy desde el proceso en cual se inyectó la DLL de EMET. En CPUs de 64 bits sobre Windows de 64 bits siempre está activo y no se puede desactivar. Por lo tanto si se invoca a SetProcessDEPPolicy en estas CPUs se produce un fallo.

Se puede evadir mediante una técnica llamada return-to-libc, en la cual se sobreescribe la pila para apuntar a código de librerías (por ejemplo, system en glibc). En este caso no se ejecuta código en la propia pila, y por eso se puede bypassear. Sucede algo parecido con la técnica ROP, donde tampoco se busca ejecutar código en la pila.

Para realizar la técnica ROP es necesario tener el control de la pila. La idea es aprovechar pequeños trozos de código (instrucciones) que ya están en memoria para construir el payload deseado. Para ello se escriben en la pila las direcciones de las instrucciones que interesan. A esto se le llama ROP-gadgets. Éstas instrucciones se ejecutan sin problemas, ya que están ubicadas en páginas de memoria marcadas con permisos de ejecución (NX=0). Finalmente se escribe la shellcode en una zona ejecutable, que previamente estaba en la pila, y se salta a ella. Se puede escribir sobre la sección de código en JIT, ya que requiere que los permisos que se utilicen sean rwx. Sino, se puede hacer uso de VirtualAlloc para establecer todos los permisos o dar permisos de ejecución con VirtualProtect.

Se podría hacer que todo el exploit funcionara a base de ROP puramente, pero típicamente se hace uso de él solo durante la primera fase. Es decir, se persigue como objetivo ejecutar el código que hemos copiado en la pila y no construirlo mediante ROP-gadgets.

Visto que existen técnicas para evitar DEP, es conveniente además hacer uso de otras técnicas de mitigación (ASLR, SHEOP, MIC) para convertirlo en realmente efectivo. Por ejemplo, mediante ASLR el atacante no podrá encontrar las posiciones de memoria donde están situados los ROP-gadgets.

DEP se puede configurar de cuatro maneras diferentes:

  • optIn: sólo afecta a binarios de Windows y a aplicaciones que explícitamente lo indiquen. Los binarios de 64 bits son la excepción, ya que siempre serán protegidos a menos que se indique lo contrario mediante optOut.

  • optOut: afecta a todos los binarios, tanto de Windows como de terceros. Se puede indicar explícitamente que algunos binarios no se vean afectados.

  • AlwaysOn: se aplica a todo el sistema haciendo caso omiso de las excepciones optOut.

  • Disabled: se desactiva totalmente haciendo caso omiso de las excepciones optIn.


- ASLR

En Windows los ejecutables (EXE y DLL) en principio se cargan en memoria en la dirección base establecida en tiempo de compilación que consta en el propio fichero. Para prevenir la explotación de vulnerabilidades mediante ASLR se aleatoriza esta dirección, de forma que no se utiliza la indicada en el ejecutable.

Es necesario distinguir dos implementaciones de ASLR. La que realiza el propio Windows trabaja con módulos que han sido compilados con un flag específico (IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE), y aleatoriza la dirección base con hasta 256 posibilidades. La segunda implementación es la ofrecida por EMET donde no se necesario indicar nada en tiempo de compilación, y por lo tanto no hace falta recompilar la aplicación. Esto es, si un ejecutable no soporta ASLR de forma nativa, mediante EMET se asigna la dirección de memoria base donde se carga el ejecutable de forma que el cargador de imágenes tenga que buscar una nueva dirección. A esto se le llama Mandatory ASLR (pseudo-ASLR), y tiene una menor entropía que ASLR real: 4 bits frente a 8 en ASLR nativo.

Mandatory ASLR usado conjuntamente con la técnica de mitigación Bottom Up Randomization, implementado en la versión 2.1 de EMET, ofrece una gran protección. La entropía obtenida es la misma que con ASLR real, y además la dirección base cambia cada vez que se inicia la aplicación. Con ASLR nativo esto no ocurre, y además es necesario un reinicio.

En EMET la mitigación Mandatory ASLR fuerza la relocalización de DLLs que han sido cargadas posteriormente a EMET.DLL. Por lo tanto no se aleatoriza con EMET ni la propia imagen core ni las librerías estáticas empotradas en él. Cuando EMET se carga hace un hook a LdrLoadDll y comprueba por cada módulo que se vaya a cargar el bit IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE. Si no está presente implica que la DLL no ha sido enlazada con el flag ASLR, por lo tanto se fuerza pseudo-ASLR preasignando una página de la dirección base para que el operativo la cargue en otra dirección.

Para comprobar si EMET está funcionando correctamente con ASLR podemos usar Process Explorer de la suite Sysinternals. Primero hay que tener en cuenta que los módulos que marca como ASLR son los que han sido compilados específicamente para ello; es decir, aquellos con los que trabaja Windows y no EMET. Para poder ver los que EMET ha forzado la relocalización hay que ir a Options-Configure Colors y activar Relocated DLLs. Después indicaremos que queremos que se muestren las DLLs mediante View-Show Lower Pane y finalmente View-Lower Pane View-DLLs. Entonces al pinchar sobre un proceso protegido con ASLR en EMET, si no utiliza DLLs compiladas con dynamic base, veremos que han sido relocalizadas mediante EMET (las mostrará de amarillo si se utiliza el color por defecto).

Artículo cortesía de David Montero  
Leer más...

20 marzo 2012

Exploit de Joomla paso a paso

En esta entrada voy a tratar de explicar cómo hacer un exploit paso a paso para Joomla 2.5.0-2.5.1 o 1.7.0-1.7.5, de la forma más sencilla posible y explicando  conceptos básicos de inyecciones de SQL y alguno un poco más avanzado, ya que en este caso se hace el ataque basado en tiempo.

Para este ejercicio lo ideal es que montéis un Joomla versión 2.5.1 por defecto en vuestro sistema y podáis acceder localmente para ir haciendo las pruebas.

Hasta la fecha no hay exploit para este fallo del 29 de febrero, aunque la vulnerabilidad se conoce gracias a la nota de seguridad de Colin Wong.

Lo que me ha dejado completamente K.O., es como una vulnerabilidad tan gorda y estúpida, se ha podido colar en el código. Me ha sorprendido muchísimo que no haya sido descubierta antes, coño, si es que hasta el Acunetix, la detecta.


El primer paso es buscar donde está el bug comparando el código de la versión vulnerable: 2.5.0 ó 2.5.1, con el de la versión que lo soluciona: 2.5.2. 

Se descargan ambos ficheros y se descomprimen para ver que líneas han sido modificadas. Afortunadamente no hay demasiadas y es muy sencillo detectar las líneas que están afectadas por el sql injection con un simple comando "diff" (línea 8)



¡Vaya! En las dos últimas líneas del diff se ve que la variable "$current" en la nueva versión es llamada usando $db->quote() y no directamente. Sospechoso ;).

Lo siguiente es tratar de encontrar en que momento este código es ejecutado para averiguar donde se ha de inyectar el código SQL y hasta dónde se puede llegar.

Toca revisar el fichero dónde está esa línea: j-2.5.1/plugins/system/redirect/redirect.php


Tan solo por la cabecera se puede observar que es un componente del Core de Joomla que está encargado de hacer redirecciones y viendo el panel de administración, te haces una rápida idea de que función hace este plugin.


Básicamente permite hacer redirecciones en caso de que solicite una página web que no existe. Gestionando los errores y evitando que un visitante llegue a una página muerta de la web.

Ahora a leer el código del fichero más en detalle y lentamente. Por lo menos la parte más crítica:


Al margen del primer comentario (hay que ver ahora quien es el idiota). En el código se aprecia que la sentencia SQL vulnerable (línea 24) es llamada cuando no existe una redirección publicada y permanente creada para esa página (el if de la línea 18). Es decir, si por ejemplo se solicita la URL: http://localhost/joomla/index.php/AAAAA y el administrador del CMS no ha creado un redirect para esta página, mostrará un error 404 estándar de Joomla.

El siguiente paso  que da el aplicativo (de la línea 26 a la 45) es añadir la URL a la base de datos para que el administrador pueda ver que páginas se han solicitado y no existen, pero esta parte es indistinta, ya que la inyección se ha generado antes y por lo tanto es irrelevante.

¿Entonces cómo se explota? Pues tan solo hay que llamar una página del tipo: http://localhost/joomla/index.php/AAAAAA' union select ... y el código que se quiera insertar. Lo sé, parece imposible que un producto tan popular y con esta madurez aún tenga un sql injection TAN estúpido.

"El problema" para hacer uso de la vulnerabilidad es que el resultado de la inyección no es mostrado por pantalla, ni errores, ni resultados positivos/negativos y conseguir algo útil es un poco más complejo, ya que la sentencia vulnerable es usada internamente por el aplicativo y no para generar la página resultante.

Solo queda una alternativa y es hacer inyecciones basadas en tiempo. Es decir, si al solicitar la página no existente tarda 1 segundo en responder normalmente, provocar que tarde 10 según el resultado de la inyección.

El ejemplo más sencillo para detectar esta vulnerabilidad es llamar a la página de la siguiente forma: http://localhost/joomla/index.php/AAAAAA' union select sleep(10) union select '1 y observaríamos que tarda 10 segundos en devolver la página ya que la sentencia SQL vulnerable se quedará 10 segundos esperando e impidiendo la ejecución normal que devolvería la página normalmente en 1 ó 2 segundos. 

La ejecución en base de datos y completando la sentencia que se obtiene de la línea 24 con los parámetros que se han pasado, queda de la siguiente forma:

select id from tabla where old_url='http://localhost/joomla/index.php/AAAAAA' union select sleep(15) union select '1'

Ahora no queda más remedio que estudiar funciones de MySQL y ver cómo usar este comportamiento, para extraer datos. Las más importantes:
  • database(): devuelve el nombre de la base de datos: select database()
  • sleep(): ejecuta una demora de tiempo: select sleep(10)
  • length(): devuelve la longitud de una cadena: select length(database()) 
  • ascii(): devuelve el valor ascii de una cadena: select ascii("A")
  • substring() ó mid(): recorta una cadena de caracteres: select mid(database(),1,1)
  • load_file(): devuelve el contenido de un fichero: select load_file("/etc/hosts")
  • ord(): devuelve el código del valor si es multibyte o su ascii: select ord("2")
  • if(): permite devolver valores en base a los resultados de otras consultas: select if(database()="hola","yes","no") en este caso "no", ya que se llama "joomla" y no "hola"
Mezclando estas funciones se puede llegar al objetivo final. Por ejemplo, en mi base de datos que se llama "joomla":
  1. select substring(database(),1,1) devuelve el primer carácter de "joomla", es decir, la "j".
  2. select ascii(substring(database(),1,1)) devuelve el primer carácter del nombre "joomla", la "j" y luego lo convierte a su decimal ascii: 106
  3. select ascii(substring(database(),2,1)) devuelve el segundo carácter de "joomla", la "o" y luego lo convierte a su decimal ascii: 111
  4. select if(database()="joomla","si","no") comprueba si el resultado de database() es "joomla", en caso de que correcto devuelve "si", en caso de que no sea así devolverá "no".
  5. select if(ascii(substring(database(),2,1))=106,sleep(10),null) comprueba si el decimal ascii del primer carácter de database(), "106", es igual a 106, si es así, ejecuta un sleep de 10 segundos y si no, no devuelve nada.
Lo mejor, verlo en funcionamiento directamente sobre MySQL


Pues después de esto solo queda automatizar todo el proceso del ejemplo 5 para ir recorriendo cadenas de caracteres con substring() y comparar con la tabla ascii, calculando cuánto tarda la web en responder, 10 segundos o tan solo 1 ó 2.

Con estas peticiones se averigua el primer carácter de "database()":

select if(ascii(substring(database(),1,1))=1,sleep(10),null)
select if(ascii(substring(database(),1,1))=2,sleep(10),null)
select if(ascii(substring(database(),1,1))=3,sleep(10),null)
...
select if(ascii(substring(database(),1,1))=105,sleep(10),null)
select if(ascii(substring(database(),1,1))=106,sleep(10),null)    <-- en esta se ejecutará el sleep, ya que el ascii de "j" es 106 y la condición se cumple.

Una vez se detecta el retardo de 10 segundos, se pasa al siguiente carácter, modificando el substring:


select if(ascii(substring(database(),2,1))=1,sleep(10),null)
select if(ascii(substring(database(),2,1))=2,sleep(10),null)
select if(ascii(substring(database(),2,1))=3,sleep(10),null)
...

Anidando un par de bucles y calculando el tiempo se puede sacar el resultado de cualquier consulta sql. Por ejemplo con: select table_name from information_schema.tables where table_schema = "joomla" and table_name like "%_users" se obtiene el nombre de la tabla donde se almacenan los usuarios y con: select password from zzzz_users limit 1, el hash de la contraseña del usuario administrador.

Si el usuario que se conecta a la base de datos tiene privilegios suficientes, también podría ejecutar load_file(), cargando un fichero del sistema, que se yo, por ejemplo el /etc/passwd. 

El exploit tan solo ha de automatizar este proceso, incluso puede que alguna herramienta ya desarrollada se pueda configurar para este propósito. El funcionamiento incluyendo peticiones tendría este flujo:
  1. Se obtiene la fecha del sistema
  2. Se hace petición HTTP GET con la comprobación, por ejemplo:  http://localhost/joomla/index.php/AAAAAA' union  select if(ascii(substring(database(),1,1))=1,sleep(10),null) union select '1
  3. Se vuelve a obtener la fecha del sistema
  4. Si la diferencia de tiempo entre el punto 1 y el 3 es de 10 segundos, es que la condición del 'if' se cumple, por lo que se conoce el valor ascii correcto. 
Pues eso es todo, ya solo queda optimizar y tirar línas de código que hagan el trabajo sucio.

La optimización pasa por encontrar el menor tiempo posible de espera, reduciendo los 10 segundos que se han usado durante todo el artículo a uno inferior que no genere falsas alarmas. Otra mejora consiste en no hacer tantas peticiones web, evitando recorrer toda la tabla ascii buscando el carácter válido. Para determinadas sentencias, como database(), tan solo consultar desde el decimal 32 al 90.

La última, un poco más compleja consiste en hacer una consulta con ord() y AND para averiguar los bits que compone cada byte. Con tan solo 8 peticiones se averigua el código ascii, pero si calculamos que la mitad de las peticiones tendrán como resultado un sleep(), puede tardar más que hacer hasta las 60  peticiones recorriendo la propia tabla, en la que solo un requiere un único sleep().

¡Fin! Espero que este ejercicio le haya servido a alguien. Este es el código que a mí me ha quedado:



Para los más vagos, un vídeo que espero sea explicativo.

Leer más...

27 diciembre 2011

El pasado domingo enlazábamos en nuestro post recopilatorio "enlaces de la SECmana - 103", con lo mejor de la semana, un mensaje en la lista del sistema operativo freebsd.org en el que se anunciaba una vulnerabilidad crítica en el servicio telnetd que permitiría ejecución remota de código como usuario con privilegios máximos (ya que normalmente es ejecutado como usuario root).

La vulnerabilidad residía en la librería encrypt.c, ya que cuando se proporcionaba una clave de cifrado mediante el protocolo telnet, su longitud no era validada antes de que dicha clave se copiase dentro de un búfer de tamaño fijo. Se puede ver mejor en el parche que se puso a disposición de todos para solventar dicha vulnerabilidad, en donde se establece que si la longitud (variable len) es mayor que MAXKEYLEN, entonces se fuerza a tomar su valor:

Parche para el demonio telnetd

Ayer mismo, Jaime Peñalba "Nighterman" del grupo Painsec, al que pudimos ver en la pasada Rooted CON 2011 dando una charla sobre qué protecciones tomo él y su grupo para participar en el CTF de la Defcon 18 (aquí el video, 100% recomendado), publicaba un exploit que permitiría aprovechar esta vulnerabilidad en FreeBSD 8.0, 8.1 y 8.2:



Según se ha notificado desde el momento que se anunció esta vulnerabilidad, se tenía constancia de que estaba siendo explotada.

[+] FreeBSD Security Advisory FreeBSD-SA-11:08.telnetd
[+] Exploit telnetd-encrypt_keyid.c por Jaime Peñalba "Nighterman" de Painsec
Leer más...

08 octubre 2011

Chromium/Chrome su programa de recompensas y el Pwn2own

A principios del año pasado el equipo de  de Chromium creo un programa de recompensas para todos aquellos que repotarsen un fallo de seguridad  en el producto, que partía de los $500 hasta los $31337,7 por los más críticos.

Un año después pueden presentar los magníficos resultados que ha tenido el programa. Que resumo según mis cálculos y basándome en la lista publicada: actualmente van por 215 bugs identificados. Un total de 201.954 dólares repartidos en "premios", es decir, una media de $939 por fallo. Realmente poco dinero si pensamos el esfuerzo que le hubiera costado a Google encontrar por si mismo estos fallos y todos aquellos que les han reportado y no suponen un riesgo de seguridad o no son suficientemente críticos.

Si hacemos zoom sobre los datos, se puede observar que Sergey Glazunov lleva embolsados más de 53.000$ en 41 fallos en este periodo, seguido por "miaubiz" que llega a los 31.000$.



Esta filosofía y preocupación por la seguridad es posiblemente el motivo por el que Chrome no es explotado en el concurso Pwn2Own, donde a los participantes podían ganar hasta 20.000$ "tan solo" por una vulnerabilidad que se escapase de la sanbox.


En ocasiones algunos investigadores esperan al concurso para ganar más dinero con un fallo crítico, pero se arriesgan a que otra persona lo reporte y pierdan el trabajo.

Por otra parte, Google parchea todas las vulnerabilidades que conocen pocos días antes de que se celebre el encuentro con el objetivo de "salir guapo en la foto", aunque esta es una técnica que también usa Safari sin el mismo éxito.







Leer más...

04 octubre 2011

A todos nos ha pasado alguna vez que llega a nosotros la noticia de que han hackeado (o defaceado, o crackeado, o ...) una página web que conocemos, e inmediatamente nos ha entrado el gusanillo por visitarla para ver la pintada virtual que han dejado en la misma. Pero no es así de fácil, la mayoría de las veces la visitamos con recelo, o directamente no la visitamos por aquello de: ¿y si ...?

¿Y si de paso han incrustado un exploit? ¿Y si hay algo de Metasploit o BeEF de regalo?

Precisamente ésto es lo que busca "Owned & Exploiting" (@ownedexploiting), un bot que informa vía twitter y que se encarga de analizar las últimas webs que han sido comprometidas en busca de exploits, malware y comportamientos sospechosos. Es capaz de detectar 0days y exploits que no están documentados pero están siendo utilizados "in the wild".

Casos como el reciente hackeo de Mysql.com y su posterior modificación para servir malware podrían ser detectados rápidamente.

Por debajo, JsUnpack con algunas modificaciones es el encargado de analizar las webs y determinar su estado. En caso de detectar algún comportamiento sospechoso o malicioso, el bot publicará la web y un reporte. Además, etiqueta como #suspicious o #malicious el twitt para poder diferenciar rápidamente lo puede ser un falso positivo y lo que no.

Dentro del reporte podemos ver la información detallada. Por ejemplo:

[suspicious:5] (ipaddr:74.55.2.198) account.iclickcare.com/
status: (referer=www.google.com)saved 32302 bytes ./files/fetch_adad9ebba96aac20521a65a50ada0922c12d36c9
info: [decodingLevel=0] found JavaScript
suspicious: Warning detected //warning CVE-NO-MATCH Shellcode Engine Binary Threshold
info: [script] www.dz-attacker.co.cc/indexi/index3/js2/l10n.js?ver=20101110
info: [script] www.dz-attacker.co.cc/indexi/index3/js2/jquery.js?ver=1.4.4
info: [script] dz-attacker.co.cc/indexi/index3/js/tooltip.js
info: [img] dz-attacker.co.cc/pic/index/dz-security.png
info: [img] dz-attacker.co.cc/pic/brisco-dz-new.png
info: [img] dz-attacker.co.cc/pic/index/logo/twitter.png
info: [img] dz-attacker.co.cc/pic/index/logo/facebook.png
info: [img] dz-attacker.co.cc/pic/index/logo/skype.png
info: [script] www.dz-attacker.co.cc/indexi/index3/js/cufon-yui.js
info: [script] www.dz-attacker.co.cc/indexi/index3/js/League_Gothic_400.font.js
info: [script] www.dz-attacker.co.cc/indexi/index3/js/jquery.cycle.all.min.js
info: [script] www.dz-attacker.co.cc/indexi/index3/js/jquery.easing.1.3.js
info: [script] www.dz-attacker.co.cc/indexi/index3/js/jquery.countdown.min.js
info: [decodingLevel=1] found JavaScript

Además, un aliciente del servicio es que al informar en el mismo momento de la detección, permite que cualquiera pueda analizar por su cuenta la web antes de que sea limpiada.

Poco a poco se podrían añadir nuevas funcionalidades, cómo analizar webs a petición mediante un reply, de ésta forma los propios usuarios de twitter podrían ser una fuente de sitios comprometidos y utilizar el bot a modo de análisis.
Leer más...

26 julio 2011

¡Nominaciones Pwnie Awards 2011!


Vuelven los premios más divertidos del mundo del hacking y la seguridad. ¿Que qué se premia? Se premia el FAIL, la pericia o el ridículo dentro de la comunidad de la seguridad.

Además de ser unos premios bastante peculiares, son un pequeño resumen de lo mejor de todo el año, especialmente en la comunidad del exploiting.

Este año hay de todo y para todos, y es que la tarta está muy repartida.

Mención especial para Sony, que no ha dejado hueco para más participantes en la categoría "Pwnie for Most Epic FAIL", y es que ocupa ella sola todo el espacio disponible.

El 3 de Agosto en Las Vegas, en BlackHat USA, se celebrará la ceremonia que determinará los vencedores de cada categoría.

Este año las categorías son las siguientes:

- Pwnie for Best Server-Side Bug
- Pwnie for Best Client-Side Bug
- Pwnie for Best Privilege Escalation Bug
- Pwnie for Most Innovative Research
- Pwnie for Lamest Vendor Response
- Pwnie for Best Song
- Pwnie for Most Epic FAIL
- Pwnie for Lifetime Achievement
- Pwnie for Epic Ownage

Y las nominaciones para cada categoría:

Pwnie for Best Server-Side Bug

Premio para la persona que haya descubierto el fallo más sofisticado e interesante tecnicamente en el lado del servidor.

- ASP.NET Framework Padding Oracle
- Microsoft FTP server heap overflow
- ISC dhclient metacharacter injection
- BSD-derived IPComp encapsulation stack overflow
- Exim remote code execution flaw

Pwnie for Best Client-Side Bug

Igual que la categoría anterior, pero en el lado del cliente.

- FreeType vulnerability in iOS
- Google Chrome sandbox bypass
- Java mismatched codebase arbitrary code execution
- Blackberry Pwn2Own exploit
- Android web market XSS

Pwnie for Best Privilege Escalation Bug

Seguimos con el mejor fallo que permita escalada de privilegios.

- Privilege escalation in CSRSS
- Linux kernel set_fs kernel memory overwrite
- Linux $ORIGIN privilege escalation

Pwnie for Most Innovative Research

Persona que haya publicado la investigación, paper, presentación, hilo en lista de correo o herramienta más innovadora e interesante.

- Stackjacking
- Understanding and Exploiting Flash ActionScript Vulnerabilities
- Black Box Auditing Adobe Shockwave
- Securing the Kernel via Static Binary Rewriting and Program Shepherding
- Understanding the LFH heap

Lamest Vendor Response

La peor respuesta por parte del vendedor.

- Remotely exploitable stack overflow in OpenSSH on Novell NetWare
- Magix Music Maker 16 stack overflow
- RSA SecurID token compromise

Pwnie for Best Song

¿Qué ceremonia de entrega de premios no tiene premio para la mejor canción?

- Eatin' Cookies
- Hacker Hacker
- 0-day
- The Light It Up Contest
- Mastering Success And Failure
- Help Yourself To My Flaws
- LIGATT Rap
- gli anni
- #antisec
- My Digital Self

Pwnie for Most Epic FAIL

Parece que aquí hay premio seguro.

- Sony (Fail0verflow y GeoHot)
- Sony (Sony Online Entertainment (SOE) fail)
- Sony (LulzSec)
- Sony (PSN)
- Sony (Despedido su equipo de seguridad de redes)

Pwnie for Epic 0wnage

- Anonymous for hacking HBGary Federal
- LulzSec for hacking everyone
- Bradley Manning and Wikileaks
- Stuxnet

Podéis consultar toda la información y los divertidos comentarios de cada una de las vulnerabilidades en la web del concurso.

Referencias
Leer más...

15 enero 2010


Imagino que a estas alturas de la película todo el mundo habrá leído sobre la ruptura Google VS China motivado por unos ciberataques cometidos por el gobierno Chino contra sistemas de Google (y no solo de google, también están involucradas otras corporaciones de EEUU)

Ayer José Antonio contaba como uno de los vectores de ataque ha sido el software de Adobe, hoy, llegan noticias que además de Adobe, todo apunta a un 0day en Internet Explorer como otra causa de esos ciberataques.

De aquí, hay varias cosas interesantes, las mas obvias pasan por saber que tiene que decir de todo esto el gobierno Chino y tampoco queda muy bien parado Google (con navegador propio), si parte de ese 'hackeo' se ha realizado a través de Internet Explorer.

Uno de los datos que realmente llaman la atención es el hecho de que tanto el exploit, como el troyano solo han sido empleados para las 33 compañías que fueron víctimas del ataque.

Parece que esas historias de ciber-crimen organizado, mafias con 0Days que roban importantes activos, etc etc habrá que tomárselas mucho mas en serio

Y, por cierto, +1 Yahoo por solidarizarse con su enemigo
Leer más...