Este post es la última parte de la serie Wargame Bandit.

A continuación, se mostrará como resolver los retos desde el 20 > 21, hasta el 32 > 33 (el reto 33 > 34 aún no ha salido).

Soluciones

Solución Bandit 20 > 21

Instrucciones

En el directorio home se encuentra un binario setuid, el cual, hace lo siguiente: realiza una conexión al localhost en el puerto que le indiquemos como argumento. Este leerá una línea en la conexión establecida, la que, debe ser la password para conectarse a este reto. Si los datos enviados son correctos, este binario entregará la password del siguiente reto.

Comandos recomendados a usar

ssh, nc, cat, bash, screen, tmux, Unix ‘job control’ (bg, fg, jobs, &, CTRL-Z, …)

Solución

Vemos que existe el archivo setuid en el directorio home:

Si vemos las instrucciones del software, este indica que solo se debe ingresar el puerto de conexión:

Según los comandos que podemos usar  para resolver este reto, se encuentra tmux. Este nos permite dividir el terminal, por lo tanto, podemos trabajar con dos terminales a la vez.

Para usar este comando, en el terminal escribimos tmux y damos enter, lo que nos mostrará una nueva terminal. Para poder dividirla, usamos la combinación de teclas CTRL+b, seguido del símbolo %. Esto nos dividirá de forma vertical el terminal.

Para movernos entre terminales, usamos CTRL+b con las teclas de dirección:

Ahora que podemos trabajar con dos terminales, creamos un listener usando nc, donde, la opción -l es para dejar al equipo en modo escucha, y la opción -p 1234 para escuchar en el puerto 1234.

Pero cómo se debe pasar la password del reto anterior, lo hacemos mediante el comando echo (también puede ser mediante el comando cat).

Una vez arriba el listener, en el otro terminal usamos el binario suconnect al puerto definido para poder obtener la password del siguiente reto:

Solución Bandit 21 > 22

Instrucciones

Un programa se encuentra ejecutándose de forma automática regularmente desde un cron. Para ver el cron debemos revisar el directorio /etc/cron.d/ para saber que comando se está ejecutando.

Comandos recomendados a usar

cron, crontab, crontab(5) (use “man 5 crontab” to access this)

Solución

Vemos el contenido del directorio /etc/cron.d/:

Como estamos buscando la password del reto 22, vemos el archivo cronjob_bandit22:

Analizando lo que ejecuta este cron:

  • @reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null: después de un reinicio, ejecuta /usr/bin/cronjob_bandit22.sh &> /dev/null como el usuario bandit22
  • * * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null: cada minuto ejecuta /usr/bin/cronjob_bandit22.sh &> /dev/null como el usuario bandit22

Revisamos el script cronjob_bandit22.sh:

Ahora sabemos que este pasa la password de bandit22 al archivo t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv almacenado en /tmp/, y le da permisos 644, indicando que cualquiera puede leerlo:

Solución Bandit 22 > 23

Instrucciones

Un programa se encuentra ejecutándose de forma automática regularmente desde un cron. Para ver el cron debemos revisar el directorio /etc/cron.d/ para saber que comando se está ejecutando.

Comandos recomendados a usar

cron, crontab, crontab(5) (usar “man 5 crontab” para acceder a este)

Solución

Vemos el contenido del directorio /etc/cron.d/, y revisemos que se encuentra ejecutando el archivo cronjob_bandit23:

Este se encuentra ejecutando el script cronjob_bandit23.sh que se encuentra en el directorio /usr/bin/:

Lo que hace este script es:

  • Asigna a la variable myname el valor de la salida del comando whoami, que en este caso es bandit22
  • Luego, asigna a la variable mytarget el siguiente output:
    • Toma el resultado de echo I am user $myname (I am user bandit22), y lo manda a md5sum
    • Este entrega el hash MD5 del mensaje anterior (169b67bd894ddbb4412f91573b38db3 -). Y por último, esto es entregado al comando cut -d ' ' -f1
    • El último comando separa el mensaje MD5 usando el delimitador de un espacio ' ', y muestra el primer campo de esto, que es 169b67bd894ddbb4412f91573b38db3

El problema al ejecutar el script anterior, es que el resultado está basado en bandit22, por lo tanto, debemos hacerlo de la siguiente forma para obtener la password de bandit23:

NOTA: también se puede asignar la salida del comando a una variable para luego usarlo en el comando cat.

Solución Bandit 23 > 24

Instrucciones

Un programa se encuentra ejecutándose de forma automática regularmente desde un cron. Para ver el cron debemos revisar el directorio /etc/cron.d/ para saber que comando se está ejecutando.

En este reto se debe crear un script.

Comandos recomendados a usar

cron, crontab, crontab(5) (usar “man 5 crontab” para acceder a este)

Solución

Revisamos el script cronjob_bandit24.sh que se encuentra en /usr/bin/:

Lo que hace este script es ejecutar todo lo que contiene el directorio /var/spool/bandit24 y que el dueño sea bandit23,  y luego lo elimina.

NOTA: este script se ejecuta cada minuto mediante el crontab configurado.

Por lo tanto, como sabemos que las contraseñas de los retos se almacenan en /etc/bandit_pass, vamos a hacer generar un script que lea la password, y que ese contenido lo almacene en un nuevo archivo que podamos leer.

Lo primero que haremos es crear un directorio en la carpeta /tmp:

Al directorio nuevo le damos full permisos para que cualquiera pueda escribir, leer y ejecutar sobre este:

Creamos nuestro script usando el editor de texto nano (dar enter para continuar con el programa):

El script que vamos a ejecutar es un script en bash (por eso indicamos que utilizará #!/bin/bash, en caso de que no se encuentre en esa ruta, se puede obtener con el comando which bash).

Lo que hace este script es que leerá el archivo con la password de bandit24 y la almacenará en el archivo password.txt:

Le damos permisos de ejecución al script, y esperamos a que pase el minuto para que se ejecute el crontab y este corra nuestro script:

Luego de esperar un tiempo, revisamos la carpeta creada en el directorio temporal, y vemos que se encuentra la password del siguiente reto:

NOTA: en caso de que no funcione, validar los permisos de la carpeta de destino, y si el script creado tiene permisos de ejecución.

Solución Bandit 24 > 25

Un programa está escuchando en el puerto 30002, el cual, nos dará la contraseña para bandit25 si se entrega la contraseña de bandit24 y un PIN numérico secreto de 4 dígitos. No hay forma de recuperar el PIN, excepto a través de todas las 10000 combinaciones, llamadas fuerza bruta.

Solución

Lo que nos dice el reto es que, debemos conectarnos al puerto 30002 y debemos ingresar la password de bandit24 y un PIN. Si intentamos conectarnos al puerto, este nos indica que debemos ingresar la password, seguido de un espacio y luego este PIN de cuatro dígitos:

Por lo tanto, creamos una carpeta en el directorio /tmp para crear un script y hacer fuerza bruta del PIN:

El siguiente script lo que hace es mandar la password seguido por 4 dígitos, partiendo por 0000 hasta llegar a 9999 (no se fijen en como está programado el script, solo en su funcionalidad):

A este le damos permisos de ejecución:

Y le pasamos este script al comando netcat:

Una vez mandado el PIN correcto, la conexión nos muestra la contraseña del siguiente reto y cierra la conexión:

Solución Bandit 25 > 26

Instrucciones

El shell para bandit26 no es /bin/bash, sino algo más. Descubra qué es, cómo funciona y cómo salir de él.

Comandos recomendados a usar

ssh, cat, more, vi, ls, id, pwd

Solución

El reto nos indica que bandit26 no utiliza la shell /bin/bash, por lo tanto, revisamos el archivo /etc/passwd, el cual, nos indica que shell está utilizando:

Si vemos que hay en el directorio local, encontramos la llave privada de SSH de bandit26:

Solución Bandit 26 > 27

Instrucciones

Buen trabajo consiguiendo una shell! ¡Ahora date prisa y toma la contraseña de bandit27!.

Comandos recomendados a usar

ls

Solución

Si intentamos conectarnos usando esta llave privada, nos cierra la conexión:

Si revisamos que hace la shell configurada en bandit26, vemos que este ejecuta un comando more:

Este comando muestra el output del archivo text.txt en páginas, pero para lograr esto, debemos disminuir el tamaño del terminal:

Una vez realizado esto, podemos ver que nos muestra el output de text.txt compaginado:

Cuando vemos --More--(x%) podemos usar la tecla v para ingresar al modo de edición:

Ahora podemos ingresar variables en este usando ::

Una vez configurada la variable que llamará una shell /bin/bash, corremos la variable shell:

Revisamos que tiene el directorio local, y este posee un setuid para ejecutar comandos como bandit27:

Por lo tanto, ahora podemos ver la password del próximo reto:

Solución Bandit 27 > 28

Instrucciones

Hay un repositorio 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.

Clone el repositorio y encuentre la contraseña para el siguiente nivel.

Comandos recomendados a usar

git

Solución

Git es un sistema de control de versiones diseñada para manejar proyectos. Este nos permite clonar proyectos creados para poder usarlos o modificarlos.

Para poder clonar este repositorio, usamos la herramienta git con su opción clone, seguido de la ruta dada entre comillas:

Luego de que el repositorio se encuentra clonado, revisamos su contenido y vemos que en el archivo README se encuentra la password del siguiente reto:

Solución Bandit 28 > 29

Instrucciones

Hay un repositorio 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.

Clone el repositorio y encuentre la contraseña para el siguiente nivel.

Comandos recomendados a usar

git

Solución

Clonamos el repositorio indicado en las instrucciones:

Revisamos el contenido del directorio repo:

Al ver el archivo README.md, no encontramos nada útil, por lo tanto chequeamos el manual de git para ver qué nos puede ayudar a resolver el reto.

Dentro de los comandos útiles que encontramos, uno de ellos es git-log, el cual, muestra los logs de cuando se ejecuta un commit en git:

También está el comando git-diff, el que, nos indica los cambios entre commits:

Si hacemos un git log, vemos los commit realizados:

Con respecto a estos commit y sus comentarios, podemos indicar lo siguiente:

  • El commit edd935d60906b33f0619605abd1689808ccdd5ee es el que clonamos, y este especifica que se arregló una fuga de información.
  • EL commit c086d11a00c0648d095d04c089786efef5e01264 es el anterior a nuestro repositorio clonado, y en este, se le agregaron datos.
  • Y por último, el commit de2ebe2d5fd1598cd547f4d56247e053be3fdc38 fue el primero en realizarse.

Ahora que sabemos esto, comparamos el commit actual con el anterior para ver sus diferencias:

Solución Bandit 29 > 30

Instrucciones

Hay un repositorio 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.

Clone el repositorio y encuentre la contraseña para el siguiente nivel.

Comandos recomendados a usar

git

Solución

Clonamos el repositorio:

Seguimos los pasos del reto anterior para ver el contenido y los cambios dentro del directorio repo:

Una de las características que posee git son las branch (ramas), estas permiten tener en paralelo avances del proyectos, sin afectar el proyecto principal (conocido como master).

En nuestro caso, estamos en el master, el cual, corresponde a nuestro HEAD (rama actual en la que estamos trabajando):

Si queremos ver las distintas ramas (branch) de este repositorio, usamos el comando git branch -a:

Como sabemos ahora que existe una rama de desarrollo (remotes/origin/dev), podemos cambiarnos de branch para ver lo que posee este:

Si revisamos, ahora tenemos como HEAD el branch de desarrollo:

Chequeamos los commits realizados:

Vemos los cambios del último commit.

Solución Bandit 30 > 31

Instrucciones

Hay un repositorio git en ssh://bandit30-git@localhost/home/bandit30-git/repo. La contraseña para el usuario bandit30-git es la misma que para el usuario bandit30.

Clone el repositorio y encuentre la contraseña para el siguiente nivel.

Comandos recomendados a usar

git

Solución

Realizamos los pasos de los retos anteriores:

Revisamos el archivo README.md y los commit realizados:

Como podemos ver, solo tiene el commit inicial, por lo tanto, revisamos si tiene más branch:

Pero al chequear, nos damos cuenta que solo se muestra el branch master. Otra cosa que podemos ver, es si no se ocultaron ramas usando el comando git stash. Este oculta el branch y los deja como referencias.

Para poder ver estas referencias, se usa el comando git show-ref:

Vemos que aparece la referencia refs/tags/secret, si vemos que contiene con git show f17132340e8ee6c159e0a4a6bc6f80e1da3b1aea, nos muestra las password del siguiente reto:

Solución Bandit 31 > 32

Instrucciones

Hay un repositorio 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.

Clone el repositorio y encuentre la contraseña para el siguiente nivel.

Comandos recomendados a usar

git

Solución

Clonamos el repositorio y vemos el archivo README.md:

Este nos dice que debemos actualizar el repositorio remoto master con el archivo key.txt, y este debe tener el texto May I come in?:

Chequeamos que estamos en la rama master:

Creamos el archivo key.txt:

Agregamos el archivo a git usando el comando git add:

Cuando lo intentamos agregar, debemos forzarlo con la opción -f, debido que en .gitignore se están ignorando los archivos TXT.

Y por último, hacemos un commit con el comando git commit -m "Comentario", y lo actualizamos con el comando git push, el cual, falla porque es rechazado, pero esto nos muestra la password del siguiente reto:

Solución Bandit 32 > 33

Instrucciones

Después de todo este material de git, es hora de otro escape. ¡Buena suerte!.

Comandos recomendados a usar

sh, man

Solución

En este reto, todo lo que escribimos en la shell es transformada a mayúsculas:

Por lo tanto, utilizamos $0 para hacer referencia a la shell o al script, y esto nos trae una shell sh:

Revisamos que somos el usuario bandit33 y obtenemos la password: