
Test de pénétration d'application web en Go
GOWAPT est le petit frère de wfuzz, un couteau suisse du WAPT. Il permet au pentester d'effectuer d'énormes activités sans aucun stress, il suffit de le configurer et tout se fait en quelques clics.
Pour installer gowapt, tapez simplement :
make
sudo make install
Depuis le menu -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
Exemples
Scannez http://www.example.com et filtrez toutes les requêtes 200 OK
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -f "code == 200"
Scannez http://www.example.com en fuzzant le paramètre GET vuln à la recherche de XSS (supposons qu'il avait 200 balises avec une requête légitime)
gowapt -u "http://www.example.com/?vuln=FUZZ" -w wordlist/Injections/XSS.txt -f "tags > 200"
Scannez http://www.example.com en fuzzant le paramètre POST vuln à la recherche de XSS (supposons qu'il avait 200 balises avec une requête légitime)
gowapt -u "http://www.example.com/" -d "vuln=FUZZ" -w wordlist/Injections/XSS.txt -f "tags > 200"
Scannez http://www.example.com protégé par authentification et filtrez toutes les requêtes 200 OK
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -f "code == 200" -a "user:password"
Scannez http://www.example.com en ajoutant l'en-tête Hello: world et filtrez toutes les requêtes 200 OK
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -f "code == 200" -H "Hello: world"
Scannez http://www.example.com en utilisant l'authentification de base avec utilisateur/mot de passe guest:guest
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -a "guest:guest"
Scannez http://www.example.com en ajoutant une extension
gowapt -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt -x myextension.js
Scannez http://www.example.com via un proxy (comme Burp) :
gowapt -p "http://localhost:8080" -u "http://www.example.com/FUZZ" -w wordlist/general/common.txt
Scannez http://www.example.com (reçu du proxy) et filtrez toutes les requêtes 200 OK
gowapt --from-proxy -w wordlist/general/common.txt
Exécutez le mode scanner sur http://www.example.com (reçu du proxy) avec les plugins par défaut
gowapt --from-proxy --scanner --plugin-dir plugin/
Ensuite, ouvrez BurpSuite, envoyez la requête que vous souhaitez fuzzer dans Repeater et définissez un proxy amont sur 127.0.0.1:31337. Lorsque vous êtes prêt, cliquez sur Envoyer. Si tout s'est bien passé, vous devriez voir en réponse Request received by GOWAPT
Les extensions sont un moyen simple d'étendre les fonctionnalités de gowapt. Une machine virtuelle JavaScript est responsable du chargement et de l'exécution des fichiers d'extension.
Ci-dessous une liste des API actuellement implémentées
* PS : Lors de l'utilisation de setHTTPInterceptor, la méthode de callback reçoit 3 paramètres :
Étant donné la nature de sendRequestSync, cela ralentira le moteur en raison de la requête synchrone, donc utilisez-le avec modération
Plus d'informations sur l'exemple d'extension ci-dessous :
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"})
}
})
Un nouveau mode appelé Scanner a été introduit avec le dernier commit. Il permet à l'utilisateur de créer des plugins entièrement personnalisables pour effectuer un scan web actif. Pour plus d'informations, lisez le Wiki !
Les wordlists proviennent du projet wfuzz ! Merci beaucoup les gars !
Ci-dessous la liste des encodeurs disponibles
Vous pouvez appliquer des filtres sur les variables suivantes
gowapt est publié sous la licence GPL 3.0 et est copyleft de Daniele 'dzonerzy' Linguaglossa
| Méthode | Nombre de paramètres | Description | Paramètres |
|---|
| addCustomEncoder | 2 | Créer un encodeur personnalisé à utiliser avec les wordlists | Param1 -> EncoderName (string) Param2 -> EncoderLogic (function) |
| panic | 1 | Pour le débogage, faire planter l'application | Param1 -> PanicText (string) |
| dumpResponse | 2 | Vider une requête/réponse complète sur le disque, utile pour sauvegarder un cas de test | Param1 -> ResponseObject (http.Response) Param2 -> Path (string) |
| setHTTPInterceptor | 1 | Créer un intercepteur pour les requêtes HTTP sortantes et les réponses entrantes | Param1 -> HTTPCallback (function) * |
| sendRequestSync * | 4 | Envoyer une requête HTTP de manière synchrone | Param1 -> Method (string) Param2 -> Url (string) Param3 -> PostData (string) Param4 -> Headers (Object{Name:Value}) |