lunes, 10 de diciembre de 2012

Buscando puertas traseras en impresoras Samsung y DELL

Hace unos días saltó la noticia de una puerta trasera en el firmware usado por ciertas impresoras. Debido al secretismo por parte de Samsung y Dell, que ha llevado incluso a desactivar en el site oficial de Samsung las descargas de los firmwares de las impresoras afectadas, hemos intentado averiguar cuáles son los modelos que poseen esta cuenta de administración, así como comprobar el nivel de acceso al dispositivo.

Como comentamos en nuestra UAD, el boletín del US-CERT era muy parco y sólo podíamos esperar mayor información por parte del investigador. Una vez se publicó la 'community string' sólo debíamos
centrarnos en la tarea de identificar modelos de impresoras Samsung o DELL y comprobar si se veían afectadas.

Para ello Shodan sigue siendo la herramienta perfecta en este tipo de casos arrojando mas de 1300 resultados para impresoras DELL y más de 7000 para impresoras Samsung con el puerto SNMP activo.
Ya sólo quedaba exportar y adaptar un listado para importarlo en SNScan, una pequeña y rápida utilidad en Windows para escanear dispositivos SNMP. En Linux podemos utilizar snmpwalk y SnmpEnum con los mismos resultados.

Centrándonos en DELL, en una primera tanda pude comprobar si había comunicación SNMP gracias a la community string por defecto ‘public’:

Listado de impresoras DELL importado de Shodan. 

Aparentemente sí la había, pero utilizando la community de nivel administrativo 's!a@m#n$p%c': 

Modelo DELL 2335dn afectado. 

podemos ver que del anterior listado sólo una de ellas se veía afectada. En realidad no todas las impresoras Samsung son fabricadas por DELL (Lexmark también fabrica para ella), pero esto confirma el modelo afectado con los reportes de algunos usuarios en Twitter, DELL 2335DN.

Ya en una segunda tanda con Samsung, pude comprobar la cantidad de impresoras afectadas y la importancia de esta vulnerabilidad:
Numerosos modelos de Samsung afectados.
De ahí que se pudieran ofrecer datos mas o menos aproximados de las posibles series afectadas:
  • Series Samsung SCX-4xxx, 5xxx, 8xxx 
  • Series Samsung ML-2xxx y ML-3xxx
  • Series Samsung CLX-3xxx
Utilizando por ejemplo MIB Browser se puede conectar a la impresora para indagar en sus funciones y (como tenemos la cuenta de administración), podemos llegar a alterarlas con los MIB adecuados.

En la captura podemos ver las características completas del modelo ML-3050:

jueves, 29 de noviembre de 2012

Google Play y su absurda pregunta de seguridad

Personalmente, odio las preguntas de seguridad. Parecen un anacronismo en estos tiempos. Hablamos de ello en este artículo. Sin embargo siguen ahí, utilizándose en muchos servicios. El caso es que sinceramente, creo que he encontrado la pregunta de seguridad más absurda que se puede realizar en un servicio de seguridad. Lo raro es que el responsable sea Google Play.

Esto ocurrió hace unos días cuando un amigo, desde su nuevo teléfono con Android, comenzó a crearse una cuenta para utilizar Google Play. Cuesta creerlo.




Solamente espero que se trate de una mala traducción combinado con una errata (¿algo relacionado con el apellido de soltera de la madre?)... y aun así sería absurdo.

Por cierto, la víctima eligió esa pregunta, y usó su apellido real porque le parecía la pregunta más sencilla y por supuesto, completamente lógica.


viernes, 23 de noviembre de 2012

Falsa actualización de los navegadores que resulta en "suicidio"


De vez en cuando aparecen campañas de infección que nos sorprenden por su "buen hacer" u originalidad. Hemos descubierto hoy una página que, si bien no es nada del otro mundo técnicamente, pretende simular una actualización del navegador de manera convincente. Se trata de hxxp:// securebrowserupdate.com.

Según se visite con uno u otro navegador, muestra diferentes páginas muy personalizadas.
Todos los navegadores tienen su SP1, SP2... incluso con antivirus incluido.



Se adapta (más o menos) a cualquier cosa que la visite (y por supuesto, son rusos... ). 


Pero no descarga malware que no sea el ejecutable para Windows.

El ejecutable en sí simplemente instala un falso buscador en todos los navegadores, estableciéndolo además como página de inicio. El falso buscador en concreto es hxxp://ecostartpage.com/

El malware se copia a sí mismo en la carpeta temporal con el nombre de suicide.exe

El dominio fue dado de alta de día 16 de noviembre. No parece aprovechar ninguna vulnerabilidad. El que ha montado la web se ha olvidado de no mostrar abiertamente el índice de ficheros... hxxp://securebrowserupdate.com/js/ 

Cuando salió hace unos días era detectado por firmas por 7 motores, pero ahora ya lo detectan 22. 


viernes, 9 de noviembre de 2012

Escondiendo el email de las arañas de forma sencilla

Hoy hay muchas formas de evitar que las arañas encargadas de recoger correos por la web para enviar basura,  no vean los correos incrustados en la web. Una de ellas es usando imágenes con la dirección de email contenida en ella, pero esta opción nos impide poder usar adecuadamente la propiedad "mailto" de HTML. Otra de las técnicas utilizadas es el uso de JavaScript. Normalmente este tipo de arañas que van a la caza y captura de direcciones de correo electrónico, no interpretan el JavaScript que encuentran a su paso.

En este punto nos encontramos con dos maneras de conseguir el objetivo: por ofuscación o por "exclusión" de parte del contenido del email. Ofuscar el código es muy utilizado, por eso el método que muestro es el de exclusión. No es algo novedoso, pero si práctico y sencillo y como se verá no cuesta nada programarlo.

Para implementarlo usamos jQuery. Para los que no lo conozcan, es la librería para JavaScript que ha devaluado en los currículum el título de "experto en Javascript".

El pequeño consejo consiste en usar el siguiente código cada vez que queramos representar una dirección de email:

<span class='email'>spam</span>

La función que se encargará de realizar el cambio:

$(function(){
    $(".email").each(function(index) {
        var addr = $(this).text().replace(/\n/g,"").replace(/ /g,"");
        $(this).html('<a href="mailto:'+addr+'@hispasec.com" >'+ addr +'@hispasec.com</a>');
    });
});

Y el código resultante después de cargar la web, que será interpretado por el navegador... Por supuesto, se pueden realizar combinaciones con otros métodos para hacerlo más complejo.

<a href="mailto:spam@hispasec.com">spam@hispasec.com</a>

jueves, 18 de octubre de 2012

No creas a todos los programas que calculan el hash MD5 de un fichero

Hace unos días, mi compañero Sergio de los Santos comentó en la oficina que eran ya unas cuantas personas las que, tras descargarse una de sus herramientas y comprobar su hash MD5, este era incorrecto una y otra vez. La herramienta utilizada por todas ellas era una gratuita, llamada filehasher (ntsecurity.nu/toolbox/filehasher/).  Me propuso investigarlo.

Tras ver que comprobando el hash con otras utilidades se obtenía el resultado correcto y que el fallo no residía en el fichero analizado, se tenía entonces al culpable: filehasher.

Se suponía que esta entrada debería contener líneas de ensamblador, capturas de pantalla del Olly o del IDA... pero, tras documentarme un poco antes de zambullirme entre registros y opcodes, creí ver dónde podía radicar el problema.

La primera suposición que nos hicimos en el laboratorio,era que debía existir algún fallo al tratar el buffer que sería 'digerido' por el algoritmo MD5. Evidentemente, supusimos que la situación más probable era que los programadores habrían usado una librería ya implementada y probada para el cálculo del hash y que ahí no podría estar el error. Implementar ellos mismo el cálculo sería una pérdida de tiempo. Esto supondría tener que hacer algo de reversing sobre el programa, ya que los ficheros fuentes no son públicos.

Antes de nada, me puse a comprobar que, ciertamente, el programa tenía un funcionamiento anómalo. Comparé el resultado de calcular el MD5 de un par de ficheros de prueba. Un fichero (1.txt) contenía un único byte "1" (0x31 h) y otro, llamado 'vacio.txt' que no contenía nada.

