OTW - Bandit

OTW - Bandit#

OverTheWire - Bandit

Este writeup cubre los niveles 0 a 14-15 de Bandit. El artículo se irá actualizando a medida que avance en el resto de niveles.

0. Introducción#

OverTheWire es una plataforma que ofrece diferentes retos para asentar conocimientos sobre comandos de Linux relacionados con el pentesting.

“Bandit” es el nivel inicial. Es el punto de partida perfecto para quienes se inician en este mundo: no requiere experiencia previa en hacking, pero sí curiosidad y ganas de aprender. Más que un reto técnico complejo, “Bandit” es un entrenamiento para adquirir soltura con la línea de comandos y desarrollar un pensamiento ordenado a la hora de resolver problemas.

A la hora de armar el writeup me he asegurado de no filtrar las credenciales ni spoilers importantes, una de las reglas que la plataforma te pide cumplir. Trataré de ser lo más cuidadosa y de no revelar la solución de los niveles así a las bravas.

0.1. Cómo jugar#

A pesar de que pide no armar writeups sobre los retos de la plataforma, documentaré los pasos sin revelar la solución final por si en algún momento es necesario que retroceda para buscar otra alternativa.

No se trata de publicar el cómo se revuelve mediante capturas y listo, sino de comprender cómo se logra llegar a ese punto además de los intentos que se han realizado.


1. Desarrollo#

1.1. Nivel 0#

En el primer reto lo que te pide es establecer una conexión mediante SSH. Nos proporciona el usuario, la contraseña, el puerto al que conectarse, …

Para realizar la conexión SSH escribiremos lo siguiente:

ssh bandit0@bandit.labs.overthewire.org -p 2220

Una vez nos hayamos conectado, nos pedirá la contraseña (esta nos la proporcionan en el enunciado).

Nos aparecerá información con respecto a las máquinas, más reglas (en las que se incluye no desvelar la solución), consejos, etc.

1.2. Nivel 0-1#

Aquí nos pedirá buscar un archivo que contenga una contraseña. Nada más entremos en la máquina mediante la conexión SSH, lo recomendable es realizar un pwd para saber en qué directorio nos encontramos.

A continuación realizaremos un ls -la para listar los archivos que tengamos (más los ocultos). Si queremos averiguar qué contienen los archivos usaremos cat para visualizarlos.

Cuando tengamos la contraseña, ya podremos avanzar al siguiente nivel.

{% hint style=“info” %} NOTA: es recomendable que copiemos las contraseñas en un archivo. Si nos las piden y no las tenemos a mano, seguramente tendremos que realizar desde 0 el reto para volver a conseguir la contraseña. {% endhint %}

1.3. Nivel 1-2#

Con la contraseña que hemos obtenido, en el anterior nivel, iniciamos sesión de nuevo mediante conexión SSH a la máquina, esta vez con el usuario bandit1.

Realizamos de nuevo el pwd para asegurarnos de que la ruta en la que nos encontremos es la correcta, ls -la para listar los archivos y un cat para mostrar el contenido del archivo.

1.4. Nivel 2-3#

En el siguiente usuario, al hacer ls -la nos sale un archivo con un nombre peculiar. Si intentamos abrirlo sin poner delante ./ (para señalar que el archivo se encuentra en la propia ruta) no podremos pulsar la tecla Tab debido a los caracteres especiales que tiene.

Cuando ya podamos seleccionarlo, usamos cat una vez más para mostrar el contenido del archivo.

1.5. Nivel 3-4#

En esta ocasión tenemos un directorio inhere. Si hacemos un ls -l normal y corriente no veremos nada. En cambio, si metemos la opción para que se muestren los archivos ocultos, veremos que hay uno.

Mostramos su contenido con cat, y nos guardamos la contraseña para el siguiente nivel.

1.6. Nivel 4-5#

El enunciado nos cuenta que la contraseña se encuentra guardado en el único archivo legible para el ser humano. ¿Es posible que donde esté la contraseña sea en el archivo más pequeño?

Si hacemos ls -lSr (para ordenar los archivos de mayor tamaño a menor) no ocurrirá nada. Si nos fijamos, todos tienen el mismo tamaño, por lo que conviene optar por otra opción.

Si usamos el comando file más el nombre del archivo (con el ./ delante debido al caracter especial) nos saldrá que hay uno que tiene texto ASCII, en comparación con el resto que sólo tiene caracteres ilegibles.

