jueves, 26 de julio de 2018

Auditando una librería en 16 horas

Hace unos días en el trabajo me asignaron una tarea donde tenía que auditar una librería, la funcionalidad de la librería era poder leer diferentes formatos de documentos (PDF, WORD, TXT, etc) y estaba programada en C#.

Como nunca había hecho algo del estilo no sabía como comenzar, por eso estoy escribiendo este post, por si alguien tiene algún caso como el mío que pueda servirle como una guía.

Al ser una librería y no ser una aplicación o algo parecido no podemos trabajar sobre un entorno real, por lo que lo que tenemos que hacer es una serie de recomendaciones que los futuros programadores puedan usar para no tener fallos de seguridad al hacer sus aplicaciones sobre esta librería, y para esto vamos a partir de la base de que no crean ningún filtro y todo lo harán tal cual funcionan las funciones en las librerías.

Además de esto, esta auditoria tenía un poco de prisa, y la librería era bastante grande, por lo que en lugar de poder leer todo el código tuve que hacer como una especie de Checklist de las cosas que eran importantes de mirar. Vamos a pensar las cosas que podrían provocar una posible vulnerabilidad.


  • ¿El código está ofuscado? Esto es lo primero que pensé, ya que al ser C# este código es legible, y el hecho de que no esté ofuscado facilitaría mucho la tarea de un posible atacante para ¿?encontrar vulnerabilidades en una aplicación que estuviese programada con esta librería.
  • ¿Tiene algún Buffer Overflow? Bueno este punto lo descarté debido a que la librería esta programada en .NET, el cual hace una eficiente gestión de la memoria, y para provocar aquí un Buffer Overflow habría que hacerlo con esta intención.
  • ¿Cómo actúa la funcionalidad de guardar ficheros? Es importante saber si sobrescribe ficheros o deja guardarlos con cualquier extensión.
  • ¿Cómo actúa la funcionalidad de cargar ficheros? Igual que en el anterior es importante conoces si hace algún filtro por extensión, además pensé que tal vez al detectar que se carga un fichero ".docx" ejecutara los macros.
  • ¿Tiene alguna función de cifrado? En caso de que si habría que ver si estas funciones son seguras o están ya desfasadas.
Una vez hecha nuestra lista de posibles fallos de seguridad nos vamos a poner manos a la obra.


Ofuscación del código

Al estar programado en C# decompilarlo es algo sencillo, lo único que hay que hacer es usar alguna herramienta como DotPeek.

Una vez decompilado el código pude ver que tenía una ofuscación muy pobre, algunas funciones tenían un nombre extraño, pero el código dentro de estas funciones no tenía ningún tipo de ofuscación, por lo que el código era totalmente legible.

Funcionalidad de guardar ficheros

Una vez tenemos el código perfectamente legible lo primero que hice fue buscar la funcionalidad encargada de guarda ficheros, en este caso era "Save()", estaba dentro de una clase donde se guardaba toda la información de dicho Documento y se le pasaba por parámetro el path y el nombre del fichero para guardarlo.

Dentro de esta función detectaba a través de la extensión el tipo de documento, y al no detectar que fuera ni PDF ni WORD lo guardaba en texto plano y sin ningún filtro de extensión.

En caso de que la aplicación funcionara por HTTP, deberían aplicar un filtro de extensiones para evitar una subida arbitraria de ficheros, yo creé una pequeña POC para mostrar esto.


Además de esto pude comprobar que la sobrescribía ficheros sin ningún tipo de validación, por lo que depende de la aplicación podría derivar en una elevación de privilegios.

Imaginemos esta situación:

  1. Nos encontramos con tres usuarios, dos de ellos son administradores y otro es usuario sin privilegios.
  2. Hemos conseguido acceso al servidor con el usuario sin privilegios, sin embargo la aplicación se encuentra abierta con privilegios de administrado.
  3. El otro usuario administrador tiene un programa en el registro de Windows el cual se inicia al iniciar sesión.
En este caso tendríamos la posibilidad de sobrescribir el programa del otro usuario administrador y sobrescribirlo por malware obteniendo así una elevación de privilegios.



Funcionalidad de cargar ficheros

La función que se encargaba de esto era "Load()" y, aunque en ningún momento les hacía caso a las macros de un fichero de WORD (lo cuál me dio mucha pena), tampoco aplicaba ningún filtro de extensiones.

El peligro en este caso reside en que, en el caso de que hicieran una aplicación funcionando por HTTP, podrían obtener información privilegiada, algo así como si fuera un LFI.

Aquí prepare una pequeña POC mostrando que con esta función sin ningún tipo de filtro podría obtenerse el código del PHP que habíamos subido con la funcionalidad de guardar ficheros.


Funcionalidades de cifrado

Funcionalidades que se encargasen de cifrar solo encontré una rebuscando entre el código, sin embargo los algoritmos que se encargaban de esto ya estaban desfasados.

Encontré un estandar llamado FIPS 197, que advierte de los peligros del uso de RC4 al encriptar PDFs, en lugar de este algoritmo recomienda usar AES con claves de cifrado de 128 bits.

En el código de la librería solo se permitía el uso de RC4 con dos tipos distintos de claves.


Hasta aquí es todo lo que encontré yo, también es verdad que tuve poco tiempo para realizar la auditoria. Espero que este post le sirva a alguien que se encuentre un caso parecido en un futuro.

Saluti.

ai pocas fotoh por temah de confidensialidad

domingo, 22 de julio de 2018

Hackeando a Manolo el Barbas [Parte 1] - Recolección de información

Hace un tiempo di una charla la cual no pude grabar, y para que no quedase en el olvido he decidido hacer una serie de Posts donde explique todo lo que dije en la charla de una forma más detallada.

El título de la charla era "Hackeando a Manolo el Barbas" donde la idea era crear un perfil online de una persona y explicar el proceso que llevaría un posible atacante para obtener información privilegiada y acceso a este perfil. De esta forma dividiré la serie de Posts de tal forma que explique cada uno de los pasos siendo de la siguiente forma.

  1. Obtención de información pública de la persona o Doxing.
  2. Buscando y adivinando la contraseña.
  3. Obtención de contraseña con engaños y saltando el 2FA.
  4. Robo de datos a través de Malware.
Vamos a partir de un perfil de twitter, y a partir de ahí intentaremos sacar y guardar toda la información que podamos encontrar.


Tan solo de aquí podemos encontrar ya cierta información que nos puede resultar de ayuda:
  1. Nombre: Manolo
  2. Apellido: El Barbas
  3. Nick: MalElBarbas127
  4. Ciudad: Málaga
  5. Profesión: Publicista
Sigamos buscando información en el Twitter, para ello vamos a mirar sus tweets a ver que encontramos, en este caso podremos ver el siguiente Tweet.


De este tweet podemos obtener dos cosas:
  1. Hobby: Fútbol
  2. Registrado: mushofutbol.com (Esto nos puede servir por si la web es vulnerable).
Sigamos obteniendo informacíón de Twitter, para eso vamos a usar: https://tinfoleak.com/#contact, donde pondremos el usuario y el email a donde queremos que nos envíe la información.

Al rato nos llegará un email con un reporte de toda la información que puede sacar de este perfil, en mi caso no es mucha información ya que es un perfil falso y no ha tenido mucha actividad.


Ya que hemos recolectado suficiente información de Twitter vamos a seguir mirando por otro sitio, hay una herramienta muy útil de búsqueda de información la cual se llama OSINT Framework, que la pueden encontrar aquí: http://osintframework.com/

Nosotros usaremos la herramienta https://namechk.com/, la cual sirve para buscar mas perfiles a partir de un nombre de usuario, esto nos servirá para poder recolectando información.


Aquí podemos ver que también tiene un perfil de Facebook, así que iremos a su perfil para ver que más podemos obtener.

Aquí podemos ver que además de vivir en Málaga estudió en la Universidad de Málaga, y además de esto poca más información pública podemos ver ya que es un perfil ficticio con poca actividad.

Una vez hecho esto vamos a intentar obtener el correo electrónico, para esto nos vamos a ayudar de la funcionalidad de he olvidado mi contraseña tanto en Facebook como en Twitter, donde poniendo el usuario nos da una pista de como es el correo electrónico.


De aquí podemos sacar la siguiente información:

  1. El correo parece acabar con "@gmail.com".
  2. El correo contiene 17 dígitos.
  3. El correo comienza con ma.
  4. El número de teléfono acaba en 22.
Lo siguiente que haremos será usar esta misma funcionalidad pero con Facebook.

Aquí además de esto podemos ver que antes del @ se encuentra un 7, ahora nos encontramos antes un tarea de deducción.

  1. Partimos de esta base: ma**************7@gmail.com
  2. Deducimos que el número 7 es igual que en el nickname: ma************127@gmail.com
  3. Por el tamaño vemos que coincide con el nombre: manoloelbarbas127@gmail.com

Vamos a comprobar que este email con: https://verify-email.org/

Vemos que el email existe, además podemos comprobar que exista en Twitter con la misma funcionalidad que usamos para obtener los datos.



Aquí podemos ver que el número de teléfono es el mismo, así que aumenta las posibilidades de que ese sea el mail, de la misma forma podemos hacer esto con Facebook.


Aquí directamente nos dice que ese es el usuario al que nos referimos, de forma que lo estaríamos confirmando.

Toda la información que hemos llegado a obtener es la siguiente:

  1. Nombre: Manolo
  2. Apellido: El Barbas
  3. Nick: MalElBarbas127
  4. Ciudad: Málaga
  5. Profesión: Publicista
  6. Hobby: Fútbol
  7. Registrado: mushofutbol.com
  8. Email: manoloelbarbas127@gmail.com
  9. Teléfono: *******22

Me gustaría por último añadir que en muchas ocasiones los ajustes de privacidad de las plataformas nos retrasan este proceso, por lo tanto es bueno crear un perfil falso para agregar como amigo o seguir al usuario de tal forma que la cantidad de información que podamos obtener sea mayor, en los que en algunos casos podemos obtener el correo electrónico solo mirando el perfil del usuario dependiendo de como lo tenga configurado.

Hasta aquí hemos llegado por hoy, en las próximas semanas seguiré escribiendo las demás partes de la charla.

Saluti.

la vin la k le vamoh a lia a manolo


jueves, 19 de julio de 2018

Empieza un nuevo camino

Tras varios meses pensándolo ayer decidí separarme de Underc0de, fue algo duro, pues después de 5 años separarte de una gente que te ha dado tanto es difícil, pero las cosas se acaban, en este caso no es mi final en "InfoSec(?)".

Los motivos por los que me separo de Underc0de son personales, y no ha habido ningún tipo de peleas ni discusiones (por si alguna maruja se lo pregunta), ellos conocen mis motivos y me he despedido, y allí quedará guardado para siempre, al igual que todos los recuerdos.

¿Por qué no es mi final en InfoSec? Basicamente he decidido seguir mi camino yo solo, todo lo que hacía en Underc0de lo haré por mi cuenta en este blog, además retomaré la idea que tenía de escribir cosas que me pasaran en mi día a día en la seguridad informática, en resumen para que quede más claro el blog se dividirá en dos partes:

1º Papers, tutoriales, e investigaciones que hago por mi cuenta y que me parece interesante compartir. (Aquí incluiré todo lo que he ido posteando en Underc0de a lo largo del tiempo poco a poco)

2º Experiencias en conferencias, con gente que me encuentro por internet, laboral, etc.

Además de esto me he propuesto escribir un Post semanal, cosa que es bastante complicada, así que si tienes algo que quieres compartir con el público me puedes contactar en:

rolosfh@gmail.com

Saluti.

Ehpero que me leyais de ves en cuando.