
Menschen- und maschinenlesbares Format für Web-Schwachstellentests

explo ist ein einfaches Werkzeug, um Web-Sicherheitslücken in einem menschen- und maschinenlesbaren Format zu beschreiben.
Durch die Definition eines Request-/Condition-Workflows ist explo in der Lage, Sicherheitslücken auszunutzen, ohne dass
ein Skript geschrieben werden muss. Dies ermöglicht es, komplexe Schwachstellen in einem einfachen lesbaren und ausführbaren Format zu teilen.
Beispiel zum Extrahieren eines CSRF-Tokens und dessen Verwendung in einem Formular:
name: get_csrf
description: csrf token extrahieren
module: http
parameter:
url: http://example.com/contact
method: GET
header:
user-agent: Mozilla/5.0
extract:
csrf: [CSS, "#csrf"]
---
name: exploit
description: nutzt SQL-Injection-Schwachstelle mit gültigem CSRF-Token aus
module: http
parameter:
url: http://example.com/contact
method: POST
body:
csrf: "{{get_csrf.extracted.csrf}}"
username: "' SQL INJECTION"
find: You have an error in your SQL syntax
In diesem Beispiel wird die Sicherheitslücke getestet, indem zwei Schritte ausgeführt werden, die von oben nach unten ablaufen. Der letzte Schritt gibt je nachdem, ob der String 'You have an error in your SQL syntax' gefunden wurde, Erfolg oder Misserfolg zurück.
pip install explo
git clone https://github.com/dtag-dev-sec/explo
cd explo
python setup.py install
explo [--verbose|-v] testcase.yaml
explo [--verbose|-v] examples/*.yaml
Im Ordner examples/ befinden sich einige Beispiel-Testfälle.
$ explo examples/SQLI_simple_testphp.vulnweb.com.yaml
Sie können explo auch als Python-Bibliothek einbinden:
from explo.core import from_content as explo_from_content
from explo.core import ExploException, ProxyException
def save_log(msg):
print(msg)
try:
result = explo_from_content(explo_yaml_file, save_log)
except ExploException as err:
print(err)
Ein HTTP/HTTPS-Proxy und ein Timeout für Anfragen können über Umgebungsvariablen gesetzt werden. Das Standard-Timeout beträgt 15 Sekunden.
$ export http_proxy=http://proxy:8089
$ export https_proxy=https://proxy:8090
$ export timeout=10
$ explo ...
Module können hinzugefügt werden, um die Funktionalität und Klassen von Sicherheitslücken zu erweitern.
Das http-Modul ermöglicht es, eine HTTP-Anfrage zu stellen, Inhalte zu extrahieren und Inhalte zu suchen/zu überprüfen.
Die folgenden Daten stehen für nachfolgende Schritte zur Verfügung:
stepname.response.contentstepname.response.cookiesresponse.extracted.variable_nameWenn ein find_regex-Parameter gesetzt ist, wird ein regulärer Ausdruck auf den Antwort-Body angewendet. Falls dies fehlschlägt, gibt das Modul einen Fehler zurück und stoppt die Ausführung des aktuellen Workflows (und aller nachfolgenden Schritte).
Beim Extrahieren mittels regulärer Ausdrücke verwenden Sie die Treffergruppe extract, um den zu extrahierenden Wert zu markieren (siehe unten für ein Beispiel).
Zum Referenzieren von Cookies geben Sie den Namen des vorherigen Schritts an, von dem die Cookies übernommen werden sollen (cookies: the_other_step.response.cookies).
Parameterbeispiele:
parameter:
url: http://example.com
method: GET
allow_redirects: True
headers:
User-Agent: explo
Content-Type: abc
cookies: stepname.response.cookies
body:
key: value
find: nach String suchen
find_regex: nach (reg|ulärem) Ausdruck suchen
find_in_headers: Suchstring in Headern
expect_response_code: 200
extract:
variable1: [CSS, '#csrf']
variable2: [REGEX, '<input(.*?)value="(?P<extract>.*?)"']
Das http_header-Modul prüft, ob einer Antwort ein bestimmter Satz von Headern (und Werten) fehlt. Alle anderen Parameter sind identisch zum http-Modul.
Die folgenden Daten stehen für andere Module zur Verfügung:
stepname.response.contentstepname.response.cookiesParameterbeispiele:
parameter:
url: http://example.com
method: GET
allow_redirects: True
headers:
User-Agent: explo
Content-Type: abc
body:
key: value
headers_required:
X-XSS-Protection: 1
Server: . # alle Werte sind gültig
Das sqli_blind-Modul kann zeitbasierte blinde SQL-Injection erkennen.
Die folgenden Daten stehen für andere Module zur Verfügung:
stepname.response.contentstepname.response.cookiesParameterbeispiele:
parameter:
url: http://example.com/vulnerable.php?id=1' waitfor delay '00:00:5'--
method: GET
delay_seconds: 5
Wenn der Schwellenwert von 5 Sekunden (delay_seconds) überschritten wird, gibt die Prüfung wahr zurück (und damit einen Erfolg).
Der Metadaten-Block ist ein spezieller Block, der als erster Block in einer .yaml-Datei hinzugefügt werden kann, um einer Schwachstelle Metadaten zur weiteren Verarbeitung hinzuzufügen. Dies ist nützlich, wenn explo als Bibliothek verwendet wird und Metadaten für jede Schwachstellenbeschreibung mit meta_from_content(content) gelesen werden können. Dieses Modul benötigt weder einen Namen noch eine Beschreibung.
Beispiele:
module: metadata
parameter:
cvss: 8.9
author: Robin Verton
---
name: login
description: login with test credentials
module: http
parameter:
url: http://testphp.vulnweb.com/userinfo.php
method: POST
body:
uname: test
pass: test