OverTheWire: Bandit – 27 à 33

Cet article est le dernier d’une série de quatre :

Niveau 27

$ ssh -p 2220 bandit27@bandit.labs.overthewire.org

Ce niveau tourne autour de Git. On me donne l’adresse d’un dépôt à cloner ; je m’exécute.

Git est un outil de versioning. Incontournable de nos jours, il permet de garder un historique des modifications faites à votre code, de le partager avec d’autres développeurs et de travailler à plusieurs sur la même base de code.

Après avoir cloné le dépôt, j’en liste le contenu, puis affiche le fichier README.

bandit27@bandit:~$ dest=$(mktemp -d)

bandit27@bandit:~$ git clone ssh://bandit27-git@localhost/home/bandit27-git/repo $dest
Cloning into '/tmp/tmp.yJuHRsOuKW'...

…

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

bandit27@bandit:~$ ls $dest
README

bandit27@bandit:~$ cat $dest/README
The password to the next level is: [[PASSWORD]]

Niveau 28

$ ssh -p 2220 bandit28@bandit.labs.overthewire.org

Ce niveau aussi est basé sur Git. Cette fois, le mot de passe n’est pas présent dans le README :

bandit28@bandit:~$ dest=$(mktemp -d)

bandit28@bandit:~$ git clone ssh://bandit28-git@localhost/home/bandit28-git/repo $dest
Cloning into '/tmp/tmp.jjiliPMwXC'...

…

bandit28-git@localhost's password:
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 9 (delta 2), reused 0 (delta 0)
Receiving objects: 100% (9/9), done.
Resolving deltas: 100% (2/2), done.

bandit28@bandit:~$ ls $dest
README.md

bandit28@bandit:~$ cat $dest/README.md
# Bandit Notes
Some notes for level29 of bandit.

## credentials

- username: bandit29
- password: xxxxxxxxxx

Comme dit précédemment, Git conserve l’historique de toutes les modifications effectuées dans le code. Si le mot de passe a fait un jour partie du code, je devrais pouvoir en retrouver la trace :

bandit28@bandit:~$ cd $dest

bandit28@bandit:/tmp/tmp.jjiliPMwXC$ git log
commit edd935d60906b33f0619605abd1689808ccdd5ee
Author: Morla Porla <morla@overthewire.org>
Date:   Thu May 7 20:14:49 2020 +0200

    fix info leak

commit c086d11a00c0648d095d04c089786efef5e01264
Author: Morla Porla <morla@overthewire.org>
Date:   Thu May 7 20:14:49 2020 +0200

    add missing data

commit de2ebe2d5fd1598cd547f4d56247e053be3fdc38
Author: Ben Dover <noone@overthewire.org>
Date:   Thu May 7 20:14:49 2020 +0200

    initial commit of README.md

Le dernier commit (HEAD) parle de fuites de données. J’affiche les modifications :

bandit28@bandit:/tmp/tmp.jjiliPMwXC$ git show HEAD
commit edd935d60906b33f0619605abd1689808ccdd5ee
Author: Morla Porla <morla@overthewire.org>
Date:   Thu May 7 20:14:49 2020 +0200

    fix info leak

diff --git a/README.md b/README.md
index 3f7cee8..5c6457b 100644
--- a/README.md
+++ b/README.md
@@ -4,5 +4,5 @@ Some notes for level29 of bandit.
 ## credentials

 - username: bandit29
-- password: [[PASSWORD]]
+- password: xxxxxxxxxx

Niveau 29

$ ssh -p 2220 bandit29@bandit.labs.overthewire.org

Encore un niveau avec Git – et pas le dernier. Je clone le dépôt :

bandit29@bandit:~$ dest=$(mktemp -d)

bandit29@bandit:~$ git clone ssh://bandit29-git@localhost/home/bandit29-git/repo $dest
Cloning into '/tmp/tmp.VKhfiI2wzP'...

…

Le mot de passe n’est – encore une fois – pas présent dans le README, mais un commentaire dans le fichier parle de différents environnements, et d’un mot de passe non présent en production.

Git permet l’utilisation de branches, c’est à dire que chaque développeur peut travailler sur sa propre version du code, qui peuvent être fusionnées plus tard. Elles sont aussi parfois utilisées pour garder un code différent entre les environnements.

Je liste les différentes branches :

bandit29@bandit:/tmp/tmp.VKhfiI2wzP$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev
  remotes/origin/master
  remotes/origin/sploits-dev

Si le mot de passe n’est pas présent en production – ici la branche master – il sera peut-être dans la branche dev. J’affiche la dernière modification sur cette dernière :

bandit29@bandit:/tmp/tmp.VKhfiI2wzP$ git show origin/dev
commit bc833286fca18a3948aec989f7025e23ffc16c07
Author: Morla Porla <morla@overthewire.org>
Date:   Thu May 7 20:14:52 2020 +0200

    add data needed for development