1.7. Nivel 5-6#

Para este nivel es necesario saber usar bien el comando find. Dentro del directorio inhere, encontramos muchos más directorios. El enunciado nos da 3 pistas a tener en cuenta para encontrar el archivo que nos interesa:

  • Tiene que ser legible para el humano
  • Su tamaño es de 1033
  • No puede ser un ejecutable

Con todas estas características, ya podremos armar nuestro comando find. Una vez más, sacamos el resultado con el comando cat.

1.8. Nivel 6-7#

Este nivel es bastante parecido al anterior. Debemos de usar de nuevo el comando find, pero en esta ocasión el archivo que debemos de buscar no se encuentra en el propio directorio del usuario bandit6.

Además, el enunciado del nivel nos proporciona las siguientes pistas:

  • El propietario es bandit7
  • El archivo pertenece al grupo bandit6
  • Su tamaño es de 33 kB

Con esos datos ajustamos correctamente el comando. Nos saldrán bastantes errores de que no tiene los permisos para acceder a ese directorio, pero de entre todo eso se encuentra la ruta del archivo que contiene la contraseña.

1.9. Nivel 7-8#

Al hacer de primeras un ls -la, nos encontramos con un archivo llamado data.txt. Si realizamos un cat, nos saldrá muchas líneas compuestas de dos columnas. Una con palabras aleatorias, y otra con cadenas que podrían ser contraseñas del siguiente nivel.

El enunciado de este nivel nos indica que la contraseña se encuentra al lado de la palabra “millionth”.

Para ello usaremos el comando grep, que nos permite sacar líneas específicas de un archivo de texto según los parámetros que le indiquemos. En esta ocasión, la línea debe de contener la palabra “millionth”.

Ajustamos nuestro comando grep, y sin mucha dificultad nos aparecerá la contraseña para el siguiente nivel.

1.10. Nivel 8-9#

Accedemos y hacemos cat al archivo data.txt. Sólo aparecen supuestas contraseñas. El enunciado indica que la contraseña se encuentra en la línea que sólo aparece una vez, lo que nos indica que hay líneas que se deben de repetir.

Para este nivel podemos prescindir de grep, y en cambio usar sort y uniq, comandos que se nos ofrece en el enunciado.

El comando sort sirve para ordenar el contenido de un archivo, mientras que uniq nos elimina las líneas que están repetidas.

Preparamos los comandos con tuberías, y ya tendremos la contraseña.

1.11. Nivel 9-10#

Volvemos a tener el archivo data.txt, en esta ocasión el archivo no es legible. El enunciado nos indica que la contraseña se encuentra precedido de varios símbolos “=”.

Usaremos tuberías con el comando grep, añadiéndole el comando strings. Como he comentado, el archivo contiene caracteres no legibles, por lo que para realizar un mayor filtrado, sacaremos únicamente las cadenas.

De esta forma sacaremos con muchísima más facilidad la contraseña. Sino, se nos mezclarían muchas más líneas.

1.12. Nivel 10-11#

El archivo del siguiente nivel contiene un texto en base 64, según el enunciado del nivel. Podremos usar el comando base64 --decode para sacar la contraseña del siguiente nivel.

1.13. Nivel 11-12#

Este nivel es bastante parecido al anterior, excepto que en este caso la contraseña está cifrada con el cifrado César. Esto se deduce gracias a la pista que nos deja el enunciado del nivel, con lo de las 13 rotaciones.

Cifrado César

Si lo desciframos, teniendo en cuenta las rotaciones, obtendremos la contraseña sin demasiada complicación.

1.14. Nivel 12-13#

En el siguiente nivel el enunciado nos dice que la contraseña está de nuevo almacenada en el archivo data.txt, pero que esta vez lo que contiene es un hexdump de un archivo que ha sido compreso repetidamente.

En esta ocasión muestro el contenido de data.txt para haceros una idea a lo que me refiero

Nos aconseja que creemos una carpeta en /tmp. Usaremos el comando mktemp -d para que nos genere un nombre para nuestra carpeta temporal. Con mkdir crearemos la carpeta donde podremos trastear con el archivo.

{% hint style=“info” %} NOTA: recomiendo guardar el nombre de la carpeta temporal en algún sitio, al ser el nombre que se genera

difícil de recordar. {% endhint %}

Volviendo a la pista del enunciado, ¿qué es un hexdump? En español se le conoce más como “volcado hexadecimal”, y es una vista textual de la información en el formato de su propio nombre, en hexadecimal. Normalmente los hexdump se suelen sacar de volcados de memoria, archivos, …

Con todo esto explicado, moveremos el archivo a la carpeta temporal y usaremos el comando xxd -r. Este comando sirve para tanto realizar como deshacer volcados hexadecimales.

Cuando lo tengamos, si usamos cat sobre el archivo que hemos sacado (porque es importante redirigir la salida a un archivo nuevo) nos saldrán varias líneas ilegibles. Esto se debe a que la salida se trata de un archivo comprimido. Usaremos el comando file para averiguar el tipo de archivo del que se trata.

La “gracia” de este nivel es que como bien indica el enunciado, la contraseña está metida en un archivo comprimido que a su vez está comprimido con otro formato que a su vez, …

Entonces iremos usando los diferentes comandos como gunzip, tar, gzip, bzip2, …

Cuando finalmente hagamos file a un archivo y nos indique que se trata de un archivo de texto ASCII, ya tendremos por fin la contraseña.

1.15. Nivel 13-14#

En esta ocasión al realizar un ls sobre el directorio nos encontramos con una clave SSH privada. El enunciado nos indica que para pasar al siguiente nivel no necesitamos una contraseña, sino conectarnos por SSH.

Usamos el mismo comando ssh que utilizamos para conectarnos a los niveles, pero indicando el usuario del siguiente nivel (bandit14) y la dirección, en este caso el localhost. Tenemos que usar también la clave privada que nos han proporcionado (con -i), o sino no podremos entrar.

Una vez dentro ya podremos pasar al siguiente nivel.

1.16. Nivel 14-15#

Todavía con el usuario bandit14, nos piden que para la contraseña tenemos que mandar la que se consiguió en el nivel anterior por el puerto 30000 a localhost.

Esto lo realizaremos usando el comando netcat (nc), comando que nos permite abrir conexiones TCP/UDP. En este caso abrimos una por el puerto 30000, y mandamos la contraseña obtenida anteriormente.

Inmediatamente nos proporcionará la contraseña para acceder al siguiente nivel.


2. Conclusión#

Me parece una plataforma interesante para repasar comandos y técnicas usadas en ciberseguridad, muy parecida a Pwn.College (es posible que en un futuro también realice algún writeup o artículo sobre esta plataforma).

En concreto con el nivel “Bandit” aunque sea muy sencillo, siempre viene bien un pequeño repaso de estas nociones. Este tipo de retos los recomiendo para alguien que está empezando a cacharrear con los comandos básicos de Linux y para que le pierda ese miedo a usar la terminal.


3. Referencias#

OverTheWire

{% embed url="https://www.ducea.com/2008/02/12/linux-tips-find-all-files-of-a-particular-size/" %}

{% embed url="https://www.cyberciti.biz/faq/how-do-i-find-all-the-files-owned-by-a-particular-user-or-group/" %}

{% embed url="https://www.freecodecamp.org/espanol/news/grep-command-tutorial-how-to-search-for-a-file-in-linux-and-unix-with-recursive-find/" %}

{% embed url="https://itsfoss.com/es/comando-sort-linux/" %}

{% embed url="https://victorhckinthefreeworld.com/2021/10/21/el-comando-uniq-de-gnu/" %}

{% embed url="https://labex.io/tutorials/linux-linux-strings-command-with-practical-examples-422934" %}

{% embed url="https://askubuntu.com/questions/178521/how-can-i-decode-a-base64-string-from-the-command-line" %}

{% embed url="https://es.wikipedia.org/wiki/Volcado_hexadecimal" %}

{% embed url="https://stackoverflow.com/questions/13160309/conversion-hex-string-into-ascii-in-bash-command-line" %}

{% embed url="https://www.ochobitshacenunbyte.com/2019/09/19/comandos-gzip-y-gunzip-en-gnu-linux/" %}

{% embed url="https://www.ibm.com/docs/en/aix/7.3.0?topic=t-tar-command" %}

{% embed url="https://www.iespai.com/2023/09/13/el-comando-bzip2/" %}

{% embed url="https://es.wikipedia.org/wiki/Netcat" %}