Inicio Overthewire - Bandit (31-33)
Entrada
Cancelar

Overthewire - Bandit (31-33)

Ya está aquí la última entrada en lo que a los retos de Bandit se refiere. Es una entrada mucho más corta, puesto que solamente describe los últimos 3 niveles (aunque el último trata de mostrar el fichero que felicita al usuario por haber completado los retos).

En el primer reto, se continúa intentando obtener la contraseña del siguiente nivel en un repositorio de git, pero el último reto, hace uso de la variable $0, usada para referenciar la shell o el script en ejecución.


Bandit 31.

Se informa en el enunciado que existe un repositorio git en ssh://bandit31-git@localhost/home/bandit31-git/repo y que la contraseña para el usuario bandit31-git es la misma que para el usuario bandit31, por tanto, se debe clonar el repositorio y buscar la contraseña del usuario 32.

Se realiza la creación del directorio de trabajo dentro del directorio /tmp como en los puntos anteriores.

1
2
mkdir /tmp/gitbandit31
cd !$

Se clona el repositorio en el directorio de trabajo, creado previamente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git clone ssh://bandit31-git@localhost/home/bandit31-git/repo
Cloning into 'repo'...
Could not create directory '/home/bandit31/.ssh'.
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:98UL0ZWr85496EtCRkKlo20X3OPnyPSB5tB5RPbhczc.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/bandit31/.ssh/known_hosts).
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames

bandit31-git@localhost's password:
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (4/4), done.

Se muestra el contenido del fichero README.md de la raíz del repositorio, informando de que se debe realizar una sincronización con el repositorio remoto, siguiendo los detalles que informa en el fichero.

1
2
3
4
5
6
7
cat README.md
This time your task is to push a file to the remote repository.

Details:
    File name: key.txt
    Content: 'May I come in?'
    Branch: master

Entonces se crea el fichero key.txt con el contenido que indica el fichero README.md.

1
echo "May I come in?" > key.txt

Se debe tener en cuenta, que existe un fichero .gitignore cuyo información hace que no se pueda subir ficheros con extensión txt y que se debe borrar (o eliminar la línea del fichero ) para poder hacer commit del archivo key.txt, creado previamente.

1
2
cat .gitignore
*.txt

Cuando se realiza el borrado, se puede añadir el fichero a los ficheros que se desea hacer commit.

1
git add .

Se realiza un commit, que es un estado en el tiempo del control de ficheros de un repositorio, confirmando que el fichero key.txt se añade.

1
2
3
4
5
git commit -m "upload key.txt"
[master c18d619] upload key.txt
 2 files changed, 1 insertion(+), 1 deletion(-)
 delete mode 100644 .gitignore
 create mode 100644 key.txt

Confirmando que el commit se genera correctamente, se puede realizar un denominado push para sincronizar el contenido del repositorio remoto con la información que tienen los ficheros locales.

Se puede observar, que al insertar la contraseña del usuario y confirmar que el fichero key.txt tiene la información requerida, se muestra la información del usuario siguiente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
git push
Could not create directory '/home/bandit31/.ssh'.
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:98UL0ZWr85496EtCRkKlo20X3OPnyPSB5tB5RPbhczc.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/bandit31/.ssh/known_hosts).
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames

bandit31-git@localhost's password:
Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 290 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote: ### Attempting to validate files... ####
remote:
remote: .oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
remote:
remote: Well done! Here is the password for the next level:
remote: 56a9bf19c63d650ce78e6ec0354ee45e
remote:
remote: .oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.oOo.
remote:
To ssh://localhost/home/bandit31-git/repo
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'ssh://bandit31-git@localhost/home/bandit31-git/repo'

Bandit 32.

El enunciado dice exáctamente los siguiente:

Después de todo este asunto del git es hora de otra escapada. ¡Buena suerte!

Cuando se accede con el usuario 32, devuelve una shell que a priori, convierte todos los comandos lanzados, a letras mayúsculas, por lo que el intérprete no reconoce los comandos (sh, interprete usado aquí es sensible a mayúsculas y minúsculas).

1
2
3
4
5
WELCOME TO THE UPPERCASE SHELL
>> whoami
sh: 1: WHOAMI: not found
>> id
sh: 1: ID: not found

Como se comentó anteriormente, la única forma de “escapar” es llamando a la variable $0 que suele estar asignada a la shell del sistema usado (si no es llamada mediante un script, estando entonces asignada al nombre de dicho script).

Se puede ver este comportamiento lanzando en otra terminal con una shell completa el siguiente comando.

1
2
echo $0
-bash

Se llama a la variable, obteniendo una shell diferente (se puede ver que el símbolo cambia).

1
2
>> $0
$

Se lanza un comando id para comprobar con que usuario se está ejecutando la shell, obteniendo que el usuario es bandit33.

1
2
$ id
uid=11033(bandit33) gid=11032(bandit32) groups=11032(bandit32)

Al ser el usuario 33 el que ejecuta la shell, se puede obtener su contraseña del fichero correspondiente.

1
2
$ cat /etc/bandit_pass/bandit33
c9c3199ddf4121b10cf581a98d51caee

Investigando la forma de actuar de este nivel, se verifica mediante el fichero /etc/passwsd que la shell que se ejecuta con el usuario bandit32 al iniciar sesión, es /home/bandit32/uppershell.

1
2
$ grep bandit32 /etc/passwd
bandit32:x:11032:11032:bandit level 32:/home/bandit32:/home/bandit32/uppershell

Se revisan los permisos del fichero, verificando que dispone del flag SUID con el propietario bandit33, así que al ejecutar el script, se hará como si el propio usuario lo ejecutara.

1
2
$ ls -ltr /home/bandit32/uppershell
-rwsr-x--- 1 bandit33 bandit32 7556 May  7  2020 uppershell

Bandit 33.

Por el enunciado del nivel, en ese momento no existe el nivel 34 todavía.

Pese a todo, se accede con el usuario bandit33 y se observa que existe un fichero llamado README.txt en la $HOME del usuario, en el que se felicita al usuario por resolver todos los retos, como se muestra a continuación.

1
2
3
4
5
6
7
8
Congratulations on solving the last level of this game!

At this moment, there are no more levels to play in this game. However, we are constantly working
on new levels and will most likely expand this game with more levels soon.
Keep an eye out for an announcement on our usual communication channels!
In the meantime, you could play some of our other wargames.

If you have an idea for an awesome new level, please let us know!
Esta entrada está licenciada bajo CC BY 4.0 por el autor.