Retos Bandit (OverTheWire)
Retos de Bandit de la plataforma OverTheWire.
0
Para el primer nivel solo se pide establecer una conexión por SSH, para la cual nos dan el host, puerto y credenciales.
ssh bandit0@bandit.labs.overthewire.org -p 2220
Una vez dentro encontramos un archivo README que al leer su contenido nos muestra la contraseña para entrar como el siguiente usuario bandit1
1
Para este nivel la instrucción es leer el archivo con nombre -
Si el nombre de un archivo comienza con - entra en conflicto a la hora de leerlo pues se interpreta como esperando un parámetro.
Para solucionarlo basta con indica la ruta absoluta del archivo. O también ./-

2
Existen varias formas de leer archivos que su nombre está formado por mas de una palabra con espacios de por medio.
- Encerrar el nombre
- del archivo entre comillas
"" - Escribir el inicio del nombre y usar el
Tab, de esta forma se escapa con un backslash los espacios - Indicar la ruta absoluta

3
Tanto los archivos como los directorios en sistemas basados en UNIX se pueden ocultar colocando un punto delante del nombre. Para listarlos se utiliza ls con el parámetro -a de all

4
Con la herramienta file podemos determinar el tipo de archivo. Es la que utilizaremos para saber de entre todos los presentes cuál es legible y ese tendrá la contraseña del próximo nivel

5
En este nivel es necesario realizar una búsqueda del archivo que contiene la contraseña el cual debe cumplir con:
- human-readable
- 1033 bytes in size
- not executable
find . -type f ! -executable -size 1033c | xargs cat | xargs
# el xargs al final es solo para mejorar el output

6
Este nivel es muy parecido al anterior, solo hay que ajustar los parámetros en función de lo que se busca. Al aplicar la búsqueda desde la raíz, saldrán muchos errores que es recomendable redirigir al /dev/null para tener un output más limpio.
find / -user bandit7 -group bandit6 -size 33c 2>/dev/null | xargs cat

7
grep es la utilidad que estaremos usando en este caso para aplicar un filtro al momento de leer este archivo.

8
Al leer el contenido del archivo, se muestra una gran cantidad de cadenas y la mayoría están repetidas y desorganizadas.
Para poder realizar la búsqueda de esa cadena única, con sort podemos aplicar un ordenamiento alfabético; y con uniq listar solo las que no se repiten.

9
strings nos permite listar las cadenas de caracteres imprimibles de un archivo, mayormente de binarios compilados.
Más abajo aparece la contraseña
10
Para superar este nivel, debemos decodificar el contenido del archivo utilizando una tubería y seguido el algoritmo, acompañado del parámetro -d para indicar que es una decodificación.

11
En esta ocasión tenemos una cadena donde cada caracter está rotado 13 posiciones, haciendo referencia al algoritmo de cifrado ROT13.

12
Inicialmente se tiene un archivo cuyo contenido es un hexadecimal. Parecido al nivel con Base64 se puede decodificar con la herramienta xxd y el parámetro -r de reverse. El resultado es un comprimido.
Para descomprimirlo se puede utilizar 7z pues permite tanto listar el contenido como extraerlo independientemente del algoritmo que se haya utilizado.
Esta operación de descompresión se repite varias veces hasta que se obtiene un archivo ASCII

13
Para este nivel viene bien conocer el funcionamiento del protocolo SSH y los archivos que permiten la conexión.
Debemos tomar la clave privada que nos comparten (normalmente id_rsa) y proporcionarla durante la conexión SSH, ya que al estar incluida en el archivo authorized_keys nos va a permitir conectarnos sin pedir contraseña.

14
Netcat es una herramienta sencilla de utilizar que nos permitirá pasar este nivel al poder conectarnos al propio equipo en un puerto específico.
Una vez conectado solo basta con introducir la contraseña del nivel actual y obtendremos la siguiente.

15
En esta ocasión la diferencia está en que la conexión debe ser cifrada. Para ello usaremos la herramienta ncat con el parámetro --ssl

16
Como nos indican un rango específico de puertos, debemos hacer un escaneo para ver cuáles de ellos está abiertos. Para esto podemos usar nmap, la cual nos devuelve 5 puertos abiertos y de ellos debemos ver el que admite la conexión por SSL.

17
diff es la herramienta que nos permitirá ver la línea que es diferente entre los 2 archivos dados

18
Cuando establecemos una conexión por SSH, es posible indicar como parámetro un comando que deseamos que se ejecute. Lo positivo es que este comando se va a ejecutar antes que la bashrc del equipo remoto nos expulse; dándonos un margen de actuación.
Alternativamente podemos lanzar directamente una bash

19
El binario nos permite directamente ejecutar el comando que se le indique; y como cuenta con permisos SUID, lo estaremos ejecutando en nombre del propietario.
Sabiendo esto, directamente podemos lanzar una bash

20
Para pasar este nivel, de alguna forma tenemos que abrir un puerto en la misma pc remota que esté en escucha, de modo que si desde esa terminal enviamos la contraseña del nivel anterior, hará una verificación y nos enviará la nueva en caso de ser correcta.
Esto se puede hacer con netcat abriendo un puerto y luego el mismo puerto es el que se indica como parámetro al ejecutar el binario.

21
Para entender este nivel conviene saber al menos de que van las tareas cron. Una vez entendido lograr pasar no será difícil entendiendo que cada paso conlleva al siguiente:
- Leer el archivo correspondiente al nivel, en este caso el
bandit22. - Leer el script que es ejecutado por la tarea.
- Leer el contenido del archivo donde se deposita el resultado del script.

22
Para este segundo caso de tareas cron, el script que se ejecuta es un poco mas elaborado. La forma resumida de interpretar este script sería:
- El valor de la variable
mynamees el resultado de ejecutar el comandowhoami, que como lo ejecuta bandit23 pues este es el valor. - El valor de
mytargetes el resultado de calcular el hash md5 de la cadena indicada.cutse utiliza para eliminar de la salida el doble espacio y quedarse con el primer resultado - Luego la contraseña del usuario bandit23 está siendo almacenada en un directorio dentro de /tmp cuyo nombre es el hash antes calculado .

23
Primeramente vamos a analizar el contenido del script que se ejecuta como tarea cron.
La variable
mynamealmacena el output del comandowhoami, y como estamos en el nivel 23, lógicamente quien lo ejecuta es el usuario bandit24. Luego se mueve a un directorio específico cuya ruta contiene el valor de la variablemynameA continuación el comandoechonos da una pista de lo que sucede a continuación. Dentro del bucle for es donde ocurre toda la acción. Este va a iterar sobre cada elemento dentro del directorio, obviando los enlaces al mismo directorio y al anterior. Luego guarda en la variableownerel propietario del fichero actual, y en caso de que sea el uusuario nuestro (bandit23) lo va a ejecutar y posteriormente borrar.
Habiendo entendido el funcionamiento, sabemos que debemos crear un script que será ejecutado por el usuario bandit24. ¿Pero que debe hacer este script? Sencillo, de alguna forma debemos leer el contenido del archivo que contiene la contraseña del usuario bandit24 que está almacenada junto con las demás vistas en estos retos, que es en el directorio /etc/bandit_pass.
Ya tenemos la teoría, ahora vamos a la práctica.
Vamos a crear un directorio temporal con mktemp -d y entramos, que será donde tendremos la copia del script que nos sugieren tener en el ejercicio. Luego creamos el script con el siguiente contenido
#!/bin/bash
cat /etc/bandit_pass/bandit24 > <ruta_del_directorio_temporal>/pass
chmod o+r <ruta_del_directorio_temporal>/pass
El fichero pass va a almacenar el output de ejecutar un cat sobre el archivo que contiene la contraseña; y el chmod es para asegurarnos de que nosotros mismo tendremos acceso a leerlo luego, ya que será un archivo creado por otro usuario
Auto seguido debemos asegurarnos de que bandit24 pueda acceder al directorio actual.
Para acabar los preparativos, asignamos permisos de ejecución al script para que bandit24 pueda ejecutarlo, copiamos el script a la ruta que indica el script de la tarea cron y luego de unos segundos tendremos un nuevo archivo con la contraseña de bandit24 dentro.

24
Del enunciado ya sabemos que la única forma de encontrar el pin correcto es directamente haciendo fuerza bruta. Para entenderlo paso a paso lo primero es que la conectarnos con nc al localhost:30002 debemos indicar la contraseña actual y seguido el pin, ambos separados por un espacio
nc localhost 30002
<contraseña> 1234
Para agilizar este proceso, podemos hacer uso del comando echo y una tubería con nc
echo <contraseña> 1234 | nc localhost 30002
Ahora podemos preparar de antes todas las combinaciones necesarias y pasárselas a nc de una vez. Esto lo podemos hacer con un oneliner de un blucle for y redirigir todo a un archivo
for i in {0000..9999}; do echo "<contraseña> $i"; done; > brute_force.txt
Con todas las combinaciones listas ya podemos pasarlas a nc; y si aplicamos un filtro nos evitamos todo el stderr
cat brute_force.txt | nc localhost 30002

25
Cuando intentamos conectarnos como el usuario bandit26, notamos que la conexión si se llega a entablar pero auto seguido nos expulsa sin otorgarnos una bash. Pues una forma de comprobar si tenemos algún tipo de shell asignada es comprobando el /etc/passwd. Al hacerlo vemos que en su lugar tenemos un script que dentro ejecuta la utilidad de more para leer el contenido de un archivo, que se hacemos una deducción debe ser el texto de bandit26 que se muestra al intentar acceder por SSH
Pues bien, more es una herramienta que nos permite leer el contenido de archivos, muy similar a less en cuanto al modo de paginación si el contenido es muy largo. Entonces para tener un modo de interactuar con el sistema antes de que se cierre la conexión, debemos reducir el tamaño de la terminal para que el texto no se llegue a mostrar del todo.
Con la tecla ‘v’ entramos en el modo visual y ya entonces podemos agrandar la terminal sin que se cierre. En este punto presionamos Esc, Shift + : para crear una variable y asignarle como valor una /bin/bash. De este modo al guardarla y volverla a llamar se nos lanzará una bash en la que si podremos interactuar.

26
Este nivel es bien sencillo, ya lo habíamos visto antes. Es un binario SUID con el que rápidamente nos lanzamos una bash como el usuario propietario (bandit27) y podemos leer el archivo con su contraseña.

27
A continuación comienzan una serie de retos relacionados con la herramienta git
Para este primero nos clonamos el repositori que nos indican y dentro solo aparece un archivo Readme con la contraseña dentro

28
Iniciamos clonando el repositorio e igual que antes existe un archivo Readme que esta vez no contiene la contraseña.
Con el comando log se pueden listar todos los commit que se han hecho en el proyecto. Uno de ellos en su descripción nos da una pista acerca de una fuga de información
Ahora con show y pasándole el id podemos ver los cambios que se hicieron en ese commit, y se observa que se sustituyó en el Readme la línea que contenía la contraseña por una que solo contiene la letra ‘x’
git show <id>

29
Una vez más comenzamos clonando el repositorio y de primeras vemos un mensaje que dice que no hay contraseñas en producción.
En git existe una funcionalidad que son las llamadas ‘ramas’. Estas permiten hacer una bifurcación del código y poder seguir el proyecto por 2 caminos según las necesidades del proyecto. Con branch podemos trabajar sobre estas ramas.
Al listarlas apaprecen varias y una de ellas es la dev. El mensaje de antes hablaba sobre producción, de luego que el otro lugar hacia donde mirar es a desarrollo. Por tanto nos cambiamos a esta rama, y al listar el contenido del Readme si aparece la contraseña.

30
Como siempre iniciamos clonando el repositorio y revisando el archivo Readme
Con git también se puede hacer uso de etiquetas o tag. Para listarlas se usa directamente el parámetro ‘tag’ y para ver detalles se utiliza ‘show’

31
Esta vez nos toca no analizar un commit sino hacer uno.
Para poder hacer un commit a un repositorio remoto, debemos configurar localmente las credenciales de dicho repositorio, o de otra forma cualquier persona podría hacer uno.
Luego preparamos el archivo tal cual nos indica el ejercicio y nos aseguramos de subirlo a la rama correcta.

32
Si analizamos el /etc/passwd vemos que para el usuario bandit32 no se tiene una shell normal. Al conectarnos convierte todos nuestros comandos a mayúscula y claro eso el sistema no lo reconoce.
De alguna forma debemos lograr ejecutar comando con letras minúsculas
Para entender el truco de este nivel debemos comprender como funcionan los argumentos posicionales de un script. Tomemos el siguiente de ejemplo. Cuando se trata de un script, $1 hace referencia al primer argumento que se le pasa al script, $2 al segundo y así sucesivamente. En el caso de $0 apunta hacia el propio script. Ahora bien, cuando se trata de una bash, como la propia bash quien ejecuta los comandos, es bash a quien se menciona cuando se usa $0.
Como $0 son 2 caracteres que no tienen mayúsculas y devuelven otro valor que ya viene en minúscula, pues este es el comando que necesitamos para ejecutar otros comandos.
