Over The Wire est un site de challenge type wargame proposant différentes thématiques permettant de s’exercer à la sécurité sous Linux. En tant que débutant en sécurité informatique, je posterai les solutions que je trouve au fur et à mesure que j’avance.

Introduction

Bandit est une suite de challenges autour du Shell Linux, l’objectif de chaque niveau est d’obtenir un flag constituant le mot de passe pour le niveau supérieur. Les challenges Bandits ont pour but d’introduire les débutants aux problématiques de sécurité sous un environnement Linux.

Avant de consulter cette solution, je vous invite fortement à réaliser ces challenges par vous-même et d’utiliser Google à volonté. En effet, c’est en pratiquant et en s’arrachant les cheveux qu’on finit par apprendre.

Lors des exemples, j’utiliserai le terminal Linux, mais vous pouvez très bien réaliser ce challenge sur Windows, en utilisant le protocole ssh de Putty

Challenge Bandits

Niveau 0

Le premier niveau, consiste à se connecter en ssh et lire le flag qui se trouve dans le fichier readme.

On commence par se connecter en ssh en utilisant le mot de passe indiqué dans l’énoncé.

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

Une fois connecter, nous allons maintenant lister les fichiers du répertoire courant en utilisant la commande ls.

On peut voir qu’un fichier readme est présent, nous allons donc le lire grâce à la commande cat.

bandit0@bandit:~$ cat readme 
boJ9jbbUNNfktd78OOpsqOltutMc3MY1
bandit0@bandit:~$ 

Voilà notre premier flag !

On peut maintenant se déconnecter de la session SSH en utilisant le raccourci CTRL+D. On se connecte ensuite au prochain challenge en utilisant le mot de passe trouver.

Niveau 1

Le mot de passe sur ce challenge est stocké dans le fichier -, or celui-ci est utilisé pour les arguments des commandes. Il va donc falloir lire le fichier depuis un chemin absolu en utilisant ./.

bandit1@bandit:~$ ls
-
bandit1@bandit:~$ cat ./-
CV1DtqXWVFXTvM2F0k09SHz0YwRINYA9
bandit1@bandit:~$

Niveau 2

Ici le but du challenge est de lire un fichier contenant des espaces, hors sous linux on ne peut pas lire un fichier avec des espaces sans les spécifier. Pour ce faire, nous allons les échapper grâce à des \.

bandit2@bandit:~$ ls
spaces in this filename
bandit2@bandit:~$ cat spaces\ in\ this\ filename 
UmHadQclWmgdLOKQ3YNgjWxGoRMb5luK
bandit2@bandit:~$ 

Niveau 3

Ici, le flag se trouve dans un fichier caché dans le répertoire inhere.

On commence par se rendre dans le fichier inhere, grâce à la commande cd. Ensuite, nous allons afficher les fichiers cachés avec l’argument ls-a.

bandit3@bandit:~$ cd inhere/
bandit3@bandit:~/inhere$ ls -a
.  ..  .hidden
bandit3@bandit:~/inhere$ cat .hidden 
pIwrPrtPN36QITSp3EQaw936yaFoFgAB
bandit3@bandit:~/inhere$ 

Niveau 4

Le niveau 4 contient un dossier inhere avec plusieurs fichiers de file01 à file09. le but ici, est de trouver le seul fichier lisible par un humain(human-readable). Pour ce faire, nous allons utiliser la commande file, qui va permettre de déterminer le type d’un fichier.

