[Bug-Bounty] Encadenando 5 vulnerabilidades hasta conseguir shell a partir de app android.

Buenas

En esta entrada explicaré como ha sido posible encadenar cinco vulnerabilidades en una aplicación de contactos con una base de usuarios de ~8 millones de usuarios para llegar a conseguir una shell en el entorno de pre-producción de una forma relativamente sencilla explotando una serio de fallos de seguridad en la misma (IDOR (Insecure Direct Object Reference) + Race Condition + XSS + Directory listing + XXE = pwned)

Primero de todo agradecer a la compañía el buen trato recibido y que pese a no tener un programa de recompensas hayan reconocido el trabajo con una suma cercana a las cinco cifras; además de permitirme escribir un writeup, eso sí, redactando de una forma que no se identifique a la compañía, por tanto sin fotos (para censurar todo mejor no poner nada) +parrafada inside +acto de fe.

Todas las vulnerabilidades fueron parcheadas en las 3 horas siguientes al primer contacto.

Resumen

Antes de entrar en el asunto de la explotación, un breve sumario de como fue el proceso.

  1. Buscar un IDOR en la API que comunica la app con el servidor para modificar el emisor y receptor de los mensajes.
  2. Explotar una condición de carrera en el identificador de mensaje y hacer funcionar el IDOR para impersonar al usuario .
  3. Enumeración de usuarios a través de fuzzing a las IDs para conseguir cuentas con permisos elevados.
  4. Explotar XSS a través de chat con un administrador para robar las cookies.
  5. Acceder al panel de pre-producción con las cookies robadas.
  6. Conseguir un listado en un directorio con archivos de configuración en xml.
  7. Ejecutar código en el servidor mediante XXE.
  8. Spawnear una shell (sin root) en el servidor.

Explotación

Resultado de imagen de pwn time

La APP como ya he comentado es la típica para «conocer gente», por tanto las acciones disponibles son basicamente, subir fotos, dar likes y mandar mensajes, toda esta información se envía al servidor a través de una API en formato json + base64.

Además tiene un dashboard web donde realizar algunas de las opciones de las que dispone la app.

Es bastante común que las APIs no tengan demasiados controles de seguridad, hay múltiples writeups por ahí de IDORs en APIs con resultados muy diversos, borrar comentarios, editar información de otros usuarios etc. En este caso no encontré forma de explotar un IDOR para editar información en otras cuentas dummy por la presencia de un token bearer, en cambio si era posible impersonar usuarios en el envío de mensajes, editando  el ID de usuario de origen y el ID de usuario destino, ya que dada la naturaleza de estas aplicaciones los usuarios deben poder comunicarse entre ellos vía mensajes de texto (siempre que haya coincidencias de me gusta) sea como fuere, a través del mencionado dashboard web es posible saber el ID de nuestro usuario para poder contrastarlo con la petición desde la APP, y asegurarnos de quién somos para el servidor (un número), ademas en este caso los identificadores son autoincrementales y por tanto se puede fuzzear hasta dar con la primera cuenta (id 0 ||id 1) que en buena lógica sera de un desarrollador (la primera persona que usa la app).

Recreación de la información enviada al servidor entre dos cuentas controladas a traves de la APP.

{ «idmsg»: 111111, «from»: 12345, «to»: 4567, «message»: «mensaje dummy» } (sin b64)

  • Primero el identificador único del mensaje
  • ID de quién envía el mensaje
  • ID de quién recibe el mensaje
  • Mensaje

En este punto la forma de explotar es mas o menos clara (cambiar idmsg, from y to), salvo por un pequeño detalle, necesitamos un idmsg válido, que no haya sido usado (el de la petición dummy ya no nos sirve, y que nos deje enviar un mensaje desde un id que no es el nuestro, cosa que obviamente comprueba y devuelve error), pero claro, mediante la app se envían muchos mensajes, así que en el intervalo desde que enviamos un mensaje nosotros y queremos enviar el siguiente no sabemos que id asignarle a ese campo que no haya sido usado ya y que por tanto nos devuelva un error el servidor; en este punto se abre un abanico de varias opciones para probar.

  1. Darle un id al mensaje de 999999999 (o un numero muy superior al ultimo que enviamos para asegurarnos que ese id no se ha usado).
  2. Intentar explotar a ciegas un integer overflow en el backend.
  3. Intentar una condición de carrera para enviar mas de un mensaje con el mismo id.

Opción 1:

Dando al mensaje un identificador lo suficientemente alto el servidor nos responde con error por petición mal formada, así que primer fail y descartamos esta opción.

Opción 2:

Se me ocurrió que quizás se podría dar al id de mensaje un numero lo suficientemente alto como para provocar un integer overflow, para los que desconozcan esta vulnerabilidad, un ejemplo en c++:

#include <iostream>
#include <climits>
using namespace std;
int main()
{
int n = 0;
int num = INT_MAX;
cout << num << endl;
n = num + 1;
cout << n << endl;
return 0;
}

Salida:

2147483647
-2147483648

De este modo se podría, sin conocer el id del último mensaje procesado, asignar un id al mensaje que sea menor (por que mayor ya ha dado error) pero que no este en uso. El problema es que no se sabe que tecnología esta corriendo en el backend, así que un integer overflow a ciegas se paga 1000 a 1 que funcione (aparte del riesgo de crear una denegación de servicio lo cual seria cagar muy fuera del tiesto), y como era de esperar no funcionó.

Opción 3:

Intentar explotar una condición de carrera para *enviar dos mensajes diferentes con el mismo id*, (vulne bien explicada).

Para probar necesitamos 3 cuentas dummy, una que envía el mensaje y dos para jugar con los IDs del to. A nivel teórico como explotarlo es sencillo con burp -> curl && curl > comprobar respuesta y mirar la app. A nivel práctico, una condición de carrera es de lo más inestable que hay a nivel de exploiting, asi que tocaba cruzar los dedos para que funcionase algún intento.. y funcionó después de unos cuantos. Había recibido el mismo mensaje en las dos cuentas dummy.

Una vez validada la condición de carrera, lo que realmente nos interesa es hacer un user impersonation a través de un IDOR. La idea es conseguir de este modo que un administrador me escriba a la cuenta dummy y poder usarle como vector para escalada de privilegios. Como tenemos el dashboard web podemos fuzzear IDs hasta encontrar la mas baja, siendo esta la primera persona en darse de alta en el servicio, que tiene bastantes papeletas de ser un dev.

Efectivamente al acceder al perfil, la miniatura (foto de perfil del usuario) es el logo de la aplicación, asi que tiene buena pinta el asunto.

Pero saber el id de admin y saber que podemos mandarnos mensajes desde su cuenta no nos va a dar una shell. Dado que es una app random, sin bug bounty ni siquiera un responsive disclosure, no esta la presion que existe siempre en el resto de programas de «Voy a reportar esto ya a ver si se me va a adelantar alguien.» quien haya visto alguna vez esa etiqueta o puntito morado en un report sabrá de lo que hablo XD.

Asi que sin prisa se puede pensar como aprovechar esta vulnerabilidad, que de base ya es crítico el poder impersonar a cualquier usuario de la plataforma de forma completamente arbitraria.

Yendo al grano, en el dashboard de la web se recibian notificaciones del tipo «Has recibido un mensaje de X: blablalba» (tambien se podria leer el chat). de modo que si somos capaces de inyectar un XSS en ese campo estaremos ejecutando codigo en el lado del cliente a traves del dashboard en cuanto le salte la notificacion al usuario y pinche encima para leerla. Esto lógicamente tiene una gran pega, tenemos que mandarle un payload por el chat a un administrador, que lo leera y saltaran todas las alarmas, pero no solo eso, es que hay que impersonarle con el IDOR para que el inicie la conversación él(nosotros no podemos porque no tenemos «match»), en fin, lo de siempre, pruebas con cuentas dummy, y para mi sorpresa, no solo funciona, si no que lo que la otra persona recibe como mensaje un mensaje vacio, valga la redundancia, como si hubiéramos mandado un espacio.

Resultado de imagen de wtf meme

Repetimos el proceso con el usuario que creemos que es admin y a esperar que este conectado, le salte la notificación y abra el chat.

Una vez tenemos sus cookies, me doy cuenta de que no coincide la IP de la petición con la IP del dashboard donde yo puedo hacer login, asi que nmap a esa IP a ver que nos dice y puerto 8080, 22 y algunos otros que no interesan abiertos.

En el 8080 un panel de login muy similar al del dashboard web, pero a la vez diferente, como una version mejorada (mas bonita, en le login; y con mas opciones dentro). Inyectamos las cookies y para dentro.

Escalada de privilegios.

Resultado de imagen de privilege escalation

Aquí si que pensé mas seriamente, mandar reporte anónimo y a dormir, por que tocar algo ahi puede suponer una interrupción del servicio y sería pasarse. Pero bueno, decidi explorar un poco, ir pasando por las diferentes opciones sin cambiar nada para generarme un arbol de directorios y archivos en burp que pueda mirar después si por lo que sea pierdo la sesión (se caduca).

Revisando al cabo de un rato, en una de las visitas por los apartados de la web, habia leido */config/service-cfg.xml , asi que me paso al directorio /config y pum, directory listing. Vuelvo a recorrer todas las opciones hasta que encuentro un formulario de subida de archivos, intento subir un txt para probar tema filtros y no me deja, pruebo otra serie de extensiones y tampoco, asi que XML, que no me deja subir, pero ya cambia el error de un «unsupported file type» a «format error». esta claro que el servidor verifica la integridad de la estructura del archivo, situación que se pudo solucionar fácilmente usando la misma estructura de uno de los archivos del directorio*/config/ que tuviera alguno de los campos vacíos para poder hacer ahí la llamada a una entidad que me ejecute código en el servidor, sin alterar la configuración original. En este caso no era capaz de ejecutar código para poder pillar una shell reversa, en cambio me acordé de una situación exactamente igual que habia tenido hace un par de semanas en una maquina boot2root que puede solucionar leyendo la clave privada de conexión por ssh, y así conseguir una shell a través de dicho servicio.

Ya no había mucho mas que hacer, reporte al email que figuraba en la play store sin detallar demasiado, con un par de fotos de la shell y el dashboard de dev, con las ips utilizadas,  las cuentas, y a jugar unas merecidas partidas al csgo, hasta que responden, luego skype con un dev y un sysadmin, se parchea todo y a dormir que iba siendo hora.

Fin de la explotación.

Ahora algunas cosas ya a titulo personal dejando temas técnicos a un lado y respondiendo alguna pregunta que pueda surgir y/o que me hayan hecho.

¿Por qué explotas una vulnerabilidad en un entorno real con el riesgo que eso conlleva existiendo tantas plataformas de CTFs y de pentest en infraestructura muy buenas como hackthebox, ihacklabs o vulnhub?

Por que no es lo mismo. Los CTFs están bien para aprender cosas nuevas que no sabes ni que existen pero la sensación una vez completado no es la misma. No es la misma sensación la que se consigue al hacer un keygen sobre un keygenme que sobre un software comercial, lo mismo con exploits… etc. También yo me pregunto a veces ¿Por qué la gente sale a andar en bici o a correr por la calle si pueden hacerlo en una cinta o en una bicicleta estática? Me imagino que la respuesta en el 90% de los casos sera la misma «no es lo mismo» aunque lo parezca. Pues eso.

Sobre los riesgos. Bueno, es evidente que la reacción de una compañía ante esta situación puede ser adversa, pueden coger sin mas el email y reenviarlo a su cert gubernamental, o a sus respectivas FCSE, tú decides si corres o no el riesgo, en mi opinión cualquier persona con dos dedos de frente se tomará estas situaciones como una oportunidad de oro para minimizar el riesgo de sufrir un ataque de una persona o grupo con intenciones muy diferentes que pueden suponer su quiebra económica o la pérdida absoluta de la confianza de sus clientes que les puede llevar a lo primero.

¿Qué esperas a cambio cuando reportas algo a una organización que no tiene una política definida a este respecto?

La respuesta es fácil. Nada. No estás en condiciones de exigir nada (nadie te ha pedido que toques nada, lo haces por diversión, entrenamiento o el motivo que sea), es más bajo mi punto de vista, que exijas algo (lo que sea) a cambio es extorsión. La empresa está en todo su derecho de no responder, responder con un gracias, de responder que lo pondrán en manos de sus abogados, o como en este caso agradecerlo y dar una compensación económica (más o menos generosa, es solamente decisión suya y hay que tomarlo siempre como un gesto muy positivo). En este caso he tenido la suerte de toparme con una empresa concienciada, con un par de personas en nómina que saben de seguridad, y que saben lo que es un bug-bounty, de hecho ya estaban barajando sacar un programa de recompensas antes de que yo contactara con ellos. Además la valoracion de esta experiencia en concreto es 10/10, no solo he recibido un trato perfecto si no que he podido aportar ideas para solucionar los problemas, algo que no es nada común y que por lo menos para mi, que nunca he trabajado en una empresa, ver cómo gestionan un servicio con tanta demanda y el curro que hay detrás me ha parecido una experiencia muy enriquecedora.

No es el mismo caso que con una empresa que si tiene activo un programa de recompensas, en el cual si esperas algo a cambio de tu trabajo(ya sea dinero o hall of fame), y si no lo recibes o crees que la recompensa no esta en concordancia con lo que «prometen» (como hace starbucks sistemáticamente, por poner un ejemplo) tienes todo el derecho de reclamar de forma argumentada a través del equipo intermediario, sea bugcrowd, sea h1 etc.

¿Qué medidas se han puesto en marcha para solucionar estos bugs?

Para la primera parte se randomizan los IDs de usuario y no es posible acceder a los perfiles por ID para la enumeración de usuarios via web.

Para el XSS se sanitiza correctamente el contenido de los chats en la web.

Para el XXE se sanitiza el documento.

¿Qué app es?

Como he mencionado la principio la empresa prefiere mantener su privacidad, algo totalmente legítimo igual que otras muchas empresas con programas de recompensa activos no permiten el «public disclosure», o censuran el 90% del reporte, o directamente llevan a cabo programas privados con un número de personas muy reducido y unas políticas respecto a la difusión muy estrictas. Si finalmente lanzan un programa público editare la entrada.

¿Es esto «hacking ético»?

Es hacking, a secas. El tema de «hacking ético» siempre me ha parecido una invención de puro marketing, añadirle ético a la palabra para poder comercializar el concepto sin que dinosaurios digitales lo miren mal,  el hacking es hacking, lo que es ético o no ético es el comportamiento de las personas; del mismo modo que cuándo vas al médico no vas a una suerte de «médico ético» por que la medicina es medicina sin más, a una persona puede no parecerle ético que un cirujano plástico haga X tipo de operación pero no por eso al resto de médicos les vas a llamar «médico ético» y al resto lo contrario. Lo mismo se puede aplicar a muchas mas profesiones por ejemplo soldado-contratista privado etc.

Hasta aquí la entrada.

 

 

 

 

 

 

 

 

Analizando la app de La Liga para Android

Buenas

Después de la última entrada un poco fuera de lo común, vuelvo con algo más en concordancia con las anteriores entradas.

Me ha llamado la atención una noticia que salió a la luz ayer sobre que La Liga espia a los usuarios a traves del microfono de la aplicacion. *Para los que no sean de España, La Liga es una organización que se encarga de gestionar las competiciones de futbol a nivel nacional.

En este y otros artículos se pueden leer frases como

La Liga parece querer convertir a los particulares en ‘micrófonos andantes’ al servicio de sus intereses, en este caso, detectar posibles fraudes

La noticia se viralizó y La Liga publicó un comunicado exponiendo sus argumentos al respecto, y es en este punto donde las cosas no me cuadraban.

*Antes de ir al lío me gustaria aclarar que no tengo nada en contra de La Liga ni de las empresas que están relacionadas con este asunto. Particularmente no soy un gran fan del fútbol y por tanto no tengo la aplicación, pero después de saber según que cosas de las que hace la app no creo que la instalase.

Primero vamos a ver que dice el comunicado sobre las acusaciones de espiar a los usuarios desde un punto de vista puramente lógico y luego vamos a ver cuál es la realidad basándonos en el código fuente de la aplicación en su versión 6.4.7 publicada el dia 8 de Junio de 2018 que al fin y al cabo es lo que ejecutan los usuarios en sus dispositivos.

Parte lógica/subjetiva sobre el comunicado de La Liga

Obviando la primera parte donde intentan justificarse hablando de pérdidas económicas y demás historias, en el tercer parrafo ya empiezan a decir cosas que no concuerdan con la realidad.

Esta nueva funcionalidad para la detección del fraude está habilitada en la app desde el pasado viernes 8 de junio de 2018, solo para usuarios del sistema Android y a nivel nacional*.

Dicen que la funcionalidad de recopilar información del microfono y ubicación se ha habilitado el 8 de junio, pues bien, la version 6.4.0 publicada el 21 de Febrero de 2018 con SHA1 efd50120f73c0d674492126ce9e9198da57c8287 tiene la capacidad de recopilar información tanto del micrófono como de la ubicación exactamente de la misma forma que la ultima versión disponible. Puede que se implementase en una versión anterior, es cuestión de mirarlo, pero con este ejemplo es suficiente para desmontar esa parte del comunicado. A no ser que la ‘funcionalidad’ a la que se refieran sea a la de pedir permiso y no a la de ‘espiar usuarios’.

*La primera versión de la aplicación de LaLiga que incluye el SDK de la empresa Fluzo para grabar el micrófono es la 6.3.0 publicada el 21 de Noviembre de 2017, si bien, la primera versión que envía la ubicación y el audio a sus servidores sin informar al usuario es la 6.4.5 publicada el 7 de Junio de 2018. Más info aquí.

(…) el micrófono captará el código binario de fragmentos de audio, con el único objeto de poder conocer si está viendo partidos de fútbol de competiciones disputadas por equipos de LaLiga, pero nunca se accederá al contenido de la grabación.

Poco que comentar aqui, salta a la vista la burrada de decir que el micrófono no graba fragmentos de audio. Ademas es contradictorio decir que se analiza la grabación (de la manera que sea, ya se vera luego)  y en la linea siguiente que nunca se accederá al contenido. Lo que se entiende de ahi es que graban e inmediatamente despues eliminan, por que en el momento que hagan cualquier otra cosa sobre el archivo generado que no sea eliminarlo ya están accediendo al contenido.

Ahora nos comentan como protegen la privacidad del usuario…

LaLiga sólo activará el micrófono y geoposicionamiento del dispositivo móvil durante las franjas horarias de partidos en los que compitan equipos de LaLiga.

Eso de la franja horaria es muy relativo, si un equipo Español juega en china cuando aquí sean las 5 de la madrugada, pueden activar los 10 millones de terminales y que graben.

LaLiga no accede a los fragmentos de audio captados por el micrófono del dispositivo, ya que estos se convierten de forma automática en un código binario en el propio dispositivo. LaLiga sólo accede a este código binario, que es irreversible y no permite obtener de nuevo la grabación de audio.

Aqui ya el comunicado pierde toda la credibilidad que pudiera tener. Por un lado nos dicen que La Liga no accede a los audios, que los transforman en un código binario de forma automática en el dispositivo (evidentemente, en computación todo son datos binarios, lo cual no quiere decir que no estén grabando un audio que pueda ser reproducido posteriormente) pero si les damos el beneficio de la duda, ¿lo que nos intentan decir es que están generando un hash progresivo con su aplicación después de grabar el audio y en el propio terminal ? o dicho de otra manera, ¿se refieren a que su aplicación hace lo que shazam (valorada en 400 millones de euros) ? Pero en este caso mucho más complejo, por que shazam si puede construir una base de datos sobre canciones que son un conjunto finito y concreto; pero reconocer que el sonido ambiente corresponde a un partido de fútbol en un bar ya son palabras mayores.

Queda bastante claro a estas alturas que lo que hacen es eso, pero que evidentemente no lo hacen de forma local, si no que envian la grabación a otro servicio para identificarla y a lo mejor soy yo que he buscado mal, pero en ningun punto de las condiciones generales de uso y politicas de privacidad de la aplicacion he visto que se mencione que los datos recopilados se mandan a otra empresa para que los analice, realmente no se como iran estos temas a nivel legal, pero en el aviso legal sobre privacidad y cookies hace una mencion a

Sus datos personales no serán cedidos a otras personas o empresas para ser utilizados para sus propios fines. No obstante, algunas entidades subcontratadas por LaLiga podrían acceder a los Datos Personales e información como Encargados o Subencargados del tratamiento para prestar a LaLiga un servicio necesario. En particular, LaLiga recibe asistencia de:

(a) Proveedores de servicios. A veces, compartimos su información con nuestros terceros proveedores de servicios, que nos ayudan a proporcionar nuestros servicios. Ejemplos de proveedores de servicios: alojamiento, métricas y analíticas.

Eso vuelve a ser genérico y bajo mi punto de vista deja la puerta abierta a traficar con los datos sin límite ninguno, total, cualquier empresa se puede convertir en proveedor de servicios de la noche a la mañana, ¿no?.

A partir de aquí los siguientes puntos ya me parecen puro recochineo de quien lo haya escrito y los que lo hayan aprobado como un comunicado serio.

Si este código coincide con un código previo de control, LaLiga podrá saber que está viendo un partido determinado. Si no coincide, el código se elimina.

Esto no se como tomarmelo, no se si viajan al futuro para generar previamente un codigo de control de determinado partido o simplemente es mas humo. *Pueden generar un patron inaudible y emitirlo durante los partidos.

Los códigos no irán referidos a su nombre, sino a su dirección IP y al ID específico que asigna la APP cuando el usuario se registra.

Supongo que lo que espera aqui esta gente es que les demos las gracias por guardar solo el identificador de usuario y la direccion IP y no referir los codigos al nombre de la persona. Igualmente vuelven a mentir, la APP no necesita registro y te genera un ID que guarda en la primera hora y que por supuesto tambien envia a la misma empresa externa, para lo del fraude y tal.

Le recordaremos periódicamente que LaLiga puede activar tu micrófono y geoposicionamiento y le solicitaremos que confirme su consentimiento.

Una afirmación completamente ambigua de la que no hay evidencia en el codigo de la aplicacion.

Podrá revocar su consentimiento en cualquier momento en los ajustes del dispositivo móvil.

Faltaria mas LOL.

Parte técnica

Ahora vamos con lo interesante que es demostrar todo lo anterior pero con datos, y que mejor opción que destripar la aplicación a ver que es lo que hace y como lo hace. Aviso de que sera largo por que hay que ir función por función viendo que hace cada cosa para evitar que todo pueda parecer una conjetura o suposición mia.

Para esto se puede tirar de apktool para ver el smali o lo que sea, nos vale un dex to jar y tirando, total lo que interesa es ver el código de una manera estática sin necesidad de editar el comportamiento, ya que si no me equivoco modificar la aplicacion seria cagar fuera del tiesto en relación con la legalidad, aunque en este caso en ningun EULA se indica que esto no se pudiera hacer.

Hay principalemente dos paquetes que nos interesan dentro de la aplicación, uno el de las clases propias de la app, es.lfp.gi.main y el de la empresa que hace uso de las funcionalidades polémicas, en este caso la empresa se llama fluzo 

FLUZO is the Google Analytics for TV. We turn TV viewers and content into digital users and monetizable assets through a proprietary ACR technology.

y su codigo esta en com.fluzo.sdk .

Echando un primer vistazo al código del main de la app podemos intuir que quien lo haya hecho no es precisamente un genio.

Ahi es donde ya se encuentra la primera evidencia de que efectivamente va a comunicarse con un servicio externo (algo que para los que no hayan leido los acuerdos de usuario y el comunicado, no se menciona en ningún sitio, todo lo contrario), mas allá de hardcodear la API de un servicio privado, que bueno, si les gusta vivir al límite no es asunto mio. Ademas aquí hay un punto gracioso, que intuyo no les habrá hecho mucha gracia a los devs de fluzo, pero que ya trataremos mas adelante.

Si buscamos referencias a esa url fluzo.com ya empezamos a ver que donde hay geolocalización o grabación del microfono, acaban apareciendo de una u otra manera endpoints en esta URL, por ejemplo:

Ahí ya vemos que aflora el nombre del endpoint asignado a esta aplicación https://laliga.fluzo.com que aparentemente no tiene nada y en /settings responde con un json que es indiferente por que no es el objetivo del post analizar nada que no sea la aplicación de manera estática.

