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 como聽root
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.