
Exploit pour CVE-2018-18925 : exécution de code à distance dans Gogs via un traversée de répertoire dans la gestion des sessions, permettant le contournement de session et l'accès administrateur avec RCE ultérieure via des hooks git.
Exploitation de CVE-2018-18925, une exécution de code à distance contre l'outil Git auto-hébergé : Gogs.
Gogs est basé sur le framework Macaron. Le système utilisé pour gérer les sessions est très similaire à celui de PHP. L'identifiant de session dans le cookie est mappé à un fichier sur le système de fichiers. Lorsque le serveur web reçoit une requête avec un identifiant de session (sous forme de cookie), il recherche le fichier sur le système de fichiers.
La vulnérabilité est une simple traversée de répertoire lors de la récupération du fichier utilisé pour la session sur le système de fichiers. Vous pouvez par exemple définir le cookie i_like_gogits sur ../../../../../../etc/passwd pour obtenir une erreur du serveur.

Afin d'exploiter le contournement de session, nous avons besoin d'un moyen de téléverser un fichier spécialement conçu, puis nous utiliserons ce fichier comme identifiant de session. Nous pouvons créer notre propre fichier d'identifiant de session avec https://github.com/RyouYoo/CVE-2018-18925/blob/main/main.go.
go run main.go
Lors de la création de la copie du dépôt localement, Gogs place les fichiers dans /data/gogs/data/tmp/local-repo/[REPO_ID]/[FILENAME] (ce dépôt n'est créé que lorsque vous utilisez la fonctionnalité "Upload file").

Où [FILENAME] est le nom du fichier que vous téléversez et [REPO_ID] est l'identifiant du dépôt qui peut être trouvé via le lien Fork :

Où 5 est l'identifiant du dépôt.
Par défaut, les sessions sont stockées dans /data/gogs/data/sessions/. Par conséquent, vous pouvez utiliser le chemin relatif suivant pour votre identifiant de session : ../tmp/local-repo/[REPO_ID]/[FILENAME]. En utilisant ce chemin dans votre cookie i_like_gogits, vous devriez être connecté en tant qu'administrator.

Afin d'obtenir une RCE, vous pouvez utiliser la fonctionnalité des hooks git dans un dépôt donné pour exécuter un script shell.

Dans pre-receive, injectez votre code :

Ensuite, effectuez un push, avec git ou avec la fonction de création de fichier, pour que le hook soit exécuté.