Writeup - Wargame Bandit - Parte 3
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).
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 usuariobandit22
* * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
: cada minuto ejecuta/usr/bin/cronjob_bandit22.sh &> /dev/null
como el usuariobandit22
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 comandowhoami
, 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 amd5sum
- Este entrega el hash MD5 del mensaje anterior (
169b67bd894ddbb4412f91573b38db3 -
). Y por último, esto es entregado al comandocut -d ' ' -f1
- El último comando separa el mensaje MD5 usando el delimitador de un espacio
' '
, y muestra el primer campo de esto, que es169b67bd894ddbb4412f91573b38db3
- Toma el resultado de
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
Instrucciones
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: