
Un fuzzer da riga di comando per il protocollo Apache JServ (ajp13)
AJPFuzzer è un fuzzer rudimentale per il Apache JServ Protocol (ajp13).
Costruito sopra libajp13, lo strumento permette di creare e inviare messaggi AJP usando un'interfaccia a riga di comando facile da usare. AJPFuzzer può creare messaggi AJP13 correttamente formattati (tutti i tipi di messaggio) così come mutazioni (ad esempio bit flipping, messaggi con tipo non corrispondente, ecc.), facilitando gli sforzi di test di sicurezza mirati a servizi basati su AJP come moduli AJP di server web, contenitori J2EE e molti altri.
Scarica l'ultimo jar di AJPFuzzer dalla pagina delle releases
Esegui il jar scaricato usando:
$ java -jar ajpfuzzer_v0.7.jar
Lo strumento mostrerà una shell. Digitando ?list, è possibile elencare tutti i comandi disponibili. A questo punto, puoi connetterti al target usando:
AJPFuzzer> connect 127.0.0.1 8009
Poi, puoi inviare un messaggio CPing (tipo 10) semplicemente digitando '10' (nessun argomento è necessario per questo messaggio)
AJPFuzzer/127.0.0.1:8009> 10
Il seguente screenshot illustra l'esecuzione completa:
Ovviamente, è possibile inviare messaggi più complessi specificando il caso di test e gli argomenti appropriati. Fare riferimento a ?list per tutti i dettagli su un comando specifico.
Per esempio, possiamo inviare un messaggio di tipo ForwardRequest completamente personalizzato usando:
> forwardrequest 2 "HTTP/1.1" "/api/" 127.0.0.1 localhost porto 8009 false "Cookie:AAAA=BBBB" ""
È anche possibile inviare un messaggio ForwardRequest fuzzando elementi arbitrari:
> genericfuzz 2 "HTTP/1.1" "/test.html" "127.0.0.1" "127.0.0.1" "server.name.test" 8009 false "Cookie:AAAA=BBBB" "secret:FUZZ" /tmp/list.txt
Ad oggi, AJPFuzzer fornisce i seguenti casi di test:
Nuovi casi di test possono essere aggiunti estendendo la classe AJPTestCases.java. Usando l'annotazione @Command, lo strumento riconoscerà il comando aggiuntivo e lo renderà disponibile dalla CLI.
| Id | Name | Descrizione |
|---|
| 1 | body | Invia un messaggio body dal web server al contenitore J2EE |
| 2 | forwardrequest | Avvia il ciclo di elaborazione della richiesta dal web server al contenitore J2EE |
| 3 | sendbodychunk | Invia un chunk del body dal contenitore J2EE al web server |
| 4 | sendheaders | Invia gli header della risposta dal contenitore J2EE al web server |
| 5 | endresponse | Segna la fine della risposta, dal contenitore J2EE al web server |
| 6 | getbodychunk | Ottieni ulteriori dati dal richiedente. Messaggio dal contenitore J2EE al web server |
| 7 | shutdown | Invia un pacchetto standard di shutdown AJP13 |
| 8 | ping | Invia un pacchetto AJP13 di ping (ping != CPing) |
| 9 | cpong | Invia un pacchetto AJP13 CPong |
| 10 | cping | Invia un pacchetto AJP13 CPing |
| 11 | forwardreqalltypes | Invia un pacchetto AJP13 ForwardRequest, con tutti i possibili tipi di pacchetto |
| 12 | verbtampering | Invia più richieste tramite AJP13 e fai HTTP Verb Tampering, per rilevare potenziali falle di bypass dell'autenticazione |
| 13 | jettyleak | Invia un pacchetto AJP13 in stile JettyLeak |
| 14 | hugelengthsmallbody | Invia messaggi ForwardRequest+Body, con un grande Content-Length e un piccolo Body |
| 15 | hugeheader | Invia due pacchetti AJP13 ForwardRequest con lunghezza dell'header maggiore di 0x9999 (es. A010) |
| 16 | fuzzbit | Crea un AJP13 ForwardRequest complesso e avvia il bit flipping |
| 17 | fuzzslice | Crea un AJP13 ForwardRequest, SendHeaders, ShutDown, 0xFF, 0x00. Taglia e invia. |
| 18 | servletpath | Crea un AJP13 ForwardRequest con attributo 'servlet_path' arbitrario |
| 19 | bypassauthnull | Crea due AJP13 ForwardRequest con auth_type impostato a 'null' |
| 20 | envars | Crea un AJP13 ForwardRequest con req_attribute_code (10) per impostare variabili d'ambiente arbitrarie |
| 21 | hugepacketsize | Crea due richieste AJP13 con dimensione > 8192 byte |
| 22 | genericfuzz | Crea un AJP13 ForwardRequest (GET) che permette di fuzzare elementi arbitrari del messaggio usando la parola chiave FUZZ |