Contenido
Página Oficial –> OverTheWire: Bandit
Level 0
Objetivo del Nivel:
El objetivo de este nivel es que inicies sesión en el juego mediante SSH. El host al que debe conectarse es bandit.labs.overthewire.org, en el puerto 2220. El nombre de usuario es bandit0 y la contraseña es bandit0. Una vez que haya iniciado sesión, vaya a la página del Nivel 1 para averiguar cómo superar el Nivel 1.
Resolución:
Para iniciar en el juego, en este nivel de inicio nos pide que establezcamos conexión por SSH, como el usuario Bandit0, a la dirección bandit.labs.overthewire.org por el puerto 2220. Para ello simplemente debemos de establecer una conexión SSH común:
ssh [Usuario]@[Host] -p [Pauerto]
ssh bandit0@bandit.labs.overthewire.org -p 2220
ssh
: Le indica a tu sistema que desea abrir una Conexión de Shell Segura y cifrada.Usuario
: Representa la cuenta a la que deseas acceder. Podemos acceder comoroot
si queremos tener máximos privilegios en el equipo cliente.Host
: Hace referencia al equipo al que quieres acceder. Esto puede ser una dirección IP (10.10.10.10) o un nombre de dominio (www.ejemplo.com).
Una vez establecida la conexión nos pedirá la contraseña de la cuenta solicitada, en nuestro caso Bandit0. La introducimos, pulsamos Enter
y finalmente tendremos control del equipo.
Level 0 –> Level 1
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en un archivo llamado «readme» ubicado en el directorio de inicio. Use esta contraseña para iniciar sesión en bandit1 usando SSH. Siempre que encuentre una contraseña para un nivel, use SSH (en el puerto 2220) para iniciar sesión en ese nivel y continuar el juego.
Resolución:
Una vez conectados como Bandit0, vamos a buscar el archivo readme. Nos indica que se encuentra en el directorio inicio (home directory).
Con el comando pwd podemos ver el directorio en el que nos encontramos y para mostrar el contenido de un directorio utilizamos el comando ls.
Finalmente, podemos leer el archivo readme con el comando cat:
pwd
ls
cat readme
Debemos de copiar el código que contiene el archivo readme, ya que es la contraseña para el siguiente nivel del juego como el usuario Bandit1.
Para salir de la conexión SSH actual y poder conectarnos como Bandit1, usamos el comando exit y volvemos a conectarnos, pero esta vez, como el usuario Bandit1 y con la nueva contraseña.
exit
ssh bandit1@bandit.labs.overthewire.org -p 2220
Level 1 –> Level 2
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en un archivo llamado – ubicado en el directorio de inicio (home).
Resolución:
Una vez establecida la conexión y estar registrados como el usuario Bandit1 (recordad que podéis verificarlo con el comando whoami), vemos como el único archivo que se encuentra en nuestro directorio tiene de nombre un guion (–), el cual para ser leído no vale con utilizar un simple cat.
Una solución es incorporar la ruta completa del archivo que queremos leer, en este caso /home/bandit1/-
En el caso de desconocer la ruta podemos utilizar el comando pwd para ver el directorio en el que nos encontramos.
cat /home/bandit1/-
Otra manera de leer el archivo con cat es indicando que queremos leer el archivo desde la ruta actual, que se represente con ./
cat ./-
echo $(pwd)/-
cat $(pwd)/-
Level 2 –> Level 3
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en un archivo llamado «spaces in this filename» ubicado en el directorio de inicio (home).
Resolución:
El reto del siguiente nivel es leer un archivo con espacios intercalados en el nombre. Existen varias formas de leer estos archivos:
En el primer método se utiliza la barra \ para escapar los espacios y que se pueda leer el archivo correctamente.
cat spaces\ in\ this\ filename
El segundo método se utiliza el asterisco * para leer todos los archivos del directorio actual. Como solo hay un archivo, solo nos reportará la contraseña del siguiente nivel.
cat *
Otra forma de poder leer este archivo es utilizar el asterisco * para terminar de rellenar un nombre. Si por ejemplo escribimos spaces*, el sistema buscará cualquier archivo que empiece por spaces, independientemente de lo siguiente.
cat spaces*
Y la que para mí es la forma más sencilla si queremos referirnos a un archivo concreto que contiene espacios, es entrecomillándolo:
cat "spaces in this filename"
Level 3 –> Level 4
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en un archivo oculto en el directorio inhere.
Resolución:
Lo primero que hacemos es entrar en el directorio inhere con el comando cd y listamos su contenido con ls:
Como nos dice el enunciado de este nivel, el archivo está oculto. Los archivos ocultos en un directorio se representan con un punto delante del nombre ( .archivo) y para poder visualizarlos podemos utilizar el comando ll:
Ahora ya podemos ver el archivo oculto, en este caso el archivo de llama .hidden y podemos leer su contenido con el comando cat:
Level 4 –> Level 5
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el único archivo legible por humanos en el directorio inhere . Consejo: si su terminal está desordenada, intente con el comando «reset«.
Resolución:
Si tratáis de leer alguno de los archivos, vemos como no son legibles pero uno contiene la contraseña del siguiente nivel.
Para poder listar los archivos podemos utilizar el comando find . para reportar todos los archivos del directorio actual y concatenarlo con file para ver qué tipo de archivo es cada uno. El comando xargs se utiliza para utilizar un comando sobre el output del anterior.
Vemos como el único archivo que contiene texto es el archivo -file07.
find . | xargs file
cat ./-file07
Level 5 –> Level 6
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en un archivo en algún lugar del directorio inhere y tiene todas las siguientes propiedades:
- legible por humanos
- 1033 bytes de tamaño
- no ejecutable
Resolución:
Vale, en este caso tenemos tres parámetros por los que poder filtrar, en el primero nos indica que es un archivo legible para humanos (archivo readable), para ello utilizaremos el comando find con la siguiente sintaxis:
find . -type f -readable
- file . : Buscar desde la ruta actual.
- -type f : Especifica que la búsqueda es de archivos (file).
- -readable : Filtra por archivos legibles.
find . -type f -readable -size 1033c
- -size : Filtra por tamaño de archivo.
- 1033 : Tamaño.
- c : Especifica que son bytes.
find . -type f -readable -size 1033c ! -executable
- ! : Niega el siguiente parámetro.
- -executable : Filtra por archivos ejecutables.
Para entenderlo mejor para filtrar por archivos ejecutables utilizamos:
- find . -executable
Y para archivos no ejecutables lo especificamos con añadiendo ! :
- find . ! -executable
Level 6 –> Level 7
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en algún lugar del servidor y tiene todas las siguientes propiedades:
- Propiedad del usuario bandit7
- Propiedad del grupo bandit6
- 33 bytes de tamaño
Resolución:
Al igual que en el nivel anterior, podemos utilizar el comando find para filtrar por el usuario, el grupo y el tamaño del archivo:
find / -user bandit7 -group bandit6 -size 33c
- -user : Filtra por nombre de Usuario.
- -group : Filtra por nombre de Grupo.
- -size : Filtra por tamaño de archivo.
- 33 : Tamaño.
- c : Especifica que son bytes.
find / -user bandit7 -group bandit6 -size 33c | xargs cat
Level 7 –> Level 8
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el archivo data.txt junto a la palabra millionth.
Resolución:
Nuestra contraseña se encuentra junto a la palabra millionth, podemos filtrar la palabra con grep:
cat data.txt | grep millionth
Ya podemos visualizar nuestra contraseña, podemos terminar de filtrar el resultado con el comando awk:
cat data.txt | grep millionth | awk '{print $2}'
- awk ‘{print $2}’ : Filtra por el segundo argumento.
Level 8 –> Level 9
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el archivo data.txt y es la única línea de texto que aparece una sola vez.
Resolución:
En el siguiente nivel, podemos ver que el archivo data.txt contiene muchas líneas y todas menos nuestra contraseña aparecen repetidas:
Con el comando sort podemos listar el contenido del archivo en orden alfabético:
sort data.txt
Una vez tenemos el contenido listado con sort, podemos utilizar el comando uniq -u para solo mostrar las líneas únicas que no están repetidas:
sort data.txt | uniq -u
Level 9 –> Level 10
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el archivo data.txt en una de las pocas cadenas legibles por humanos, precedida por varios caracteres ‘=‘.
Resolución:
strings data.txt
La siguiente pista que nos dan en este nivel es que el contenido está precedido por varios =, entonces vamos a utilizar el comando grep para filtrar por aquellas líneas que contengas dos iguales seguidos:
strings data.txt | grep ==
Ya podemos visualizar la contraseña. Si ahora únicamente quisiéramos mostrar la línea que la contiene, lo podemos hacer de varias formas, o bien con el comando grep y especificando n.E o también lo podríamos hacer con el comando tail -n 1, que nos reporta la última línea:
strings data.txt | grep n.E
Finalmente, con el comando awk podemos indicar que utilizando el espacio como delimitador FS=’ ‘, nos imprima el segundo argumento ‘{print $2}’:
strings data.txt | grep n.E | awk '{print $2}' FS=' '
Level 10 –> Level 11
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el archivo data.txt, que contiene datos codificados en base64.
Resolución:
Para decodificar archivos en base64 simplemente utilizamos el comando base64 y el argumento -d (decoder):
cat data.txt | base64 -d
Y si queremos quedarnos solo con la contraseña, podemos utilizar awk para filtrar por el cuarto argumento:
cat data.txt | base64 -d | awk '{print $4}'
Level 11 –> Level 12
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el archivo data.txt, donde todas las letras minúsculas (az) y mayúsculas (AZ) se han girado 13 posiciones.
Resolución:
páginas que te muestran la sentencia original antes de ser rotadas, como por ejemplo:
Nosotros vamos a ver como se hace a través de la terminal de Linux, para practicar un poco más algunos comandos y algunos conceptos de bash.
Para realizar esta acción con el comando tr debemos de aplicar la sustitución de todas las letras del abecedario [A-Z] esto tanto en mayúscula como en minúscula [A-Za-z] y lo vamos a sustituir por trece posiciones más adelante, que como podemos ver en la imagen anterior, van desde la N hasta la Z y de la A a la M [N-ZA-Mn-za-m], por lo que el comando sería sustituir el primer parámetro por el segundo:
cat data.txt | tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
Para finalizar el filtrado, podemos utilizar el comando awk para filtrar por el último delimitador con NF'{print $NF}’:
cat data.txt | tr '[A-Za-z]' '[N-ZA-Mn-za-m]' | awk NF'{print $NF}'
Level 12 –> Level 13
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en el archivo data.txt, que es un volcado hexadecimal de un archivo que ha sido comprimido repetidamente. Para este nivel, puede ser útil crear un directorio bajo /tmp en el que pueda trabajar usando mkdir. Por ejemplo: mkdir /tmp/myname123. Luego copie el archivo de datos usando cp, y cámbiele el nombre usando mv (¡lea las páginas de manual!)
Resolución:
Para trabajar de forma más cómoda, vamos a copiarlo todo y vamos a crear utilizando nano un archivo llamado data en nuestra propia terminal y pegar el contenido de data.txt:
nano data.txt
Una vez tenemos el archivo creado en nuestro sistema, vamos a ver que es lo que nos interesa del archivo. Vemos que al leer el archivo se nos muestran tres columnas, pues el texto que a nosotros nos interesa y que se encuentra en hexadecimal es la del centro.
En primer lugar, vamos a tratar restablecer el volcado en hexadecimal, para ello utilizaremos el comando xxd -r y guardaremos los resultados en un archivo nuevo llamado data1 con el comando sponge:
cat data | xxd -r | sponge data1
Nota: El comando catn es el comando cat, ya que mi comando cat está sustituido por batcat.
Una vez descomprimido el archivo, si tratamos de leerlo veremos como la mayor parte son caracteres no legibles. Para poder saber de qué tipo de archivo se trata, utilizaremos xxd para volver el contenido a hexadecimal:
En el enunciado del nivel actual, nos indica que el archivo, aparte de ser un volcado en hexadecimal, se trata de un archivo que ha sido comprimido varias veces. Para saber de que tipo de archivo comprimido se trata, para poder luego descomprimirlo, debemos de fijarnos en los primeros caracteres del volcado hexadecimal.
Esta combinación de letras y números que aparecen al inicio son la firma digital del archivo, que son datos utilizados para identificar o verificar el contenido de un archivo. Estas firmas también se conocen como números mágicos o Magic Bytes.
En Wikipedia podéis encontrar una lista de todas las firmas de archivos:
Vemos como la firma de archivos indica que se trata de un archivo comprimido gz. Por tanto, vamos a cambiar el nombre a nuestro archivo y añadir su extensión .gz.
mv data data.gz
En Wikipedia podéis encontrar una lista de todas las firmas de archivos:
Vemos como la firma de archivos indica que se trata de un archivo comprimido gz. Por tanto, vamos a cambiar el nombre a nuestro archivo y añadir su extensión .gz.
Utilizaremos el comando gunzip para descomprimir el primer archivo:
mv data data.gz
Al descomprimir el archivo data1.gz, vemos como nos descomprime el archivo data1. Como el enunciado de este nivel nos indica que el archivo ha sido comprimido varias veces y volvemos a desconocer de qué tipo de archivo comprimido se trata, vamos a utilizar el comando 7z, de esta forma no tendremos que pasar cada vez el contenido a hexadecimal para comprobar la firma de archivos. El comando 7z detecta automáticamente de qué tipo de comprimido se trata y lo descomprime. Con la opción 7z l podemos ver el tipo de comprimido que es y su contenido y con la opción 7z x descomprimiremos el archivo.
7z l data1
Con el comando 7z l vemos como nos indica que el archivo data1 es un comprimido de tipo bzip2 y que el archivo que contiene se llama data1~.
Para descomprimir el archivo y extraer su contenido utilizaremos la opción de 7z x:
7z x data1
Una vez hemos extraído el contenido del archivo comprimido, volvemos a realizar la misma operación. Simplemente, debemos utilizar el comando 7z x seguido del archivo para ir descomprimiendo cada uno de ellos. En caso de querer ver que archivo se trata, utilizamos la opción 7z l:
7z l data1~
7z x data1~
7z l data4.bin
7z x data4.bin
7z l data5.bin
7z x data5.bin
7z l data6.bin
7z x data6.bin
7z x data6
7z l data8.bin
7z x data8.bin
Tras descomprimir el archivo múltiples veces, vemos como, finalmente, el archivo data9.bin contiene la contraseña.
7z l data9.bin
cat data9.bin
Podemos terminar de filtrar los resultados con awk NF'{print NF}’ que nos imprimirá el último argumento.
cat data9.bin | awk 'NF{print $NF}'
Gracias a bash, todo este proceso lo podemos automatizar creando un script.
#!/bin/bash
# El siguiente script nos permite automatizar el proceso de descompresión del archivo data del nivel Bandit 12.
# En primer lugar debemos de deshacer el volcado en hexadecimal y guardar los resultados en un archivo
# gunzip (data.gz por ejemplo). Para crear el archivo podemos utilizar el siguiente comando.
# cat data | xxd -r | sponge data.gz
# Luego utilizando un bucle while y con el comando 7z descomprimiremos el archivo de forma recursiva.
cat data | xxd -r | sponge data.gz
function ctrl_c(){
echo -e "\n\n [!] Saliendo... \n"
exit 1
}
# Ctrl+C
trap ctrl_c INT
first_file_name="data.gz"
decompressed_file_name="$(7z l data.gz | tail -n 3 | head -n 1 | xargs | awk 'NF{print $NF}')"
7z x $first_file_name &>/dev/null
while [ $decompressed_file_name ]; do
echo -e "\n [+] Nuevo archivo descomprimido: $decompressed_file_name"
7z x $decompressed_file_name &>/dev/null
decompressed_file_name="$(7z l $decompressed_file_name 2>/dev/null | tail -n 3 | head -n 1 | xargs | awk 'NF{print $NF}')"
done
Level 13 –> Level 14
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en y /etc/bandit_pass/bandit14 y solo puede leerla el usuario bandit14. Para este nivel, no obtiene la siguiente contraseña, pero obtiene una clave SSH privada que puede usarse para iniciar sesión en el siguiente nivel.
Nota: localhost es un nombre de host que se refiere a la máquina en la que está trabajando.
Resolución:
cat sshkey.private
ssh -i sshkey.private bandit14@localhost -p 2220
cat /etc/bandit_pass/bandit14
Level 14 –> Level 15
Objetivo del Nivel:
La contraseña para el siguiente nivel se puede recuperar enviando la contraseña del nivel actual al puerto 30000 en localhost.
Resolución:
nc localhost 30000
Level 15 –> Level 16
Objetivo del Nivel:
La contraseña para el siguiente nivel se puede recuperar enviando la contraseña del nivel actual al puerto 30001 en localhost usando encriptación SSL.
Nota útil: ¿Obtienes «HEARTBEATING» y «Read R BLOCK»? Use -ign_eof y lea la sección «COMANDOS CONECTADOS» en la página de manual. Junto a ‘R’ y ‘Q’, el comando ‘B’ también funciona en esta versión de ese comando…
Resolución:
Ncat tiene la opción –ssl que nos permite encriptar la data que vayamos a enviar:
ncat [Opción] [Host] [Puerto]
ncat --ssl localhost 30001
Level 16 –> Level 17
Objetivo del Nivel:
Las credenciales para el siguiente nivel se pueden recuperar enviando la contraseña del nivel actual a un puerto en localhost en el rango 31000 a 32000. Primero averigüe cuáles de estos puertos tienen un servidor escuchando en ellos. Luego, averigüe cuáles de ellos hablan SSL y cuáles no. Solo hay 1 servidor que proporcionará las siguientes credenciales, los demás simplemente le enviarán lo que le envíe.
Resolución:
cd /tmp
mktemp -d
mktemp -d
Una vez dentro del directorio temporal vamos a crear un script para ver que puertos entre el 31000 y el 32000 están abiertos:
nano portScan.sh
#!/bin/bash
# ESCANER DE PUERTOS ABIERTOS
# El siguiente script nos reportará todos los puertos abiertos
# que tenemos en nuestro sistema.
# Función Ctrl+C
function ctrl_c(){
echo -e "\n\n [!] Saliendo... \n"
exit 1
}
# Ctrl+C
trap ctrl_c INT
# Escaneo de puertos:
echo -e "\n\n [+] Iniciando Escaneo de Puertos: \n"
for port in $(seq 1 65535); do
(echo '' >/dev/tcp/127.0.0.1/$port) 2>/dev/null && echo -e " [+] $port - OPEN \n" &
done; wait
Para que nuestro script sea funcional, debemos de añadirle permisos de ejecución con el comando chmod:
chmod +x portScan.sh
Para ejecutar el script debemos añadir ./ seguido de su nombre. Vemos como nos reporta varios puertos. Ahora debemos de ir probando con Ncat los distintos puertos para ver cual nos reporta algo. Recordar que el enunciado del nivel nos indica que la contraseña debe de transmitirse por medio de encriptación SSL. Para ello, debemos de especificar en el comando Ncat el parámetro –ssl.
En este caso, el puerto valido es el 31790 ya que al enviar la contraseña del nivel actual, nos devuelve una clave ssh privada (id_rsa).
./portScan.sh
ncat --ssl localhost 31790
Para poder utilizar esta clave, creamos un archivo llamado «id_rsa» con nano y la copiamos. Para poder trabajar está clave, le tenemos que dar con chmod el permiso 600, para que solo nosotros podamos leerlo y modificarlo.
Por último lugar, nos conectamos como bandit17 por SSH utilizando la clave id_rsa.
chmod 600 id_rsa
ssh -i 600 id_rsa bandit17@localhost -p 2220
Finalmente, para poder ver la contraseña de bandit17 podemos leerla en el directorio /etc/bandit_pass/bandit17.
cat /etc/bandit_pass/bandit17
Realizar el Escaneo de puertos con Nmap:
En caso de disponer de Nmap, como es el caso, podemos realizar un escaneo filtrando por los parámetros que nso aporta el enunciado:
nmap -n -v -p 31000-32000 localhost
Level 17 –> Level 18
Objetivo del Nivel:
Hay 2 archivos en el directorio de inicio: passwords.old y passwords.new . La contraseña para el siguiente nivel está en passwords.new y es la única línea que se ha cambiado entre passwords.old y passwords.new
NOTA: si ha resuelto este nivel y ve ‘¡Adiós!’ al intentar iniciar sesión en bandit18, esto está relacionado con el siguiente nivel, bandit19
Resolución:
Si tratamos de leer con cat los archivos, vemos como contiene muchas líneas iguales. Para averiguar que diferencias hay entre dos archivos podemos utilizar el comando diff, que comparará los dos archivos y nos reportará las diferencias.
Para comparar los archivos con diff simplemente ejecutamos el comando seguido de los archivos que deseamos comparar:
diff passwords.new passwords.old
Level 18 –> Level 19
Objetivo del Nivel:
La contraseña para el siguiente nivel se almacena en un archivo readme en el directorio de inicio. Desafortunadamente, alguien ha modificado .bashrc para cerrar la sesión cuando inicia sesión con SSH.
Resolución:
Si tratamos establecer una conexión básica SSH como el usuario Bandit18 nos expulsa de la conexión. Para poder establecer conexión, podemos especificar un comando tras lanzar la petición SSH.
De esta manera, se ejecuta nuestro comando antes de que interprete el contenido del archivo de configuración .bashrc.
Una forma de poder interactuar con el equipo y no solo lanzar un comando, es utilizando bash.
De esta forma la terminal que se nos abrirá no estará tratada por el archivo .bashrc y podremos interactuar con el equipo Bandit18.
ssh bandit18@bandit.labs.overthewire.org -p 2220 bash
Level 19 –> Level 20
Objetivo del Nivel:
Para obtener acceso al siguiente nivel, debe usar el binario setuid en el directorio de inicio. Ejecutarlo sin argumentos para saber cómo usarlo. La contraseña para este nivel se puede encontrar en el lugar habitual (/etc/bandit_pass), después de haber utilizado el binario setuid.
Resolución:
Vemos que en el directorio principal tenemos el archivo bandit20-do. Si tratamos de ver los permisos con el comando ll vemos que el archivo tiene permisos SUID y que el usuario principal es Bandit20.
Con el comando file podemos extraer más información y vemos que se trata de un ejecutable de 32-bits. Para ejecutarlo, debemos especificar antes del archivo los caracteres «./«.
Al tratar de ejecutar el archivo sin argumentos, vemos como nos indica que podemos añadir un comando como por ejemplo id.
Con el comando whoami podemos ver como que usuario esta ejecutando este programa los comandos y vemos que nos reporta Bandit20. Esto quiere decir que todos los comandos que ejecutemos con el archivo bandit20-do los ejecuta como Bandit20 y que podemos interactuar con el sistema y utilizar sus privilegios como si de el se tratará.
ll bandit20-do
file bandit20-do
./bandit20-do
./bandit20-do whoami
Finalmente, como tenemos los permisos de Bandit20, podemos leer el archivo que almacena su contraseña en el directorio /etc/bandit_pass/bandit20.
./bandit20-do cat /etc/bandit_pass/bandit20
Otra forma de interactuar como Bandit20 aprovechando los permisos SUID, es llamando a una bash como en el ejercicio anterior. Para ello ejecutamos bash -p y tendremos una terminal de bash en la que seremos el usuario Bandit20:
./bandit20-do bash -p
Level 20 –> Level 21
Objetivo del Nivel:
Hay un binario setuid en el directorio de inicio que hace lo siguiente: establece una conexión con localhost en el puerto que especifique como argumento de la línea de comandos. Luego lee una línea de texto de la conexión y la compara con la contraseña del nivel anterior (bandit20). Si la contraseña es correcta, transmitirá la contraseña para el siguiente nivel (bandit21).
Resolución:
Para poder establecer una conexión con el localhost y poder ejecutar el archivo, tendremos que abrir otra terminal y establecer otra conexión ssh como bandit20 para poder trabajar.
Si tratamos de ejecutar únicamente el archivo suconnect nos reporta que la conexión no es posible:
./suconnect 4444
Para poder establecer la conexión, en una terminal a parte nos pondremos en escucha con Netcat por le puerto 4444 y luego, ejecutaremos el archivo suconnect por el mismo puerto:
nc -lvnp 4444
Finalmente, enviamos la contraseña del nivel bandit20 y nos devolverá la contraseña para el nivel siguiente.
Level 21 –> Level 22
Objetivo del Nivel:
Un programa se ejecuta automáticamente a intervalos regulares desde cron, el programador de trabajos basado en el tiempo. Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.Resolución:
Si tratamos de leer el archivo, vemos que esta ejecutando un script en la ruta /usr/bin/cronjob_bandit22.sh. Los asteriscos (*****) indican los intervalos de tiempo en los cual se repite la acción, en este caso, al ser todo asteriscos está en el modo predeterminado y se ejecutará a cada minuto. En el manual del comando Cron («man cron» para ver el manual) podéis ver como ajustar los parámetros de tiempo.
cat cronjob_bandit22
Al leer el script, vemos como en la primera línea le añade un permiso 644 a un archivo situado en el directorio /tmp.
cat /usr/bin/cronjob_bandit22.sh
Si tratamos de leer los permisos del directorio /tmp, vemos como tenemos permisos de lectura y que al leerlo con cat, nos reportará la contraseña para el siguiente nivel.
Level 22 –> Level 23
Objetivo del Nivel:
Un programa se ejecuta automáticamente a intervalos regulares desde cron , el programador de trabajos basado en el tiempo. Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.Resolución:
En este nivel si tratamos de ver que servicio está corriendo cron en el directorio /etc/cron.d, vemos que existe un archivo llamado cronjob_bandit23.Si utilizamos cat para ver el archivo de configuración cron, vemos que el script cronjob_bandit23.sh situado en la ruta /usr/bin/ se está ejecutando cada minuto.
cat cronjob_bandit23
Si miramos sus permisos, podemos ver como tenemos permisos de ejecución y que el usuario principal es Bandit23. Esto es importante revisarlo ya que el scrip al ejecutarse tiene en cuenta que somos Bandit23 y no el actual Bandit22.
ll /usr/in/cronjob_bandit23.sh
Ahora vamos a tratar de ver que está ejecutando este script. Al igual que el nivel anterior, este script cuenta con dos variables «myname» y «mytarget«.
- myname : Está variable está recogiendo el output del comando whoami, al ser el usuario principal del archivo Bnadit23, este será el usurio que guardará.
- mytarget : Exactamente igual que en el ejercicio anterior, utilizando la variable «myname» o sea Bandit23 y lo codifica con md5sum. Esta variable será el nombre del archivo que contiene la contraseña, el cual lo copian del directorio /etc/bandit_pass/bandit23 al directorio /tmp.
Como no tenemos permisos sobre el directorio /tmp no podemos acceder al directorio de la contraseña si no conocemos como se llama ya que no podemos ejecutar el comando ls.
cat /usr/in/cronjob_bandit23.sh
Para conocer el nombre del archivo que se ha creado en el directorio /tmp, podemos ejecutar la línea del script que recoge la variable mytarget:
echo I am user bandit23 | md5sum | cut -d ' ' -f 1
Finalmente, simplemente tratamos de leer el archivo con el ese nombre en el directorio /tmp y podremos ver la contraseña.
Level 23 –> Level 24
Objetivo del Nivel:
Un programa se ejecuta automáticamente a intervalos regulares desde cron , el programador de trabajos basado en el tiempo. Busque en /etc/cron.d/ la configuración y vea qué comando se está ejecutando.
Resolución:
Vamos a ver que archivo cron se esta ejecutando. Para ello nos dirigimos al directorio /etc/cron.d/ y vemos como existe un archivo de configuración cron llamado cronjob_bandit24.
Vemos como el archivo cronjob_bandit24 ejecuta un script llamado cronjob_bandit24.sh y se esta ejecutando cada minuto.
cat cronjob_bandit24.sh
Vamos a tratar de ver el código del script para ver que esta ejecutando. El script ejecuta y elimina cada minuto todos los archivos del directorio /var/spool/bandit24/foo.
Si tratamos de crear un archivo en el directorio /var/spool/bandit24/foo vemos como tenemos permisos de escritura ya que nos permite crear archivos.
Esto quiere decir que si creamos un script y lo almacenamos en esta ruta, al ejecutarse el archivo cron cada minuto, primero se ejecutará el archivo que hayamos creado y luego lo eliminará.
Para aprovechar esta vulnerabilidad de permisos, podemos crear un script que nos guarde la contraseña del usuario bandit24, ya que el script guardado en el archivo /var/spool/bandit24/foo será ejecutado por bandit24 que es el usuario principal y por tanto podemos leer la contraseña guardada en /etc/bandit_pass/bandit24.
cat /usr/bin/cronjob_bandit24.sh
Para crear el script y poder trabajar de forma más cómoda, crearemos un archivo temporal en el directorio /tmp con el comando mktemp -d . Luego con el comando nano podemos crear nuestro script:
mktemp -d
nano script.sh
Este script es muy simple, vamos a leer con cat la contraseña del directorio /etc/bandit_pass/bandit24 y guardaremos el output (>) en nuestro directorio temporal /tmp/tmp.q4JCceebIA/ y guardarlo como pass.log.
Finalmente, para no tener problemas de permisos, vamos a dar permisos de lectura al archivo creado para que nosotros como Bandit23 podamos leerlo.
Este script es muy simple, vamos a leer con cat la contraseña del directorio /etc/bandit_pass/bandit24 y guardaremos el output (>) en nuestro directorio temporal /tmp/tmp.q4JCceebIA/ y guardarlo como pass.log.
Finalmente, para no tener problemas de permisos, vamos a dar permisos de lectura al archivo creado para que nosotros como Bandit23 podamos leerlo.
ls -l
chmod +x script.sh
Ya tenemos el script creado, ahora para que se pueda ejecutar le daremos permisos de ejecución con el comando chmod:
ls -l
chmod o+wx /tmp/tmp.q4JCceeIA
Ahora ya podemos copiar con el comando cp el script en el directorio /var/spool/bandit24/foo/ que ejecuta el comando cron:
cp script.sh /var/spool/banit24/foo/
Como sabemos que el comando se ejecuta cada minuto. Una forma de «vigilar» si el archivo se crea, podemos utilizar el comando watch -n para especificar que queremos que un comando se ejecute cada periodo de tiempo, con watch -n1 ls -l, estaremos ejecutando el comando ls -l cada segundo:
Como el script se ha ejecutado correctamente nos ha creado el archivo pass.log que contiene la contraseña para el nivel siguiente.
Level 24 –> Level 25
Objetivo del Nivel:
Un demonio está escuchando en el puerto 30002 y le dará la contraseña de bandit25 si se le proporciona la contraseña de bandit24 y un código PIN numérico secreto de 4 dígitos. No hay forma de recuperar el código PIN, excepto pasando por todas las 10000 combinaciones, lo que se conoce como fuerza bruta.
No necesita crear nuevas conexiones cada vez.
Resolución:
Para poder averiguar el código de cuatro números vamos a crear un script. Primero crearemos un archivo temporal con mktemp -d para poder trabajar ahí de forma más cómoda:
Para crear un script que nos muestre todas las combinaciones de números entre el 0000 y el 9999, utilizaremos un bucle for para incluir todas las combinaciones en la variable i que la especificaremos detrás de la contraseña actual. Guardaremos los resultados en el archivo combinations.txt.
Luego, leyendo el archivo con cat, enviaremos su output al comando Netcat por el puerto 30002. Finalmente, para poder eliminar todos los resultados que no nos interesan podemos utilizar el comando grep para anular las líneas que contengan las palabras «Wrong» y «Please enter«.
Una vez tenemos listo el script, solo nos queda darle permisos de ejecución con chmod y ejecutarlo:
Level 25 –> Level 26
Objetivo del Nivel:
Iniciar sesión en bandit26 desde bandit25 debería ser bastante fácil… El shell para el usuario bandit26 no es /bin/bash , sino otra cosa. Descubra qué es, cómo funciona y cómo salir de él.
Resolución:
En el siguiente nivel, vemos como en directorio principal tenemos una clave privada. Si intentamos establecer una conexión por ssh utilizando está clave, veremos como no nos permite ingresar como Bandit26.
Como veis, nos muestra el banner de bandit26 pero nos expulsa.
Como el enunciado nos indica que la shell del nivel bandit26 no es una bash, vamos a tratar de ver que tipo de shell utiliza este usuario. Para comprobarlo podemos utilizar el comando grep para filtrar por el usuario bandit26 en el directorio /etc/passwd.
Vemos como el tipo de shell es showtext:
Para ver en que se basa esta shell, podemos leer el archivo principal del script con el comando cat.
Vemos como tras exportar la shell, lo primero que ejecuta es el comando more contra el archivo text.txt.
Este archivo text.txt contiene el banner que se nos mostro antes y el comando more se utiliza para mostrar el contenido de ese archivo en una única página.
Para ver la función del comando more, antes de establecer la conexión por ssh, debemos de minimizar la terminal de forma que el banner no quepa dentro, de esta manera cuando lo ejecutemos, el comando more actuará y será visible:
Al no caber todo el resultado dentro de la terminal, nos muestra en la esquina inferior izquierda que el comando more esta activo.
Para poder interactuar con la shell desde este punto, pulsamos la tecla v y se nos abrirá el panel de visión:
Una vez dentro del panel de visión, podremos introducir líneas de comandos pulsando «Shift + :«.
Para poder ejecutar una bash, definimos la variable shell con la ruta /bin/bash con el siguiente comando:
Ahora solo debemos ejecutar la variable shell y no ejecutara una bash:
Finalmente podremos leer la contraseña en el directorio /etc/bandit_pass/bandit26:
Level 26 –> Level 27
Objetivo del Nivel:
¡Buen trabajo consiguiendo una shell! ¡Ahora date prisa y obtén la contraseña para bandit27!
Resolución:
Para poder completar este nivel, debemos de mantener abierta la conexión que establecimos en el ejercicio del nivel anterior.
Vemos como en el directorio principal del usuario bandit26 tenemos dos archivos, el banner del ejercicio anterior que esta en el archivo text.txt y un archivo con el nombre bandit27-do:
Para ver de que tipo de archivo se trata, utilizaremos el comando file seguido del nombre del archivo.
Vemos como nos reporta que se trata de un archivo ejecutable:
También debemos de comprobar los permisos del archivo, para ello utilizamos el comando ls -l.
Este archivo tiene dos cosas interesantes, la primera es que tiene permisos SUID y la segunda es que el usuario principal es Bandit27.
Ahora vamos a tratar de ver que hace el script. Si tratamos de ejecutarlo con ./
Vemos como nos reporta que necesita un comando seguido del script para poder ejecutarlo, el ejemplo nos muestra el comando id, pero nosotros vamos a utilizar el comando whoami para ver que usuario está ejecutando el script.
Al ejecutar el script y lanzar el comando whoami, el sistema interpreta que el somos el usuario bandit27, ya que es el usuario principal como habíamos visto al revisar los permisos.
Finalmente, como somos el usuario bandit27, podemos leer sus contraseña en el directorio /etc/bandit_pass/bandit27:
Level 27 –> Level 28
Objetivo del Nivel:
Hay un repositorio de git en ssh://bandit27-git@localhost/home/bandit27-git/repo
. La contraseña para el usuario bandit27-git
es la misma que para el usuario bandit27
.
Clona el repositorio y encuentra la contraseña para el siguiente nivel.
Resolución:
Para poder descargarnos el repositorio, vamos a crear un directorio temporal donde poder descargarnos los archivos. Para ello utilizaremos el comando mktemp -d:
Una vez dentro del directorio temporal, podemos intentar descargarnos el repositorio, para descargarnos el repositorios git utilizamos el comando git clone seguido de la dirección del repositorio.
Pero vemos que si intentamos descargarnos directamente el repositorio, nos salta un error indicando que nos estamos conectando por el puerto 22 el cual no está previsto para esto.
Como en todas las conexiones que hemos establecido por ssh han sido por el puerto 2220, vamos a probar a descargarnos el repositorio, indicando el puerto 2220. Para ello, después de la dirección localhost podemos especificar el puerto especificándolo detrás de dos puntos : .
Vemos como ahora si que nos pide la contraseña para establecer la conexión. Recordar que la contraseña es la misma que la del usuario Bandit27.
Ahora que ya lo tenemos descargado, podemos ver como se nos ha descargado un directorio llamado repo, que dentro contiene un archivo README, el cual, contiene la contraseña para el siguiente nivel.
Finalmente, podemos filtrar por el último argumento con el comando awk:
Level 28 –> Level 29
Objetivo del Nivel:
Hay un repositorio de git en ssh://bandit28-git@localhost/home/bandit28-git/repo
. La contraseña para el usuario bandit28-git
es la misma que para el usuario bandit28
.
Clona el repositorio y encuentra la contraseña para el siguiente nivel.
Resolución:
Podemos ver que se nos ha descargado el directorio repo, que dentro contiene un archivo llamado README.md.
Veamos con cat que contiene el archivo README.md:
Vemos como dentro del archivo, nos muestra unas credenciales y con la contraseña bloqueada.
En los repositorio de git, con el comando git log, podemos revisar los commits del repositorio. Estos commits son los cambios que se han ido realizando en el archivo a lo largo del tiempo.
Si ejecutamos el comando git log dentro del repositorio, vemos como nos muestra tres commits. De los cuales llama la atención el primero, ya que no nos muestra una nota que dice «arreglar la fuga de información» (fix info leak).
Para poder revisar los cambios que se realizan en estos commits, debemos de copiar el identificador de dicho commit y luego, ejecutamos el comando git show seguido del código identificador para que nos muestre el archivo que ha sido modificado.
Para poder revisar los cambios que se realizan en estos commits, debemos de copiar el identificador de dicho commit y luego, ejecutamos el comando git show seguido del código identificador para que nos muestre el archivo que ha sido modificado.
Finalmente, podemos ver que el cambio que se realizo en el repositorio, fue bloquear la contraseña y sustituirla por xxxxxxxx.
Las líneas que se muestran en verde son las que se han añadido, mientras que las rojas son las líneas eliminadas o modificadas.
Level 29 –> Level 30
Objetivo del Nivel:
Hay un repositorio de git en ssh://bandit29-git@localhost/home/bandit29-git/repo
. La contraseña para el usuario bandit29-git
es la misma que para el usuario bandit29
.
Clona el repositorio y encuentra la contraseña para el siguiente nivel.
Resolución:
Una vez descargado, nos dirigimos al nuevo directorio llamado repo. Dentro de repo podemos encontrar el archivo README.md.
Si tratamos de leerlo, vemos como no nos muestra la contraseña.
Si revisamos los commits del repositorio, vemos como hay dos:
Para ver las modificaciones realizadas en los commits utilizaremos el comando git show:
Como ninguno de los dos commits nos muestra información relevante, vamos a ver que ramas (brach) existen de este repositorio.
Las ramas (branch en inglés) en git son una división del estado del código, esto permite crear nuevos caminos a favor de la evolución del código.
Para poder ver todas las ramas existentes, podemos utilizar el comando git branch -a:
Para desplazarnos hasta otra rama, simplemente ejecutamos el comando git checkout seguido del archivo donde se encuentra la nueva rama, en este caso dev:
Si ahora ingresamos en el directorio repo de la nueva rama, vemos como en el archivo README.md esta vez si que contiene la contraseña del usuario Bandit30.
Level 30 –> Level 31
Objetivo del Nivel:
Hay un repositorio de git en ssh://bandit30-git@localhost/home/bandit30-git/repo. La contraseña para el usuario bandit30-gites la misma que para el usuario bandit30.
Clona el repositorio y encuentra la contraseña para el siguiente nivel.
Resolución:
Si tratamos de revisar los commits y las ramas, tampoco llegamos a encontrar ninguna credencial valida.
Otra cosa que podemos revisar son las etiquetas (tag en inglés).
Las etiquetas son referencias que apuntan a puntos concretos en el historial de Git, para poder ver las etiquetas disponibles, podemos ejecutar el comando git tag y utilizar el comando git show seguido del nombre de la etiqueta, para ver su contenido.
En este caso, dentro de la etiqueta secret podremos encontrar la contraseña del usuario Bandit31:
Level 31 –> Level 32
Objetivo del Nivel:
Hay un repositorio de git en ssh://bandit31-git@localhost/home/bandit31-git/repo
. La contraseña para el usuario bandit31-git
es la misma que para el usuario bandit31
.
Clona el repositorio y encuentra la contraseña para el siguiente nivel.
Resolución:
Una vez tenemos creado el archivo, el siguiente paso será añadirlo al repositorio, para ello primero debemos de utilizar el comando git add -f seguido del nombre del archivo para añadir nuestro archivo key.txt.
Posteriormente, podemos añadir un commit para especificar que acción estamos realizando en el repositorio, para ello utilizamos el comando git commit -m y entre comillas indicaremos el mensaje que queremos que aparezca, en mi caso «Añadimos el archivo kay.txt»:
Ahora ya solo nos quedaría subir o publicar los cambios para que en el repositorio principal se actualice y nos muestre los cambios. Para ello utilizamos el comando git push -u orgin y especificamos la rama donde lo vamos a publicar, en nuestro caso en la rama master.
Cuando realicemos está acción, nos pedirá la contraseña del nivel actual y al proporcionársela, nos devolverá la contraseña del usuario Bandit32.
Level 32 –> Level 33
Objetivo del Nivel:
Después de todo esto git, es hora de otro escape. ¡Buena suerte!
Resolución:
Este es el último nivel de la serie de ejercicios Bandit.
Al tratar de conectarnos por SSH como con cualquier otro nivel, vemos como esta vez nos abre una terminal distinta:
Si tratamos de ejecutar algún comando, vemos como nos reporta un mensaje de error «not found«, esto es debido a que no nos encontramos en una sh, que el interprete de comandos que deberíamos de estar utilizando para poder ejecutar esta serie de comandos.
Como no podemos especificar mediante comando que queremos cambiar de tipo de shell, porque nos reporta un error por consola, vamos a utilizar las variables para especificar que queremos ejecutar una sh.
Las variables se especifican utilizando el signo del dolar $ e indicando la posición del input que vayamos a introducir. Pero utilizando las variables también podemos especificar el primer argumento del comando, en el caso anterior sh y que para representarlo en forma de variable seria $0.
Si ejecutamos $0, vemos como nos interpreta que estamos ejecutando una sh, y por tanto, ya tendremos total ejecución de comando como el usuario bandit33.
Finalmente, como somos el usuario Bandit33 podemos leer con cat nuestra contraseña del directorio de contraseñas generales /etc/bandit_pass/bandit33.
Enhorabuena si has conseguido llegar hasta aquí ya que es el final de los ejercicios de la sección Bandit de Over The Wire.
Si tratamos de leer el archivo README.md del último usuario Bandit33 nos reportará el siguiente mensaje felicitándonos por nuestro progreso.