Testimonial
Catégorie: Web Difficulté: easy Flag: HTB{w34kly_t35t3d_t3mplate5}
Challenge
Description
The challenge involves an recruitment page for "They Fray" and allows anyone to submit a testimonial. The webstack utilizes GoLang with chi/templ and is deployed via Air, which allows for live reloading of golang applications. Testimonials is a GRPC Microservice and stored/retrieved as files. Exploitation occours because the Testimonial microservice is exposed to end-users, which provides the ability to overwrite the golang files on the webservice. Due to air live reloading files, it is possible to inject arbituary code.
Ce challenge tourne sur un docker, disponible sur Github
Analyse globale
Le site est très simple, on a un formulaire et des card qui correspondes aux différents formulaires déjà soumis

Concernant le code, on voit que l’on a 2 services qui écoutent
Un service HTTP
Un service GRPC

Dans /grpc.go il y a la fonction SubmitTestimonial qui permet d’enregistrer dans /public/testimonials/ les formulaires reçus. Il faut noter que le nom du fichier est d’ailleurs le nom du customer

Dans /client/client.go on s’aperçoit que l’on a une restriction lorsque l’on soumet un formulaire, le nom du customer ne peut pas contenir n’importe quel caractère

Seulement comme nous avons vu juste avant, le service GRPC ne contient pas ces restrictions lui-même, ce qu’il fait que si l’on passe directement par lui et non par le service web, on peut choisir n’importe quel nom de fichier et écraser des fichiers existants
Exploitation
On commence par se connecter au service GRPC avec grpcurl
Comme le service ne supporte pas la réflexion, la documentation nous dit que l’on peut fournir directement le fichier proto

On peut maintenant appeler la fonction SubmitTestimonial avec notre payload
Pour ça, on va le faire en Go en reprenant le dossier /ptb/ pour se connecter au serveur GPRC.
Concernant le payload, il faut simplement copier-coller /view/home/index.templ et remplacer fsys := os.DirFS("public/testimonials") par **fsys := os.DirFS("/")** ce qui permettra de lire tous les fichiers à la racine
Et enfin pour le nom ce sera ../../view/home/index.templ pour remonter jusqu’au dossier du challenge puis redescendre jusqu’à index.templ pour l’écraser
Ce qui nous donne maintenant sur la page principale

Mis à jour
Ce contenu vous a-t-il été utile ?