Kit de detecção e confirmação de RCE que testa URLs ou requisições HTTP capturadas em busca de injeção de comandos, SSTI, caminhos cegos e OOB, retornando veredictos em camadas com provas.
confirmed significa que o alvo executou a entrada. negative significa que as sondagens o alcançaram.
Versão 2.40.0 · MIT · Python 3.8+ · zero dependências de terceiros
RCEKit é um kit de detecção e confirmação de RCE para testes de penetração autorizados, red teaming e pesquisa de segurança. Aponte-o para um alvo que você tem permissão para testar — uma URL ou uma requisição HTTP capturada — e cada descoberta retorna com o nível que conquistou.
Cada confirmed baseia-se em um valor que o RCEKit gerou aleatoriamente para
aquela sondagem e que a reflexão não pode produzir: um resultado computado
presente na resposta e ausente de um controle sem payload, ou um callback
out-of-band carregando um token que apenas o alvo detinha. Sinais mais fracos
mantêm seus próprios níveis e nunca são promovidos a ele. E uma execução que não
conseguiu testar algo nunca o reporta como limpo.
O RCEKit confirma RCE através de múltiplos métodos sob uma única CLI. Abaixo ele é apontado para CVEs reais e publicamente documentadas em software de produção — cada veredito diferenciado contra um controle sem payload:
| Classe de RCE | --methods | Alvo do mundo real | Veredito |
|---|
| Injeção de comando do SO (baseada em resultados) | reflected | Webmin 1.910 — CVE-2019-15107 | confirmed |
| Injeção de expressão (OGNL) | eval | Apache Struts2 — S2-001 | confirmed |
| Expression-lookup (Log4Shell/JNDI) | lookup | Apache Solr 8.11.0 (Log4j 2.14.1) — CVE-2021-44228 | lookup-sink |
| Injeção de comando cega (sem saída) | time | Webmin 1.910 — CVE-2019-15107 | needs-review |
Cada linha é reproduzida por tests/bench/, que executa o RCEKit
contra essas builds sob Docker e verifica o veredito e seu controle negativo.
Última execução verde em 2.36.0 (2026-09-20): 3/3 casos. Essa é uma afirmação
pontual, não contínua -- o benchmark é executado em uma cadência, não a cada
alteração.
Cada controle é o teste real da linha. Struts2 sondado com reflected retorna
negative, porque S2-001 reavalia OGNL e não há shell por trás dele. O sinal
time do Webmin é mantido em needs-review em um alvo onde ele por acaso está
correto. E o Solr sondado com oob retorna negative embora seja
explorável -- oob constrói comandos de shell e um sink ${jndi:...} não
executa nenhum deles, que é a lacuna que lookup existe para fechar, medida em
vez de afirmada.
A linha do Log4Shell diz lookup-sink, não confirmed: o que o callback prova
é que o sink resolveu uma URI escolhida pelo RCEKit. Alcançar RCE requer um
servidor que responda à consulta com uma classe carregável, e no nível de risco
padrão apenas jndi:dns:// sai -- uma consulta de nome, sem conexão além dela
para tal servidor responder.
reflected — injeção de comando do SO, Webmin CVE-2019-15107 → confirmed
eval — injeção de expressão OGNL, Apache Struts2 S2-001 → confirmed
lookup-sink
time — injeção de comando cega, Webmin CVE-2019-15107 → needs-review
O RCEKit tem duas formas suportadas, e nenhuma é um substituto da outra.
Instale-o — pipx mantém a CLI em seu próprio ambiente, que é o que você
quer para uma ferramenta em vez de uma biblioteca:```bash
pipx install rcekit # or: pip install rcekit
rcekit --doctor # confirms the corpus it will run with
**Ou leve apenas o único arquivo.** O corpus de payloads é incorporado ao módulo, então
`rcekit.py` é executado sozinho sem nada ao lado — nenhuma etapa de instalação, nenhum
site-packages, nada para deixar para trás. Em uma jump box de cliente, um host
air-gapped, ou em qualquer lugar onde `pip install` não é uma opção:```bash
curl -O https://raw.githubusercontent.com/kabiri-labs/rcekit/main/rcekit.py
python rcekit.py --doctor # same corpus, same check, zero installation
Ambos executam o mesmo código e reportam os mesmos veredictos. Trabalhar a partir de um checkout é a terceira forma, e também não requer instalação:```bash git clone https://github.com/kabiri-labs/rcekit.git cd rcekit # Python 3.8+, standard library only
Coloque um marcador `FUZZ` onde sua entrada chega (ou selecione um parâmetro com `-p` ao
usar uma requisição capturada), e peça ao RCEKit para provar o RCE:```bash
rcekit --acknowledge-consent \
--verify-url "https://target.example/lookup?host=FUZZ" \
--methods reflected,eval
| -s | --server | SERVER | http://localhost:8080 | URL do servidor |
| -t | --token | TOKEN | null | Token de autenticação |
| -u | --username | USERNAME | null | Nome de usuário para autenticação |
| -p | --password | PASSWORD | null | Senha para autenticação |
| -k | --insecure | INSECURE | false | Ignorar verificação de certificado TLS |
| -c | --config | CONFIG | null | Caminho para o arquivo de configuração |
| -v | --verbose | VERBOSE | false | Ativar saída detalhada |
| -d | --debug | DEBUG | false | Ativar saída de depuração |
| -h | --help | HELP | false | Exibir mensagem de ajuda |
| -V | --version | VERSION | false | Exibir informações da versão |```
[detect] methods: reflected, eval
[detect] sent 13 probes: confirmed=4, negative=9
[detect] CONFIRMED execution (4): [reflected/unix/raw] ; echo RKYZRIP$((540141+314681))RKFWVFS$(echo RKBWOOC)RKYZRIP (target computed 'RKYZRIP854822RKFWVFSRKBWOOCRKYZRIP' — random operands, absent from control)
### De uma requisição capturada — a forma que a maioria dos alvos reais tem
Um `--verify-url` carrega uma URL e nada mais. A maioria dos sinks que vale a pena testar fica
atrás de um POST com um cookie de sessão, um content type e um body, e o RCEKit recebe
essa requisição por inteiro: salve-a do seu proxy ou do devtools do seu navegador e nomeie
o campo no qual injetar.```bash
rcekit --acknowledge-consent \
-r search.req -p q \
--methods reflected,eval
--no-verify — Pula a verificação de integridade do arquivo de saída.--no-cleanup — Mantém os arquivos temporários após a conclusão.--verbose — Ativa a saída de log detalhada.--quiet — Suprime toda a saída, exceto erros.# Verificação básica de integridade
python3 cve_2025_55182.py -t https://alvo.exemplo.com
# Verificação com autenticação
python3 cve_2025_55182.py -t https://alvo.exemplo.com -u admin -p senha
# Especificar arquivo de saída personalizado
python3 cve_2025_55182.py -t https://alvo.exemplo.com -o resultado.json
# Modo detalhado com limpeza desativada
python3 cve_2025_55182.py -t https://alvo.exemplo.com --verbose --no-cleanup
A ferramenta segue um fluxo de verificação em várias etapas:
Esta ferramenta destina-se apenas a testes de segurança autorizados e pesquisa educacional. O uso não autorizado contra sistemas sem consentimento explícito por escrito é ilegal e antiético. Os autores não se responsabilizam por qualquer uso indevido ou dano causado por esta ferramenta.
Sempre obtenha a devida autorização antes de testar qualquer sistema.``` [detect] sent 4 probes: confirmed=3, negative=1
[detect] CONFIRMED execution (3): [reflected/unix/raw] ; echo RKHWNHK$((114157+752773))RKXGFIH$(echo RKHSEIF)RKHWNHK (target computed 'RKHWNHK866930RKXGFIHRKHSEIFRKHWNHK' — random operands, absent from control)
O método, o caminho, os cabeçalhos, o corpo e os cookies são reutilizados tal como capturados, e cada valor é codificado para o contexto em que é inserido — um valor JSON, um campo de formulário e um cookie não são escapados da mesma forma. Remova `-p` e marque o local com `FUZZ` ou `*`, se preferir.
### Tudo o que a ferramenta tem
Duas coisas só são acessíveis a partir de um pedido capturado: a **enumeração de pontos de injeção** (`--auto-params`) e qualquer sink que necessite de uma sessão. Portanto, a execução mais completa que o RCEKit consegue fazer começa a partir de `-r`, não de um URL — o que vale a pena saber antes de concluir que um alvo está limpo.```bash
rcekit --acknowledge-consent \
-r search.req --auto-params all --point-order thorough \
--methods reflected,eval,time,lookup,deser \
--oob-host oob.yourdomain.example --listen-dns-port 53 \
--verify-active-risk stateful --probe-depth full \
--detect-json findings.json
| -s | --server | SERVER | http://localhost:8080 | URL base do servidor |
| -t | --token | TOKEN | | Token de autenticação |
| -k | --insecure | | false | Ignorar erros de TLS |
| -o | --output | FORMAT | text | Formato de saída (text, json) |
| -v | --verbose | | false | Ativar registro detalhado |
| -q | --quiet | | false | Suprimir saída não essencial |
| -c | --config | FILE | ~/.config/tool/config.yaml | Caminho do arquivo de configuração |
| -n | --dry-run | | false | Simular sem executar ações |
| -f | --force | | false | Forçar operação sem confirmação |
| -y | --yes | | false | Responder sim a todos os prompts |
| -d | --debug | | false | Ativar saída de depuração |
| -h | --help | | | Exibir mensagem de ajuda |
| -V | --version | | | Exibir informações da versão |
# Execução básica
tool scan --target example.com
# Especificar porta e protocolo
tool scan --target example.com --port 443 --protocol https
# Saída em JSON
tool scan --target example.com --output json
# Usar arquivo de configuração
tool scan --config /path/to/config.yaml
# Modo detalhado com depuração
tool scan --target example.com --verbose --debug
# Simulação sem executar
tool scan --target example.com --dry-run
# Forçar operação sem confirmação
tool scan --target example.com --force
# Responder sim a todos os prompts
tool scan --target example.com --yes
O arquivo de configuração usa o formato YAML:
server: http://localhost:8080
token: your-token-here
insecure: false
output: text
verbose: false
quiet: false
timeout: 30
retries: 3
| Variável | Descrição |
|---|---|
TOOL_SERVER | URL do servidor |
TOOL_TOKEN | Token de autenticação |
TOOL_INSECURE | Ignorar erros de TLS |
TOOL_OUTPUT | Formato de saída |
TOOL_VERBOSE | Ativar registro detalhado |
TOOL_QUIET | Suprimir saída não essencial |
TOOL_CONFIG | Caminho do arquivo de configuração |
TOOL_TIMEOUT | Tempo limite em segundos |
TOOL_RETRIES | Número de tentativas |
| Código | Descrição |
|---|---|
0 | Sucesso |
1 | Erro geral |
2 | Uso incorreto do comando |
3 | Erro de configuração |
4 | Erro de autenticação |
5 | Erro de rede |
6 | Tempo limite excedido |
7 | Permissão negada |
8 | Recurso não encontrado |
9 | Recurso já existe |
10 | Operação cancelada |
Verifique se o servidor está em execução e se a URL está correta:
curl -v http://localhost:8080/health
Verifique se o token está correto e não expirou:
tool auth status
Aumente o tempo limite ou verifique a conectividade de rede:
tool scan --target example.com --timeout 60
Execute com privilégios elevados ou verifique as permissões do arquivo:
sudo tool scan --target example.com
Contribuições são bem-vindas! Por favor, siga estas etapas:
git checkout -b feature/nova-funcionalidade)git commit -am 'Adiciona nova funcionalidade')git push origin feature/nova-funcionalidade)Este projeto está licenciado sob a Licença MIT - consulte o arquivo LICENSE para obter detalhes.
Esta ferramenta é destinada apenas para testes de segurança autorizados e fins educacionais. Os usuários são responsáveis por garantir que têm permissão para testar os sistemas de destino. Os autores não se responsabilizam por qualquer uso indevido ou danos causados por esta ferramenta.
O que cada flag abre:
| | |
|---|---|
| `--auto-params all` | cada valor de query, folha JSON, campo de formulário, parte multipart, cookie e header, em vez de um campo nomeado |
| `--point-order thorough` | cada header não hop-by-hop, não apenas os de alto rendimento |
| `--methods ...,lookup,deser` | sinks de expression-lookup e desserialização, que os métodos em forma de shell não alcançam |
| `--oob-host` | um host de callback para os métodos cegos. Precisa de um domínio delegado a você; a porta 53 precisa de root |
| `--verify-active-risk stateful` | o degrau mais alto — adiciona as formas de probe que fazem o alvo buscar de um endereço que o RCEKit não escolheu |
| `--probe-depth full` | cada forma de break-out por sink, não apenas as baratas |
| `--detect-json` | os mesmos veredictos em JSON legível por máquina |
**Isto é um monte de requisições.** A linha de custo é impressa antes de qualquer coisa disparar, e
`--max-points` / `--max-payloads` a limitam. Execute contra uma instância que você tem
permissão para quebrar: `--verify-active-risk stateful` é o nível para um alvo descartável, não para produção.
Sem infraestrutura externa, sem arquivo de configuração.
**Não confie nos GIFs** — [reproduza-os você mesmo](https://github.com/kabiri-labs/rcekit/blob/main/docs/verify-it-yourself.md)
contra alvos Webmin e Struts2 dockerizados em cerca de cinco minutos.
**A seguir:** o [**guia de campo**](https://github.com/kabiri-labs/rcekit/blob/main/docs/guide.md) percorre as situações reais — requisições
capturadas, WAFs, separadores filtrados, sinks entre aspas, alvos cegos e sem egresso —
um exemplo prático cada.
---
## O que um veredicto significa
Encontrar um *candidato* a RCE é fácil. Reportar um que sobreviva ao reteste de outra pessoa
é a parte difícil, e falha em duas direções: um "possivelmente vulnerável" que acaba sendo
reflexão, e um "não vulnerável" de uma execução que na verdade nunca testou nada.
O RCEKit responde com **oito veredictos que nunca são colapsados uns nos outros**:
| Veredicto | O que ele afirma |
|---|---|
| **`confirmed`** | O alvo executou a entrada. Retornou um valor que não poderia produzir de outra forma — computado a partir de operandos aleatórios para aquele probe — e esse valor está ausente de um controle sem payload. |
| **`deserialization-sink`** | O alvo reconstruiu um grafo de objetos fornecido pelo atacante. Comprovado, mas sobre uma *propriedade diferente*: alcançar RCE a partir daí depende de gadgets no classpath, então nunca é chamado de RCE. |
| **`lookup-sink`** | O alvo resolveu uma URI que o RCEKit entregou — uma expressão `${jndi:…}` alcançou um lookup, comprovado por um callback carregando um token que só aquele probe possuía. É um sink, não execução: alcançar RCE a partir daí precisa de um servidor respondendo com uma classe carregável. |
| **`needs-review`** | Um sinal real que não é prova por si só — uma regressão de timing linear, uma fingerprint de parser. Vale o seu tempo, nunca vale a palavra "confirmed". |
| **`inconclusive`** | A evidência apareceu, mas não pôde ser atribuída à execução — o controle sem payload também a carregava. |
| **`negative`** | Probes foram construídos, alcançaram o alvo e não encontraram nada. |
| **`error`** | Nada alcançou o alvo. |
| **`nothing-tested`** | Nenhum probe foi construído. |
No momento em que `confirmed` e `maybe` se confundem, `confirmed` deixa de significar qualquer coisa — então
nada é jamais promovido para cima. Uma regressão de timing permanece `needs-review` por mais
limpa que seja a inclinação. Um callback de desserialização permanece `deserialization-sink` por mais
certo que você esteja de que o classpath é explorável.
### A outra metade: uma execução que não testou nada nunca é limpa
As duas últimas linhas são as que outras ferramentas não têm, e importam mais do que
parecem. Um scanner que não conseguiu alcançar o alvo, ou não construiu nenhum probe porque
suas flags excluíram todos eles, não aprendeu **nada** sobre o alvo —
e imprimir `negative` ali é uma mentira que se lê exatamente como segurança.
Então `error` e `nothing-tested` são veredictos de primeira classe, a execução sai com código diferente de zero,
e o RCEKit diz qual deles aconteceu e por quê:```
[!] No probes were built, so NOTHING WAS TESTED — this is not a negative result.
[!] None of the selected methods (reflected, file) apply to environment(s): sql.
Ele dispara onde quer que uma execução possa silenciosamente se tornar vazia: um método que não se aplica aos ambientes selecionados, um degrau de --sink-shape para o qual o shell escolhido não tem sintaxe, uma seleção de --bridges inteiramente retida pelo teto de segurança, um corpo de requisição que quebrou a entrega antes de chegar.
Uma execução que foi apenas parcialmente cegada recebe o mesmo tratamento um nível abaixo. Se você pediu um oráculo de segunda ordem e o endpoint observado nunca respondeu, os veredictos das sondagens ainda se mantêm — mas a execução informa que eles foram decididos sem nunca ler o canal que você apontou, em vez de deixá-los passar como um negativo de segunda ordem.
Uma CLI, uma flag --methods, cobrindo os principais caminhos para RCE:
| Classe de RCE | --methods | Como o RCEKit prova |
|---|---|---|
| Injeção de comando do SO | reflected | Faz o shell calcular $((a+b)) sobre operandos aleatórios e colapsar $(echo TAG); confirma o resultado, nunca a expressão literal. Escrito no próprio dialeto do sink — POSIX, cmd.exe ou PowerShell. |
Injeção de código / expressão — SSTI, SpEL, OGNL, Groovy, eval() (CWE-94) | eval | Injeta a*b em toda sintaxe de template comum (${…} {{…}} #{…} %{…} <%=…%> @(…), sem delimitadores); confirma que o produto aparece enquanto o literal a*b não. |
| Injeção de comando cega (sem saída) | time | Dispara uma série controlada de atrasos 0/N/2N e confirma que o tempo de resposta acompanha o atraso linearmente; reportado como needs-review — jitter não consegue falsificá-lo, mas timing não é um valor computado. |
| Alvos internos / sem egresso | file | Escreve um token aleatório e o busca de volta através de qualquer caminho de leitura — uma raiz web, um parâmetro LFI, um handler de download ou exportação, uma pré-visualização apoiada em /tmp. Prova execução mais uma primitiva de escrita, sem listener externo. |
| Primitiva de upload / escrita — PUT-a-JSP, upload não verificado (CWE-434) | write | Escreve um one-liner que calcula um produto através da sua própria requisição de upload, depois busca o arquivo: o produto é RCE confirmed, o código-fonte retornando literalmente é needs-review — escrita arbitrária de arquivo, servido mas não interpretado. |
| Sinks de desserialização — fastjson, shiro, weblogic (CWE-502) | deser | Prova que o endpoint desserializa dados do atacante, via um gadget DNS não-executável ou um diferencial de forma de erro. Reportado como , como RCE. |
Três coisas ampliam onde esses métodos podem alcançar, sem mudar o que qualquer um deles chamará de confirmed:
--observe-url) — quando o payload chega em uma requisição e executa em outra: SSTI armazenado renderizado em uma página de perfil, um payload escrito em um log que um motor de template posteriormente renderiza, um job enfileirado. O endpoint observado é diferenciado contra um snapshot tirado antes de qualquer sondagem ser enviada.--bridges) — COPY … FROM PROGRAM, xp_cmdshell, expect://. Uma ponte é um transportador, não um oráculo: ela envolve o comando que os métodos já constroem, então os mesmos níveis se aplicam através dela.-p all) — query, folhas JSON, campos de formulário, partes multipart, cookies, cabeçalhos e segmentos de caminho, cada um codificado para onde cai, com o custo da sondagem impresso antes de qualquer disparo. Um corpo GraphQL é ordenado pelo que pode realmente confirmar: as variables que um resolver lê antes do próprio documento de operação.Combine métodos livremente: --methods reflected,eval,time executa os três e reporta cada nível separadamente.
Escopo honesto. O RCEKit confirma RCE que é alcançável por injeção em uma requisição e interpretado por um shell ou um avaliador. Ele não cobre bugs de corrupção de memória (buffer overflow, UAF) ou injeção de argumentos em um array
argvsem shell — esses são problemas diferentes. Cadeias de gadgets de desserialização também ficam fora do escopo:--methods deserprova que um endpoint desserializa dados do atacante e o diz em seu próprio nível, mas qual gadget (se algum) transforma isso em execução depende do classpath do alvo, e o RCEKit não afirma saber. Ele visa ser excelente nas classes de RCE orientadas por injeção acima em vez de medíocre em tudo.
As outras ferramentas neste espaço são construídas para te colocar dentro. O RCEKit é construído para que o achado sobreviva ao escrutínio de outra pessoa — o reteste do cliente, a fila de triagem, a revisão do relatório. Essa diferença aparece três vezes.
Você raramente sabe a classe antes de testar. Cobrir um sink desconhecido com ferramentas de classe única significa executar cada uma por vez e reconstruir a requisição para cada uma:
| Pode confirmar | RCEKit | commix | SSTImap | Nuclei |
|---|---|---|---|---|
| Injeção de comando do SO | ✅ | ✅ (todo o seu escopo) | — | por template |
| Injeção de expressão / SSTI | ✅ | via sua técnica baseada em eval | ✅ (todo o seu escopo) | por template |
| Cego — timing | ✅ como um nível separado | ✅ | ✅ | — |
| Cego — fora de banda | ✅ listener embutido | — | — | via interactsh |
| Sem egresso — escrever & buscar de volta | ✅ qualquer caminho de leitura | ✅ (raiz web) | — | — |
Sinks cmd.exe e PowerShell | ✅ sondagens por dialeto | ✅ (cmd) | — | por template |
| Upload → escrever-depois-executar | ✅ escrita vs. execução, níveis separados | — | — | por template |
| Segunda ordem — chega aqui, executa lá | ✅ | — | — | — |
| Ponte de linguagem de consulta para o SO | ✅ | — | — | por template |
| Sink de desserialização | ✅ nível próprio, nunca chamado de RCE | — | — | por template |
| Tudo o acima, uma CLI, uma execução | ✅ | — | — | — |
Cobertura conforme a lista de técnicas documentadas de cada projeto. SSTImap é o sucessor mantido do tplmap, que seu autor marcou como não mantido.```bash
python rcekit.py --acknowledge-consent -r request.txt -p host --methods reflected,eval,time
### 2. Ele discute com os próprios resultados
Uma ferramenta relata o que encontrou. O RCEKit também relata **no que se recusou a acreditar** —
`inconclusive` é um veredito próprio, para evidências que apareceram mas não puderam
ser atribuídas à execução:```
[detect] methods: reflected, eval
[detect] sent 13 probes: confirmed=0, inconclusive=2, negative=11
Aqueles dois teriam sido descobertas de outra pessoa. Cinco mecanismos produzem esse veredito, e eles são executados em cada confirmação:
inconclusive, não uma descoberta.$((a+b)); apenas a execução retorna o valor.confirmed.O mesmo instinto funciona no sentido oposto. Timing nunca se autoconfirma, um callback de desserialização nunca é chamado de RCE, e uma execução que não construiu nenhuma sonda nunca é chamada de negativa.
Os controles que as regras de engajamento de um cliente realmente pedem, na ferramenta em vez de nas suas anotações:
| Portão de consentimento | Nada exploratório é gerado ou disparado sem --acknowledge-consent. |
| Plano de execução | Imprime a contagem exata de sondas, formas de sink, níveis de segurança e quaisquer destinos de callback de saída antes da primeira requisição sair. |
| Seguro por padrão | Reverse shells, acesso a credenciais, metadados de nuvem, movimento lateral e escape de contêiner são retidos até você elevar --verify-active-risk; persistência e backdoors precisam de uma segunda flag além disso. Pontes que criam um objeto no alvo estão sujeitas ao mesmo teto. |
| Comandos de limpeza | file, write e as pontes com estado alteram o estado do alvo, então cada descoberta — incluindo um needs-review — imprime o que executar para desfazê-la. |
| Credenciais permanecem no lugar | A busca de leitura de file carrega os cabeçalhos Authorization/Cookie da execução apenas para a mesma origem, e diz isso em voz alta quando os retém. A busca de canal observado não envia nenhum, a menos que você forneça uma requisição com --observe-request. |
| Trilha de auditoria redigida | Cada execução é registrada em exploit_audit.log, registrando que um cabeçalho de credencial foi enviado, nunca o seu valor. |
| Marca d'água | --watermark insere um token rastreável em cada payload, para que um payload encontrado nos logs do cliente meses depois seja atribuível à sua execução. |
| Sem callbacks de terceiros | O listener OOB é seu. Nada é roteado através de um servidor de interação público, o que alguns engajamentos proíbem terminantemente. |
| Um único arquivo stdlib | rcekit.py roda sozinho — jump box, host air-gapped, em qualquer lugar onde pip install não é uma opção. |
Quer um shell em vez de um veredito? commix e SSTImap continuam para
pós-exploração; o RCEKit para na prova por design. Varrendo milhares de hosts
em busca de CVEs conhecidas? Esse é o trabalho do Nuclei — e o RCEKit escreve templates
do Nuclei (--output-format nuclei), então ele alimenta o seu scanner em vez de competir com ele.
Já sabe que a injeção é SQL e quer o banco de dados em si?
sqlmap domina esse terreno — as
pontes do RCEKit existem para provar que o SO é alcançável a partir de um parâmetro de texto, não para
explorar o banco de dados.
Cada linha é um exemplo prático no guia de campo — o comando, o que ele envia, e como ler o que volta.
| Situação | Vá para |
|---|---|
| Tenho uma URL e um parâmetro | Aponte para uma URL |
| Tenho uma requisição salva do Burp | Aponte para uma requisição capturada |
| A aplicação é JSON / o payload continua sendo corrompido | Fazendo o payload chegar intacto |
| Não sei qual classe é | Escolhendo métodos |
O sink remove ; | Quando o sink filtra separadores |
Minha entrada cai dentro de 'aspas' | Injetando dentro de aspas |
| O sink executa minha entrada como o comando inteiro | Sinks de comando inteiro |
| O alvo é Windows ou o sink é PowerShell | Sinks Windows e PowerShell |
| Há um WAF | Contornando um WAF |
| Nenhuma saída volta | Alvos cegos |
| Nenhuma saída e nenhuma saída de rede | Alvos sem saída de rede |
| A requisição armazena um arquivo em vez de executar algo | Alvos de upload e primitiva de escrita |
| O payload executa depois, em uma requisição diferente |
| Verifique você mesmo | Reproduza as confirmações acima na sua própria máquina, contra alvos vulneráveis em docker. Cinco minutos. |
| Guia de campo | Passo a passo orientado a exemplos de cada situação real, da primeira sonda a cadeias multi-etapa. Comece aqui. |
| Geração de payload & exportações | O RCEKit como gerador de payload: perfis de alvo, e exportações para Burp / ffuf / Nuclei. |
| Referência | Cada flag, ambiente, categoria, contexto, codificação e sink de execução de código. |
| CHANGELOG.md | O que mudou em cada versão, e o que reverificar ao atualizar. |
| CONTRIBUTING.md | Como adicionar sinks, categorias, codificações e métodos de detecção. |
| SECURITY.md | Reportando uma vulnerabilidade no próprio RCEKit. |
O RCEKit explora, e esse é o ponto. Uma vulnerabilidade é confirmada fazendo o alvo executar a coisa, porque essa é a única evidência que uma assinatura não pode falsificar e uma build corrigida não pode produzir por acidente. O que limita uma execução não é a relutância em explorar. São dois fatos estruturais e um interruptor.
Ele não aceita nenhum payload arbitrário seu. As sondas são construídas pelo motor para servir a um oráculo — aritmética sobre operandos aleatórios para aquela sonda, um nome que apenas esta execução poderia ter escolhido. Não há entrada que transforme a detecção em outra coisa, porque não há tal entrada a fornecer.
Qualquer coisa que vá além de computar um valor declara o nível que precisa, então uma
flag decide até onde uma execução vai: --verify-active-risk safe | intrusive | stateful. Um método ou uma forma de sonda única acima desse nível é retido pelo
nome, com a flag que o enviaria — uma escada que encolhe silenciosamente é
indistinguível de um alvo sem nada a encontrar. Contra uma instância descartável, eleve o nível e obtenha tudo o que a ferramenta tem.
--acknowledge-consent; --detection-only é benigno e não exige.--verify-active-risk. Payloads destrutivos (persistência, backdoors) nunca são
disparados sem --verify-allow-destructive. Um plano de execução imprime exatamente
o que será enviado antes de qualquer coisa disparar.safe / intrusive / stateful. Payloads do corpus são
filtrados por --max-safety; métodos de detecção e suas formas de sonda declaram
os mesmos degraus e são filtrados por --verify-active-risk, então um método que
faz o alvo se comunicar externamente ou deixa algo para trás está sujeito à mesma
ordenação que cada payload do corpus. O pré-voo nomeia o nível que cada item retido
realmente precisa. file e write são controlados pela sua própria configuração
em vez disso: nenhum dos dois faz nada até você nomear um diretório para escrever e uma
URL para ler de volta.exploit_audit.log; --watermark incorpora um token rastreável; logs de execução vão para
rcekit.log.--template-file explícito que está ausente, faz o RCEKit se recusar a rodar e sair com código diferente de zero
em vez de gerar silenciosamente nada (--doctor verifica isso). Apenas um arquivo de corpus
padrão ausente recorre à cópia embutida, e ele avisa quando
o faz.Este toolkit destina-se apenas a testes de penetração autorizados, pesquisa de segurança, educação e treinamento defensivo. Nunca o use contra sistemas sem permissão explícita — testes não autorizados são ilegais.
python -m unittest discover -s tests # dependency-free test suite
Contribuições são bem-vindas — novos sinks/categorias, codificações, ambientes, métodos
de detecção, correções de bugs e documentação. As bases de payload ficam em templates JSON
editáveis (`templates/payloads.json`), então a maior parte da cobertura é estendida sem tocar no
código-fonte Python. Após alterar o corpus, atualize a cópia embutida que acompanha o
`rcekit.py`:```bash
python tools/embed_corpus.py # --check verifies it is current
A suíte de testes falha se os dois divergirem. Consulte CONTRIBUTING.md.
MIT — consulte LICENSE.
deserialization-sink| Cego / fora de banda — exfil, assíncrono | oob | Listener HTTP/DNS embutido recebe callbacks e correlaciona cada um ao payload exato; cada sondagem carrega seu próprio token. |
| Sinks de lookup de expressão — Log4Shell/JNDI | lookup | O sink resolve uma URI ${jndi:…} em vez de executar um comando, então as sondagens de shell do oob não alcançam nada. Prova apenas pelo callback e reporta lookup-sink, nunca confirmed. Apenas jndi:dns:// é enviado — uma consulta de nome e nada mais — então o que é provado é o lookup, não uma cadeia de gadgets. |
| Quando a execução acontece em outra requisição |
| O ponto de injeção é SQL e o sink é o host do banco de dados | Pontes de linguagem de consulta |
| O endpoint recebe um objeto serializado | Sinks de desserialização |
| O sink está atrás de um login ou de um upload de arquivo | Cadeias multi-etapa |
Recebi needs-review / inconclusive / error | Lendo os resultados |
| Diz que o corpus é inutilizável | Solução de problemas |