Inicio OverTheWire - Bandit Walkthrough
Entrada
Cancelar

OverTheWire - Bandit Walkthrough

En este post vamos a realizar todos los niveles del CTF OverTheWire: bandit que actualmente van desde el 0 hasta el 33.

Nivel 0:

Para empezar el primer nivel debemos conectarnos por SSH a la siguiente direccion ‘bandit.labs.overthewire.org’ y mediante el usuario bandit0, contraseña bandit0 y puerto 2220.

Con el siguiente oneliner podemos conectarnos:

1
sshpass -p 'bandit0' ssh bandit0@bandit.labs.overthewire.org -p 2220

bandit0_1

En el directorio donde nos encontramos hay archivo llamado readme que contiene la contraseña de bandit1 bandit0_2

Nivel 1 -> 2

Salimos de la sesión ssh de bandit0 y con el siguiente comando nos conectamos como bandit1:

1
sshpass -p 'NH2SXQwcBdpmTEzi3bvBHMM9H66vVXjL' ssh bandit1@bandit.labs.overthewire.org -p 2220

En el directorio actual existe un archivo llamado literalmente “-“, como vemos, si le hacemos un simple cat en principio no nos dejará, ya que la terminal piensa que le vamos a asignar un parámetro al comando.

Os dejo las diferentes formas que tenemos de ver el contenido del archivo: bandit1_1

Nivel 2 -> 3

Al conectarnos como bandit2 nos damos cuenta de que dentro del directorio actual hay un archivo llamado “spaces in this file”, para ver el contenido simplemente escribiremos “cat s” y pulsamos la tecla Tab, o escribimos cat spaces*. bandit2_1

Nivel 3 -> 4

La contraseña para el siguiente nivel se encuentra en un archivo oculto dentro del directorio inhere, los archivos ocultos en sistemas Linux empiezan con un “.”.

Para ver los archivo ocultos usamos el comando ls -la: bandit3_1

Con este comando lo hariamos de una forma mas “certera”, ya que buscamos los archivos con el comando find y filtramos para que solo nos muestre el archivo .hidden y le hacemos un cat de forma paralela con el comando xargs: bandit3_2

Nivel 4 -> 5

La contraseña para el siguiente nivel se encuentra en el único archivo legible en el directorio inhere:

Con el comando find buscaremos los archivos legibles y le haremos un file de forma paralela con xargs, para ver el tipo de cada archivo bandit4_1

Como vemos, hay un archivo que es de tipo ASCII text, vamos a mostrar su contenido, con el siguiente oneliner: bandit4_2

Nivel 5 -> 6

La contraseña para el siguiente nivel se encuentra en un archivo dentro del directorio inhere y tiene las siguientes propiedades:

  • legible por humanos
  • 1033 bytes de tamaño
  • No es ejecutable

Si buscamos por archivo legibles, no saldrán muchos: bandit5_1

Pero si le añadimos el parámetro -size y le pasamos que el archivo tiene un tamaño de 1033 bytes (se representa con la letra “c” en find), solo nos devuelve un archivo:

bandit5_2

Vamos a mostrar su contenido: bandit5_3

(Borramos los espacios con el comando tr ya que en la salida hay muchos espacios)

Nivel 6 -> 7

La contraseña para el siguiente nivel se encuentra en algún lugar del servidor y tiene las siguientes propiedades:

  • El usuario propietario es bandit7.
  • El grupo propietario es bandit6.
  • Tiene 33 bytes de tamaño.

Usaremos el comando find como en el nivel anterior para buscar en el sistema archivo con usuario propietario bandit7, grupo propietario bandit6, y 33 bytes de tamaño, y la hacemos un cat: bandit6_1

Nivel 7 -> 8

La contraseña para el siguiente nivel se encuentra dentro de archivo data.txt al lado de la palabra millionth: bandit7_1

Vamos a filtrar para que solo nos muestre la contraseña: bandit7_2

Nivel 8 -> 9

La contraseña para el siguiente nivel se encuentra en el archivo data.txt y está en la línea que ocurre una vez.

Con el comando sort y uniq podremos ver la línea que solo está escrita una vez en el archivo: bandit8_1

Nivel 9 -> 10

La contraseña para el siguiente nivel se encuentra en el archivo data.txt en una de las pocas cadenas legibles, al lado de varios carateres ‘=’, con el comando grep buscamos caracteres “=” dentro del archivo y luego imprimimos la última línea y filtramos por la última palabra de la línea on awk: bandit9_1