bandit4@bandit:~/inhere$ file ./*
./-file00: data
./-file01: data
./-file02: data
./-file03: data
./-file04: data
./-file05: data
./-file06: SysEx File -
./-file07: ASCII text
./-file08: data
./-file09: data
bandit4@bandit:~/inhere$ cat ./-file07
koReBOKuIDDepwhWk7jZC0RTdopnAYKh
bandit4@bandit:~/inhere$

On peut voir que le fichier file07, est de type ASCII est donc human-readable.

Niveau 5

Le niveau 5 contient un dossier inhere qui renferme plusieurs dossiers contenants eux-mêmes plusieurs fichiers.

bandit5@bandit:~$ cd inhere/
bandit5@bandit:~/inhere$ ls
maybehere00  maybehere04  maybehere08  maybehere12  maybehere16
maybehere01  maybehere05  maybehere09  maybehere13  maybehere17
maybehere02  maybehere06  maybehere10  maybehere14  maybehere18
maybehere03  maybehere07  maybehere11  maybehere15  maybehere19
bandit5@bandit:~/inhere$ ls maybehere00
-file1  -file2  -file3  spaces file1  spaces file2  spaces file3
bandit5@bandit:~/inhere$

La description du niveau 5 nous donne les indications suivantes :

  • Human-readable
  • 1033 bytes in size
  • Not executable

Cette description nous oriente vers l’utilisation de la commande find, qui va permettre de rechercher un fichier via des attributs. En l’occurrence, ici nous allons utiliser l’attribut size, qui va permettre de rechercher un fichier selon sa taille.

bandit5@bandit:~/inhere$ find -size 1033c
./maybehere07/.file2
bandit5@bandit:~/inhere$ cat ./maybehere07/.file2
DXjZPULLxYr17uwoI01bNLQbtFemEgo7

Niveau 6

Ici, la description nous indique que le password est stocké quelques part sur le serveur et que l’on peut le trouver en suivant les indications suivantes :

  • Owned by user bandit7
  • Owned by group bandit6
  • 33 bytes in size

Comme précédemment, cette description nous oriente vers l’utilisation de la commande find. Ici, nous allons utiliser les arguments / qui va permettre de rechercher à partie de la racine, -group et -user indique le groupe ainsi que le propriétaire du fichier.

bandit6@bandit:~$ bandit6@bandit:~$ find / -group bandit6 -user bandit7 -size 33c
find: ‘/var/cache/apt/archives/partial’: Permission denied
/var/lib/dpkg/info/bandit7.password
find: ‘/var/lib/apt/lists/partial’: Permission denied
find: ‘/var/lib/polkit-1’: Permission denied
[…]

Dans les résultats de la recherche, on peut voir apparaître un fichier bandit7.password qui est exécutable par notre utilisateur local.

bandit6@bandit:~$ cat /var/lib/dpkg/info/bandit7.password
HKBPTKQnIay4Fw76bEy8PVxKEDQRKTzs
bandit6@bandit:~$

Niveau 7

La description nous indique que le flag se trouve à la suite du mot millionth dans le fichier data.txt. En effectuant un cat sur celui-ci, on remarque qu’il comporte plusieurs noms. Cela serait très fastidieux si l’on devait parcourir le fichier à la main. Nous allons donc utiliser la commande grep, qui va permettre d’afficher seulement la ligne contenant l’argument millionth.

bandit7@bandit:~$ grep "millionth" data.txt
millionth       cvX2JJa4CFALtqS87jk27qwqGhBM9plV
bandit7@bandit:~$

Niveau 8

Ici, le but va d’être de rechercher le flag qui apparaît seulement une seule fois dans le fichier. Pour ce faire, nous disposons de la commande uniq. Qui va permettre d’afficher les lignes uniques en utilisant l’argument -u.

Au préalable, nous allons utiliser la commande sort qui va permettre de trier le fichier par ordre alphabétique.

bandit8@bandit:~$ cat data.txt | sort | uniq -u
UsvVyFSfZZWbi6wgC7dAFyFuR6jQQUhR
bandit8@bandit:~$

Niveau 9

Pour ce niveau, on se rend compte qu’en effectuant un simple cat sur le fichier, on nous affiche une série de caractères non lisible pour un humain. Cependant la description nous indique que le flag est lisible par un humain et commence par =.

Nous allons donc utiliser la commande string qui va afficher seulement les chaînes de caractères human readable suivie de la commande grep pour effectuer un filtrage sur le caractère =.

bandit9@bandit:~$ strings data.txt | grep "==="
2========== the
========== password
========== isa
========== truKLdjsbJ5g7yyJ2X2R0o3a5HQJFuLk
bandit9@bandit:~$ 

Niveau 10

Nous avons ici un fichier data.txt contenant une chaîne de caractère encodé en base64 . On la reconnaît notamment grâce à l’apparition du caractère = systématique en fin de chaîne.

bandit10@bandit:~$ cat data.txt
VGhlIHBhc3N3b3JkIGlzIElGdWt3S0dzRlc4TU9xM0lSRnFyeEUxaHhUTkViVVBSCg== 

Sous Linux nous possédons une commande nommée base64, qui va permettre d’encoder ou décoder une chaîne en base64. Dans notre cas, nous utilisons l’argument base64 -d pour décoder la chaîne.

bandit10@bandit:~$ cat data.txt | base64 -d
The password is IFukwKGsFW8MOq3IRFqrxE1hxTNEbUPR 
bandit10@bandit:~$

Niveau 11

Dans cet exercice, le texte contenu dans le fichier data.txt a été codé à l’aide du chiffrement de césar rot13. Toutes les lettres ont été décalées de 13 positions. Pour retrouver le texte initial, nous allons utiliser la commande tr qui va permettre de transformer les lettre en utilisant un argument.

bandit11@bandit:~$ cat data.txt |  tr '[A-Za-z]' '[N-ZA-Mn-za-m]'
The password is 5Te8Y4drgCRfCx8ugdwuEX8KFC6k2EUu
bandit11@bandit:~$

Niveau 12

L’énoncé nous indique que le fichier data.txt est un hexdump d’un fichier compressé plusieurs fois. Le format hexdump est un format non lisible par un système de fichier courant. Tout d’abord, nous allons créer un espace de travail dans le répertoire /tmp pour pouvoir travailler efficacement.

bandit12@bandit:~$ mkdir /tmp/Fydz; cp data.txt /tmp/Fydz; cd /tmp/Fydz

On convertit ensuite notre fichier au format binaire en utilisant la commande xdd.

bandit12@bandit:/tmp/Fydz$ xxd -r data.txt > data
bandit12@bandit:/tmp/Fydz$ file data
data: gzip compressed data, was "data2.bin", last modified: Tue Oct 16 12:00:23 2018, max compression, from Unix
bandit12@bandit:/tmp/Fydz$

Le but du challenge est de retrouver les formats de compression et renommer les fichiers en conséquence.

bandit12@bandit:/tmp/Fydz$ mv data data.gz
bandit12@bandit:/tmp/Fydz$ gzip -d data.gz
bandit12@bandit:/tmp/Fydz$ ls
data  data.txt
bandit12@bandit:/tmp/Fydz$ file data
data: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/Fydz$ bzip2 -d data
bzip2: Can't guess original name for data -- using data.out
bandit12@bandit:/tmp/Fydz$ ls -la
total 1716
drwxr-sr-x     2 bandit12 root    4096 May 12 16:29 .
drwxrws-wt 36629 root     root 1740800 May 12 16:29 .. 
-rw-r--r--     1 bandit12 root     435 May 12 16:21 data.out
-rw-r-----     1 bandit12 root    2581 May 12 16:14 data.txt
bandit12@bandit:/tmp/Fydz$ file data.out
data.out: gzip compressed data, was "data4.bin", last modified: Tue Oct 16 12:00:23 2018, max compression, from Unix
bandit12@bandit:/tmp/Fydz$ gzip -d data.gz
gzip: data.gz: No such file or directory
bandit12@bandit:/tmp/Fydz$ gzip -d data.out
gzip: data.out: unknown suffix -- ignored
bandit12@bandit:/tmp/Fydz$ mv data.out data.gz
bandit12@bandit:/tmp/Fydz$ gzip -d data.gz
bandit12@bandit:/tmp/Fydz$ ls data
data
bandit12@bandit:/tmp/Fydz$ ls
data  data.txt
bandit12@bandit:/tmp/Fydz$ file data
data: POSIX tar archive (GNU)
bandit12@bandit:/tmp/Fydz$ tar -xvf data
data5.bin
bandit12@bandit:/tmp/Fydz$ file data5.bin
data5.bin: POSIX tar archive (GNU)
bandit12@bandit:/tmp/Fydz$ tar -xvf data5.bin
data6.bin
bandit12@bandit:/tmp/Fydz$ file data6.bin
data6.bin: bzip2 compressed data, block size = 900k
bandit12@bandit:/tmp/Fydz$ tar -xvf data6.bin
data8.bin
bandit12@bandit:/tmp/Fydz$ file data8.bin
data8.bin: gzip compressed data, was "data9.bin", last modified: Tue Oct 16 12:00:23 2018, max
compression, from Unix
bandit12@bandit:/tmp/Fydz$ mv data8.bin data8.gz
bandit12@bandit:/tmp/Fydz$ gzip -d data8.gz
bandit12@bandit:/tmp/Fydz$ file data
data: POSIX tar archive (GNU)
bandit12@bandit:/tmp/Fydz$ file data8
data8: ASCII text
bandit12@bandit:/tmp/Fydz$ cat data8
The password is 8ZjyCRiBWFYkneahHwxCv3wb2a1ORpYL
bandit12@bandit:/tmp/Fydz$

Niveau 13

Cet exercice consiste à se connecter à l’utilisateur bandit14 en utilisant une clé privée. Pour ce faire, rien de plus simple il suffit d’utiliser la commande ssh -i qui va permettre de spécifier une clé privée.

bandit13@bandit:~$ ls
sshkey.private
 
bandit13@bandit:~$ ssh bandit14@localhost -i sshkey.private

Nous voilà connecter sur l’utilisateur bandit14, il suffit maintenant de récupérer le flag via le chemin indiqué dans l’énoncé.

bandit14@bandit:~$ cat /etc/bandit_pass/bandit14
4wcYUJFw0k0XLShlDzztnTBHiqxU3b3e
bandit14@bandit:~$

Niveau 14

Ici, l’objectif est de transmettre le mot de passe du niveau 14 sur le port 30000 de la machine courante. On commence à rentrer dans les concepts indispensables en sécurité informatique qui consiste à établir une connexion réseau en utilisant netcat.

bandit14@bandit:~$ cat /etc/bandit_pass/bandit14 | nc localhost 30000
Correct!
BfMYroe26WYalil77FoDi9qh59eK5xNr
bandit14@bandit:~$

Je vous conseille fortement de vous intéresser à netcat, c’est un outil très puissant et indispensable en sécurité informatique.

Niveau 15

Le même principe, sauf que le serveur ne discutera avec nous seulement si nous utilisons la couche de chiffrement SSL. On utilise donc la commande openssl s_client en spécifiant à sl_client de ne pas démarrer en client interactif.

bandit15@bandit:~$ echo "BfMYroe26WYalil77FoDi9qh59eK5xNr" |openssl s_client -quiet -connect localhost:30001
depth=0 CN = localhost
verify error:num=18:self signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
Correct!
cluFn7wTiGryunymYOu4RcffSxQluehd
 
bandit15@bandit:~$

C’est ainsi que clôture cette première partie de ce challenge. Pour suivre la suite du challenge, je vous invite à suivre le blog pour vous tenir au courant des nouveaux articles.