[Sthack 2022][Write up – Exploit] Sanic

 

Introduction

https://www.youtube.com/watch?v=PX7zPlQjAr8
OK WE GOTTA GO FAST !!!

Analyse de l’environnement

Dans la description du challenge, on retrouve un :
ssh [email protected]
En arrivant sur le serveur, on se trouve avec un binaire chall et un fichier flag.
Le binaire possède le suid root, et le fichier flag n’est accessible en lecture que pour root.
Bref on se dit vite qu’on va devoir exploiter le binaire pour lire le fichier.
On notera également un .dockerenv dans le /, cool on peut faire un peu n’importe quoi, on ne devrait pas crasher le host (spoiler: non)

Le binaire, il marche comment ?

Lorsqu’on lance le chall, voici ce qui s’affiche:

Sortie standard Sanis

Sortie standard Sanic

Bon on peut voir quelques commandes lancées par le binaire : ps, sort, ainsi qu’un output dans /tmp/chall/processes-RANDOM-NUM.
J’ai tenté de reverse le binaire pour être sur de comprendre ce qu’il faisait, mais je me suis retrouvé face à un truc compilé statiquement et strippé, et ma motivation s’est tout de suite effondrée.
Ceci dit, vu que le binaire a l’air de lancer un ps et d’afficher l’output, il se passe quoi si je le lance 36 fois en même temps ?

for i in `seq 1 100`; do ./chall & done

Ceci nous permet de récupérer d’autres commandes lancées par notre cher binaire chall.

/usr/bin/bash -c rm -rf /tmp/chall; mkdir -pv /tmp/chall
/usr/bin/cat /tmp/chall/processes-1163304

Du coup ce qu’on comprend du binaire:

  • Il affiche le nom du fichier d’output (on l’appellera $PROCESS_FILE)
  • Il rm le dossier /tmp/chall et le recrée instantanément. (impossible de précréer des fichiers dans le dossier).
  • Il fait un ps -fau | sort -uV -o $PROCESS_FILE
  • Il fait un cat $PROCESS_FILE

En regardant bien ce qu’il fait, on se rend compte qu’il y’a une potentielle Race Condition entre la partie ps et le cat du fichier.
Seulement, il va falloir trouver un moyen de ralentir le programme afin de pouvoir rm et créer un lien symbolique sur le $PROCESS_FILE.

SANIC, GOTTA SLOW DOWN !

On peut pas trop influer sur le ps ni le rm , mais du coup on va se concentrer sur le sort 🙂
Avec mon confrère Headorteil, on s’est dit:

« Si on spawn 2000 process sleep, le sort il va galérer ! »

ET incroyable, ça a marché !
Du coup on a balancé un bon vieux :

for i in `seq 4272`; do sleep 200 & done
Eat Sleep Pwn Repeat

Eat Sleep Pwn Repeat

Ok maintenant que le sort galère un peu, c’est parti pour récupérer le nom du programme au départ, ensuite on attend un peu, on rm le fichier et on fait notre lien symbolique !

./chall > /tmp/jb/abc & a=$(cat /tmp/jb/abc | head -n 1 | cut -d ' ' -f 7); sleep 0.2 && rm $a && ln -s /home/chall/flag $a

Décortiquons un peu cela !

  • ./chall > /tmp/jb/abc : on envoie l’output du programme dans un fichier à nous
  • a=$(cat /tmp/jb/abc | head -n 1 | cut -d ‘ ‘ -f 7) : on récupère le $PROCESS_FILENAME
  • sleep 0.2 && rm $a && ln -s /home/chall/flag $a : on rm le fichier et on fait notre lien symbolique

FINALLY

Un petit cat /tmp/jb/abc nous récupère le flag !
FLAG: vroumvroumrapide (je me rappelle plus trop du flag, mais ça ressemblait à un truc comme ça)

LOUIS GIESENINGÉNIEUR SÉCURITÉ
Louis est un développeur autant web que système qui a également mis un pied dans d’autres domaines de l’informatique tels que le DevOps et la sécurité offensive.

Arrivé en février 2020 chez Login, il réalise aussi des pentests occasionnellement.

Add a comment

*Please complete all fields correctly