Los resultados fueron los siguientes

> filehasher 1.txt -md5
c4ca4238a0b923820dcc509a6f75849b  1.txt


> filehasher vacio.txt -md5
0123456789abcdeffedcba9876543210  vacio.txt





 
Curioso, llama la atención el valor devuelto para 'vacio.txt' que, además de parecer "poco aleatorio", no se parecía al valor del MD5 de un archivo vacío, que, más o menos, recordaba que empezaba por "d41...".

Para cerciorarme de que no era cosa mía, ejecuté el comando 'md5sum' de UNIX sobre los mismos archivos:

$ md5sum 1.txt
c4ca4238a0b923820dcc509a6f75849b  1.txt

$ md5sum vacio.txt
d41d8cd98f00b204e9800998ecf8427e  vacio.txt


Efectivamente, parece que el programita no funciona como debiese... pero solo en algunos casos. El hash de '1.txt' se calcula correctamente, pero, ¿a qué se debe que unas sumas se calculen bien y otras mal?

Para no meterme todavía a pelear con el ensamblador, decidí refrescar la memoria sobre el funcionamiento interno de MD5. Así, si tenía que enfrentarme a él dentro del código, podría localizarme dentro del algoritmo más fácilmente. Tocaba meterse ahora con su RFC, el RFC 1321 (http://www.ietf.org/rfc/rfc1321.txt) concretamente.

Yendo directamente a la sección relativa a la implementación del algoritmo, vemos que se diferencian 5 pasos a la hora de su cálculo. Sólo veremos los 3 primeros de una manera MUY resumida. El entendimiento de estos sencillos pasos nos será de utilidad más adelante.

Paso 1: Añadir un padding


  • Al buffer original se le añaden una serie de bits, de tal forma que crezca hasta una cifra cuyo tamaño, tras ser dividido por 512, nos dé un resto de 448. En caso de que el tamaño del buffer inicial cumpla ya esta condición, se añadirán 512 bits. 
  • Los bits añadidos estarán formados por un bit '1' seguido de tantos bits '0' como sean necesarios para que se de la condición matemática anterior.

Paso 2: Añadir la longitud del buffer

  • Además del 'padding' añadido en el paso 1, se concatenarán 64 bits adicionales que indican el tamaño del buffer original.
  • El valor estará formado por dos palabras de 32 bits representadas en little-endian.
  • Tras añadir estos últimos 64 bits, ya tenemos un buffer múltiplo de 512 bits (64 bytes), de tal manera que ya puede ser tratado por "EL ALGORITMO", todas esas engorrosas operaciones XOR, OR, AND,rotaciones, etc.

Paso 3: Inicialización del buffer MD

  • A grandes rasgos, el cálculo del hash MD5, se realiza modificando un "buffer base".
  • Las modificaciones vendrán dadas por los bytes que vayamos leyendo de nuestro buffer resultante de los dos primeros pasos.
  • El "buffer base" está formado por 4 palabras de 32 bits con la siguiente configuración:

word A: 01 23 45 67
word B: 89 ab cd ef
word C: fe dc ba 98
word D: 76 54 32 10

¿Os suenan esos valores? Pongámoslos en una sola línea:

01 23 45 67  89 ab cd ef  fe dc ba 98  76 54 32 10

Si recordamos el hash devuelto por 'filehasher' del archivo 'vacio.txt', éste era:

0123456789abcdeffedcba9876543210  vacio.txt

Si no me equivoco, parece que nuestros amigos de "ntsecurity.nu" omiten, en algunos casos una pequeña parte del algoritmo y fueron directamente a "lo feo". Concretamente me da que los pasos 1 y 2 se los ahorran para algunos ficheros, y empiezan directamente con el paso 3.

¿Cómo podía comprobar que mi suposición era cierta? Pues haciéndole el trabajo al programa. Calcular por mí mismo los pasos 1 y 2 a un fichero (vacío, en este caso, que sabemos que falla), y pasarle el resultado a filehasher. Si tras este tratamiento previo mío, el resultado es el válido, es que mi suposición es cierta: han implementado ellos mismos el algoritmo MD5 y han eludido el paso 1 y paso 2 (los que crean el padding).

Vamos a ver cuál debería ser el buffer de salida de un fichero vacío con un pequeño ejemplo en python:

>>> buff = "" # Primeramente nuestro buffer, vació obviamente
>>> buff += "\x80" + "\x00" * 55 # Le añadimos un '1' seguido de 447 '0's
>>> # 0x80 = 1000 0000
>>> # 1 '1' + 7 '0's + (8 '0's) * 55 ==> 1 + 7 + 440 = 448 bits
>>> buff += "\x00" * 8 # 8 bytes indicando el tamaño del buffer original
>>> fd = open('hashme.bin', 'w')
>>> fd.write(buff)
>>> fd.close()


Ahora el nuevo archivo 'hashme.bin' contiene los bits que resultan de aplicar los pasos 1 y 2 del algoritmo MD5 sobre un fichero vacío. Vamos a ver qué nos dice ahora 'filehasher' sobre el hash de nuestro nuevo fichero:

> filehasher hashme.bin -md5
d41d8cd98f00b204e9800998ecf842
7e  hashme.bin


Y comprobamos si es el mismo resultado que nos daría el algoritmo original.

$ md5sum hashme.bin
d100adc7d963ac0b837f7ac2
9dc701d7  hashme.bin


Ahora sí es el MD5 (real) del archivo vacío. Parece que no andábamos muy descaminados en nuestras suposiciones.

En las primeras pruebas que realicé al calcular el MD5 con 'filehasher', al comprobar el hash de '1.txt', cometí un pequeño fallo porque abrí el fichero con un editor de texto, el cual le añadió un carácter de fin de línea al final. Al añadir un carácter de más, obtuve un hash diferente al devuelto por el 'md5sum' del byte '0x31 h', cuando en verdad 'filehasher sí lo calculaba bien. Creía entonces, que el cálculo fallaba para todos los archivos. En ese momento, me propuse generar el buffer resultante de aplicar los pasos 1 y 2 sobre el byte '0x31 h', creando la versión 2 de '1.txt':

>>> buff = "1" # contenido del fichero 1.txt 
>>> buff += "\x80" # primer '1' y siete '0' 
>>> buff += "\x00" * 54 # '0's adicionales hasta completar los 448 bits 
>>> len(buff) * 8 # 'len' devuelve el conteo en bytes 
448 
>>> buff += "\x08" + "\x00" * 7 # 64 bits con el tamaño original del fichero (8 bits) en little-endian 
>>> len(buff) * 8  
512 
>>> fd = open('1_2.txt', 'w') 
>>> fd.write(buff) 
>>> fd.close()



Cuál es mi sorpresa cuando estoy volviendo a comprobar todos los pasos y los ficheros, cuando veo que los hashes de 1.txt y 1_2.txt devueltos por 'filehasher' son exactamente los mismos:

> filehasher 1.txt -md5
c4ca4238a0b923820dcc509a6f75849b  1.txt

> filehasher 1_2.txt -md5
c4ca4238a0b923820dcc509a6f75849b  1_2.txt


Para asegurarme de que no está ocurriendo algo raro, compruebo las sumas con el comando que sé que lo calcula bien:

$ md5sum 1_2.txt
72937eb55e83c95f11f12b96715b9d8f  1_2.txt

$ md5sum 1.txt
c4ca4238a0b923820dcc509a6f75849b  1.txt


¿Qué está pasando entonces? El tamaño de 1.txt es de 1 byte, mientras que el de 1_2.txt es 64 bytes... sí, el mismo tamaño que ha de tener el buffer antes de comenzar el paso 3. Me pongo a probar diferentes archivos de distintos tamaños y efectivamente, el MD5 devuelto por 'filehasher' falla para todos aquellos ficheros cuyo tamaño en bytes es múltiplo de 64.

Todo parece indicar que a la hora de la comprobación del tamaño del buffer para obtener la cantidad de padding a añadir, se cae en un fallo en la lógica del programa en la que, si el tamaño del fichero es múltiplo de 512 bits (64 bytes), no se añade padding ni tamaño del fichero alguno.

viernes, 28 de septiembre de 2012

Hispasec participa en el curso de Seguridad en Tecnologías de la Información y las Comunicaciones en la Universidad de Sevilla


El departamento de Ingeniería Telemática de la Universidad de Sevilla, realizará un curso de experto en seguridad como parte de la oferta de posgrado de la Universidad de Sevilla para 2012/2013.

El profesorado incluye a Hispasec, que impartirá el temario sobre malware y seguridad en Windows.  La lista completa de profesorado: 
  • José Carlos Álvarez Parralo. PRICEWATERHOUSECOOPERS (PwC)
  • Ignacio Campos Rivera. Universidad de Sevilla Ingeniería Telemática
  • Sergio De Los Santos. HISPASEC
  • Antonio Luis Delgado González. Universidad de Sevilla Ingeniería Telemática
  • Antonio Estepa Alonso. Universidad de Sevilla Ingeniería de Sistemas y Automática
  • Godofredo Fernández Requena. Universidad de Sevilla Ingeniería Telemática
  • José Girón Gómez.  MInisterio del Interior
  • Julián González Caracuel. ISDEFE
  • Victor Iglesias Palomo. JUNTA DE ANDALUCÍA.
  • Oliver Daniel López Yela. SANDETEL
  • Germán Madinabeitia Luque. Universidad de Sevilla Ingeniería de Sistemas y Automática
  • Pablo Nebrera Herrera. ENEO
  • Jose Manuel Pavón Álvarez. ISOTROL
  • Isabel Román Martínez. Universidad de Sevilla Ingeniería de Sistemas y Automática
  • Enrique Villa Crespo. WELLNESS TELECOM
  • Juan Manuel Vozmediano Torres. Universidad de Sevilla Ingeniería de Sistemas y Automática
El número de créditos es 30,00 ECTS. El coste, 1.839 euros (tasas incluidas). El periodo de preinscripción irá del 01/10/2012 al 20/11/2012 y se impartirá de febrero a junio de 2013.

Más información aquí y aquí

martes, 11 de septiembre de 2012

¿Has perdido las llaves? Busca primero por la web

El tema de las búsquedas en Google o Bing (ponga aquí su buscador preferido) de documentos sensibles, servidores mal configurados, y otra información diversa que no-debería-pero-está-visible da mucho juego.


De hecho, cuando hacemos una auditoría, en la fase inicial. Una de las primeras tareas que realizamos es determinar qué información sobre los objetivos se encuentra "ahí fuera".

En la biblioteca de herramientas con "dorks" que hemos ido acumulando y que usamos, hay una entrada que es especialmente críticaCasi nunca da resultados. Pero de muy de vez en cuando salta la luz
verde y si es resulta comprometedora puede llegar a convertirse en un asunto bastante delicado.

Por la descripción del propio dork se intuye lo que buscamos:

intext:begin private key ext:asc


Y no falla: aparte de algún que otro falso positivo, ahí fuera están expuestas algunas claves privadas válidas:


Con la extensión podemos ir jugando puesto que existen unas cuantas más de uso común:

asc, cer, cert, crt, der, pem, gpg, p7c, p12, pfx, pgp y obviamente...txt

Y dejando la imaginación volar podemos probar estrechando la búsqueda a dominios curiosos, como .gov o el siempre profuso .edu


¿Y seguro que sirven estas claves privadas? ¿No serán simples test o claves no caducadas?


El caso de esta última es bastante curioso porque estaba expuesta en el sitio de una empresa de seguridad...




martes, 28 de agosto de 2012

Algunos apuntes curiosos sobre el 0-day de Java 7

La última vulnerabilidad descubierta en Java está dando que hablar últimamente. No es para menos, Java junto con los complementos para Flash y Adobe PDF Reader de los navegadores nos dejan un reguero de CVEs cuyo catálogo no deja de crecer.

Lo curioso del asunto es que no se trata de una vulnerabilidad al uso. Es decir, no es un desbordamiento de pila, de entero o un puntero nulo. En principio los applet de Java corren en un entorno sin privilegios, bajo la atenta mirada del SecurityManager. Si el applet intenta hacer algo que no debe el SecurityManager lo pillará y saltará una excepción. ¿Pero qué ocurriría si deshabilitamos el SecurityManager? Pues que ojos que no ven... troyano que se descarga... Se trata de un problema en la "cadena de confianza" de Java.

La vulnerabilidad en sí reside en que han encontrado una forma de poder deshabilitar al SecurityManager, dejando al applet con los mismos privilegios que una aplicación de escritorio, es decir: luz verde para usar cualquier API de Java. Aquí lo explican de manera magistral.

Vamos a explicar un poco el payload del exploit encontrado. Por supuesto, las teorías que lanzaremos son simplemente especulaciones. Este exploit en concreto encontrado no tiene por qué ni el único, ni representativo de otros que puedan haber estando infectando sistemas en los últimos días... pero es el único público que se ha descubierto atacando realmente sistemas.

El código que efectúa la deshabilitación del SecurityManager:




Viendo el código da para especular. Apuntado por mi compañero Sergio de los Santos que ha diseccionado a la criatura.


Eso pertenece a la clase que hace de Applet. La primera en ejecutarse cuando el navegador carga el .jar malicioso. Y ese código se interpreta prácticamente como un: "Si el ordenador donde me estoy ejecutando es un Windows llama al método estático xrun de la clase Gondzz". Ya está. Ninguna otra referencia a otro sistema, ya sea Mac OSX o Linux. Sin embargo vayámonos al  método xrun de la clase Gondzz:


Vemos en las primeras lineas que se prepara la llegada de un archivo que se descargará con el método downFile. Ese archivo se llamará update.exe. Más abajo hay una sentencia if que literalmente dice: "Si el ordenador donde me ejecuto NO es Windows, haz una llamada a chmod y cambia los permisos a rwxr-xr-x. Siendo esto último una llamada característica de sistemas UNIX para permitir la ejecución.

Curiosamente ya en la primera clase, se discrimina la llamada a xrun si el sistema no es Windows, así que un sistema "no Windows", no llegará ahí. ¿Para qué una segunda comprobación? ¿Para qué un chmod?

Con todo esto y el nombre que usaron en el paquete que contiene las clases "cve2012xxxx" (es la nomenclatura que se usa en el estándar CVE de la industria) da la impresión de que el 0-day les quemaba las manos. Sabían que iba a ser detectado se le asignaría un CVE más pronto que tarde. Leyendo el código pueden aparecer todo tipo de teorías: que querían liberar una versión que infectara tanto a Windows como a sistemas OSX o Linux y se quedaron "a medias". O que hayan reutilizado partes de otros exploits, y no han "limpiado" del todo el código. O que en el futuro estaba pensado infectar a otras máquinas no Windows...

Además el código no esta ofuscado. Se lee limpia y perfectamente. Un descuido sutil pero que pocas veces se observa en código Java malicioso. La ofuscación para Java es trivial, pasar un programa y listo. Lo único ofuscado son las URL de descarga del troyano, algo ya clásico. ¿Nos decantamos por "las prisas", entonces?


viernes, 24 de agosto de 2012

Renovamos el Blog del Laboratorio de Hispasec

En Hispasec, estamos aprovechando el verano para realizar algunos cambios. Entre muchos otros asuntos internos y externos, vamos a renovar el blog del laboratorio después de más de siete años. Abandonamos el antiguo a su suerte (lo dejamos como contenido estático), y estrenamos este en Blogger.

Por aquel entonces, se realizaba una declaración de intenciones en la primera entrada que podría seguir siendo válida:



Abajo a la izquierda podrás encontrar un enlace al antiguo blog. En él a su vez aparecerá un enlace a este. Los usuarios ya suscritos por RSS serán redirigidos automáticamente y en principio, no notarán demasiada diferencia.

Esperemos que la renovación no solo sea estética/técnica, y usemos el blog con entradas que resulten interesantes y con una regularidad mayor que la que hasta ahora hemos podido mantener...