Toolkit per il rilevamento e la conferma di RCE che verifica URL o richieste HTTP catturate per command injection, SSTI, percorsi blind e OOB, restituendo verdetti a livelli con prova.
confirmed significa che il target ha eseguito l'input. negative significa che le sonde lo hanno raggiunto.
Versione 2.40.0 · MIT · Python 3.8+ · zero dipendenze di terze parti
RCEKit è un toolkit di rilevamento e conferma RCE per penetration testing autorizzato, red teaming e ricerca sulla sicurezza. Puntalo verso un target che sei autorizzato a testare — un URL o una richiesta HTTP catturata — e ogni risultato torna con il livello che ha guadagnato.
Ogni confirmed si basa su un valore che RCEKit ha generato casualmente per quella sonda e
che quella riflessione non può produrre: un risultato calcolato presente nella risposta e
assente da un controllo senza payload, oppure un callback out-of-band che trasporta un token
che solo il target ha mai posseduto. I segnali più deboli mantengono i propri livelli e non vengono mai
promossi a confirmed. E un'esecuzione che non ha potuto testare qualcosa non lo riporta mai come
pulito.
RCEKit conferma RCE attraverso molteplici metodi sotto un'unica CLI. Di seguito è puntato verso CVE reali e documentati pubblicamente in software di produzione — ogni verdetto differenziato rispetto a un controllo senza payload:
| Classe RCE | --methods | Target reale | Verdetto |
|---|---|---|---|
| OS command injection (basata su risultati) | reflected | Webmin 1.910 — CVE-2019-15107 | confirmed |
| Expression injection (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 |
| Blind command injection (nessun output) | time | Webmin 1.910 — CVE-2019-15107 | needs-review |
Ogni riga è riprodotta da tests/bench/, che esegue RCEKit
contro queste build sotto Docker e verifica il verdetto e il suo controllo
negativo. Ultima esecuzione verde alla 2.36.0 (2026-09-20): 3/3 casi. Questa è una
affermazione puntuale, non continua -- il benchmark viene eseguito con una cadenza,
non a ogni modifica.
Ogni controllo è il vero test della riga. Struts2 sondato con reflected torna
negative, perché S2-001 rivaluta OGNL e non c'è una shell dietro di esso.
Il segnale time di Webmin è mantenuto a needs-review su un target dove capita di
essere corretto. E Solr sondato con oob torna negative sebbene sia
sfruttabile -- oob costruisce comandi shell e un sink ${jndi:...} non ne esegue
nessuno, che è il divario che lookup esiste per colmare, misurato piuttosto che
asserito.
La riga Log4Shell dice lookup-sink, non confirmed: ciò che il callback prova
è che il sink ha risolto un URI scelto da RCEKit. Raggiungere RCE richiede un server che
risponda alla lookup con una classe caricabile, e al livello di rischio predefinito solo
jndi:dns:// esce -- una name lookup, senza alcuna connessione oltre essa per un tale
server a cui rispondere.
reflected — OS command injection, Webmin CVE-2019-15107 → confirmed
eval — OGNL expression injection, Apache Struts2 S2-001 → confirmed
lookup-sink
time — blind command injection, Webmin CVE-2019-15107 → needs-review
RCEKit ha due forme supportate, e nessuna è un fallback per l'altra.
Installalo — pipx mantiene la CLI nel proprio ambiente, che è ciò che
vuoi per uno strumento piuttosto che una libreria:```bash
pipx install rcekit # or: pip install rcekit
rcekit --doctor # confirms the corpus it will run with
**Oppure prendi solo quel singolo file.** Il corpus di payload è integrato nel modulo, quindi
`rcekit.py` funziona da solo senza nient'altro accanto — nessun passaggio di installazione, nessun
site-packages, nulla da lasciare dietro. Su un jump box del cliente, un host air-gapped,
o ovunque `pip install` non sia un'opzione:```bash
curl -O https://raw.githubusercontent.com/kabiri-labs/rcekit/main/rcekit.py
python rcekit.py --doctor # same corpus, same check, zero installation
Entrambi eseguono lo stesso codice e riportano gli stessi verdetti. Lavorare da un checkout è il terzo modo, e non richiede alcuna installazione:```bash git clone https://github.com/kabiri-labs/rcekit.git cd rcekit # Python 3.8+, standard library only
Metti un marker `FUZZ` dove arriva il tuo input (oppure seleziona un parametro con `-p` quando
usi una richiesta catturata), e chiedi a RCEKit di dimostrare l'RCE:```bash
rcekit --acknowledge-consent \
--verify-url "https://target.example/lookup?host=FUZZ" \
--methods reflected,eval
| -s | --server | SERVER | http://localhost:8080 | URL del server MCP |
| -t | --token | TOKEN | null | Token di autenticazione |
| -c | --config | CONFIG | null | File di configurazione |
| -v | --verbose | VERBOSE | false | Abilita output dettagliato |
| -h | --help | HELP | false | Mostra il messaggio di aiuto |
# Avvia il server MCP con impostazioni predefinite
mcp-server
# Avvia con porta e host personalizzati
mcp-server --port 9090 --host 0.0.0.0
# Abilita output dettagliato
mcp-server --verbose
# Usa un file di configurazione
mcp-server --config /path/to/config.json
Aggiungi quanto segue al file di configurazione di Claude Desktop:
{
"mcpServers": {
"kitploit": {
"command": "node",
"args": ["/path/to/mcp-server/index.js"],
"env": {
"MCP_SERVER_URL": "http://localhost:8080"
}
}
}
}
Installa l'estensione MCP per VS Code e configura il server:
{
"mcp.servers": {
"kitploit": {
"command": "node",
"args": ["/path/to/mcp-server/index.js"]
}
}
}
# Clona il repository
git clone https://github.com/kitploit/mcp-server.git
cd mcp-server
# Installa le dipendenze
npm install
# Avvia in modalità sviluppo
npm run dev
# Esegui tutti i test
npm test
# Esegui i test con copertura
npm run test:coverage
# Esegui i test in modalità watch
npm run test:watch
# Crea la build di produzione
npm run build
# Avvia la build di produzione
npm start
I contributi sono benvenuti! Segui questi passaggi:
git checkout -b feature/amazing-feature)git commit -m 'Add some amazing feature')git push origin feature/amazing-feature)Questo progetto è distribuito sotto licenza MIT. Consulta il file LICENSE per i dettagli.
Nota: Questo progetto è fornito solo a scopo educativo e di ricerca. Gli autori non sono responsabili per qualsiasi uso improprio.``` [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)
### Da una richiesta catturata — la forma che hanno la maggior parte dei target reali
Un `--verify-url` trasporta un URL e nient'altro. La maggior parte dei sink che vale la pena testare si trova
dietro una POST con un cookie di sessione, un content type e un body, e RCEKit prende
quella richiesta intera: salvala dal tuo proxy o dai devtools del tuo browser e indica
il campo in cui iniettare.```bash
rcekit --acknowledge-consent \
-r search.req -p q \
--methods reflected,eval
python3 CVE-2025-55182.py --url http://target.com
| Opzione | Descrizione |
|---|---|
--url | URL di destinazione (obbligatorio) |
--proxy | Proxy HTTP (es. http://127.0.0.1:8080) |
--headers | File contenente header personalizzati |
--timeout | Timeout della richiesta in secondi (predefinito: 10) |
--verbose | Abilita output dettagliato |
# Test di base
python3 CVE-2025-55182.py --url http://target.com
# Con proxy
python3 CVE-2025-55182.py --url http://target.com --proxy http://127.0.0.1:8080
# Con header personalizzati
python3 CVE-2025-55182.py --url http://target.com --headers headers.txt
# Modalità dettagliata
python3 CVE-2025-55182.py --url http://target.com --verbose
Lo script invia una richiesta POST appositamente predisposta all'endpoint /api/upload con un payload multipart che sfrutta la vulnerabilità di path traversal. La risposta viene analizzata per determinare se il target è vulnerabile.
POST /api/upload HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary
------WebKitFormBoundary
Content-Disposition: form-data; name="file"; filename="../../../../etc/passwd"
Content-Type: application/octet-stream
<contenuto del file>
------WebKitFormBoundary--
Lo script controlla la risposta alla ricerca di indicatori di sfruttamento riuscito:
Questo progetto è rilasciato sotto la licenza MIT.``` [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)
Il metodo, il percorso, gli header, il body e i cookie vengono riutilizzati così come catturati, e ogni valore viene codificato per il contesto in cui finisce — una foglia JSON, un campo di form e un cookie non vengono escapati allo stesso modo. Ometti `-p` e contrassegna il punto con `FUZZ` o `*`, se preferisci.
### Tutto ciò che lo strumento ha
Due cose sono raggiungibili solo da una richiesta catturata: l'**enumerazione dei punti di iniezione** (`--auto-params`), e qualsiasi sink che richiede una sessione. Quindi l'esecuzione più completa che RCEKit può fare parte da `-r`, non da un URL — cosa che vale la pena sapere prima di concludere che un target è pulito.```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
python3 CVE-2025-55182.py -u <URL> -c <COMMAND>
# Esegui il comando 'id' sul server di destinazione
python3 CVE-2025-55182.py -u http://target.com -c "id"
# Esegui il comando 'whoami' sul server di destinazione
python3 CVE-2025-55182.py -u http://target.com -c "whoami"
# Esegui il comando 'ls -la' sul server di destinazione
python3 CVE-2025-55182.py -u http://target.com -c "ls -la"
Lo script sfrutta la vulnerabilità CVE-2025-55182 inviando una richiesta POST appositamente predisposta all'endpoint di destinazione. La richiesta contiene un payload progettato per attivare l'esecuzione di codice in remoto (RCE) sul server.
requestspip install requests
Questo strumento è fornito solo a scopo didattico e di ricerca sulla sicurezza. Gli autori non sono responsabili per qualsiasi uso improprio o danno causato da questo software. Usalo in modo responsabile e solo su sistemi che possiedi o per cui hai ricevuto autorizzazione esplicita.
Questo progetto è rilasciato sotto la Licenza MIT.``` [verify] loaded request from search.req: enumerating 4 injection point(s) [detect] enumerating 4 injection point(s) x 3 method(s) [detect] cost: 4 points x ~1739 probes = at least 6964 requests [detect] body param 'q': confirmed (1544 probes) <-- CONFIRMED [detect] sent 6371 probes: confirmed=446, negative=5925
Cosa apre ciascun flag:
| | |
|---|---|
| `--auto-params all` | ogni valore di query, foglia JSON, campo di form, parte multipart, cookie e header, invece di un singolo campo denominato |
| `--point-order thorough` | ogni header non hop-by-hop, non solo quelli ad alto rendimento |
| `--methods ...,lookup,deser` | sink di expression-lookup e deserializzazione, che i metodi a forma di shell non riescono a raggiungere |
| `--oob-host` | un host di callback per i metodi blind. Richiede un dominio delegato a te; la porta 53 richiede root |
| `--verify-active-risk stateful` | il livello più alto — aggiunge le forme di probe che fanno sì che il target effettui una richiesta da un indirizzo che RCEKit non ha scelto |
| `--probe-depth full` | ogni forma di break-out per sink, non solo quelle economiche |
| `--detect-json` | gli stessi verdetti in JSON leggibile da macchina |
**Queste sono un sacco di richieste.** La riga di costo viene stampata prima che qualsiasi cosa parta, e
`--max-points` / `--max-payloads` la limitano. Eseguilo contro un'istanza che ti è
consentito rompere: `--verify-active-risk stateful` è il livello per un target usa e getta, non per la produzione.
Nessuna infrastruttura esterna, nessun file di configurazione.
**Non fidarti delle GIF** — [riproducile tu stesso](https://github.com/kabiri-labs/rcekit/blob/main/docs/verify-it-yourself.md)
contro target Webmin e Struts2 dockerizzati in circa cinque minuti.
**Poi:** la [**guida sul campo**](https://github.com/kabiri-labs/rcekit/blob/main/docs/guide.md) affronta le situazioni reali — richieste
catturate, WAF, separatori filtrati, sink tra virgolette, target blind e senza egress —
un esempio pratico ciascuna.
---
## Cosa significa un verdetto
Trovare un *candidato* RCE è facile. Segnalarne uno che sopravvive al retest di qualcun altro
è la parte difficile, e fallisce in due direzioni: un "possibilmente vulnerabile"
che si rivela essere reflection, e un "non vulnerabile" da un'esecuzione che in realtà
non ha testato nulla.
RCEKit risponde con **otto verdetti che non vengono mai collassati l'uno nell'altro**:
| Verdetto | Cosa asserisce |
|---|---|
| **`confirmed`** | Il target ha eseguito l'input. Ha restituito un valore che non avrebbe potuto produrre altrimenti — calcolato da operandi casuali per quella specifica probe — e quel valore è assente da un controllo senza payload. |
| **`deserialization-sink`** | Il target ha ricostruito un grafo di oggetti fornito dall'attaccante. Provato, ma riguarda una *proprietà diversa*: raggiungere l'RCE da lì dipende da gadget nel classpath, quindi non viene mai chiamato RCE. |
| **`lookup-sink`** | Il target ha risolto un URI che RCEKit gli ha passato — un'espressione `${jndi:…}` ha raggiunto un lookup, provato su un callback che portava un token detenuto solo da quella probe. È un sink, non un'esecuzione: raggiungere l'RCE da lì richiede un server che risponda con una classe caricabile. |
| **`needs-review`** | Un segnale reale che non è prova di per sé — una regressione temporale lineare, un fingerprint del parser. Vale il tuo tempo, mai la parola "confirmed". |
| **`inconclusive`** | L'evidenza è apparsa, ma non è stato possibile attribuirla all'esecuzione — anche il controllo senza payload la conteneva. |
| **`negative`** | Le probe sono state costruite, hanno raggiunto il target e non hanno trovato nulla. |
| **`error`** | Nulla ha raggiunto il target. |
| **`nothing-tested`** | Non è stata costruita alcuna probe. |
Nel momento in cui `confirmed` e `maybe` si confondono, `confirmed` smette di significare qualcosa — quindi
nulla viene mai promosso verso l'alto. Una regressione temporale resta `needs-review` per quanto
pulita sia la pendenza. Un callback di deserializzazione resta `deserialization-sink` per quanto
tu sia certo che il classpath sia sfruttabile.
### L'altra metà: un'esecuzione che non ha testato nulla non è mai pulita
Le ultime due righe sono quelle che gli altri strumenti non hanno, e contano più di
quanto sembri. Uno scanner che non ha potuto raggiungere il target, o che non ha costruito alcuna probe
perché i tuoi flag le escludevano tutte, non ha appreso **nulla** sul target —
e stampare `negative` in quel caso è una bugia che si legge esattamente come sicurezza.
Quindi `error` e `nothing-tested` sono verdetti di prima classe, l'esecuzione esce con codice diverso da zero,
e RCEKit dice quale dei due si è verificato e perché:```
[!] 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.
Colpisce ovunque una run possa silenziosamente diventare vuota: un metodo che non
si applica agli ambienti selezionati, un gradino --sink-shape per cui la shell
scelta non ha sintassi, una selezione --bridges interamente trattenuta dal
tetto di sicurezza, un corpo di richiesta che ha interrotto la consegna prima di
arrivare.
Una run che è stata solo parzialmente accecata riceve lo stesso trattamento un livello più in basso. Se hai richiesto un oracolo di secondo ordine e l'endpoint osservato non ha mai risposto, i verdetti delle sonde restano validi — ma la run ti dice che sono stati decisi senza mai leggere il canale verso cui l'hai puntato, invece di lasciarli passare per un negativo di secondo ordine.
Una CLI, un flag --methods, che copre i principali percorsi verso l'RCE:
| Classe RCE | --methods | Come RCEKit lo dimostra |
|---|---|---|
| OS command injection | reflected | Fa calcolare alla shell $((a+b)) su operandi casuali e collassare $(echo TAG); conferma il risultato, mai l'espressione letterale. Scritto nel dialetto del sink stesso — POSIX, cmd.exe o PowerShell. |
Code / expression injection — SSTI, SpEL, OGNL, Groovy, eval() (CWE-94) | eval | Inietta a*b in ogni sintassi di template comune (${…} {{…}} #{…} %{…} <%=…%> @(…), nudo); conferma che il prodotto appare mentre il letterale a*b no. |
| Blind command injection (nessun output) | time | Lancia una serie controllata di ritardi 0/N/2N e conferma che il tempo di risposta segue il ritardo linearmente; riportato come needs-review — il jitter non può falsificarlo, ma il timing non è un valore calcolato. |
| Target interni / senza egress | file | Scrive un token casuale e lo recupera attraverso qualsiasi percorso di rilettura — una web root, un parametro LFI, un handler di download o export, un'anteprima basata su /tmp. Dimostra l'esecuzione più una primitiva di scrittura, senza listener esterno. |
| Primitiva di upload / scrittura — PUT-a-JSP, upload non controllato (CWE-434) | write | Scrive un one-liner che calcola un prodotto attraverso la tua stessa richiesta di upload, poi recupera il file: il prodotto è RCE confirmed, il sorgente che torna indietro verbatim è needs-review — scrittura arbitraria di file, servita ma non interpretata. |
| Sink di deserializzazione — fastjson, shiro, weblogic (CWE-502) | deser | Dimostra che l'endpoint deserializza dati dell'attaccante, tramite un gadget DNS non eseguibile o un differenziale di forma dell'errore. Riportato come , come RCE. |
Tre cose ampliano dove quei metodi possono arrivare, senza cambiare ciò che
ciascuno di essi chiamerà confirmed:
--observe-url) — quando il payload atterra
su una richiesta e viene eseguito su un'altra: SSTI memorizzato renderizzato su
una pagina profilo, un payload scritto in un log che un template engine
renderizza in seguito, un job in coda. L'endpoint osservato viene differenziato
rispetto a uno snapshot preso prima che qualsiasi sonda fosse inviata.--bridges) — COPY … FROM PROGRAM,
xp_cmdshell, expect://. Un bridge è un vettore, non un oracolo: avvolge il
comando che i metodi già costruiscono, quindi gli stessi livelli si applicano
attraverso di esso.-p all) — query, foglie JSON, campi
form, parti multipart, cookie, header e segmenti di path, ciascuno codificato
per dove atterra, con il costo della sonda stampato prima che qualsiasi cosa
parta. Un body GraphQL è ordinato per ciò che può effettivamente confermare: le
variables che un resolver legge prima del documento dell'operazione stesso.Mescola i metodi liberamente: --methods reflected,eval,time esegue tutti e tre e
riporta ciascun livello separatamente.
Ambito onesto. RCEKit conferma l'RCE che è raggiungibile iniettando in una richiesta e interpretato da una shell o da un valutatore. Non copre bug di corruzione della memoria (buffer overflow, UAF) o injection di argomenti in un array
argvsenza shell — quelli sono problemi diversi. Anche le gadget chain di deserializzazione restano fuori ambito:--methods deserdimostra che un endpoint deserializza dati dell'attaccante e lo dice nel proprio livello, ma quale gadget (se esiste) lo trasforma in esecuzione dipende dal classpath del target, e RCEKit non pretende di saperlo. Mira a essere eccellente nelle classi di RCE guidate da injection sopra elencate piuttosto che mediocre in tutto.
Gli altri strumenti in questo spazio sono costruiti per farti entrare. RCEKit è costruito perché il finding sopravviva allo scrutinio di qualcun altro — il retest del cliente, la coda di triage, la revisione del report. Questa differenza si manifesta tre volte.
Raramente conosci la classe prima di testare. Coprire un sink sconosciuto con strumenti a classe singola significa eseguirli uno per uno e ricostruire la richiesta per ciascuno:
| Può confermare | RCEKit | commix | SSTImap | Nuclei |
|---|---|---|---|---|
| OS command injection | ✅ | ✅ (il suo intero ambito) | — | per template |
| Expression injection / SSTI | ✅ | tramite la sua tecnica basata su eval | ✅ (il suo intero ambito) | per template |
| Blind — timing | ✅ come livello separato | ✅ | ✅ | — |
| Blind — out-of-band | ✅ listener integrato | — | — | tramite interactsh |
| No-egress — scrivi & recupera | ✅ qualsiasi percorso di rilettura | ✅ (web root) | — | — |
Sink cmd.exe e PowerShell | ✅ sonde per dialetto | ✅ (cmd) | — | per template |
| Upload → scrivi-poi-esegui | ✅ scrittura vs. esecuzione, livelli separati | — | — | per template |
| Secondo ordine — atterra qui, esegue là | ✅ | — | — | — |
| Bridge verso linguaggi di query all'OS | ✅ | — | — | per template |
| Sink di deserializzazione | ✅ livello proprio, mai chiamato RCE | — | — | per template |
| Tutto quanto sopra, una CLI, una run | ✅ | — | — | — |
Copertura secondo la lista di tecniche documentate di ciascun progetto. SSTImap è il successore mantenuto di tplmap, che il suo autore ha contrassegnato come non mantenuto.```bash
python rcekit.py --acknowledge-consent -r request.txt -p host --methods reflected,eval,time
### 2. Discute con i propri risultati
Uno strumento riporta ciò che ha trovato. RCEKit riporta anche **ciò che si è rifiutato di credere** —
`inconclusive` è un verdetto a sé stante, per prove che sono emerse ma non potevano
essere attribuite all'esecuzione:```
[detect] methods: reflected, eval
[detect] sent 13 probes: confirmed=0, inconclusive=2, negative=11
Sarebbero state scoperte di qualcun altro. Cinque meccanismi producono quel verdetto, e vengono eseguiti a ogni conferma:
inconclusive, non una scoperta.$((a+b)); solo l'esecuzione restituisce il valore.confirmed.Lo stesso istinto vale nella direzione opposta. Il timing non si auto-conferma mai, una callback di deserializzazione non viene mai chiamata RCE, e un'esecuzione che non ha costruito alcuna sonda non viene mai chiamata negativa.
I controlli su cui le rules of engagement di un cliente chiedono effettivamente conto, nello strumento piuttosto che nelle tue note:
| Consent gate | Nulla di sfruttante viene generato o lanciato senza --acknowledge-consent. |
| Execution plan | Stampa l'esatto numero di sonde, le forme dei sink, i livelli di sicurezza e qualsiasi destinazione di callback in uscita prima che parta la prima richiesta. |
| Safe by default | Reverse shell, accesso a credenziali, metadata cloud, movimento laterale e container escape sono trattenuti finché non alzi --verify-active-risk; persistenza e backdoor richiedono un secondo flag in aggiunta. I bridge che creano un oggetto sul target sono soggetti allo stesso tetto. |
| Cleanup commands | file, write e i bridge stateful modificano lo stato del target, quindi ogni scoperta — inclusa una needs-review — stampa cosa eseguire per annullarla. |
| Credentials stay put | Il fetch di rilettura di file porta gli header Authorization/Cookie dell'esecuzione solo verso la stessa origin, e lo dichiara esplicitamente quando li trattiene. Il fetch del canale osservato non ne invia nessuno a meno che tu non gli passi una richiesta con --observe-request. |
| Redacted audit trail | Ogni esecuzione finisce in exploit_audit.log, registrando che un header di credenziale è stato inviato, mai il suo valore. |
| Watermarking | --watermark imprime un token tracciabile in ogni payload, così un payload trovato nei log del cliente mesi dopo è attribuibile alla tua esecuzione. |
| No third-party callbacks | Il listener OOB è tuo. Nulla viene instradato attraverso un server di interazione pubblico, cosa che alcuni ingaggi vietano del tutto. |
| One stdlib file | rcekit.py viene eseguito da solo — jump box, host air-gapped, ovunque pip install non sia un'opzione. |
Vuoi una shell invece di un verdetto? commix e SSTImap proseguono nella
post-exploitation; RCEKit si ferma alla prova per design. Scansionare migliaia di host
alla ricerca di CVE note? È il lavoro di Nuclei — e RCEKit scrive template
Nuclei (--output-format nuclei), quindi alimenta il tuo scanner invece di competere con esso.
Sai già che l'iniezione è SQL e vuoi il database stesso?
sqlmap possiede quel terreno — i bridge di
RCEKit esistono per provare che il OS è raggiungibile da un parametro testuale, non per
sfruttare il database.
Ogni riga è un esempio pratico nella field guide — il comando, cosa invia, e come leggere ciò che ritorna.
| Situazione | Vai a |
|---|---|
| Ho un URL e un parametro | Point at a URL |
| Ho una richiesta salvata da Burp | Point at a captured request |
| L'app è JSON / il payload continua a essere alterato | Landing the payload intact |
| Non so di quale classe si tratti | Choosing methods |
Il sink rimuove ; | When the sink filters separators |
Il mio input finisce dentro 'quotes' | Injecting inside quotes |
| Il sink esegue il mio input come comando intero | Whole-command sinks |
| Il target è Windows o il sink è PowerShell | Windows and PowerShell sinks |
| C'è un WAF | Working around a WAF |
| Non torna indietro alcun output | Blind targets |
| Nessun output e nessuna egress | No-egress targets |
| La richiesta memorizza un file invece di eseguire qualcosa | Upload and write-primitive targets |
| Il payload viene eseguito dopo, su una richiesta diversa |
| Verify it yourself | Riproduci le conferme sopra sulla tua macchina, contro target vulnerabili dockerizzati. Cinque minuti. |
| Field guide | Percorso guidato basato su esempi di ogni situazione reale, dalla prima sonda alle catene multi-step. Inizia qui. |
| Payload generation & exports | RCEKit come generatore di payload: profili target, ed export Burp / ffuf / Nuclei. |
| Reference | Ogni flag, variabile d'ambiente, categoria, contesto, codifica e sink di code-execution. |
| CHANGELOG.md | Cosa è cambiato in ogni release, e cosa ricontrollare in fase di aggiornamento. |
| CONTRIBUTING.md | Come aggiungere sink, categorie, codifiche e metodi di rilevamento. |
| SECURITY.md | Segnalare una vulnerabilità in RCEKit stesso. |
RCEKit sfrutta, e questo è il punto. Una vulnerabilità viene confermata facendo fare al target la cosa, perché è l'unica evidenza che una firma non può falsificare e una build corretta non può produrre per caso. Ciò che delimita un'esecuzione non è la riluttanza a sfruttare. Sono due fatti strutturali e un interruttore.
Non accetta alcun payload arbitrario da te. Le sonde sono costruite dal motore per servire un oracolo — aritmetica su operandi casuali per quella sonda, un nome che solo questa esecuzione avrebbe potuto scegliere. Non esiste un input che trasformi il rilevamento in qualcos'altro, perché non esiste un tale input da fornire.
Qualsiasi cosa che vada oltre il calcolo di un valore dichiara il tier di cui ha bisogno, così un
flag decide fin dove arriva un'esecuzione: --verify-active-risk safe | intrusive | stateful. Un metodo o una singola forma di sonda al di sopra di quel tier viene trattenuto per
nome, con il flag che lo invierebbe — una scala che si accorcia silenziosamente è
indistinguibile da un target senza nulla da trovare. Contro un'istanza usa e getta, alza il tier e ottieni tutto ciò che lo strumento ha.
--acknowledge-consent; --detection-only è benigno e non lo richiede.--verify-active-risk. I payload distruttivi (persistenza, backdoor) non vengono mai
lanciati senza --verify-allow-destructive. Un execution plan stampa esattamente
cosa verrà inviato prima che qualsiasi cosa parta.safe / intrusive / stateful. I payload del corpus sono
filtrati da --max-safety; i metodi di rilevamento e le loro forme di sonda dichiarano
gli stessi gradini e sono filtrati da --verify-active-risk, quindi un metodo che
fa contattare l'esterno al target o lascia qualcosa dietro è soggetto allo stesso
ordinamento di ogni payload del corpus. Il pre-flight nomina il tier di cui ogni elemento trattenuto
ha effettivamente bisogno. file e write sono invece regolati dalla loro stessa configurazione:
nessuno dei due fa nulla finché non indichi una directory in cui scrivere e un
URL da cui rileggere.exploit_audit.log; --watermark incorpora un token tracciabile; i log di esecuzione vanno in
rcekit.log.--template-file mancante, fa sì che RCEKit rifiuti di eseguire e esca con codice diverso da zero
invece di generare silenziosamente nulla (--doctor lo verifica). Solo un file di corpus
predefinito assente ricade sulla copia integrata, e lo dichiara quando
lo fa.Questo toolkit è destinato esclusivamente a penetration testing autorizzato, ricerca sulla sicurezza, formazione e addestramento difensivo. Non usarlo mai contro sistemi senza esplicito permesso — i test non autorizzati sono illegali.
python -m unittest discover -s tests # dependency-free test suite
Contributi benvenuti — nuovi sink/categorie, codifiche, ambienti, metodi di
rilevamento, correzioni di bug e documentazione. Le basi dei payload risiedono in template JSON modificabili
(`templates/payloads.json`), quindi la maggior parte della copertura si estende senza toccare il codice
Python sorgente. Dopo aver modificato il corpus, aggiorna la copia integrata che viene distribuita all'interno di
`rcekit.py`:```bash
python tools/embed_corpus.py # --check verifies it is current
La suite di test fallisce se i due divergono. Vedi CONTRIBUTING.md.
MIT — vedi LICENSE.
deserialization-sink| Blind / out-of-band — exfil, async | oob | Il listener HTTP/DNS integrato riceve i callback e correla ciascuno al payload esatto; ogni sonda porta il proprio token. |
| Sink di expression-lookup — Log4Shell/JNDI | lookup | Il sink risolve un URI ${jndi:…} invece di eseguire un comando, quindi le sonde shell di oob non raggiungono nulla. Lo dimostra sul solo callback e riporta lookup-sink, mai confirmed. Viene inviato solo jndi:dns:// — una risoluzione di nome e nient'altro — quindi ciò che è dimostrato è il lookup, non una gadget chain. |
| When execution happens on another request |
| Il punto di iniezione è SQL e il sink è l'host del database | Query-language bridges |
| L'endpoint accetta un oggetto serializzato | Deserialization sinks |
| Il sink è dietro un login o un upload di file | Multi-step chains |
Ho ottenuto needs-review / inconclusive / error | Reading the results |
| Dice che il corpus è inutilizzabile | Troubleshooting |