Table of contents



Note

Il s’agit de la toute premiĂšre room que j’ai flag sur HTB, il y a de ça 3 ou 4 mois. Elle Ă©tait correcte, vous allez encore un peu pouvoir apprĂ©cier mon superbe Ubuntu riced on gnome (c’est une horreur).

Recon

page.png

La page est assez sobre, avec un lien et.. c’est tout

Le lien nous envoie vers /printer, qui nous demande un username et un mot de passe

En inspĂ©ctant le js de la page, on voit que si l’utilisateur a le cookie isPhotoBombTechSupport et qu’il clique dessus, il sera renvoyĂ© vers le /printer avec les identifiants pH0t0:b0Mb!

ids.png

On peut donc manuellement s’ajouter le cookie (oui, nous pourrions aussi directement recopier les identifiants mais ça nous Ă©vitera de les retaper Ă  l’avenir), puis on clique sur le lien

Le site affiche une alerte, puis nous redirige vers le /printer en étant connecté

alert.png

On finis rapidement la reconnaissance par vérifier le /robots.txt, mais on tombe sur une 404, avec un bout de code en ruby, rien de trÚs utile

robots.txt.png

Foothold

Sur le /printer, la seule chose qui saute aux yeux est le gros bouton rouge en bas de la page. En cliquant dessus, on se rend compte qu’il envoie une requĂȘte POST vers /printer

On lance donc Burp pour intercĂ©pter la requĂȘte.

request.png

On voit 3 paramĂštres: la photo, le filetype et enfin les dimensions

Si on change manuellement les dimensions dans la requĂȘte Ă  100x100, le site nous tĂ©lĂ©charge une version de l’image en 100x100, on comprend donc que l’image est gĂ©nĂ©rĂ©e dynamiquement au moment de la requĂȘte

On peut imaginer une commande du style

generateImage -path photo -type filetype -size dimensions

OĂč bien sĂ»r nos trois arguments sont passĂ©s par la requĂȘte.

En partant donc ce cela et en assumant qu’il s’agit d’une commande bash, on peut tenter une code execution en ajoutant un ; Ă  la fin d’un des paramĂštres.

Le problĂšme, c’est que nous ne savons pas lequel des 3 paramĂštres est le dernier de la commande. On va donc tenter sur chacun des paramĂštres jusqu’Ă  trouver lequel est mis en dernier, pour que la commande ressemble par exemple Ă :

generateImage -path photo.png -type png -dimensions 100x100;id

Cette ligne va Ă©xecuter deux commandes: generateImage et id

req1.png

Le site renvoie un 500, car il n’a pas trouvĂ© l’image, l’argument photo n’est donc pas injectable.

On enlĂšve le payload sur ce dernier, et on renvoie la requĂȘte

req2.png

Nouvelle rĂ©ponse 500, cette fois les dimensions sont invalides. En revanche, il n’a rien dit sur le filetype, on sait donc maintenant que notre commande ressemble plutĂŽt Ă :

generateImage -path photo.png -dimensions 100x100 -type png;id

Pour vĂ©rifier ça, on hĂ©berge rapidement un serveur python qu’on va curl via notre payload

hack.png

Et ça fonctionne, on a reçu la requĂȘte sur notre serveur, on a donc notre code execution.

On va reverse shell la machine, pour ce faire on build un reverse shell qu’on url encode et qu’on met Ă  la suite de notre ;. On lance un netcat puis on envoie la requĂȘte.

revshell.png

Privilege Escalation

AprĂšs avoir stabilisĂ© notre shell, on fait un sudo -l et on voit que l’utilisateur wizard pour utiliser sudo sur le fichier cleanup.sh. Il peut aussi modifier les variables d’environnement au lancement du programme. (SETENV)

sudol.png

On cat le cleanup.sh pour voir ce qu’il y a dedans, et on remarque que le script fait appel Ă  plusieurs commandes bash. En revanche, il les appelle toutes avec leur chemin absolu (/bin/cat) sauf pour find

cleanup.png

On part sur une path hijacking de la commande find, on crée donc un fichier find dans lequel on écrit /bin/bash, puis on le met dans tmp. Enfin, on lui met toutes les permissions (7 = RWX).

pathhijacking.png

Puis on lance cleanup.sh avec sudo en modifiant la variable d’environnement $PATH pour qu’il aille d’abord chercher la commande find dans le /tmp.

root.png

gg!

back to top