đ HackTheBox - Photobomb
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

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!

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é

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

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.

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

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

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

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.

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)

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

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).

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.

gg!