
Exploit para CVE-2018-18925: Ejecución remota de código en Gogs mediante directory traversal en el manejo de sesiones, permitiendo la omisión de sesión y acceso de administrador con posterior RCE a través de git hooks.
Explotación de CVE-2018-18925, una ejecución remota de código contra la herramienta Git autohospedada: Gogs.
Gogs se basa en el framework Macaron. El sistema utilizado para gestionar la sesión es muy similar a lo que hace PHP. El identificador de sesión en la cookie se asigna a un archivo en el sistema de archivos. Cuando el servidor web recibe una solicitud con un identificador de sesión (como una cookie), busca el archivo en el sistema de archivos.
La vulnerabilidad es un simple directory traversal al recuperar el archivo utilizado para la sesión en el sistema de archivos. Puedes, por ejemplo, establecer la cookie i_like_gogits a ../../../../../../etc/passwd para obtener un error del servidor.

Para explotar la omisión de sesión, necesitaremos una forma de subir un archivo especialmente manipulado, luego usaremos este archivo como nuestro id de sesión, podemos crear nuestro propio archivo de id de sesión manipulado con https://github.com/RyouYoo/CVE-2018-18925/blob/main/main.go.
go run main.go
Al crear la copia del repositorio localmente, Gogs coloca los archivos en /data/gogs/data/tmp/local-repo/[REPO_ID]/[FILENAME] (este repositorio solo se crea cuando usas la funcionalidad "Upload file").

Donde [FILENAME] es el nombre del archivo que subes y [REPO_ID] es el identificador del repositorio que se puede encontrar usando el enlace Fork:

Donde 5 es el id del repositorio.
Por defecto, las sesiones se almacenan en /data/gogs/data/sessions/. Por lo tanto, puedes usar la siguiente ruta relativa para tu id de sesión: ../tmp/local-repo/[REPO_ID]/[FILENAME]. Al usar esta ruta en tu cookie i_like_gogits, deberías iniciar sesión como administrator.

Para obtener RCE, puedes usar la funcionalidad de git hooks en un repositorio dado para ejecutar un script de shell.

En pre-receive inyecta tu código:

Luego haz una solicitud push, con git o con la función de crear archivo para que el hook se ejecute.