#MundoHacker: Fuerza Bruta

Volvemos con una sección que ha tenido un gran éxito entre vosotros: #MundoHacker, donde tratamos en varios tutoriales las medidas para atacar y/o defenderse en el mundo digital.

Hoy quería hablaros de los ataques por fuerza bruta, que se aprovechan por lo general de la poca imaginación de los usuarios a la hora de elegir contraseñas, y de la mayor o menor medidas que tenga el servicio para protegerse.

Antes de nada

Deciros que un ataque por fuerza bruta suele ser el último recurso de un hacker, ya que por lo general, hay métodos más directos para obtener el acceso a la información privada (como ya vimos en la anterior entrega con SQL inyection).

Sin embargo, hay algunos casos en los que resulta extremadamente interesante, como pueden ser:

  • Acceder a un servicio de una persona en particular (correo, skype, cuenta de un foro, intranet,…) para suplantarle la identidad.
  • Entrar en un servicio privado con fuertes medidas de protección sin levantar sospechas.
  • Buscarle las cosquillas a la petición de usuario/contraseña, a ver por donde falla.

Atacando

El ataque consiste en probar aleatoriamente usuario/contraseña, hasta que alguno case. Por supuesto, esto sería casi imposible sin haber hecho previamente un pequeño estudio del panorama:

  • Usuarios genéricos: Admin, administrador, guest,…
  • Usuarios conocidos (que sean visibles desde fuera).
  • Usuarios aleatorios (y más posibles) que cumplan las directrices marcadas a la hora del registro.
  • La ley de lo más simple: Las personas no se quieren complicar en sus usuarios y contraseñas, y por lo general, o usan uno para todos los servicios que pueden, o en caso que por política de contraseñas (o user), tengan que cumplir unas estrictas acotaciones, se tiende a simplificar lo máximo posible.

Esta ley nos viene como anillo al dedo a cualquier maligno, puesto que si por ejemplo la contraseña tiene que tener 6 carácteres y como mínimo un número, podemos estar seguros que una de las contraseñas más usada (o con más probabilidad de ser usada) sería 123456.

Este tipo de ataque tiene dos grandes vulnerabilidades: Los captchas y los bloqueos, y está bien que hablemos un poco de cada uno.

Captchas

Como bien sabéis, los captchas son esas pestañas obligatorias con una imagen y un texto que por lo general cuesta leerlo hasta para un ser humano, y del que tenemos que reproducir en escritura lo que trae escrito. Son muy molestos, y quizás sea esta la gran ventaja que tenemos contra ellos, puesto que muchos servicios los evitan.

Pero por otra parte, evitan con una gran efectividad este tipo de ataques, así que como desarrolladores es recomendable pensar en ellos.

El método más efectivo, que aúna las ventajas en seguridad contra ataques por fuerza bruta y no molesta a los usuarios, sería implementarlo de forma que solo fuera obligatorio (y visible) a partir de un número de fallos (como nos podemos encontrar en la mayoría de servicios de Google).

Bloqueos

Existen varios tipos, pero por lo general se trata de una medida de seguridad que bloquearía temporalmente una cuenta o una IP después de haber introducido varias contraseñas erróneas. No es de las  mejores medidas, ya que por un lado, puede usarse para joder a un usuario en particular, o dejar sin acceso al servicio temporalmente a toda una institución, y por otro lado, como os explicaré más abajo, es hasta cierto punto sencilla de evitar en fuerza bruta.

Usuarios, contraseñas y un poco de matemáticas

Nuestro amigo Chema lo explicaba de forma sencilla hace ya unos días. Existe una relación no escrita entre los usuarios y las contraseñas de un servicio (se entiende que hablamos de un servicio con un número elevado de cuentas, no una web personal).

Si A es el número de usuarios, y B es el número de contraseñas del servicio, podemos estar seguro que A siempre es mayor que B. Y esto es así porque generalmente las contraseñas tienen que cumplir una fórmula (política de contraseñas) y se tiende a repetir contraseñas entre diferentes servicios (y por lo general entre usuarios).

Además, conocemos de antemano que existen los bloqueos, y que lo más normal es que salten cuando se meten varias contraseñas mal en una usuario en un periodo de tiempo, por lo que…

¿Y por qué no hacemos el ataque por fuerza bruta al revés?

Es decir, elegimos la contraseña más probable (podría ser 123456, como ya hemos visto, o password, o la que toque), y mediante un script, metemos de forma automática cientos de posibles usuarios (quizás incluso tengamos alguno ya conocido de antemano).

Entiendo que esta situación es desesperada (quizás como dije al principio de la entrada lo único que nos interesa es entrar en la cuenta de un usuario), pero habrá casos en los que nos resulte más favorable éste último método, del que por cierto, el captcha suele ser la única protección válida.

Aplicando nuestros conocimientos de SQL inyection

El otro día hablamos de los ataques a SQL ¿Podríamos usar este conocimiento para hacer ataques por fuerza bruta más sofisticados?

Por supuesto.

Para ello, usaríamos alguna extensión o programa que nos permitiese recabar información de las peticiones internas del código (por ejemplo, una extensión para firefox, Tamper Data).

Como vemos, estamos ante una petición POST, que requiere Usuario (username) y Contraseña (password), y además, con botón derecho > ver fuente, nos devolvería el tipo de error (el código que nos devuelve del error al introducir un usuario o contraseña erróneo), que podría ser:

<html><tittle>Error usuario</tittle>Usuario y/o Contraseña incorrectos

Con esta información, ya podríamos crear un ataque dirigido más sofisticado, que tendría las siguientes características:

  • Carga los usuario/contraseña elegidos (normalmente de un fichero en texto plano).
  • Utiliza un bucle del tipo “foreach” (o cualquier otro bien optimizado) para juntar pares de datos.
  • Lanza la petición (de la que sabemos que es POST y su estructura) para cada par.
  • ‘Parsea’ la respuesta con la que ya tenemos y que sabemos que es fallo (por ejemplo controlando del “Error usuario” título).
  • En caso de que la respuesta no tenga este patrón, estaríamos ante un par correcto.

Resumiendo

Los ataques por fuerza bruta se usan para dos tres cosas principalmente:

  • Intentar acceder a la cuenta de una persona en particular: Ya conocemos su usuario, y queremos obtener su contraseña. Toda información extra que tengamos nos será de gran ayuda (otros servicios que usa, preferencias,…).
  • Intentar acceder al servicio: Para esto, lo mejor es usar la fuerza bruta a la inversa, ya que tiene más probabilidades de acierto y de paso nos saltamos los bloqueos más comunes.
  • Para bloquear el servicio a alguien o a una IP: Sería aprovecharse de una posible implementación de los bloqueos, por lo que no recomiendo su uso, o los recomiendo extremando la precaución (un número muy alto de fallos, y bloqueo por usuario, y no por IP, por ejemplo).

La mejor defensa

Los Captcha son el talón de Aquiles de este ataque, ya que son muy difíciles (en algunos casos casi imposibles) de saltar automáticamente. Pero el mejor método para implementarlos es que aparezcan al tercer o quinto fallo en la contraseña, y no desde el principio, ya que también son una gran molestia para el usuario.

 

________

Realizar este tipo de artículos me lleva varias horas, y en algunos casos, gastos extra que habitualmente suplo de mi bolsillo, o gracias a esa comunidad de patronos que me apoyan realizando donaciones puntuales o periódicas.

Si le gustaría ver más de estos tutoriales y análisis por aquí. Si el contenido que realizo le sirve en su día a día, piense si merece la pena invitarme a lo que vale un café, aunque sea digitalmente.

hazme patrono pabloyglesias