
Prueba de penetración de aplicaciones web en Go
GOWAPT es el hermano pequeño de wfuzz, una navaja suiza de WAPT. Permite al pentester realizar actividades masivas sin estrés alguno; solo configúralo y todo se reduce a unos clics.
Para instalar gowapt simplemente ejecuta:
make
sudo make install
Desde el menú de -h
Usage of gowapt:
-H value
A list of additional headers
-a string
Basic authentication (user:password)
-c string
A list of cookies
-d string
POST data for request
-e string
A list of comma separated encoders (default "plain")
-f string
Filter the results
-from-proxy
Get the request via a proxy server
-fuzz
Use the built-in fuzzer
-p string
Use upstream proxy
-plugin-dir string
Directory containing all scanning module
-scanner
Run in scanning mode
-ssl
Use SSL
-t string
Template for request
-threads int
Number of threads (default 10)
-u string
URL to fuzz
-w string
Wordlist file
-x string
Extension file example.js
Ejemplos
Escanear http://www.example.com y filtrar todas las solicitudes 200 OK
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -f "code == 200"
Escanear http://www.example.com fuzzeando el parámetro GET vuln buscando XSS (asumiendo que tenía 200 etiquetas con una solicitud legítima)
gowapt -u "http://www.example.com/?vuln=FUZZ" -w wordlist/Injections/XSS.txt -f "tags > 200"
Escanear http://www.example.com fuzzeando el parámetro POST vuln buscando XSS (asumiendo que tenía 200 etiquetas con una solicitud legítima)
gowapt -u "http://www.example.com/" -d "vuln=FUZZ" -w wordlist/Injections/XSS.txt -f "tags > 200"
Escanear http://www.example.com protegido con autenticación y filtrar todas las solicitudes 200 OK
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -f "code == 200" -a "user:password"
Escanear http://www.example.com añadiendo la cabecera Hello: world y filtrar todas las solicitudes 200 OK
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -f "code == 200" -H "Hello: world"
Escanear http://www.example.com usando autenticación básica con usuario/contraseña guest:guest
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -a "guest:guest"
Escanear http://www.example.com añadiendo una extensión
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -x myextension.js
Escanear http://www.example.com a través de un proxy (como Burp):
gowapt -p "http://localhost:8080" -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt
Escanear http://www.example.com (recibido desde el proxy) y filtrar todas las solicitudes 200 OK
gowapt --from-proxy -w wordlist/general/common.txt
Ejecutar modo escáner en http://www.example.com (recibido desde el proxy) con los plugins por defecto
gowapt --from-proxy --scanner --plugin-dir plugin/
Luego abre BurpSuite, envía la solicitud que deseas fuzzear al repeater y establece un proxy upstream hacia 127.0.0.1:31337. Cuando estés listo, haz clic en enviar. Si todo está correcto, deberías ver como respuesta Request received by GOWAPT
Las extensiones son una forma sencilla de ampliar las características de gowapt. Una máquina virtual JavaScript es la encargada de cargar y ejecutar los archivos de extensión.
A continuación se muestra una lista de la API actualmente implementada.
| Método | Número de parámetros | Descripción | Parámetros |
|---|---|---|---|
| addCustomEncoder | 2 | Crea un codificador personalizado para usar con listas de palabras | Param1 -> EncoderName (string) Param2 -> EncoderLogic (function) |
| panic | 1 | Para depuración, bloquea la aplicación | Param1 -> PanicText (string) |
| dumpResponse | 2 | Vuelca una solicitud/respuesta completa a disco, útil para guardar casos de prueba | Param1 -> ResponseObject (http.Response) Param2 -> Path (string) |
| setHTTPInterceptor | 1 | Crea un interceptor para las solicitudes HTTP salientes y las respuestas entrantes | Param1 -> HTTPCallback (function) * |
| sendRequestSync * | 4 | Envía una solicitud HTTP de forma síncrona | Param1 -> Method (string) Param2 -> Url (string) Param3 -> PostData (string) Param4 -> Headers (Object{Name:Value}) |
* PD: Al usar setHTTPInterceptor, el método de callback recibe 3 parámetros:
Debido a la naturaleza de sendRequestSync, esto ralentizará el motor debido a la solicitud síncrona, así que úsalo con moderación
Más información en el ejemplo de extensión a continuación:
example.js
/*
* Create a custom encoder called helloworld
*
* This encore just add the string "_helloworld" to every payload
* coming from the wordlist
*/
addCustomEncoder("helloworld", myenc);
/*
* Define the callback method for the helloworld encoder
*/
function myenc(data) {
return data + "_helloword";
}
/*
* Create an HTTP interceptor
*
* The interceptor will hook every request / response
* is possible to modify request before send it, anyway the respose item
* it's just shadow copy of the one received from the server so no modification
* are possible
*
*
* request_response is an object which may contains both http.Request
* or http.Response , to know which on is contained check is_request flag
*
* REMEMBER! request_response is an http.* object so you must interact with
* this one just like you would do in golang!
*
* dumpResponse is a built-in function which dump full request-response to
* disk.
* result is an object filled with stats about the response it contains some fields
*
* result.tags => Number of tags in the response
* result.code => HTTP Response status
* result.words => Number of words in the response
* result.lines => Number of lines in the response
* result.chars => Number of chars in the response
* result.request => Full dump of the request
* result.response => Full dump of the response
* result.response => The injected payload
*
*/
setHTTPInterceptor(function(request_response, result, is_request){
if(is_request){
request_response.Header.Set("Hello", "world")
}else{
dumpResponse(request_response, "/tmp/dump.txt")
/*
* Send an HTTP request in a synchronous way
*
* This API accept 4 parameters:
* method => GET | POST | HEAD | PUT | PATCH | UPDATE
* url => The url of the HTTP service
* post_data => The content of request bodyBytes
* headers => A javascript dictionary {headerName => headerValue}
*
* The response object may be null or undefined or an http.Response from golang
*/
var response = sendRequestSync("GET", "http://example.com/", null, {"Fake": "Header"})
}
})
Se introdujo un nuevo modo llamado Scanner con el último commit. Permite al usuario crear plugins totalmente personalizables para realizar escaneos web activos. Para más información, lee la Wiki!.
Las listas de palabras provienen del proyecto wfuzz! ¡Muchas gracias, chicos!
A continuación, la lista de codificadores disponibles:
Puedes aplicar filtros sobre las siguientes variables:
gowapt se publica bajo la licencia GPL 3.0 y es copyleft de Daniele 'dzonerzy' Linguaglossa