diff --git a/README.md b/README.md
index 1af21d3..39b87a8 100644
--- a/README.md
+++ b/README.md
@@ -4,5 +4,5 @@ Some notes for bandit30 of bandit.
 ## credentials

 - username: bandit30
-- password: <no passwords in production!>
+- password: [[PASSWORD]]

Niveau 30

$ ssh -p 2220 bandit30@bandit.labs.overthewire.org

Ce niveau est très similaire au précédent. Après avoir cloné le dépôt et listé l’historique, les branches, etc. sans succès, je décide de lister les tags.

Git permet de tagger des commits, par exemple pour s’y référer plus tard en utilisant un nom que l’on peut retenir facilement. C’est typiquement utilisé pour marquer certaines versions d’un logiciel.

En listant les tags, je trouve un tag secret. J’en affiche le message :

bandit30@bandit:/tmp/tmp.RXfEUb49EQ$ git tag
secret

bandit30@bandit:/tmp/tmp.RXfEUb49EQ$ git show secret
[[PASSWORD]]

Niveau 31

$ ssh -p 2220 bandit31@bandit.labs.overthewire.org

C’est le dernier exercice touchant à Git. Dans ce dépôt, on trouve un fichier .gitignore. Ce dernier liste les fichiers qui sont ignorés par Git et ne font généralement pas partie du dépôt. On l’utilise en général pour ne pas commit des fichiers de configuration propre à l’utilisateur, ou des données sensibles.

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ cat .gitignore
*.txt

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ 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

J’ai tout d’abord fouillé le dépôt, les branches, les tags, etc. en cherchant le fameux fichier key.txt. Après bien trop de temps passé sur ce niveau, j’ai compris que l’exercice attendait de moi que j’envoie ce fameux fichier… Je dois tout d’abord l’écrire, puis supprimer le .gitignore pour pouvoir l’ajouter, créer un commit et l’envoyer :

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ echo 'May I come in?' > key.txt

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ rm .gitignore

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ git add key.txt

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ git commit -m 'May I come in?'
[master a4c4bd8] May I come in?
 1 file changed, 1 insertion(+)
 create mode 100644 key.txt

bandit31@bandit:/tmp/tmp.vMb4y5e5oY$ git push

…

Counting objects: 3, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 327 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: [[PASSWORD]]
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'

Niveau 32

$ ssh -p 2220 bandit32@bandit.labs.overthewire.org

Ce niveau est celui qui m’a pris le plus de temps à résoudre. Lorsque je me connecte en tant que bandit32, j’arrive dans un shell pour le moins exotique :

WELCOME TO THE UPPERCASE SHELL
>> id
sh: 1: ID: not found

Tout ce que je tape est converti en lettres capitales avant l’exécution, ce qui m’empêche de lancer les commandes UNIX qui sont typiquement nommées en bas-de-casse.

Cependant, les caractères spéciaux et les nombres ne sont pas affectés. J’essaye alors d’exploiter certaines fonctionnalités de Bash afin de lancer un programme interactif, comme par exemple Python, qui contient généralement le numéro de version et me permettrait de le lancer avec /*/*/*3.5 par exemple.

Après plusieurs essais infructueux, je trouve une idée qui fonctionne : je peux tout à fait créer via un autre utilisateur – comme bandit31 – un lien dans /tmp qui pointe vers un shell. Le nom de ce lien est arbitraire et peut ne contenir que des lettres capitales et des chiffres. J’en choisis un long et aléatoire :

bandit31@bandit:~$ ln -s /bin/bash /tmp/774464937000634

De retour dans l’UPPERCASE SHELL, je peux maintenant lancer Bash et lire le mot de passe.

>> /*/774464937000634

bandit33@bandit:~$ cat /etc/bandit_pass/bandit33
[[PASSWORD]]

Après avoir résolu ce niveau, j’ai cherché comment d’autres personnes s’en étaient sorti. Il y avait une solution bien plus simple, qui se base sur les variables par défaut de Bash ; $0 contient le nom du shell, ici sh :

>> $0

$ cat /etc/bandit_pass/bandit33
[[PASSWORD]]

Niveau 33

$ ssh -p 2220 bandit33@bandit.labs.overthewire.org

Me voilà enfin arrivé à la fin de ce wargame !

bandit33@bandit:~$ cat README.txt
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!

Conclusion

J’espère que cet article vous aura plu et que vous aurez appris des choses. Bandit est selon moi un super wargame pour les débutants qui veulent plonger à la fois dans le monde UNIX et la sécurité informatique.

OverTheWire propose multitude d’autres jeux dans le genre, avec des difficultés croissantes. Je vous les recommande !