Bandit - [OverTheWire]

Cover Image for Bandit - [OverTheWire]
Marmeus
Marmeus

Introducción

Los Wargames de OverTheWire son una recopilazión de wargames de diferente indole. Cada wargame esta compuesto por diferentes niveles, donde el jugador tendrá el reto de cada nivel para obtener una contraseña y poder acceder al siguiente nivel.

Hoy vamos a resolver todos los niveles del wargame Bandit, donde el jugador no solo tendrá que aprender a utilizar los comandos básicos de bash sino que también tendrá que crear scritps y utilizar git con el fin de obtener las contraseñas para pasar al siguiente nivel.

Para poder acceder a los retos se realiza mediante SSH, siendo la contraseña del primer nivel bandit0.

Nota: Una vez obtengas la contraseña del siguiente nivel, tendrás que acceder a él a través de SSH cambiando el número del usuario banditX por el número del siguiente nivel.

Finalmente, en este post se recopilan los 34 niveles (hasta el Level 33) que hay a fecha 3 de febrero de 2020.

Level -1

Solución:

Level 0

Solución:

Level 1

Solución:

El “-” es el estándar input para cat, por lo que si tienes que abrir un archivo llamado “-” tienes que poner una ruta relativa o absoluta para poder leer el fichero.

Level 2

Solución:

Otra forma de leer el archivo es escribir “\ “(Contrabarra, espacio) por cada espacio que haya en el nombre del archivo. Esto lo que hace es escape el símbolo espacio, tomándolo como un elemento del nombre del archivo.

Level 3

Solución:

El argumento “a” muestra como todos los archivos incluyendo los archivos ocultos que esta en la carpeta.

Level 4

Solución:

Hay varias de resolver este nivel.

La primera forma es hacer fuerza bruta sacando todos los caracteres imprimibles en cada uno de los archivos.

La segunda forma, es también fuerza bruta pero mostrando la codificación de los archivos. Además, no estoy escribiendo todo el rato en la terminal por cada archivo, comprobando la codificación, sino que es “find” que ejecuta el comando “file” por cada archivo que se encuentre en la carpeta.

Level 5

Solución:

Con “find” hago que comprueba en el directorio actual (“.”), los archivos que tengan 1033 bytes(“Bytes=c”) , que no sean ejecutables (“! -executable”) y que sean legibles (“file”).

Level 6

Solución:

Con find hago que compruebe desde el directorio raíz de linux(“/”) todos los archivos (“-type f”) cuyo usuario sea bandit7 (“-user bandit7”), que el grupo sea bandit6 (“-group bandit6”) y que el tamaño sea de 33 bytes (“33c”).

Al no ser root o haber ejecutado la búsqueda sin permisos de superusuario hay varios archivos que el sistema no le permite a “find” leer por lo que salen muchos errores de “Permission denied”.

Level 7

Solución:

“Grep” te muestra la línea en la que aparece la palabra dada como parámetro del archivo, también pasado como parámetro.

Level 8

Solución:


Con “sort” ordeno el archivo y el resultado se lo envío a “uniq” para que solo me muestra la única linea que no se repite (“-u”).

Level 9

Solución:

Con “strings” saco todos los caracteres legibles y entre todos ellos busco con “grep” la línea que contenga algún caracter ‘=’.

Level 10

Solución:

Extraigo la string codificada con “cat” y con “base64” la decodifico “-d”.

Level 11

Solución:

Con “cat” extraigo la cadena de caracteres y con “tr” desplazo las 13 posiciones, diciendo que todos los caracteres desde la A mayúscula hasta la z minúscula(“A-Za-a”) sean sustituidos por su correspondiente elemento desplazado 13 posiciones (“N-ZA-Mn-za-m”). La A es sustituida por la N, la B por la M, la C por la O, etc.

Level 12

Solución:

Como se puede ver en la imagen, uso “xdd” para leer el archivo (“-r”) “data.txt” y guardar su resultado (“>”) en un nuevo archivo llamado data (“data”). Después voy usando “file” para detectar el formato de compresión y usando los diferentes comandos(“gzip,tar,bzip2”) para descomprimir el archivo dependiendo del tipo de archivo comprimido, varias veces hasta que por fin saco el texto en claro.

Level 13

Solución:

Para poder usar la clave privada con ssh hay que usar el parámetro “-i” seguido del archivo que contiene la clave privada.

Level 14

Solución:

Netcat corre por encima de tcp por lo que te permite realizar conexiones sencillas como es el caso. Solo hay que especificar la IP y el puerto, en este caso “localhost” o 127.0.0.1 y 3000.

Level 15

Solución:

Netcat no tiene soporte para el uso de SSL pero con “openssl” podemos indicarle que queremos hacer la función de cliente (“s_client”) y conectarnos (“-connect”) a la IP y puerto especificados.

Level 16:

Solución:

Usando nmap escaneo los 1000 puerto desde el 31000 al 32000 (“-p 31000-32000”) . De los puertos resultantes voy probando con una nueva herramienta que es como netcat, pero un poco más chetado ya que soporta ssl (“ncat”). (“ncat –ssl”). Finalmente, almaceno la clave en el fichero key17 y le cambio los permisos para que solamente el usuario del fichero pueda leerlo y ssh no se queje a la hora de conectarme al servidor.

Level 17:

Solución:

“diff” muestra las diferencias entre dos archivos. “<” indica lo que había en el primer archivo y “>” lo que hay en el segundo archivo.

Level 18

Solución:

Si al final de la instrucción de ssh escribes entre comillas un comando. SSH se conectará al servidor realizando el comando y cerrándose inmediatamente. En este caso es que con cat leyese el archivo “readme”.

Level 19

Solución:

“./bandit20-do” ejecuta el comando pasado como argumentos como si del usuario bandit20 se tratase, permitiéndonos abrir el archivo que contiene la contraseña de bandit20 y que solamente bandi20 puede leer.

Level 20

Solución:

Para resolver este reto he necesitado realizar dos conexiones por ssh, la primera se pone a la escucha esperando que alguien se conecte al puerto 1234 para poderle enviarle el contenido de “/etc/bandit_pass/bandit20” y la segunda realiza la conexión al puerto 1234.

Level 21

Solución:

Veo que script esta ejecutando cron y luego miro el contenido de dicho script que básicamente lee la contraseña del usuario bandit22 y la guarda en el el fichero “/tmp/t706../”.

Level 22

Solución:

Este script crea un hash a partir de la cadena de caracteres “I am user bandit23” que es el nombre del fichero donde guarda la contraseña del usuario bandit23.

Entonces, replico el procedimiento de obtener el nombre del fichero y uso cat para sacar lo que se encuentra en el fichero.

Level 23

Solución:

Lo que hace el anterior script es ejecutar todos los scripts que se encuentran en la carpeta “/var/spool/bandit24/”.

El script que he escrito simplemente lee la contraseña de bandit24 y la almacena en un archivo creado previamente en la carpeta “/tmp/pepe/”. Además, le añado permisos de lectura, escritura para cualquier usuario al archivo “passwd.txt”.

Y también permito que cualquier usuario pueda acceder a mi carpeta.

Finalmente, le añado permisos de ejecución al script y lo pego en la carpeta “/var/spool/bandit24/”, esperando a que se ejecute y me de la contraseña del usuario bandit24.

Level 24

Solución:

Genero un listado con todos los números posibles y luego son enviados por netcat al puerto 30002.

Level 25

Solución:

En mi caso desde bandit25 no me dejaba conectarme al equipo con el usuario bandit26, pero si que me dejaba desde fuera de bandit.labs.

Como se puede ver, es conectarme y me cierra la conexión. Así que desde bandit25 investigo que ejecuta bandit26 al iniciar sesión.

Básicamente ejecuta more sobre un un fichero “text.txt”. Si tienes una ventana más grande que el texto que te muestra, en este caso “bandit26” en asciiart, more se ejecutará y cerrará, cerrando la sesión. Para evitar esto hay que empequeñecerla hasta obtener un resultado como el siguiente.

Ahora, través del modo visual de “more” (presionando “v”) podemos asignarnos una variable que sea una ruta a bash y ejecutarlo. Para ello escribimos lo siguiente.

Level 26

Solución:

Una vez obtenida la shell en el nivel anterior, ejecutamos el programa “bandit27” que ejecuta un comando como si se lo se tratase del usuario bandit27, visto previamente en el nivel 19.

Level 27

Solución:

Clonamos el repositorio en local.

Y justamente en el archivo README del repositorio encontramos la contraseña.

Level 28

Solución:

Lamentablemente la contraseña no esta donde antes, pero quizás en un commit anterior puede que este.

Según lo que pone en los demás commits es bastante probable que se encuentre en el segundo commit.

Level 29

Solución:

En ninguno de los dos commits esta la contraseña. Pero quizás en alguna de las ramas o branches remotas que tiene el repositorio puede que este.

Probando en todas las ramas, lo encuentra la rama “dev”.

Level 30

Solución:

Lista las etiquetas creadas en el repositorio.

Y git show <tag> muestran el contenido de dicho tag.

Level 31

Solución:

Creo el archivo con el contenido especificado en el README.md

Y realizo el commit subiendo los cambios al servidor.

Level 32

Solución:

Como todo lo que escribimos lo transforma en mayúsculas y por lo tanto no podemos ejecutar ningún comando, ya que no existe ningún comando en bash cuyo nombre sean todo mayúsculas. Sin embargo, podemos usar las variables como $0, la cual contiene el nombre del programa ejecutándose, en este caso bash. Por lo que podemos invocar la shell escribiendo $0 en la terminal.

Y obtener la última flag del wargame.

Level 33

Solución:

Todo esfuerzo tiene su recompensa y aquí esta el final de todo este recorrido. Una pequeña felicitación del equipo de OverTheWire.

Contraseñas