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.

kali@kali:$ ssh -p 2220  bandit0@bandit.labs.overthewire.org

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”.

chmod o+w passwd.txt

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

chmod 777 /tmp/pepe

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

-1) bandit0
0) boJ9jbbUNNfktd78OOpsqOltutMc3MY1
1) CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
2) UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
3) pIwrPrtPN36QITSp3EQaw936yaFoFgAB
4) koReBOKuIDDepwhWk7jZC0RTdopnAYKh
5) DXjZPULLxYr17uwoI01bNLQbtFemEgo7
6) HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
7) cvX2JJa4CFALtqS87jk27qwqGhBM9plV
8) UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
9) truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
10) IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR
11) 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
12) 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
13) <SSH.key>
14) 4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
15) BfMYroe26WYalil77FoDi9qh59eK5xNr
16) cluFn7wTiGryunymYOu4RcffSxQluehd
17)  PRIVATE KEY
18) kfBf3eYk5BPBRzwjqutbbfE887SVc5Yd
19) IueksS7Ubh8G3DCwVzrTd8rAVOwq3M5x
20) GbKksEFF4yrVs6il55v6gwY5aVje5f0j
21) gE269g2h3mw3pwgrj0Ha9Uoqen1c9DGr
22) Yk7owGAcWjwMVRwrTesJEwB7WVOiILLI
23) jc1udXuA1tiHqjIsL8yaapX5XIAI6i0n
24) UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ
25) uNG9O58gUE7snukf3bvZ0rxhtnjzSGzG
26) <PRIVATE KEY>
26) 5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z
27) 3ba3118a22e93127a4ed485be72ef5ea
28) 0ef186ac70e04ea33b4c1853d2526fa2
29) bbc96594b4e001778eee9975372716b2
30) 5b90576bedb2cc04c86a9e924ce42faf
31) 47e603bb428404d265f59c42920d81e5
32) 56a9bf19c63d650ce78e6ec0354ee45e
33) c9c3199ddf4121b10cf581a98d51caee