Empezamos mirando las funciones de las clases del paquete de La Liga

Dentro de la clase LFP en el onCreate de las primeras cosas que hace es comprobar (en cada inicio de la app) si tiene permiso para el micrófono y si el idioma del dispositivo es el español, no que la IP sea de españa o el usuario español como afirman ellos pero bueno, vamos a pensar que es un bug; y si no pide permiso para usar el micrófono, aunque no vincula el funcionamiento de la app a  tener ese permiso lógicamente.

6b311051ec79ce96e314dc6e1a534e6d

En la funcion requestPermissions que como su nombre indica es para pedirte que le des acceso al micrófono si quieres, ya de entrada te crea un objeto con tu id de Fluzo sin venir a cuento y lanza el servicio, -aunque según ellos eso de grabar y coger geolocalización era en franjas horarias en las que haya partido, y no hay ningún control aqui de si hay partido o no, simplemente lo hacen cada vez que el usuario cierra y abre la app, pero bueno. (alguien podria pensar quecrean el objeto pero que no lo usen hasta que haya partido. Podría ser, pero no, ̶e̶n̶ ̶l̶a̶ ̶r̶e̶a̶l̶i̶d̶a̶d̶ ̶l̶o̶ ̶u̶s̶a̶n̶ ̶e̶x̶a̶c̶t̶a̶m̶e̶n̶t̶e̶ ̶c̶a̶d̶a̶ ̶3̶0̶ ̶m̶i̶n̶u̶t̶o̶s̶,̶ ̶y̶a̶ ̶v̶e̶r̶e̶m̶o̶s̶ ̶l̶u̶e̶g̶o̶ ̶e̶n̶ ̶q̶u̶e̶ ̶p̶u̶n̶t̶o̶ ̶l̶o̶ ̶h̶a̶c̶e̶n̶ ̶y̶ ̶p̶a̶r̶a̶ ̶q̶u̶e̶).-

Primero se muestra el metodo startFluzo que arranca el servicio y despues el metodo requestPermissions

En este clase no hay mucho más que nos interese aparte de funciones relativas a permiso de geolocalización

Es el momento de moverse a LocationService, que como su propio nombre indica contendra los metodos que gestionan el tema de la geolocalización y donde hay varias cosas interesantes.

Nos encontramos con la clase SendLocationAsyncTask que recibe el identificador fluzo del usuario, la longitud y la latitud de su posicion GPS para enviarla a X sitio.

Mirando la funcion mas en profundidad, envía la información si la función DataManager.INSTANCE.getMatchLive() devuelve un True, osea deducciendo un poco, por el nombre, si hay partido activo, devuelve verdadero, sino, devuelve falso.

̶R̶e̶a̶l̶i̶d̶a̶d̶ ̶-̶>̶ ̶d̶e̶v̶u̶e̶l̶v̶e̶ ̶s̶i̶e̶m̶p̶r̶e̶ ̶v̶e̶r̶d̶a̶d̶e̶r̶o̶.̶

 ̶C̶o̶n̶ ̶e̶s̶t̶e̶ ̶f̶u̶n̶c̶i̶o̶n̶a̶m̶i̶e̶n̶t̶o̶,̶ ̶n̶o̶ ̶s̶e̶ ̶s̶i̶ ̶s̶e̶r̶á̶ ̶u̶n̶ ̶b̶u̶g̶ ̶o̶ ̶u̶n̶a̶ ̶f̶e̶a̶t̶u̶r̶e̶ ̶i̶n̶t̶e̶n̶c̶i̶o̶n̶a̶d̶a̶,̶ ̶p̶e̶r̶o̶ ̶p̶a̶r̶a̶ ̶l̶a̶ ̶a̶p̶l̶i̶c̶a̶c̶i̶ó̶n̶ ̶s̶i̶e̶m̶p̶r̶e̶ ̶h̶a̶y̶ ̶p̶a̶r̶t̶i̶d̶o̶,̶ ̶o̶s̶e̶a̶ ̶q̶u̶e̶ ̶s̶i̶e̶m̶p̶r̶e̶ ̶s̶e̶ ̶g̶u̶a̶r̶d̶a̶n̶ ̶l̶a̶ ̶u̶b̶i̶c̶a̶c̶i̶o̶n̶ ̶c̶a̶d̶a̶ ̶X̶ ̶t̶i̶e̶m̶p̶o̶.̶

*Fallo mio aquí, como algunas personas han apuntado por twitter y en los comentarios, enviar o no la localización si depende de la respuesta del servidor, la cual se sigue comprobando cada X minutos

*Lo que se corta es el timetamp en milisegundos

Volviendo a LocationService para seguir analizando que hace la app con la geolocalización nos queda saber donde ha mandado nuestra ubicación la aplicación.

Nos lo ponen facil con la función sendUserMetadataToFluzo que es donde se hace la llamada luego a SendLocationAsyncTask, nada mas que añadir.

Ya sabemos donde van los datos de ubicación, pero nos falta responder a la pregunta de cada cuanto tiempo envia los datos la aplicación, ya hemos visto que da lo mismo si hay o no partido.

Hay varias funciones que loggean la geolocalización, pero la unica que llama a la función que envia los datos a fluzo es onNewLocation que borra las localizaciones anteriores (del telefono, no del servidor) y llama a sendUserMetadataToFluzo pasándole la nueva localización.

Después de enviarla crea un delay en el servicio de 30 * 60 * 1000 = 1800000 ms = 30 minutos, osea que recopila la geolocalización cada 30 minutos y se la envía a fluzo *si se ha recibido una respuesta positiva del servidor.

En este punto y antes de entrar en tema micrófono donde se complica un poco la cosa ya que el codigo del SDK de Fluzo esta ofuscado, me gustaria hacer referencia a como los adminsitradores de La Liga y Fluzo son capaces luego de relacionar los datos con el usuario. La respuesta a esta incógnita esta en la funcion linkUserIds

donde como su propio nombre indica se vinculan la id del usuario de la aplicacion y la ID que se asigna para fluzo. Ni se vincula la IP ni es necesario estar registrado en la app como dice La Liga en el comunicado.

Aprovecho también para hacer un inciso. La Liga afirma que no se guardan los archivos y las relaciones, hay una línea de debug en el codigo del SDK de fluzo que me hace dudar y es la siguiente:

C0850c.m819b(«FLUZO: you can check this user at https://platform.fluzo.com/audience/» + this.f662a.f730m);

f730m = ID

f662a = objeto fluzo

C0850c.m819b = metodo que escribe logs

De aquí entiendo que fluzo sí almacena los datos, y ya hemos visto que la app los manda, queda ahí la dudad de si realmente La Liga borra los datos (ubicación y grabaciones de micrófono) que no han dado positivo, o ya que los tiene se los guarda, es algo que sólo ellos saben.

Siguiendo ahora con la parte de las grabaciones de audio, aqui la cosa se complica a la vez que se hace mas divertido, el codigo del SDK de fluzo esta ofuscado, no mucho, es una ofuscacion muy basica pero lleva mucho tiempo hacerlo entendible, ademas no soy quién para modificar un código que no esta bajo un tipo de licencia que lo permita, asi que trabajaremos con el código ofuscado, que al haber hecho los devs un buen trabajo con las excepciones y el debug, podemos reconocer rapidamente que hace cada cosa.

Nos movemos ahora al paquete com.fluzo.sdk

Antes de entrar con la parte de las grabaciones, al principio de todo he dicho que en una captura habia algo gracioso, la gracia esta en que los devs de La Liga han hardcodeado el endpoint de la API de fluzo, mientras que en el propio SDK de fluzo se cifra el endpoint y se descifra al usarlo me imagino que por seguridad, aunque la funcion de descifrado tampoco es gran cosa.

Función de descifrado

Cifrado: Base64 <- rotN (n = -4) <- reverseString

Hay un par de funciones que llaman la atención en la clase Fluzo

El nombre es interesante pero poco más podemos saber a ojo.

Vamos a ver que busca al ver si f696C es un nulo, en la parte de declaraciones vemos private JSONArray f696C;

Buscando funciones que usen este objeto llegamos a m747c que llama a m777a pasándole true

Vamos a ver que hace la función isOnline

Comprueba si estamos conectados a internet, en caso contrario pues lo reintentará.

Volvemos a la función m747c 

Comprueba que ap no sea nulo private MatchListener ap; vamos a dar por hecho que no lo es para agilizar ya que no es relevante

La próxima comprobación no la entiendo muy bien, por que como comente antes esa primera funcion es para escribir logs y el argumento es el ID de usuario.

Luego tenemos f724f que es un booleano inicializado a falso asi que la pasa

Comprueba que f693g no sea nulo y si es nulo dice que el contexto es nulo. no deberia serlo asi que seguimos.

Ahora crea el objeto sharedPreferences a partir del xontexto f693g

Hace algunas reasignaciones y asigna al objeto un nuevo JSONArray pasando como argumento aa que es k098762563824 cifrado.

Por ultimo llama a MatchListener(aa) fluzoWillStartListening

Al final f705L es una flag para activar el modo debug a través del método setDebug

Por último en la linea this.f706M.m787a(); que hace unas comprobaciones sobre el estado del micrófono (no lo tengo muy claro esto)

Y por último llama a this.f706M.m788a(this.f732o, this.f696C); pasandole f732o que tiene el valor 16000 y f696C que es el objeto JSONArray con todas las preferencias

Asi que en conclusión lo que creo que hace esta función es configurar los parámetros para la grabación

Nos movemos ahora  a com.fluzo.sdk.p000a.C0840a

En esta nueva función los datos son

f748b = 16000

f753g = objeto con las preferencias de la función anterior

Llama a m818a pasándole el JSONArray

Busca «stops» en el índice 0 y si es iguual a 0 devuelve true.

Así que si esto pasa crea el log de startRecording warning: record pattern is empty, we will skip this request. y no graba, si ese índice no es 0 comprueba si C0840a.m784c devuelve true y si lo es empieza a grabar audio del micrófono.

No desarrollo android asi que tirare de instinto y docs  

La conclusión a la que llego es que comprueba que el micro este libre, luego empieza a grabar y si el estado es 0x3 (segun la API está grabando), así que para y devuelve true para grabar de verdad.

Volviendo a m788a

Inicializa el buffer en f752f

Crea el objeto audioRecorder en f749c :

AudioRecord(int audioSource, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes)

Fuente de audio = 1 = micrófono

HZRatio = i = 16000

Canal = 16

Formato = 2 (encoding_pcm_16bits) = WAV (?)

Tamaño de buffer = valor de f752f

Crea el hilo y empieza a grabar.

¿Por cuanto tiempo? No han definido tiempo, hasta que se llene el buffer.

Cuando esto ocurra si nada ha fallado se llamara a recordDidFinish (desde 761 a 1062) en com.fluzo.sdk.fluzo y es aquí donde se sube el archivo al servidor de fluzo. al endpoint /match .

Quedaria por responder la pregunta de cada cuanto tiempo se graba el microfono y se envian los datos para hacer el reconocimiento. La respuesta es no lo sé. Quizás cada 30 minutos también, pero no he encontrado la sección de código que lo confirme asi que no es más que una especulación.

Resumen y opinión

Después de analizar la aplicación y ver como La Liga por el motivo que sea, falta a la verdad sobre lo que hace su aplicación, me queda la duda de el por qué. Quiero decir, el hecho de grabar audio y geolocalizar para detectar emisiones fraudulentas me parece una idea bastante buena, pero ahorraría muchos mal entendidos explicar claramente a los usuarios qué se graba, para qué y a quién se le dan los datos para que los procese y con que finalidad así como facilitar el acceso a las politicas de privacidad que pueda hacer esa empresa de los datos igual que ya hacen por otro lado con el tema cookies facilitando la política de privacidad de Google Analytics.

Sobre la Startup Fluzo, evidentemente no puedo opinar con fundamento por que no tengo resultados objetivos, pero me imagino que si lo esta usando La Liga a la que le habra supuesto una inversion implementar el sistema es que la cosa funciona, si ese es el caso mis diez para los creadores de Fluzo por que como ya dije al principio me parece algo muy complejo lo que hace su servicio, mucho más que shazam o similares y que tanta repercusión tienen en la sociedad y a los que compañias como Apple echaron el ojo rápidamente.

*Algunas personas apuntan que es posible que la liga durante los partidos emita algún tipo de código inaudible para las personas pero que los micrófonos de los móviles si puedan captar para determinar si hay un partido de fútbol en el sonido ambiente. Esto lo veo mas fácil y factible que lo que había supuesto en un inicio.

Por último si hay algún fallo dejadlo por los comentarios o MD de twitter y así puedo corregirlo.

Hasta la próxima.

 

 

[0-Day] Tomando el control de las instalaciones de la NASA en Cabo Cañaveral.

Buenas,

Mas de un año sin escribir nada, supongo que ya iba siendo hora… Al lio.

De vez en cuando me gusta jugar con dispositivos IOT y SCADA, creo que la razón principal es la relación impacto/dificultad de explotación, ya que el impacto suele ser bastante alto (entendiendo impacto como lo que se consigue tras una explotación satisfactoria) en comparación con lo que cuesta encontrar vulnerabilidades «criticas», realmente creo que lo mas complicado es encontrar los dispositivos, al menos para mi.

*Antes de entrar en materia quiero aclarar que no tengo nada en contra de las empresas y/o instituciones que mencione a continuación y que la finalidad de la entrada es completamente informativa y educativa. 

Se ha hablado mucho de seguridad en iot desde mirai, también se ha hablado de la aspiradora autónoma que generaba un plano de tu casa usando el sensor de detección de obstáculos y mas recientemente de las pulseras fitbit.

El caso que quiero exponer hoy es el de tres vulnerabilidades para las cuales al momento de escribir esta entrada no hay parche y que pueden tener graves consecuencias.

CVSSv3:

Identificadores:

CVE-2018-11629

CVE-2018-11681

CVE-2018-11682

Si habéis visitado alguno de los enlaces y habéis leído la pequeña referencia en ingles ya sabéis de lo que va la entrada. Para los que no, lo escribo de nuevo detallando un poco mas y explicando el por que del titulo.

La situación es la siguiente:

Hay un fabricante que desarrolla dispositivos iot y que ademas es capaz de interconectar sus propios dispositivos y los de otros fabricantes a traves de un protocolo de integración que contiene  ̶u̶n̶ ̶b̶a̶c̶k̶d̶o̶o̶r̶ ̶p̶a̶r̶a̶ ̶l̶a̶s̶ ̶a̶g̶e̶n̶c̶i̶a̶s̶ ̶d̶e̶ ̶t̶r̶e̶s̶ ̶l̶e̶t̶r̶a̶s̶  una cuenta para ofrecer soporte en remoto al cliente, pero que el cliente no puede deshabilitar y que por supuesto ofrece acceso completo al dispositivo.

Impacto:

Un atacante que conozca estas credenciales podrá conectarse via telnet al dispositivo y tomar el control sobre la instalación.

Concretando un poco mas a que afecta y a que no esta vulnerabilidad.

Afecta a dispositivos que usen los protocolos de integración HomeWorks QS, radioRA 2 o stanza del fabricante Lutron Electronics.

De acuerdo con las especificaciones de esta misma empresa, los productos que usan RadioRA 2:

HomeWork QS:

Stanza:

Las credenciales para cada caso (user:pwd)

 

lutron:integration

nwk:nwk2

Lo que podemos hacer en este punto es interactuar con la instalación emulando pulsaciones en los botones a través de ? y # seguido de comando tal y como aparecerá explicado detalladamente en cada manual, así que tendremos acceso completo para manejar la instalación eléctrica a nuestro antojo.

*Captura tomada en un entorno controlado

Actualmente hay entre 7000 y 8000 dispositivos vulnerables expuestos en internet.

Ahora la explicación de el por que del titulo, aunque te podrás imaginar por donde van los tiros.

Las empresas y en general las personas tienden a compartir públicamente cosas de las que se sienten orgullosas y en este caso no es diferente, esta empresa comparte públicamente como forma de marketing grandes proyectos en los que participa y con que dispositivos con unos resultados, todo hay que decir, bastante interesantes; pero visto desde el punto de vista de un atacante, le estas dando un vector de entrada muy valioso a sitios como el estadio de Wimbledon, el museo Guggenheim el centro financiero de Taipei, entidades bancarias, hospitales e incluso las instalaciones de la NASA en cabo cañaberal.

Posible solución:

Dado que entre las características del protocolo de integración se encuentra la imposibilidad de establecer mas de una conexión simultánea con el mismo usuario, si establecemos nosotros mismos una conexión a nuestros dispositivos con esas credenciales seria imposible para un atacante hacerlo.

Antes de acabar, me gustaría hacer una reflexión y es que se habla mucho cuando pwnean una compañía, como por ejemplo Telefónica, Deloitte o las contraseñas en plano de Twitter. Se critica duramente a esas empresas (y con acierto bajo mi punto de vista (aunque al menos han dado la cara)) pero viendo casos como por ejemplo el reciente bug descubierto por Capitan alfa en dispositivos DVR que afectaba cientos de miles de dispositivos de videovigilancia; que es lo que deberían hacer las empresas que comercializan estos dispositivos aparte de la obligación moral (y no se si legal) de publicar un parche que lo solucione? Porque tampoco veo grandes reacciones ni comunicados irrelevantes para limpiar su imagen como si hacen las compañías que mencione antes (es posible que el tema seguridad en el mundo industrial se considere irrelevante, no lo se). Supongo que sera cuestión de esperar a que a un banco le hagan un robo físico tomando el control de su edificio «inteligente» o algo similar donde quede patente que las debilidades del mundo ciber tienen impacto en el mundo físico.

Gracias por leer, hasta la próxima.

PD: Si eres de las personas que visitaba el blog para leer sobre ingeniería inversa, decir que seguramente vuelva a darle actividad relacionada con esos temas, aunque es probable que sea en formato vídeo por mayor comodidad. Si lo visitabas por temas relativos a malware decir que en este tiempo off he estado trabajando sobre un sistema para trackear malware bancario que pondré pronto online.

DCS17 Writeup

Buenas!

Esta entrada la dedicare a explicar como resolver los retos planteados en el CTF de Donostia CyberSec organizado por S21 sec.

Bueno, al lio.

Forense

Mexico – Matryoska (75 Puntos)

Enunciado: La bandera se encuentra en el fichero comprimido adjunto.

Una vez descargamos el adjunto nos encontramos con un fichero aparentemente comprimido que en su interior tiene un archivo de texto donde deberia estar la flag.

4cc6a14c43e23c3f90fdd846dd4aa374

Como no podemos ver el archivo, y captando la pista del nombre del reto «Matryoska» usaremos el comando binwalk -Me fichero, esto nos extraera de forma recursiva todos los archivos que contiene el fichero.

Cuando binwalk termina, nos ha generado una carpeta de output _nombredelfichero, solo tenemos que navegar hasta la ruta _flag_7c7e9a28dd25a2e2f81e1bfe7000aa52(1).txt.gz.extracted/_flag0.txt.extracted/_flag0.txt.extracted/_flag0.txt.extracted/_flag0.txt.extracted/_flag0.txt.extracted/_flag0.txt.extracted/_flag0.txt.extracted para encontrar la flag.

 

Colombia – Phishing (200 puntos)

Enunciado: Los siguientes ficheros forman parte de una campaña de phishing, ¿ Podrías localizar la bandera en su interior ?

los archivos que se nos proporcionan en esta ocasión son 2 del tipo html con un phishing de gmail.

Abrimos el primero y nos encontramos en la siguiente URL

En este punto ahy dos opciones, o vemos el codigo fuente, o si nos damos cuenta de que al final de la url asoma  un ‘<‘ nos desplazamos a ver que contiene.

Como vemos tiene un texto en base64, lo desciframos y obtenemos:

eval(function(p,a,c,k,e,d){e=function(c){return(c<a?»:e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!».replace(/^/,String)){while(c–){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return’\\w+’};c=1};while(c–){if(k[c]){p=p.replace(new RegExp(‘\\b’+e(c)+’\\b’,’g’),k[c])}}return p}(‘3.2.i=»h g f j k»;n{(m(){5 1=3.2.l(\’1\’);1.d=\’c/x-4\’;1.9=\’8 4\’;1.b=\’\’;5 a=\’o\’;2.z(\’C\’)[0].p(1)}())}B(e){}3.2.E.G=»<6 F=\\»D://A.s–r-q.t\\» u=\\»y: 0;w: 7%;v:7%\\»></6>»;’,43,43,’|link|document|window|icon|var|iframe|100|shortcut|rel|segunda_mitad_flag|href|image|type||been|have|You|title|Signed|out|createElement|function|try|36d185c10a68b42d|appendChild|tmc|google|xn|com|style|height|width||border|getElementsByTagName|accounts|catch|head|http|body|src|outerHTML’.split(‘|’),0,{}))

Un script en JS, no pasa nada por no saber que hace el script, yo, sinceramente no tengo ni idea. La parte que nos interesa es la que esta marcada en rojo. Como vemos nos esta indicando «la segunda mitad de la flag», como hay dos archivos, lo logico es que la otra mitad este en el otro html que nos dan.

Efectivamente, en el codigo fuente del otro fichero y buscando «flag» encontramos la mitad que nos faltaba

Argentina – TCP (115 Puntos)

Enunciado: Se ha conseguido una captura de tráfico de un equipo comprometido. ¿ Podrías localizar la bandera en dicha captura de tráfico ?

El archivo que nos dan es una captura de trafico, por tanto lo abriremos con wireshark.

Siguiendo la pista «TCP» que nos dan en el titulo del reto, miramos las tramas TCP, y en una de ellas encontramos el siguiente contenido

Etiopia – Forense (50 Puntos)

Enunciado: Estamos realizando una análisis forense de una unidad USB. ¿Cual de los siguientes ficheros ha sido copiado?

La pista que nos dan para este reto es una fotografia del explorador de archivos de windows.

En este caso la fuerza bruta es muy simple, o la respuesta es contactos.txt o servicios.txt, lo que deberia hacer que nos decantasemos por el archivo servicios.txt como respuesta es que la fecha de modificacion/acceso del archivo contactos.txt hace imposible que haya sido copiado a cualquiera de las carpetas mostradas, en cambio el archivo servicios.txt podria haberse copiado perfectamente a la carpeta «Nueva carpeta».

Grecia – FTP (50 Puntos)

Enunciado. ¿ Cual es la password para acceder a los ficheros de este viejo AS/400 ?

Ahora nos vuelven a dar una captura de trafico, lo abriremos con wireshark.

En las primeras tramas del paquete encontramos una conexion a un servicio que se pone a la espera de un usuario y una contraseña, por tanto en las siguientes tramas debera hacerse el login, y lo que nos estan pidiendo como flag es la contraseña.

Efectivamente, un poco mas abajo tenemos lo que buscamos

Austria – Forense (75 Puntos)

Cameron trabajó en los 80s en una empresa de informatica. Cual era su lema? (En mayusculas y con espacios).

Nos dan un archivo comprimido con 7zip.

Una vez descomprimido el archivo tenemos el archivo card.image, para hacer analizar este fichero usaremos un programa llamado FTK imager.

Una vez abrimos la imagen, encontramos 5 fotografias en la carpeta root, lo que nos da la flag

Suecia -HTTP (125 Puntos)

Enunciado: ¿Sabrias decir el lema de este grupo de hackers? (Minisculas, mayusculas y puntuación tal como lo encuentres).

De nuevo tenemos que hacer un analisi de una captura de trafico, asi que la abriremos con wireshark.

Analizando las primeras tramas vemos que hace una conexion del tipo GET a una imagen y psoteriormente procede a su descarga

Por tanto es facil llegar a la conclusion de que en esa imagen estara la flag. Para ver la imagen ya que la conexion la hizo a una IP interna (192.168.187.1:80/hackers.jpg) es usar network miner a ver si nos la recupera.

Efectivamente nos recupera la imagen que contiene la flag.

Filipinas – Esteganografia (50 Puntos)

Hemos recibido esta imagen de un gran equipo de fútbol. Pero creemos que hay algo raro en ella…

La imagen que nos dan es la siguiente:

 

Real_993d44f0485d956a8d7d931b8d3a8e61.jpg

A simple vista no se ve nada raro en la imagen, por tanto vamos a analizarla mas a fondo.

Si usamos hexdump -C imagen podemos ver que en el EOF tiene algo cifrado en base64

El texto descifrado nos dara la flag.

Chad – Transmision (100 Puntos)

Enunciado: Hemos recibido esta transmisión de algún punto de Chad. ¡Ayúdanos a descifrarla!

Como pista nos dan un fichero de audio .wav con el nombre morse_*.wav por tanto nos dan el trabajo hecho, aunque al reproducirlo se escucha claramente el morse.

Si pasamos el mensaje por un decoder online obtenemos la flag.

Finlandia – Adjuntos en correo electronico.

Enunciado: Se ha recibido un correo electrónico con un fichero adjunto malicioso. En dicho fichero malicioso podrás encontrar la bandera.

Nos dan un archivo .xlsm (excel con macros) para evitar problemas de compatibilidad use el paquete de office para resolverlo.

Una vez lo abrimos y tras habilitar la edicion y habilitar las macros, nos encontramos con una hoja de excel vacia, como es un archivo con macros vamos a ver el codigo de las mismas con alt+f11

Como vemos ejecuta un comando de powershell, lo unico que nos falta es la variable «a», que esta en la celda AA1 de la hoja ScriptKiddie101.

Como al abrirlo solo veiamos la Sheet1, se deduce que han ocultadola hoja que nos interesa.

Nos fijamos que en la ventana de ropiedades de la sheet que nos interesa, la propiedad «visible» esta marcada en 2 – very hidden, para poder verla y por tanto recuperar el contenido de la celda AA1 que corresponde a la variable «a», le daremos la propiedad -1.

Si nos desplazamos hacia la derecha nos encontramos con lo siguiente

de la columna Z pasa directamente a la AB, y la que nos interesa es la columna AA y la celda 1. Para resolver este problema hacemos la busqueda de la celda manualmente, donde encontramos el codigo de la variable a

Basta con ejecutar la parte de la variable ‘a’ que esta entre los paréntesis a través del powershell ISE para obtener la flag.

Reversing

Camerún – Reversing

Hemos olvidado la contraseña de este fichero ¿Nos podrías ayudar a recuperarla?

Nos dan el fichero al que tenemos que hacer el reversing para obtener la flag.

Lo primero que tenemos que hacer tras descargar el archivo es darle permisos con chmod +x binario

Ejecutamos para ver el funcionamiento

Ya tenemos localizada la parte del fallo «Fallaste! (-.-)»

A continuación lo abrimos con radare2 y analizamos todo el binario con «aa», posteriormente  desensamblamos el main con «pdf@sym.main»

Localizamos la zona de fail:

0x08048680      68e7870408     push str.Fallaste____.__ ; str.Fallaste____.__ ; «Fallaste! (-.-)» @ 0x80487e7

Localizamos la zona de contraseña correcta:

0x08048628      68b0870408     push str.Era_co__a._Lo_has_conseguido___Zorionak_ ; str.Era_co__a._Lo_has_conseguido___Zorionak_ ; «Era co..a. Lo has conseguido!! Zorionak!» @ 0x80487b0

Lo de era coña se refiere al contenido de unas posiciones mas arriba donde nos dice:

0x0804860b 689f870408 push str.Otra_vez_sera… ; str.Otra_vez_sera… ; «Otra vez sera…» @ 0x804879f

tras mostrarnos ese mensaje de «error» hace un sleep y posteriormente deberia mostrarnos la flag.

Otras lineas que nos deberian llamar bastante la atencion son:

0x080485e3 68409a0408 push str.DCS2017mola ; obj.paswd ; «DCS2017mola» @ 0x8049a40
| 0x080485e8 e843feffff call sym.imp.strlen
| 0x080485ed 83c410 add esp, 0x10
| 0x080485f0 83ec04 sub esp, 4
| 0x080485f3 50 push eax
| 0x080485f4 68409a0408 push str.DCS2017mola ; obj.paswd ; «DCS2017mola» @ 0x8049a40

Bien, llegados a este punto podriamos deducir que la contraseña es «DCS2017mola», y efectivamente es esa, aun asi vamos a resolverlo modificando el flujo de ejecuccion (como prueba de concepto).

Para ello y dado que aun soy muy noob con radare, usare GDB con el plugin peda.

Una vez abrimos el programa con «gdb ./binario», usamos pdisass main para desensamblar el main.

Localizamos la zona donde hace la comprobacion del input con la flag real

0x08048604 <+153>: test   eax,eax

En la linea siguiente y si lso datos no coinciden, salta a la direccion 0x0804867d , justamente la zona donde el programa nos dice que hemos fallado, por tanto vamos a saltarnos esa verificacion.

Para ello colocamos un breakpoint en 0x08048604 con b *main+153 y ejecutamos con run.

Vemos que se ha parado en la comprobacion y esta haciendo un string compare con el caracter «D» y nuestra password «test». Como evidentemente D != t el salto nos llevaria a la zona de password incorrecta.

Para evitar esto hacemos next instruction (ni) y modificamos el instruction pointer a la siguiente direccion tras el salto que no queremos hacer  (set $eip=0x8048608)

Bien, pasamos la verificacion y nos da la flag, aunque evidentemente esta no es «test» es «DCS2017mola».

Mauritania – Reversing

Nos ha llegado el siguiente ejecutable con un mensaje protegido por contraseña. ¿Nos podrías ayudar a obtenerlo?

Nos dan de nuevo un binario

Lo primero que hacemos tras descargarlo es darle permisos igual que antes, abrirlo para ver el funcionamiento, que en este caso es exactamente igual que el anterior y abrirlo con radare para analizarlo y desensamblarlo.

Localizamos la zona de chico malo

0x08048553 683c870408 push str.Fallaste____.__ ; str.Fallaste____.__ ; «Fallaste! (-.-)» @ 0x804873c

Y la de chico bueno

0x0804857c 68f4860408 push str.Probaremos_con_un_cifrado_mejor_la_proxima_vez._Zorionak__ ; str.Probaremos_con_un_cifrado_mejor_la_proxima_vez._Zorionak__ ; «Probaremos con un cifrado mejor la proxima vez. Zorionak!!» @ 0x80486f4

Igual que antes una zona nos deberia llamar la atencion

0x08048548      3a91a0990408   cmp dl, byte [ecx + str.A1_C3bK4_2h5f8vE]

En esta comparacion va a comparar nuestro input con el contenido en bytes del registro ecx concatenado con la string «A1_C3bK4_2h5f8vE», si bien a esta zona en una primera ejecuccion no vamos a llegar, ya que antes nos encontramos con

0x08048543 eb20 jmp 0x8048565

Lo que nos lleva a una zona donde se comprueba de nuevo nuestra password

| | || 0x0804856b 80fa0a cmp dl, 0xa
| | `===< 0x0804856e 75d5 jne 0x8048545
| | | 0x08048570 80b8a0990408. cmp byte [eax + str.A1_C3bK4_2h5f8vE], 0
| | `==< 0x08048577 75cc jne 0x8048545

esta es la zona que tendremos que bypassear, para ello colocaremos igual que antes breakpoints en cada comparacion

0x0804856b

0x08048577

Si alguna de estas comparaciones diese falso saltariamos a la zona antes mencionada, y en caso de que la comprobacion diese falso, continuaria la ejecuccion hasta

0x08048560 eb7f jmp 0x80485e1

donde nos mandaria fuera de la zona de chico bueno.

Recapitulando, que la zona que nos interesa es esta:

Abrimos el binario con gdb y colocamos breakpoints en

0x0804856b y  0x08048577

Ejecutamos y nnos paramos en la primera comparacion

Next instruction, cambiamos el instruction pointer a la direccion 0x8048579 para bypassear la siguiente comprobacion y continuamos obtener la flag

Ingenieria inversa en android | Cap 1

Buenas!

En esta entrada volvemos con reversing después de unas cuantas entradas dedicadas al malware, dado que crackmes.de, la pagina de donde solía sacar los crackmes esta cerrada de forma indefinida, haré ingeniería inversa a un crackme en Android de esta pagina

 

Resolveremos el crackme numero 2, para instalarlo en nuestro emulador usamos el android device bridge

Lo subimos con adb push ‘local’ ‘emulador’

Abrimos shell en el emulador con adb shell

Navegamos hasta el directorio donde hayamos subido el APK

Instalamos con adb install nombre_del_paquete

 

El crackme presenta el siguiente panel de login donde nos pide un email y una contraseña (secret):

Lo siguiente que haremos sera situarnos con la consola del sistema en el directorio donde hayamos instalado el apk y escribir apktool d nombre_del_paquete

Una vez se haya decompilado el apk, entramos en la carpeta que se ha creado y posteriormente en el directorio smali

Una vez estamos en el directorio smali hacemos grep -R -i password

Con este comando buscaremos en todos los directorios de forma recursiva el string password sin case sensitive (-i)

Lo que estamos buscando son cadenas hardcodeadas que contengan password a ver si podemos tirar del hilo a partir de ahí.

Debería llamarnos la atención la siguiente linea

Para ver mas concretamente a que viene esta linea debemos navegar hasta la ruta indicada en morado.

Una vez dentro podemos ver el archivo en código smali

*Nota: el código smali es el punto medio entre el código programado en Java y el código dalvik que es el que «entiende» la maquina virtual de android al ejecutar la aplicación.

En la linea 191 encontramos el string que estábamos buscando, y un poquito mas abajo debería llamarnos bastante la atención la siguiente linea también hardcodeada

const-string v8, «[WARN] Secret didn\’t match b2c4782f0afc0d9ccf21af70ac6c5c7e»

Esto es un mensaje de error de un log generado tras comparar dos hash MD5, este hash que compara es la contraseña (secret) que hemos introducido, así que por pura lógica, si desciframos el hash ya tendremos la contraseña.

Ahora nos falta el email de acceso, pero si en ese mismo archivo buscamos @ saltamos directamente a otra linea hardcodeada con un email.

Ya tenemos el email y la contraseña (secret), probemos a hacer login…

 

Hasta la próxima

 

Jugando con Microsoft Office, powershell y batch | Malware

 

Me encontraba yo ayer, en medio de una apasionante clase de gestión empresarial para la cual llego un momento en que necesitaba el Excel, y al abrirlo… Sorpresa! Licencia caducada ;( Comencé a buscar en internet seriales y entre los primeros resultados, descargue un word, total, es un word, que puede salir mal, seguramente este el serial dentro para evitar que google lo indexe, pensé, nada fuera de lo normal.

Pero no, en la jungla que es internet pocas cosas son lo que parecen.

Al abrir el archivo, me encuentro una frase invitándome a hacer click en un supuesto PDF que contendría los seriales, seriales.PDF.bat, evidentemente era «malware».

No era malware sofisticado, nada especial, el tipico bucle infinito de abrir un proceso, en ese caso la calculadora.

Pero esto me dio la idea, supongo que ni mucho menos seré el primero en escribir sobre esto, pero nunca esta de mas estudiar los vectores de infección para aprender a protegerse.

Dicho esto, empecemos con la parte divertida.

Para esta POC voy a usar una tool que desarrolle hace algo mas de un mes y que puede ser descargada aqui

564cec2406b8203f5c7b651f8044d402

Voy a explicar un poco por encima lo que esta herramienta hace:

Básicamente crea un downloader, el payload que genera es .bat y hace uso de powershell, por tanto funciona de windows vista en adelante sin ningún tipo de problema de compatibilidad; ademas los payloads generados solo tienen una similitud del 21%, esta similitud esta de hecho en los parametros que recibe powershell como opciones de ejecución, por tanto la colocación de una firma en esta zona generaría infinidad de falsos positivos, quizás eso explique que siendo algo publico desde hace mas de un mes l0s antivirus miren al mar cuando lo analizan.

3aa4e2a841b21873e3638cd352f27fe7

Dicho esto, vamos a aprovecharnos de la posibilidad de insertar objetos OLE en documentos de office, para el ejemplo usare Word en la version 2010.

El procedimiento es muy simple

  1. – Nuevo archivo
  2. – Insertar
  3. – Objeto
  4. – Crear desde un archivo
  5. – Examinar y seleccionamos el archivo bat que hemos creado, posteriormente elegimos el icono que mas nos convezca.

El resultado final seria este:

Como veis lo de .pdf.bat es mas falso que una moneda de 3 euros, pero de eso nos ocuparemos mas tarde…

Ahora que ya tenemos nuestro word malicioso creado, vamos a ver si las empresas de seguridad han hecho su trabajo…

<Irony>Vaya, sorpresa, no detectan nada :O </Irony>

La parte buena de esto es que al intentar ejecutar el objeto embebido windows nos pregunta si estamos seguros de que queremos ejecutar el archivo

La parte menos buena de esto? Que si ya le has dado a abrir no te vas a parar ni a leerlo.

La peor parte? Que esa ventana es el Zone ID y que se puede bypassear muy fácilmente tal que asi

Ahora vamos a optimizar esto, para ello bindearemos un pdf con los seriales a nuestro downloader, para que al hacer doble click en el word se ejecuten ambas cosas y que no sea tan cantoso. Luego haremos algo de magia para que nos quede algo asi… (omito este paso para evitar la reproducción exacta por parte de personas con oscuras intenciones :S)

Por ultimo, repetimos el mismo proceso que antes para que nos quede de este modo:

Ahora si da mas el pego que antes, tras el doble click en el icono:

Eso es todo.

Hasta la próxima 😀

 

Crackme | Ensamblador | Medio | Sin resolver |

En esta entrada voy a presentar un crackme de nivel 2 http://crackmes.de/users/fereter/crackme_by_fereter_1./

el objetivo es parchearlo para que acepte cualquier numero de serie, vamos a ver lo primero la gui

1

Vamos a abrirlo en el ollydbg y a buscar all referenced text strings, como siempre.

Y localizamos la linea donde dice correct numner

Si, el creador se ha equivocado y a puesto numner en vez de numBer xD

El caso es que nos manda a la direccion 004032A1

Vemos que en 0040328F tiene un salto JNZ hacia la direccion 004031D0, parte donde esta el mensaje de incorrect number. Osea si el serial introducido no coincide con el valido nos lleva a esa parte.

Ante esto se me ocurren cuatro opciones

-La primera sustituir ese salto condicional en 0040328F por un salto directo a la linea de correct numner.

-La segunda sustituir la direccion  a la que apunta ese salto condicional a la linea de correct numner, asi si el serial no es el que nos piden saltaremos a donde queremos.

-La tercera opcion que se me ocurre es dejar el salto como esta, y en la direccion a la que salta poner un JMP SHORT apuntando a la direccion 004032A1, osea a la zona de chico bueno

-La cuarta, que es la que voy a usar yo ya que es la solucion optima va ser poner un JMP SHORT apuntando a 004032A1.

Ahora vemos que en la direccion 0040328B hay un salto no condicional que nos volveria a mandar hacia arriba, y queremos ir abajo. Simplemente ponemos un breakpoint que es algo rapido .

Tambien hay un salto en la direccion 00403227, del tipo JNZ de nuevo que nos lleva a incorrect number, asique hacemos un JMP SHORT a la direccion donde tenemos el otro, osea a 0040328F

Hacemos lo mismo en 004031FE

Ahora nos fijamos en la direccion 004031DB, aqui el codigo, hace que si el serial es el valido se salta la parte de incorrect number, esto es un problema ya que si no lo cambiamos por un JNE nunca llegaremos al resto de partes, ademas vamos a hacer que este nuevo salto condicional apunte a la direccion 004031FE

 

2

Guardamos y probamos.

 

 

Malware complejo: metamorfismo, polimorfismo y EPO | Teoria y ejemplos practicos

En esta entrada intentare presentar los metodos mas sofisticados que usa el malware para evitar su deteccion por parte de las compañias de antivirus, comenzara con una amplia introduccion teorica sobre polimorfismo, metamorfismo y la tecnica EPO; posteriormente ejemplificare la teoria con practicas y analizaremos los resultados para sacar conclusiones.

Antes de nada decir que no es un tutorial sobre indeteccion de malware, (esto va dirigido sobre todo a los leechers de hackforums y similares), si no que se tratara la informacion de una manera objetiva para  la concienciacion y formacion en materia de ciber-defensa de los lectores. Ni que decir tiene que no es el objetivo hacer apologia a la infeccion con malware.

Tambien aclarar que a medida que avance la entrada se convertira en algo bastante tecnico, no sera un texto divulgativo.

Una vez aclarado esto vamos a empezar por el malware Polimorfico.

1. Malware complejo: Polimorfismo

El polimorfismo en malware no es algo nuevo, tiene una gran trayectoria desde que en 1989 el desarrollador Mark Washburn crease el malware conocido como 1260 o V2PX, como prueba de concepto para demostrar  las carencias de las firmas en base a strings. Mas tarde este POC evolucionaria a un nuevo virus conocido como V2P2.

Pero antes de entrar con ejemplos concretos, lo primero es saber que quiere decir que un virus sea polimorfico, para aclarar este concepto citare un parrafo del libro Viruses revealed de  David harley, Robert Slade y Urs Gattiker (libro que recomiendo 100%, de lo mejor que he leido en relacion a este tema):

«Another word that inspires panic in the press is polymorphism, a concept poorly understood by instant experts and generally overestimated in its long-term impact on the malware problem in general. A polymorphic (“many shaped”) virus attempts to make detection of its presence more difficult by changing its “shape” from one infection to another. (The mechanisms for achieving such shape-shifting will be considered later.) This is often mistaken (not only by the press, but by writers of low-grade books on security and/or viruses) as meaning that the virus becomes a different virus or virus variant at each infection. This is not the case. A polymorphic remains the same virus but cannot be detected by looking for a characteristic scan string within the possibly infected file (or other infectable object). The code remains essentially the same, but the expression is different, so that the same program is represented by a different sequence of bytes. This by no means indicates, however, that polymorphic viruses are undetectable, though the first examples contributed to the disappearance of a number of early anti-virus products published by vendors who couldn’t handle the problem. It does mean, of course, that the anti-virus programmer has to think beyond grep-like scanning of infectable objects using pattern matching with regular expressions.»

Ahora en Español y tirando de Wikipedia (que en este caso da una definicion bastante acertada):

«En relación a los virus informáticos un código polimórfico o polimorfismo es aquel que se sirve de un motor polimórfico para mutarse a sí mismo mientras mantiene su algoritmo original intacto. Esta técnica es utilizada comúnmente por virus informáticos y gusanos para ocultar su presencia.»

Bien, una vez tenemos el concepto de polimorfismo claro, vamos a seguir con los ejemplos, historicos.

Tras la publicacion del 1260 y posteriormente el V2P2, otros investigadores desarrollaron herramientas para el desarrollo de malware polimorfico, un ejemplo de ello fue la creacion por parte de «Dark Avenger» de un motor polimorfico, que permitia la generacion de virus polimorficos.

Otro ejemplo, que quizas sea uno de los malwares mas conocidos, por su propagacion exponencial y su altisima tasa de infeccion, fue el VBS/LoveLetter, que obtuvo un ratio de infeccion de 50 millones de equipos en el año 2000. Programado en VisualBasicScript y propagado a traves de email, este malware fue una autentica obra de arte, algo nunca visto, llegando a infectar equipos del pentagono, la CIA, el parlamento britanico y numerosas multinacionales, ademas de millones de ordenadores particulares.Este caso se trata en profundidad en el libro anteriormente mencionado, en el capitulo 14.

Una vez que tenemos claro el concepto de polimorfismo y hemos visto algunos ejemplos  podemos pasar al siguiente punto.

2. Malware complejo: Metamorfismo

Para explicar este concepto citare una buena descripcion por parte de Kapersky Labs:

«Un virus metamórfico es aquel que  puede transformarse según su capacidad de traducir, editar y reescribir su propio código. Se le considera el virus informático más infeccioso y, si no se detecta rápidamente, puede producir graves daños en un sistema. Además, se reescribe y reprograma a sí mismo cada vez que infecta un sistema informático. Debido a su complejidad, para la creación de virus metamórficos es necesario contar con conocimientos amplios en programación.»

El ejemplo historico mas conocido es el «Black baron SMEG» . SMEG por sus siglas en ingles «Simulated Metamorphic Encryption enGine» o «Motor de encriptacion metamorfica simulada» (o motor de cifrado metamorfico simulado, ya que «encriptar» no se recoge en la RAE) . Volviendo al ejemplo anteriormente expuesto, se destacan dos variantes del Black baron,  SMEG.Pathogen y SMEG.Queeg. Ambas con funcionamientos muy similares, archivos del tipo DOS que infectaban archivos de tipo .exe, generalmente un maximo de 32 por equipo para dificultar su estudio. En versiones posteriores, estas dos subvariantes de SMEG solo infectaban archivos de 17:00 a 18:00 los lunes, comportamiento tipico de una bomba logica

Una vez sabemos que es el metamorfismo y el polimorfismo, pasamos a ver sus diferencias, porque a priori pueden parecerse mucho en concepto, pero esto no es asi.

3. Diferencia entre polimorfismo y metamorfismo

Bien, ahora pasare a mostrar unos codigos basicos con un ejemplo muy didactico, para ello usare un lenguaje de scripting llamado Autoit.

Polimorfismo.

Para este ejemplo usare algo muy muy basico, sustitucion de variables por strings, en este caso para mostrar un Msgbox;

3e3dd4cb3ef6d76dea2ad3ae245c73c8

afe199e2802f4d5ab75cf5be3ec37914

Como vemos el ejemplo es facil de entender, en lugar de escribir el comando msgbox(0, «Ejemplo de polimorfismo», «sadfud»), sustituimos las letras de «sadfud» por variables, algo muy facil de entender por cualquier persona y mas por un analista, pero que inexplicablemente a algunos antivirus se les resiste este metodo. El polimorfismo se trata de rizar el rizo para al final ejecutar el codigo original, cuantas mas vueltas demos, mejor para el malware y mas complicado para las soluciones de seguridad.

Para el caso del metamorfismo la cosa ya se complica, el malware metamorfico tiene un ligero parecido con las bombas logicas. Basicamente lo que hara el malware metamorfico sera modificar su comportamiento segun el entorno en el que se encuentre, para el ejemplo usare otro script en autoit que detectara si la ejecuccion se ha realizado dentro de una sandbox y en funcion del resultado ejecutara una cosa u otra:

506587c595af6192b93db12b51e406371

Buscar un ejemplo para un codigo metamorfico es muy dificil, ya que hay que entrar en casos concretos, otro ejemplo explicado con palabras podria ser:

Si el sistema operativo es windows7 haz X

Si el sistema operativo es windows10 haz Y

Las posibilidades tanto para polimorfismo como para metamorfismo son infinitas, es todo una cuestion de imaginacion e ingenio.

Pasemos a la siguiente tecnica que no es tan conocida.

4. Malware avanzado: EPO

La tecnica EPO conocida como «Entry Point Ocultation» tiene algo en comun con las bombas logicas, el malware se activa si se cumple una circunstancia concreta, pero a su vez tiene una gran diferencia, la condicion depende de la interacion del usuario, no del entorno.

Basicamente imaginemos un escenario en el cual nosotros tenemos un binario, lo ejecutamos, lo usamos y aparentemente no pasa nada. Puede ser que simplemente no hayamos activado la funcion que arranca el malware. Por ejemplo, imaginemos que tenemos un payload harcodeado dentro de un software legitimo, este payload solo se ejecuta al darle a la cruz de cerrar. De ahi el nombre, realmente no sabemos cuando se va a ejecutar, y cuando lo hace no sabemos como ni por que, ¿por que al cerrarlo y no al abrirlo, por que al pulsar determinado boton?

Bien, yo creoq ue la forma mas clara de explicar esto es con un ejemplo.

Partimos del escenario en que hemos creadoo un payload con metasploit y tenemos el shellcode limpio:

El primer paso seria insertar nuestro shellcode en una zona dentro del software legitimo, donde queramos, sin alterar su funcionamiento. para el ejemplo usare un software comercial del que evidentemente no dire el nombre, pero se puede hacer con cualquiera.

Abrimos el binario en OLLY y buscamos una zona con sitio para meter el shellcode

cad9831282cc1e067a68d5681398630c

Copiamos el shellcode en modo binario

9cd084823f795bc57537fd1cd576f52b

1c23c6508799a95624e5305d9e11099a

Ahora tenemos que decidir la condicion que se debe dar para que el shellcode sea ejecutado, lo hare cuando se cierre el software legitimo, por tanto la referencia que debemos buscar (cntrl+N) es «ExitProcess»

09533be490645702eb16acea3c1b7fb6

Una vez la tenemos con la tecla Enter, nos da las referencias de llamada a la funcion, solo debemos redireccionar con el comando JMP (offset de inicio del shellcode), y se ejecutara el payload, al final del shellcode de nuevo un jmp(referencia de exitprocess original) para que el software original siga siendo totalmente funcional.

Como vemos esta tecnica ayuda a que el malware pasa desapercibido, pero no por mucho tiempo, cualquier analista que abra con IDA o cualquier otra herramienta del estilo, vera o deberia ver que hay un payload incrustado en medio del codigo.

Una pega de este metodo es que si el payload es detectado, el software modificado tendra esa deteccion, pero si no lo esta, pasara muy desapercibido hasta que sea cazado.

Bien, una vez tenemos los ejemplos de EPO y metamorfismo; y los conceptos de polimorfismo claros vamos a pasar con los ejemplos practicos para evaluar la eficacia del polimorfismo.

5. Poniendo a prueba el malware polimorfico

Este es el punto al que realmente queria llegar, pero no vale de nada sin haber leido la parrafada anterior y lo que es mas importante: haber entendido los conceptos expuestos.

Si has saltado hasta aqui directamente, te vas a perder, ademas de que esta costosa entrada habra quedado en tu memoria como un simple tutorial o guia de desarrollo malware polimorfico, y por encima de todo quiero evitar eso.

Dicho esto, a partir de aqui se mostraran metodologias de trabajo del malware polimorfico, con diferentes lenguajes de programacion, todos de scripting que es donde mejor se ve y donde tiene mas peso el malware.

Estos lenguajes seran para empezar con algo simple batch, posteriormente VisualBasicScript, y terminaremos con un analisis profundo de malware polimorfico en Autoit.

5.1 Polimorfismo basico en archivos batch

Este tema ya lo trate en esta entrada, pero aqui se llevara a cabo un analisis estadistico, viendo el nivel de diferencia o la tasa de polimorfismo que podemos alcanzar en difetentes archivos, con diferentes metodos.

Vamos a ello.

Para estos ejemplos voy a usar una tool que desarrolle hace bastante tiempo con el objetivo de identificar patrones o trucos en cuestiones de modding para la indeteccion de malware. Esta herramienta comparara bit a bit dos archivos, mostrando los cambios realizados.

De nuevo usare el mismo script que en la anterior entrada y la misma tool.

El scan del script original es el siguiente

6ae79a57743d37a786b8c228e5259e0f

Para empezar comparare ese script con uno generado con un motor polimorfico que lo que va a hacer es generar una variable aleatoria para cada letra minuscula  y sutituirla en el texto. Ejemplo:

set kgxsqwm=a
set pqdbren=b
set yjfhlil=c
set hlpxqnf=d
set taeehog=e
set uhlfkzu=f
set rtbjcpp=g
set mxpirhb=h
set dlveneg=i
set apdxstg=j
set sgmgxoj=k
set amepvto=l
set vzzyxlv=m
set paklefi=n
set cwkyvft=o
set ptcjoef=p
set vqspkla=q
set lneutiz=r
set mdtejui=s
set tnthaax=t
set xzusnjj=u
set qdnymdh=v
set fnpgabm=w
set zztsauu=x
set hllstzi=y
set wmfquxs=z

Por lo tanto la primera linea que es @echo off quedaria asi
@%taeehog%%yjfhlil%%mxpirhb%%cwkyvft% %cwkyvft%%uhlfkzu%%uhlfkzu%

Como vemos es un metodo de polimorfismo muy basico, evidentemente cada variable se genera diferente cada vez, eso es lo que hace que sea un motor polimorfico, y que no estemos hablando de simplemente codigo ofuscado.

Pues con este metodo conseguimos bajar el ratio de deteccion a 1

e137f78a1a451b2cd6972c36912a37c7

Creo que con este pequeño ejemplo ya se puede percibir algo de la potencia que puede tener un motor polimorfico y de lo peligroso que es si cae en las manos equivocadas.

Al ser un motor polimorfico, cada vez que generamos una nueva muestra esta tiene un % de diferencia respecto al script original y a las otras muestras. Y aqui esta lo importante, y donde reside la peligrosidad del malware polimorfico, vamos a verlo con datos.

Compararemos primero la muestra original con la ofuscada a ver hasta que punto son diferentes. La parte roja representa las zonas diferentes y la azul las zonas que coinciden

En este caso el resultado es el siguiente:

43fd13d2e28904988668b4e2eb279365

La muestra creada por el motor polimorfico en base de la muestra original es un 100% diferente. En este caso al ser un metodo de ofuscacion muy basico no seria problema para un analista, pero es un dato muy bueno, ya veremos luego mas en detalle esto.

Ahora vamos a comparar dos muestras generadas con el motor polimorfico

c26baa0e07d4a57957db1e42488c08de

El resultado nos indica que las dos muestras generadas a partir del motor polimorfico son un 98% diferentes. ¿Pero que implica esto? Bien, esto en materia de ciber-seguridad desde el punto de vista de un analista de malware, es un quebradero de cabeza, solo tiene un 2% donde colocar esa deteccion para detectar todas las muestras generadas en base a este motor polimorfico. Pero claro, los motores no tienen solo 1 parametro, de echo, podemos volver a ofuscar con exactamente el mismo procedimiento otra vez el ofuscado, osea, iteramos 2 veces.

Ahora si comparamos la nueva muestra, configurada con la misma opcion , pero iterada 2 veces, con la muestra iterada solo 1 obtenemos un 100% de diferencia. Aqui el analista no tiene nada que hacer, solo puede remitirse a manualmente des-ofuscar el codigo e intentar llegar al original.

Al iterar dos veces conseguimos que la declaracion de la iteracion 1ª de las variables quede asi

c9b2619a01be74c80d5990fd883e9c07

Des-ofuscar eso no seria dificil, seria simplemente laborioso pero hemos dicho que hay mas parametros, vamos a probar otro combinado con la primera opcion iterada 2 veces.

Nos queda esto: http://pastebin.com/8tPYMYx5 Que evidentemente no hay ahi analista que valga y aunque pueda no parecerlo, funciona.

Que comparando al archivo original a esta ultima muestra nos vuelve a dar 100% de poliformismo

ede7bee64fc39e109a146e6b6d791589

Y con la muestra de la opcion 1 iterada dos veces mas de lo mismo

ede7bee64fc39e109a146e6b6d791589

Como vemos, con un motor polimorfico podemos partir de una muestra de malware muy detectada a generar infinitas muestras, todas diferentes y funcionales, algo peligrosisimo y muy complicado de detectar.

Pero al igual que digo eso, tambien digo que no es tan facil, por ejemplo con el ultimo metodo, el de cambiar la codificacion de los caracteres, pasando dos veces la misma muestra por el motor polimorfico, esas dos nuevas muestras son iguales casi en su totalidad

d68c009607167bf4f8e6a2384d0e4a54

Esto pasa por que son .bat, archivos por lotes y se ven como texto, pero al final nos meteremos con binarios Autoit, y la cosa se complicara aun mas.

Una vez visto el ejemplo facil, que mucha gente podria programar sin emplear demasiado tiempo, y que por tanto vamos asumiendo lo que un motor polimorfico supone (o eso espero) vamos a pasar a visual basic script, muy utilizado en malware, en botnets, como Safeloader, o Gorynich (diamond fox)

5.2 Polimorfismo intermedio en archivos VBS

Como he dicho antes el malware en vbs, esta de moda, ¿la razon? se ejecuta a traves de wscript y por tanto tiene unas ventajas en cuanto a indeteccion inmensas.

Para las pruebas de este motor polimorfico usaremos un payload de houdini worm, un malware bastante popular, es del tipo loader, ligero, facil de indetectar y estable.

Como podemos ver esta mas que firmado por los antivirus

 

383c78318d0020ee7834b790879550f71

*Los AVs que no lo detectan no se en que mundo viviran, en fin

Con este motor polimorfico que manejaremos ahora, ya nos metemos en temas mas serios, con mas de 30 configuraciones posibles, vamos a ir porbando a ver que nos ofrece

Vamos a probar primero una opcion que colocara el delimitador que le digamos entre cada caracter, hara una serie de modificaciones que almacenara en variables aleatorias para mas tarde ejecutar el codigo eliminando este caracter y reordenando todo el codigo. Escaneamos:

dfcdb064d5323e8fa79d1c4388f01dff

Aqui ya los antivirus son basicamente inutiles, aguanta el Kapersky pero no por mucho tiempo.

Vamos a la parte central de esto, ver como de diferente es esta muestra del original

a447e0b5078870bc88a18f888984769f

Pues ahi esta el resultado, totalmente diferentes.. Con solo una opcion en el motor polimorfico no solo conseguimos que la mayoria de antivirus ni lo huelan, en este caso es MUY GRAVE por que al ser un vbs los procedimientos heuristicos no lo van a detectar, privilegios que tiene que te ejecutes como un componente de microsoft.

Vamos a volver a generar otra muestra, esta vez cambiando el delimitador.

5fd574f32bc4f00d43816e40bcf1e8942

Pues otra muestra diferente, puede parecer lo mismo que antes, pero es que el potencial en cuanto a malware que tiene vbs  no lo tienen los archivos por lotes, y que las defensas heuristicas y proactivas no controlen el wscript lo hace peligrosisimo

Ahora vamos a rizar mas el rizo aun, lo configuramos para que trocee el codigo en X partes, ademas de almacenar cada caracter en el espacio de un array para luego mediante una funcion recursiva deeshacer todo eso al momento de ejecuccion, por si fuera poco cifraremos el resultado del primer caso con Rot-N (igual que el cifrado del cesar)

De nuevo conseguimos un 100% de variacion en la muestra

5fd574f32bc4f00d43816e40bcf1e8941

Podra parecer que estoy copiando siempre la misma imagen, pero no, es asi, el polimorfismo es lo que tiene, que es muy eficaz.

Ahora no ofuscamos nada, simplemente añadimos basura

fc2d08281be037bf406291f5515e453a2

Como vemos nos cambia la deteccion, pero solo hemos probado 3 combinaciones, tiene mas de 30 posibles este motor, pueden parecer muchas pero aun queda el motor mas potente.

5.3 Polimorfismo avanzado en Autoit

Y es que, si hay un lenguaje preferido para desarrollar malware, ese es Autoit, por su facilidad, su indeteccion, sus macros, su versatilidad, su compatibilidad en los equipos…

Y aqui es donde me voy a extender mas, al analizar autoit, como funciona, usaremos un motor polimorfico con al rededor de 50 opciones, lo que nos ofrece una potencia que jamas habia visto, esto que vais a ver a continuacion es una autentica obra de arte, y no lo digo por que haya participado en el desarrollo, si no de forma objetivo, es de momento, para mi y para mucha gente el motor polimorfico perfecto. El proyecto en principio es un ofuscador, ya que autoit es un lenguaje que se decompila igual de facil que se compila, y a nadie le gusta que le roben el codigo, pero en esta entrada vremos como  se puede aplicar como motor polimorfico con unos resultados muy buenos.

Aclarar que Autoit pese a en sus terminos no permitir el desarrollo de malware es muy utilizado, y muchos antivirus, firman los binarios simplemente por ser autoit, por ejemplo K7, pero luego veremos eso.

Autoit se programa en archivos .au3, que mas tarde se pueden convertir a exe , pero tambiena .a3x, que seria la parte sin el interprete, y son esos ficheros. a3x los que vamos a analizar.

Lo primero presentar las opciones que nos ofrece la herramienta:

eccbb11fa480b0e99c93eb6445d5f96d

Aclarar que la interfaz grafica es de la primera version y faltan algunas cosas, para las pruebas se usara la 5 version. Disponible en: github

Quiero hacer hincapie en que el proyecto se desarrolla como una herramienta para proteger codigo, que ninguno de los involucrados en el proyecto nos hacemos responsables del uso que se le de a la misma.

Para las pruebas usaremos un script con algunas detecciones

f7598f88c46ed79137ef0bf2c42ebd37

Bueno, algunas detecciones, no muchas, pero aqui lo que importa es el motor polimorfico, en este caso un ofuscador utilizado como motor polimorfico.

Dado que son muchas opciones y es imposible probar todas las combinaciones, probaremos con las que vienen por defecto

Y a ver que resultados nos vuelca

Tenemos 6 muestras

Original en .a3x y .exe

Ofuscado1 y ofuscado2 .a3x y .exe

Ambos ofuscados con los mismos parametros

Ofuscado1.exe

6f0d83e820cf49270126f064dd14e24b

Ofuscado2.exe

0436f977f50fe87b65351b97c64216b8

Vemos que pese a ser ofuscados con la misma configuración, los resultados cambian, vamos a ver en que medida cambian los archivos

EXE

Original – ofuscado1

b4d997a171ac31abc0c61be2a6b4c1dd

mas del 99% de diferencia, un resultado muy bueno, la parte en la que coinciden es el interprete, lo veremos luego

Original – Ofuscado2

d2dacc2a12411de5ff3ddce76cf0ba87

Ofuscado1 – Ofuscado2

En esta ocasion mismo resultado, pero parece que la generación de bloques fue mayor, el tamaño aumenta y la localización del interprete se desplaza

Vale, antes de seguir un inciso, la diferencia entre .a3x y .exe es que al compialr a exe Autoit mete todos los includes, todas las funciones, aunque no se use, y eso crea ejecutables de mucho mayor peso, eso nos entorpece a la hora de intentar analizar el polimorfismo entre estos dos archivos, demasiado código que no queremos, basura, por eso tenemos que comparar los archivos con extensión a3x

A3X

original – Ofuscado1

288468f468a1271584735fa33256eba5

Aquí al no tener toda esa basura idéntica en ambos, nos da el resultado que vale, un archivo totalmente diferente

original . Ofuscado2

5d2a82ad3bb831d75f72cf95394cfc0a

Un resultado perfecto también, como era de esperar

Ahora viene lo interesante, y donde se demuestra la potencia de este motor, mismos parámetros:

d339620bdea7e43e25a381b6cb8c2e37

muestras completamente diferentes

6. Conclusion

El objetivo de esta entrada era mostrar el funcionamiento de las técnicas de evasión  mas avanzadas que usa el malware a dia de hoy, no es nada nuevo, pero se ha perfeccionado hasta tal punto, que los antivirus son inútiles. Imaginemos un ransomware, lo pasan por un motor polimorfico, generan 2000 muestras, todas diferentes, todas indetectables y las distribuyen. ¿Quien para eso? Nadie, simplemente seria imposible, queda visto que los antivirus no son aptos, algunos están invirtiendo en detecciones por heuristica, como nod32 con el HIPS, pero no es suficiente, están muy por detrás.

Yo me suelo preguntar muchas veces lo mismo, si yo puedo hacer esto, que no haran los cibercriminales, que no podrá hacer una persona con estudios oficiales de programación.

Y bueno tras mas de 5 horas escribiendo la entrada, solo me queda despedirme hasta la próxima, no sin antes decir que si alguien quiere o tiene interés en las herramientas utilizadas lo valorare, algunas como la ultima son open source, y cualquier persona es bienvenida al proyecto, siempre recordando que es una prueba de concepto contra la ingeniería inversa y para proteger la propiedad intelectual, el proyecto en principio se mantendrá hasta el 25 de septiembre que se acaben las vacaciones :_(

 

 

 

 

 

 

Trabajo de investigacion: Operación link azul

*Esta entrada es la parte final de un proceso de investigación. En ningún momento de la misma se ha visto comprometida la información de ningún equipo.*

 

En esta entrada presentare un trabajo de investigación; el objetivo es comprobar la vulnerabilidad de los usuarios a una posible infección, en este caso usando como vector de ataque el hackeo a linkedin.

Para ello cree un pequeño programa en vb.net  simulando ser una herramienta para comprobar si la cuenta del usuario había sido publicada a través de su dirección de e-mail.

El programa en cuestion es el siguiente:

f648a233039996f608db644e5cf82969

67fa8348b3a983614fea00a10c15030d

El programa es pura fachada evidentemente y no comprueba absolutamente nada.

Primera parte de la operación link azul:

Elegí 2000 email aleatorios de la base de datos de linkedin (seleccioné 1000 de España, para formar una estadística a parte)

El vector de infección para la propagación del programa fue un e-mail con dirección falsa y un archivo adjunto.

39ec00449a2a3f26b26f198ca3a52899

98e86d8f4c32ac50681f2c6c3fc4abd3

Como veis, nada sofisticado, sin invertir casi nada en la parte de ingeniería social.

Funcionamiento del archivo cebo: 

El archivo simplemente crea un pequeño script en vbs para visitar una web sin abrir el navegador.

Set IE = CreateObject(«InternetExplorer.Application»)
IE.Visible = False
IE.Navigate «URL»

*Los créditos del script van en este caso para Adwind. Allí donde estés, un saludo :drinking:

Cuando el usuario «comprueba su email» el programa simplemente ejecuta el archivo y lo borra.

Resultados:

Los resultados realmente me sorprendieron, empezaremos primero por los de España:

De 1000 emails enviados la web donde se recopilaban las ips y se pintaba el mapa, registro ni mas ni menos que 435

españa visitas linkedin

Esto nos deja el escalofriante dato de que un 43,5% de los usuarios ejecutaron y «comprobaron» su email.

En total el numero de usuarios afectados del total de 2000 fueron 1231 un 61,55%.

En el top 5 de paises se encuentran

009bde660b1d587fcad7aa29d0e64428:

En total hubo usuarios afectados en 62 paises

5c36ac3f07fcc11b483a16ade7c73a29

Como se puede observar en el mapa, los países mas afectados en su mayoría han sido de habla hispana, quizás si el mensaje hubiera estado escrito en ingles la cosa habría cambiado.

Conclusiones:

Al recopilar resultados me quede realmente sorprendido, no esperaba tener un ratio de infección de mas del 10-20%, pero la realidad a triplicado mis expectativas. Ante esto creo que hay mucho que reflexionar, que hubiera pasado si en vez de un script para realizar una conexión, el archivo fueses un ransomware, o un spyware, o cualquier tipo de malware? Realmente es la gente tan vulnerable? Eso parece… Por cuanto tiempo serán las personas el eslabón mas débil de la cadena? Me temo que siempre sera así. Afortunadamente desde organismos como INCIBE se lleva a cabo una ardua tarea de conciencian sobre el uso responsable de la tecnología; y bajo mi punto de vista este es el camino que mas hay que trabajar en la lucha contra el cibercrimen, la educación, es la base de todo, y en la tecnología no iba a ser menos.

Por ultimo quiero lanzar también una critica a todas las compañías de antivirus, estoy convencido que muchas habran recibido la muestra, en la web que recopilaba las visitas se indicaba que todo era una investigación y que si algún investigador de seguridad, ya fuera de alguna empresa o independiente , llegaba ahi, que contactase. Nadie lo hizo. Ademas, la campaña fue lanzada a principios de Julio, han tenido dos meses para mover ficha, meter el dominio en lista negra… algo.. y este ha sido el resultado:

 

image

Nada mas que añadir. Que cada uno saque sus propias conclusiones, y si apetece que las comente debajo.

Un saludo.

 

Informe detallado sobre el ransomware «Satana»

**Esta entrada fue publicada originalmente en http://indeseables.github.io/**

Si hay un tipo de malware preferido por los cibercriminales, esa es la familia de los ransomware. Desde la aparicion a finales de 2013 del conocido como «virus de la policia» esta familia de malware no ha parado de crecer, dado que es facil de programar y rentable para los cibercriminales.

A continuacion procederé a analizar detalladamente un nuevo ransomware descubierto a finales de Junio y conocido como «Satana». Las muestras en las que se basa el análisis de esta entrada son; 46bfd4f1d581d7c0121d2b19a005d3df Como muestra principal

https://virustotal.com/en/file/683a09da219918258c58a7f61f7dc4161a3a7a377cf82a31b840baabfb9a4a96/analysis/

d236fcc8789f94f085137058311e848b Como muestra de malware unpacked

1. Información de versiones

A día de hoy 12 de Julio de 2016, únicamente se ha distribuido una versión del código malicioso Satana.

2. Extensiones a cifrar

Satana cifra los archivos con extensión .bak .doc .jpg .jpe .txt .tex .dbf .db .xls .cry .xml .vsd .pdf . csv .bmp .tif .1cd .tax .gif .gbr .png .mdb .mdf .sdf .dwg .dxf .dgn .stl .gho .v2i .3ds .ma .ppt .acc .vpd .odt .ods .rar .zip .7z .cpp .pas .asm

3. Extension añadida a los archivos cifrados

Tras cifrar los archivos el malware cambia el nombre de los mismos con el formato __

68747470733a2f2f692e6779617a6f2e636f6d2f30346635326430343235313135663963663134303366323537616239643765652e706e67

4. Análisis dinámico del código malicioso

Tras la ejecución del binario malicioso este crea una copia de si mismo en %TEMP% con un nombre aleatorio y posteriormente borra el archivo original. Además crea un archivo de texto bajo el nombre de ¡satana!.txt también en %TEMP%. Una vez terminado este proceso ejecuta el archivo de nombre aleatorio creado en la carpeta temporal, el cual requiere al usuario permisos de ejecución como administrador. Cuando el usuario concede los permisos de ejecución, el malware crea 2 entradas en el registro de Windows.

68747470733a2f2f692e6779617a6f2e636f6d2f37643964663361373963313264663761353333383636623261616362663061342e706e67

La primera bajo el nombre de “BTC” contiene la dirección de bitcoin asociada a la cartera que debe recibir el pago La segunda bajo el nombre de “E-mail” contiene una dirección de E-mail, la misma que se muestra en el nuevo nombre de los archivos cifrados.

68747470733a2f2f692e6779617a6f2e636f6d2f38653163303761643630336339393265363931376434663433643039626637632e706e67

5. Ataque de bajo nivel

Este ransomware no actua en modo kernel, como si lo hacen otros como por ejemplo Petya.

6. Ataque de alto nivel.

Una vez el malware ha sido ejecutado simplemente se instala de forma silenciosa en el equipo y espera al reinicio del equipo (sin forzarlo) para mostrar el siguiente mensaje

68747470733a2f2f692e6779617a6f2e636f6d2f61623637656139333438623561363834346534336539303464653639393739662e706e67

*Es el mismo contenido que el del fichero ¡satana!.txt

7. Metodo de cifrado de archivos.

Satana divide los archivos en partes de 32 bytes que cifra de forma independiente para posteriormente juntarlas usando el método RTDSC (Read Time-Stamp Counter). El algoritmo de cifrado es una modificación de AES 256.

8. Llave de cifrado

Aparentemente la llave de cifrado es siempre la misma. Un mismo archivo siempre devuelve archivos cifrados idénticos.

9. Medidas de protección anti reversing en el payload.

El payload esta empaquetado, pero puede ser fácilmente desempaquetado usando un debugger como OllyDbg, basta con colocar un BP en RtlDecompressBuffer. Tambien impide la restauración del equipo a un punto anterior a la infección.68747470733a2f2f692e6779617a6f2e636f6d2f35383166626631366463366632346166366630613137303630333937376638312e706e67

10. Conexión con el C&C

El malware conecta con el C&C y envía la siguiente información en un paquete sin cifrar. id=7 &code=100 &sdata=5.1.2600 0 1 HOME User 0&name=payload.exe &md5=59E18B50B822020294A8EA0A4154C7597847B3A6359A08194F4865D804BD7E6 &dlen=66ABDE777F35E50F671B6034FA6453AD Este proceso muestra un grave fallo en el payload, ya que si en el momento de la infeccion el C&C esta offline la llave se pierde y los archivos no pueden ser recuperados.

12. Detecion con regla YARA

rule: Satana_Ransomware
{
meta:
Description = «Deteccion de ransomware Satana»
Author = «SadFud»
Date = «12/07/2016»

strings:
$satana = { !satana! } nocase

condition:
$satana
}

11. Conclusion

Observando el funcionamiento del programa y los fallos que tiene, es posible que esta solo sea una versión de prueba y que la verdadera campaña de infección masiva aun no haya comenzado.

12. Descarga de muestras

http://www27.zippyshare.com/v/WjzkYiPy/file.html

Contraseña:indeseables