Principe:
Un simple buffer overflow nécessitant de rediriger l'addresse vers un emplacement spécifique du programme, pour obtenir un shell. Envoyer correctement le payload fut le plus compliqué
Le but est d'exploiter un "buffer overflow" sur
le programme fourni (disponible ici, ainsi que mes codes de résolution)
On lance le programme, on entre une chaine trop longue, et il crash
Via un débugger, comme edb , on recommence le même test
On lance l'exécution pas à pas (F8), et on stoppe au moment d'entrer les données
Dans ce même programme, on trouve une addresse qui nous donnerait un shell (bash):
le but est donc de prendre le contrôle du flow d'exécution, pour le rediriger sur cette addresse
et obtenir un shell (en local d'abord, puis on refera les mêmes étapes sur le challenge en ligne)
On entre donc une chaîne non-répétitive et trop longue issue de msfvenom_pattern-create
La chaîne se retrouve sur la stack
On avance pas à pas, jusqu'à arriver au RTN (return assembleur)
On modifie la valeur de la stack à la main pour mettre l'addresse désirée 4011a2
Il faut prendre garde à l'endian de la stack: la valeur à entrer à la main sera en fait
a2 11 40 00 00 00 00 00
Quand on avance d'un pas (F8), l'EIP (RIP ici, car 64 bits) a pris la valeur entrée à la main,
et le flow d'exécution a été redirigé à l'endroit voulu
On continue l'exécution (F9) et on a bien un shell: notre idée fonctionne.
Reste à la mettre en pratique sans devoir utiliser le débugger
On reprend la chaine string précédente, et on insère l'addresse désirée à l'endroit correspondant,
avec le bon endian, et on l'envoie au programme
Mais… ça n'a pas marché
J'ai perdu des plombes là dessus, à ne pas comprendre pourquoi ce payload ne marche pas…
En passant par mkfifo (named pipe), le problème ne se pose plus, et le shell se lance…
mais celui-ci se ferme immédiatement!
La stratégie du désespoir: un script PHP qui cherchera en boucle le process pwn
pour lui envoyer le payload!
On lance le script PHP, on lance ensuite
cat|pwn (pour que stdin reste ouvert et accessible)
et ça marche!
On refait la même avec le vrai challenge, et on obtient le flag
FCSC{5f25ae8fd59160b018e8ef21ff8972cdb2e3ab98e4f7bfced4e60255d378aee8}
On peut se contenter d'un cat|./pwn et d'utiliser ps -aux|grep 'pwn' dans un autre terminal
pour trouver le PID du process pwn . On lui envoie alors les données vers stdin
via la commande cat binshell.dat > /proc/PID/fd/0
Le PHP script fait cela automatiquement
↩ Retour à la liste des challenges
⇇ Retour à l'accueil