Home
Linux Retos Bandit (OverTheWire)

Retos Bandit (OverTheWire)

Retos de Bandit de la plataforma OverTheWire.

0

Para el primer nivel solo se pide establecer una conexión por SSH, para la cual nos dan el host, puerto y credenciales.

ssh bandit0@bandit.labs.overthewire.org -p 2220

Una vez dentro encontramos un archivo README que al leer su contenido nos muestra la contraseña para entrar como el siguiente usuario bandit1

1

Para este nivel la instrucción es leer el archivo con nombre - Si el nombre de un archivo comienza con - entra en conflicto a la hora de leerlo pues se interpreta como esperando un parámetro. Para solucionarlo basta con indica la ruta absoluta del archivo. O también ./- bandit1.png

2

Existen varias formas de leer archivos que su nombre está formado por mas de una palabra con espacios de por medio.

  • Encerrar el nombre
  • del archivo entre comillas ""
  • Escribir el inicio del nombre y usar el Tab, de esta forma se escapa con un backslash los espacios
  • Indicar la ruta absoluta bandit2.png

3

Tanto los archivos como los directorios en sistemas basados en UNIX se pueden ocultar colocando un punto delante del nombre. Para listarlos se utiliza ls con el parámetro -a de all bandit3.png

4

Con la herramienta file podemos determinar el tipo de archivo. Es la que utilizaremos para saber de entre todos los presentes cuál es legible y ese tendrá la contraseña del próximo nivel bandit4.png

5

En este nivel es necesario realizar una búsqueda del archivo que contiene la contraseña el cual debe cumplir con:

  • human-readable
  • 1033 bytes in size
  • not executable
find . -type f ! -executable -size 1033c | xargs cat | xargs
# el xargs al final es solo para mejorar el output

bandit5.png

6

Este nivel es muy parecido al anterior, solo hay que ajustar los parámetros en función de lo que se busca. Al aplicar la búsqueda desde la raíz, saldrán muchos errores que es recomendable redirigir al /dev/null para tener un output más limpio.

find / -user bandit7 -group bandit6 -size 33c 2>/dev/null | xargs cat

bandit6.png

7

grep es la utilidad que estaremos usando en este caso para aplicar un filtro al momento de leer este archivo. bandit7.png

8

Al leer el contenido del archivo, se muestra una gran cantidad de cadenas y la mayoría están repetidas y desorganizadas. Para poder realizar la búsqueda de esa cadena única, con sort podemos aplicar un ordenamiento alfabético; y con uniq listar solo las que no se repiten.
bandit8.png

9

strings nos permite listar las cadenas de caracteres imprimibles de un archivo, mayormente de binarios compilados. bandit9.png Más abajo aparece la contraseña

10

Para superar este nivel, debemos decodificar el contenido del archivo utilizando una tubería y seguido el algoritmo, acompañado del parámetro -d para indicar que es una decodificación.

bandit10.png

11

En esta ocasión tenemos una cadena donde cada caracter está rotado 13 posiciones, haciendo referencia al algoritmo de cifrado ROT13. bandit12.png

12

Inicialmente se tiene un archivo cuyo contenido es un hexadecimal. Parecido al nivel con Base64 se puede decodificar con la herramienta xxd y el parámetro -r de reverse. El resultado es un comprimido. Para descomprimirlo se puede utilizar 7z pues permite tanto listar el contenido como extraerlo independientemente del algoritmo que se haya utilizado. bandit11.png bandit11 2.png Esta operación de descompresión se repite varias veces hasta que se obtiene un archivo ASCII bandit11 3.png

13

Para este nivel viene bien conocer el funcionamiento del protocolo SSH y los archivos que permiten la conexión. Debemos tomar la clave privada que nos comparten (normalmente id_rsa) y proporcionarla durante la conexión SSH, ya que al estar incluida en el archivo authorized_keys nos va a permitir conectarnos sin pedir contraseña. bandit13 1.png bandit13 2.png bandit13 3.png

14

Netcat es una herramienta sencilla de utilizar que nos permitirá pasar este nivel al poder conectarnos al propio equipo en un puerto específico. Una vez conectado solo basta con introducir la contraseña del nivel actual y obtendremos la siguiente. bandit14.png

15

En esta ocasión la diferencia está en que la conexión debe ser cifrada. Para ello usaremos la herramienta ncat con el parámetro --ssl bandit15.png

16

Como nos indican un rango específico de puertos, debemos hacer un escaneo para ver cuáles de ellos está abiertos. Para esto podemos usar nmap, la cual nos devuelve 5 puertos abiertos y de ellos debemos ver el que admite la conexión por SSL. bandit16.png

17

diff es la herramienta que nos permitirá ver la línea que es diferente entre los 2 archivos dados bandit17.png

18

