đ 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!