Nivel 10 -> 11

La contraseña para el siguiente nivel se encuentra en el archivo data.txt, el cuál contiene texto codificado en base64, usaremos el comando base64 -d para decodificar el contenido del archivo: bandit10_1

Nivel 11 -> 12

Este nivel ya es un poco más complejo la contraseña se encuentra en el archivo data.txt, donde las letras se han girado 13 posiciones, un cifrado llamado ROT13.

En este nivel usaremos el comando tr para manipular el texto y dar con la clave: bandit11_1

Nivel 12 -> 13

Tal cuál vamos subiendo de nivel, la cosa se pone más complicada, en este nivel la contraseña se encuentra en el archivo data.txt, el cuál es un volcado hexadecimal de un archivo comprimido repetidamente. bandit12_1

Para trabajar más cómodos, copiaremos el archivo y nos lo llevaremos a nuestra máquina.

Y gracias al comando xxd pasaremos el volcado decimal a un archivo binario, y con sponge lo guarda todo al archivo data: kali_1

Como vemos el contenido es ilegible, ya que es un comprimido, lo podemos comprobar con el comando file: kali_2

El nivel se basa en ir descomprimiendo archivo hasta dar con el que es de tipo ASCII text contiene la contraseña, pero os dejaré un script el cuál os automatiza todas las descompresiones:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

ctrl_c(){
  echo -e "\n\n[!] Saliendo...\n"
  exit 1
}

trap ctrl_c SIGINT

primercomprimido="data"
descomprimir="$(7z l $primercomprimido | tail -n 3 | head -n 1 | awk 'NF{print $NF}')"

7z x $primercomprimido &>/dev/null

while [ $descomprimir ]; do
  echo -e "\n[+] Nuevo archivo descomprimido: $descomprimir"
  7z x $descomprimir &>/dev/null
  descomprimir="$(7z l $descomprimir 2>/dev/null | tail -n 3 | head -n 1 | awk NF'{print $NF}')"
done

El script nos ahorra la reiterada tarea de ir descomprimiendo cada archivo, la variable primercomprimido se debe llamar como el archivo que iba después de sponge.

kali_3

Ejecutamos el script y el último archivo que fue descomprimido fue data8.bin que contenía a data9.bin el cual es legible y contiene la contraseña.

Nivel 13 -> 14

La contraseña para el siguiente nivel se encuentra en el archivo etc/bandit_pass/bandit14 y puede ser leído por el usuario bandit14, no necesitamos conseguir la contraseña, pero si acceder al siguiente nivel con una clave privada SSH, la clave se encuentra en el directorio actual y se llama sshkey.private:

bandit13_1 Con el comando ssh -i podremos usar esta clave privada para conectarnos como el usuario bandit14:

bandit13_2 Tras ejecutar este comando, estaremos como el usuario bandit14.

bandit13_3 Y podremos ver la contraseña del usuario.

Nivel 14 -> 15

En este nivel nos piden que enviemos la contraseña de bandit14 el puerto 30000 de localhost, usaremos los comandos cat y nc

bandit14_1 Mostramos el contenido del archivo /etc/bandit_pass/bandit14 que contiene la contraseña del usuario y lo enviamos el puerto 30000 de localhost.

Nivel 15 -> 16

Este nivel es similar al anterior, deberemos enviar la contraseña del nivel actual al puerto 30001 de localhost mediante cifrado SSL.

Usaremos el comando openssl con el parámetro s_client para conectarnos al puerto 30001 y enviaremos la contraseña: bandit15_1

Una vez puesto este comando nos pedirá la contraseña: bandit15_2

La pegamos y nos devuelve la contraseña del siguiente nivel: bandit15_3

Nivel 16 -> 17

La contraseña para el siguiente nivel se puede recuperar enviando la contraseña del nivel a un puerto en localhost entre el 31000 y el 32000. y está usando SSL para la conexión:

Primero usaremos el comando nmap para escanear los puertos de la máquina en ese rango: bandit16_1

Así que ahora probaremos puerto por puerto, el siguiente comando openssl s_client -connect localhost:<puerto> hasta recibir la respuesta correcta: bandit16_2

El puerto 31790 nos ha devuelto una clave privada, usaremos esta misma para conectarnos al usuario bandit17. bandit16_3

Vamos a crear un directorio temporal para poder crear archivos. bandit16_4

Y vamos a volcar esa clave privada en el archivo id_rsa bandit16_5

Antes de conectarnos debemos darle los permisos 600 al archivo ya que de otra forma no nos permitirá conectarnos

Nivel 17 -> 18

Para descubrir la contraseña deberemos descubrir la única línea que se ha cambiado entre los archivos passwords.old y passwords.new.

En este nivel usaremos el comando diff que nos permite comparar línea por línea archivos para ver que líneas les diferencian. bandit17_1

Como vemos, nos muestra que línea diferencia a un archivo de otro al contraseña del siguiente nivel es el segundo resultado.

Nivel 18 -> 19

La contraseña se encuentra en el archivo readme, el problema es que algo ha sido modificado en el archivo .bashrc del usuario y no expulsa cuando nos conectamos, pero ssh nos permite ejecutar comandos recién nos conectamos, con el parámetro command kali_4

Así que usaremos el comando bash para poder lanzarnos una consola. kali_5

Y mediante este comando hemos podido ejecutar una bash como ese usuario.

Nivel 19 -> 20

En el siguiente nivel nos encontramos un binario llamado bandit20-do que tiene permisos SUID, esto quiere decir que bandit19 puede ejecutar este binario como bandit20 de forma temporal. bandit19_1

bandit19_2

Esto nos permite, entre muchas cosas, tanto mostrar la contraseña del usuario bandit20, como lanzarnos una bash como ese usuario.

Nivel 20 -> 21

Al conectarnos a la máquina, nos damos cuenta que existen un binario llamado suconnect el cual tiene permisos SUID y el propietario es bandit21: bandit20_1

Este binario establece una conexión con el host local en el puerto que le especifiquemos como argumento, lee una línea que le pasemos la compara con la contraseña de bandit20, si es correcta nos devolverá la contraseña de bandit21.

Este nivel usaremos dos consolas con la sesión ssh de bandit20 iniciada, en una nos pondremos en escucha por el puerto 4646, en la otra usaremos el binario para conectarnos a ese puerto. bandi20_2

En la ventana de abajo, si pegamos la contraseña, nos devolverá otra, que corresponde a bandit21 bandi20_3

Nivel 21 -> 22

En este nivel empezamos a jugar con tareas cron, que básicamnte son tareas que se puede programar para que se ejecuten periódicamente en el sistema. bandit21_1

Como vemos en el directorio /etc/cron.d/ tenemos varios archivos, el que nos interesa es cronjob_bandit22. bandit21_2

Si mostramos su contenido, podemos ver que se está ejecutando un script llamado cronjob_bandit22.sh de forma periódica (en este caso cada minuto) bandit21_3

Y este es el contenido del script, básicamente le está asignando unos permisos al archivo y luego está volcando la contraseña de bandit22 en él. bandit21_4

Mostramos el contenido con el comando cat y ya tenemos la contraseña.

Nivel 22 -> 23

En este nivel también se están usando tareas cron. bandit21_1

En este caso nos interesa cronjob_bandit23, ya que es el siguiente nivel. bandit22_2

Este scripts crea una variable myname mediante esa crea un hash md5 y crea archivo donde vuelca la contraseña de lo que valga en este caso whoami, vamos a ver como vulnerar esto: bandit22_3

Si ejecutamos el script, obtendremos la contraseña de bandit22, ya que es lo que devuelve el comando whoami. bandit22_4

Así que copiaremos el comando que se almacena en la variable mytarget y cambiaremos el valor de la variable myname por bandit23, nos devuelve un hash, que es el nombre de archivo que contiene la contraseña de bandit23: bandit22_5

Nivel 23 -> 24

Otro nivel con tareas cron:

bandit23_1 Este script básicamente lo que hace es ejecutar todo lo que se encuentre en la ruta /var/spool/bandit24/foo como bandit24 así que ya más o menos tenemos un idea de lo que podemos hacer para conseguir la contraseña.

bandit23_2 Primero he creado un directorio temporal con mktemp.

bandit23_3 Y he creado un script el cuál nos vuelca la contraseña de bandit24 en el directorio actual, en un archivo llamado bandit24pass.txt.

bandit23_4 El siguiente paso será dar permisos de lectura y ejecución al script para que bandit24 lo pueda ejecutar y permiso 777 al directorio temporal.

bandit23_5 Copiamos el script a la ruta que veíamos en la tarea cron.

bandit23_5 Si ejecutamos reiteradamente cada segundo ls -l con el comando watch -n 1 ls -l veremos que al pasar un minuto aparece el archivo.

bandit23_6 Y el archivo contiene la contraseña de bandit24.

Nivel 24 -> 25

En este nivel tenemos un servicio (daemon) escuchando en el puerto 30002, y nos devolverá la contraseña de bandit25 si le pasamos la contraseña de bandit24 y un PIN secreto de 4 dígitos, no hay forma de averiguar ese PIN así que deberemos hacer fuerza bruta. bandit24_1

Mediante este script creamos un archivo llamado combinaciones.txt el cuál tiene conjunto de contraseña:PIN para realizar la fuerza bruta. bandit24_2

Y con el siguiente comando comenzaremos a realizar fuera bruta enviando ese archivo hacia el puerto 30002 de localhost hasta dar con la combinación correcta.

Nivel 25 -> 26

En este nivel nos dicen que debería ser fácil conectarnos como bandit26, pero su shell no es /bin/bash, tenemos que descubrir que es y como funciona y como vulnerarlo.

bandit25_1 Tenemos su clave privada, pero de alguna forma, nos expulsa al cconectarnos:

bandit25_2

bandit25_3

Si buscamos que tipo de shell tiene bandit26, vemos que tiene una llamada showtext, vamos a ver que es: bandit25_4

Este script causa que cuando nos conectamos, ejecuta un more hacia un archivo llamado text.txt que es el banner que nos muestra al conectarnos, y luego nos expulsa. bandit25_5

Para conectarnos como bandit26, tenemos que aprovechar el more, para ello debemos conectarnos con la clave privada y hacer la terminal pequeña hasta que nos salga algo así, estamos dentro del comando more que se ejecutaba al conectarnos a bandit26. bandit25_6

Pulsamos la tecla v para poder interactuar con more y escribiremos lo siguiente, que nos mostrará la contraseña de bandit26. bandit25_7

bandit25_8 Pero en este caso nos interesa ‘spawnearnos’ una shell como bandit26, lo haremos con este comando.

bandit25_9 Y ahora escribimos :shell.

bandit25_10 Ya tenemos una shell como bandit26.

Nivel 26 -> 27

Este nivel es más sencillo, tenemos un ejecutable con SUID llamado bandit27-do, el cuál ejecuta comandos como bandit27, ya sabemos como pasarnos esto:

bandit26_1

Ya tenemos la contraseña de bandit27.

Nivel 27 -> 28

Ahora vamos a jugar con repositorios de git, este caso está en ssh://bandit27-git@localhost/home/bandit27-git/repo en el puerto 2220, la contraseña para el usuario bandit27-git es la misma que para bandit27. bandit27_1

Nos creamos un directorio temporal y ejecutamos este comando para clonarnos el repositorio, le pasamos la contraseña: bandit27_2

Y nos lo clona. bandit27_3

Nivel 28 -> 29

En este nivel seguimos con repositorios, pero en este vamos a jugar con versiones. bandit28_1

Como vemos el campo no está. bandit28_2

Con log podemos ver todos los cambios y commits han realizado en este repositorio, vemos que en el segundo se agregó datos que faltaban, y en el último ‘arreglaron la fuga de datos’, así que vamos a volver a la segunda versión. bandit28_3

Usamos el comando git checkout para esto, y ya vemos la contraseña en el archivo README.md.

Nivel 29 -> 30

Otro nivel usando repositorios, pero en este caso jugaremos con las branch o ramas en Git.

bandit29_1 Nos clonamos el repositorio de bandit29,

bandit29_2 En este nivel no nos servirá cambiar de versión del repositorio.

bandit29_3 Así que usamos el comando git branch que nos permite crear, listar o eliminar ramas en Git, entre todas, nos llama la atención la rama de dev.

bandit29_4 Así que usamos el comando git checkout dev para cambiarnos a esa rama, y ya podemos ver la contraseña.

Nivel 30 -> 31

En este nivel usaremos las tags de git para dar con la contraseña.

bandit30_1 Nos creamos el directorio temporal y nos clonamos el repositorio como en los ejercicios anteriores.

bandit30_2 En el README.md no podemos ver nada de valor

bandit30_3 Tampoco en los logs ni en las ramas.

bandit30_4 Si usamos el comando git tag para listar las etiquetas podemos ver una que se llama secret.

bandit30_5 Y con el comando git show secret podemos mostrar esa etiqueta, que es la contraseña para el siguiente nivel.

Nivel 31 -> 32

En este nivel consiste en enviar con git push un archivo con un contenido en concreto para que nos devuelva la contraseña del siguiente nivel.

bandit31_1 Como vemos, nos pide que creemos un archivo llamado key.txt con el contenido May I come in? y enviar como la rama master.

bandit31_2 Así que creamos el archivo, le agregamos el contenido y hacemos un git add, pero como vemos, existe un archivo llamado .gitignore el cuál no nos está permitiendo añadir el archivo.

bandit31_3 No nos permite añadir todo lo que sea .txt, así que lo borramos.

bandit31_4 Ahora si, añadimos el archivo y le agregamos un commit, y le hacemos un git push -u origin master.

bandit31_5

bandit31_6 Y nos devuelve la contraseña para el siguiente nivel.

Nivel 32 -> 33 (Final)

Último nivel.

bandit32_1 Al conectarnos, nos muestran un mensaje de que estamos en una UPPERCASE SHELL.

bandit32_2 Y todo lo que escribamos se convierte en mayúsculas, así que no podremos ejecutar ningún comando.

Como sabemos, la variable $0 referencia a la shell o script actual que se está ejecutando, así que si escribimos esto en la terminal, ya que estamos ejecutando bash, conseguimos ejecutarlo y tener una consola. bandit32_3

bandit32_4 Y por aquí termina el post de hoy, muy interesante para empezar a trastear con Linux y en el mundo del Hacking, espero que os haya gustado y lo hayáis disfrutado, nos vemos en el siguiente, ¡un saludo :)!.


Contraseñas de cada nivel

UsuarioContraseña
bandit0bandit0
bandit2rRGizSaX8Mk1RTb1CNQoXTcYZWU6lgzi
bandit3aBZ0W5EmUfAf7kHTQeOwd8bauFJ2lAiG
bandit42EW7BBsr6aMMoJ2HjW067dm8EgX26xNe
bandit5lrIWWI6bB37kxfiCQZqUdOIYfr6eEeqR
bandit6P4L4vucdmLnm8I7V7jG1ApGSfjYKqJU
bandit7z7WtoNQU2XfjmMtWA8u5rN4vzqu4v99S
bandit8TESKZC0XvTetK0S9xNwm25STk5iWrBvP
bandit9EN632PlfYiZbn3PhVK3XOGSlNInNE00t
bandit10G7w8LIi6J3kTb8A7j9LgrywtEUlyyp6s
bandit116zPeziLdR2RKNdNYFNb6nVCKzphlXHBM
bandit12JVNBBFSmZwKKOP0XbFXOoW8chDz5yVRv
bandit13wbWdlBxEir4CaE8LaPhauuOo6pwRmrDw
bandit14fGrHPx402xGC7U7rXKDaxiWFTOiF0ENq
bandit15jN2kgmIXJ6fShzhT2avhotn4Zcka6tnt
bandit16JQttfApK4SeyHwDlI9SXGR50qclOAil1
bandit17VwOSWtCA7lRKkTfbr2IDh6awj9RNZM5e
bandit18hga5tuuCLF6fFzUpnagiMN8ssu9LFrdg
bandit19awhqfNnAbc1naukrpqDYcF95h7HoMTrC
bandit20VxCazJaVykI6W36BkBU0mJTCM8rR95XT
bandit21NvEJF7oVjkddltPSrdKEFOllh9V1IBcq
bandit22WdDozAdTM2z9DiFEQ2mGlwngMfj4EZff
bandit23QYw0Y2aiA672PsMmh9puTQuhoz8SyR2G
bandit24VAfGXJ1PBSsPSnvsjI8p759leLZ9GGar
bandit25p7TaowMYrmu23Ol8hiZh9UvD0O9hpx8d
bandit26c7GvcKlw9mC7aUQaPx7nwFstuAIBw1o1
bandit27YnQpBuifNMas1hcUFk70ZmqkhUU2EuaS
bandit28AVanL161y9rsbcJIsFHuw35rjaOM19nR
bandit29tQKvmcwNYcFS6vmPHIUSI3ShmsrQZK8S
bandit30xbhV3HpNGlTIdnjUrdAlPzc2L6y9EOnS
bandit31OoffzGDlzhAlerFJ2cAiz1D41JW1Mhmt
bandit32rmCBvG56y58BXzv98yZGdO7ATVL5dW8y
bandit33odHo63fHiFqcWWJG9rLiLDtPm45KzUKy
Esta entrada está licenciada bajo CC BY 4.0 por el autor.