Cuando establecemos una conexión por SSH, es posible indicar como parámetro un comando que deseamos que se ejecute. Lo positivo es que este comando se va a ejecutar antes que la bashrc del equipo remoto nos expulse; dándonos un margen de actuación. bandit18 1.png Alternativamente podemos lanzar directamente una bash bandit18 2.png

19

El binario nos permite directamente ejecutar el comando que se le indique; y como cuenta con permisos SUID, lo estaremos ejecutando en nombre del propietario. Sabiendo esto, directamente podemos lanzar una bash bandit19.png

20

Para pasar este nivel, de alguna forma tenemos que abrir un puerto en la misma pc remota que esté en escucha, de modo que si desde esa terminal enviamos la contraseña del nivel anterior, hará una verificación y nos enviará la nueva en caso de ser correcta. Esto se puede hacer con netcat abriendo un puerto y luego el mismo puerto es el que se indica como parámetro al ejecutar el binario.
bandit20.png

21

Para entender este nivel conviene saber al menos de que van las tareas cron. Una vez entendido lograr pasar no será difícil entendiendo que cada paso conlleva al siguiente:

  1. Leer el archivo correspondiente al nivel, en este caso el bandit22.
  2. Leer el script que es ejecutado por la tarea.
  3. Leer el contenido del archivo donde se deposita el resultado del script. bandit21.png

22

Para este segundo caso de tareas cron, el script que se ejecuta es un poco mas elaborado. La forma resumida de interpretar este script sería:

  • El valor de la variable myname es el resultado de ejecutar el comando whoami, que como lo ejecuta bandit23 pues este es el valor.
  • El valor de mytarget es el resultado de calcular el hash md5 de la cadena indicada. cut se utiliza para eliminar de la salida el doble espacio y quedarse con el primer resultado
  • Luego la contraseña del usuario bandit23 está siendo almacenada en un directorio dentro de /tmp cuyo nombre es el hash antes calculado . bandit22.png

23

Primeramente vamos a analizar el contenido del script que se ejecuta como tarea cron.

La variable myname almacena el output del comando whoami, y como estamos en el nivel 23, lógicamente quien lo ejecuta es el usuario bandit24. Luego se mueve a un directorio específico cuya ruta contiene el valor de la variable myname A continuación el comando echo nos da una pista de lo que sucede a continuación. Dentro del bucle for es donde ocurre toda la acción. Este va a iterar sobre cada elemento dentro del directorio, obviando los enlaces al mismo directorio y al anterior. Luego guarda en la variable owner el propietario del fichero actual, y en caso de que sea el uusuario nuestro (bandit23) lo va a ejecutar y posteriormente borrar.

bandit23 1.png Habiendo entendido el funcionamiento, sabemos que debemos crear un script que será ejecutado por el usuario bandit24. ¿Pero que debe hacer este script? Sencillo, de alguna forma debemos leer el contenido del archivo que contiene la contraseña del usuario bandit24 que está almacenada junto con las demás vistas en estos retos, que es en el directorio /etc/bandit_pass.

Ya tenemos la teoría, ahora vamos a la práctica.

Vamos a crear un directorio temporal con mktemp -d y entramos, que será donde tendremos la copia del script que nos sugieren tener en el ejercicio. Luego creamos el script con el siguiente contenido

#!/bin/bash

cat /etc/bandit_pass/bandit24 > <ruta_del_directorio_temporal>/pass
chmod o+r <ruta_del_directorio_temporal>/pass

El fichero pass va a almacenar el output de ejecutar un cat sobre el archivo que contiene la contraseña; y el chmod es para asegurarnos de que nosotros mismo tendremos acceso a leerlo luego, ya que será un archivo creado por otro usuario Auto seguido debemos asegurarnos de que bandit24 pueda acceder al directorio actual. bandit23 2.png Para acabar los preparativos, asignamos permisos de ejecución al script para que bandit24 pueda ejecutarlo, copiamos el script a la ruta que indica el script de la tarea cron y luego de unos segundos tendremos un nuevo archivo con la contraseña de bandit24 dentro. bandit23 3.png

24

Del enunciado ya sabemos que la única forma de encontrar el pin correcto es directamente haciendo fuerza bruta. Para entenderlo paso a paso lo primero es que la conectarnos con nc al localhost:30002 debemos indicar la contraseña actual y seguido el pin, ambos separados por un espacio

nc localhost 30002
<contraseña> 1234

Para agilizar este proceso, podemos hacer uso del comando echo y una tubería con nc

echo <contraseña> 1234 | nc localhost 30002

Ahora podemos preparar de antes todas las combinaciones necesarias y pasárselas a nc de una vez. Esto lo podemos hacer con un oneliner de un blucle for y redirigir todo a un archivo

for i in {0000..9999}; do echo "<contraseña> $i"; done; > brute_force.txt

Con todas las combinaciones listas ya podemos pasarlas a nc; y si aplicamos un filtro nos evitamos todo el stderr

cat brute_force.txt | nc localhost 30002

Bandit24.png

25

Cuando intentamos conectarnos como el usuario bandit26, notamos que la conexión si se llega a entablar pero auto seguido nos expulsa sin otorgarnos una bash. Pues una forma de comprobar si tenemos algún tipo de shell asignada es comprobando el /etc/passwd. Al hacerlo vemos que en su lugar tenemos un script que dentro ejecuta la utilidad de more para leer el contenido de un archivo, que se hacemos una deducción debe ser el texto de bandit26 que se muestra al intentar acceder por SSH bandit25.png bandit25 2.png Pues bien, more es una herramienta que nos permite leer el contenido de archivos, muy similar a less en cuanto al modo de paginación si el contenido es muy largo. Entonces para tener un modo de interactuar con el sistema antes de que se cierre la conexión, debemos reducir el tamaño de la terminal para que el texto no se llegue a mostrar del todo. bandit25 3.png Con la tecla ‘v’ entramos en el modo visual y ya entonces podemos agrandar la terminal sin que se cierre. En este punto presionamos Esc, Shift + : para crear una variable y asignarle como valor una /bin/bash. De este modo al guardarla y volverla a llamar se nos lanzará una bash en la que si podremos interactuar. bandit25 4.png bandit25 5.png

26

Este nivel es bien sencillo, ya lo habíamos visto antes. Es un binario SUID con el que rápidamente nos lanzamos una bash como el usuario propietario (bandit27) y podemos leer el archivo con su contraseña. bandit26.png

27

A continuación comienzan una serie de retos relacionados con la herramienta git Para este primero nos clonamos el repositori que nos indican y dentro solo aparece un archivo Readme con la contraseña dentro bandit27.png

28

Iniciamos clonando el repositorio e igual que antes existe un archivo Readme que esta vez no contiene la contraseña. bandit28 1.png Con el comando log se pueden listar todos los commit que se han hecho en el proyecto. Uno de ellos en su descripción nos da una pista acerca de una fuga de información bandit28 2.png Ahora con show y pasándole el id podemos ver los cambios que se hicieron en ese commit, y se observa que se sustituyó en el Readme la línea que contenía la contraseña por una que solo contiene la letra ‘x’

git show <id>

bandit28 3.png

29

Una vez más comenzamos clonando el repositorio y de primeras vemos un mensaje que dice que no hay contraseñas en producción. bandit29 1.png En git existe una funcionalidad que son las llamadas ‘ramas’. Estas permiten hacer una bifurcación del código y poder seguir el proyecto por 2 caminos según las necesidades del proyecto. Con branch podemos trabajar sobre estas ramas. Al listarlas apaprecen varias y una de ellas es la dev. El mensaje de antes hablaba sobre producción, de luego que el otro lugar hacia donde mirar es a desarrollo. Por tanto nos cambiamos a esta rama, y al listar el contenido del Readme si aparece la contraseña. bandit29 2.png

30

Como siempre iniciamos clonando el repositorio y revisando el archivo Readme bandit30 1.png Con git también se puede hacer uso de etiquetas o tag. Para listarlas se usa directamente el parámetro ‘tag’ y para ver detalles se utiliza ‘show’ bandit30 2.png

31

Esta vez nos toca no analizar un commit sino hacer uno. bandit31.png Para poder hacer un commit a un repositorio remoto, debemos configurar localmente las credenciales de dicho repositorio, o de otra forma cualquier persona podría hacer uno. bandit31 1.png bandit31 2.png Luego preparamos el archivo tal cual nos indica el ejercicio y nos aseguramos de subirlo a la rama correcta. bandit31 3.png bandit31 4.png

32

Si analizamos el /etc/passwd vemos que para el usuario bandit32 no se tiene una shell normal. Al conectarnos convierte todos nuestros comandos a mayúscula y claro eso el sistema no lo reconoce. De alguna forma debemos lograr ejecutar comando con letras minúsculas bandit32 1.png Para entender el truco de este nivel debemos comprender como funcionan los argumentos posicionales de un script. Tomemos el siguiente de ejemplo. Cuando se trata de un script, $1 hace referencia al primer argumento que se le pasa al script, $2 al segundo y así sucesivamente. En el caso de $0 apunta hacia el propio script. Ahora bien, cuando se trata de una bash, como la propia bash quien ejecuta los comandos, es bash a quien se menciona cuando se usa $0. bandit32 2.png Como $0 son 2 caracteres que no tienen mayúsculas y devuelven otro valor que ya viene en minúscula, pues este es el comando que necesitamos para ejecutar otros comandos. bandit32 3.png