
Ein plugin-basierter Scanner, der Sicherheitsforschern hilft, Probleme in verschiedenen CMS zu identifizieren, hauptsächlich Drupal und Silverstripe.
Ein plugin-basierter Scanner, der Sicherheitsforschern hilft, Schwachstellen in verschiedenen CMS zu identifizieren.
Die Verwendung von droopescan für Angriffe auf Ziele ohne vorherige gegenseitige Zustimmung ist illegal. Es liegt in der Verantwortung des Endbenutzers, alle geltenden lokalen, staatlichen und bundesstaatlichen Gesetze einzuhalten. Die Entwickler übernehmen keine Haftung und sind nicht verantwortlich für Missbrauch oder Schäden, die durch dieses Programm verursacht werden. Bitte beachten Sie, dass droopescan die wahrscheinlichste installierte Version des CMS auf dem entfernten Host ausgibt; jegliche Korrelation zwischen Versionsnummern und Sicherheitslücken muss vom Benutzer manuell durchgeführt werden.
Unterstützte CMS sind:
Teilweise Funktionalität für:
computer:~/droopescan$ droopescan scan drupal -u http://example.org/ -t 32
[+] No themes found.
[+] Possible interesting urls found:
Default changelog file - https://www.example.org/CHANGELOG.txt
Default admin - https://www.example.org/user/login
[+] Possible version(s):
7.34
[+] Plugins found:
views https://www.example.org/sites/all/modules/views/
https://www.example.org/sites/all/modules/views/README.txt
https://www.example.org/sites/all/modules/views/LICENSE.txt
token https://www.example.org/sites/all/modules/token/
https://www.example.org/sites/all/modules/token/README.txt
https://www.example.org/sites/all/modules/token/LICENSE.txt
pathauto https://www.example.org/sites/all/modules/pathauto/
https://www.example.org/sites/all/modules/pathauto/README.txt
https://www.example.org/sites/all/modules/pathauto/LICENSE.txt
https://www.example.org/sites/all/modules/pathauto/API.txt
libraries https://www.example.org/sites/all/modules/libraries/
https://www.example.org/sites/all/modules/libraries/CHANGELOG.txt
https://www.example.org/sites/all/modules/libraries/README.txt
https://www.example.org/sites/all/modules/libraries/LICENSE.txt
entity https://www.example.org/sites/all/modules/entity/
https://www.example.org/sites/all/modules/entity/README.txt
https://www.example.org/sites/all/modules/entity/LICENSE.txt
google_analytics https://www.example.org/sites/all/modules/google_analytics/
https://www.example.org/sites/all/modules/google_analytics/README.txt
https://www.example.org/sites/all/modules/google_analytics/LICENSE.txt
ctools https://www.example.org/sites/all/modules/ctools/
https://www.example.org/sites/all/modules/ctools/CHANGELOG.txt
https://www.example.org/sites/all/modules/ctools/LICENSE.txt
https://www.example.org/sites/all/modules/ctools/API.txt
features https://www.example.org/sites/all/modules/features/
https://www.example.org/sites/all/modules/features/CHANGELOG.txt
https://www.example.org/sites/all/modules/features/README.txt
https://www.example.org/sites/all/modules/features/LICENSE.txt
https://www.example.org/sites/all/modules/features/API.txt
[... snip for README ...]
[+] Scan finished (0:04:59.502427 elapsed)
Eine vollständige Liste der Optionen erhalten Sie mit:
droopescan --help
droopescan scan --help
Weil droopescan:
Die Installation ist einfach mit pip:
apt-get install python-pip
pip install droopescan
Die manuelle Installation erfolgt wie folgt:
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
Der Master-Zweig entspricht der neuesten Version (was in pypi verfügbar ist). Der Development-Zweig ist instabil und alle Pull-Requests müssen gegen diesen erfolgen.
Installation des BlackArch-Pakets (gepflegt von Dritten):
sudo pacman -S droopescan
Sie können ein Docker-Image erstellen und droopescan aus Docker ausführen:
git clone https://github.com/droope/droopescan.git
cd droopescan
docker build -t droope/droopescan .
# Hilfe anzeigen
docker run --rm droope/droopescan
# Beispiel: Scannen einer Drupal-Seite
docker run --rm droope/droopescan scan drupal -u https://drupal.example.com
Droopescan zielt darauf ab, standardmäßig die höchste Genauigkeit zu erreichen, ohne den Zielserver durch übermäßige gleichzeitige Anfragen zu überlasten. Daher wird standardmäßig eine große Anzahl von Anfragen mit vier Threads durchgeführt; ändern Sie diese Einstellungen mit den Argumenten --number und --threads.
Dieses Tool kann vier Arten von Tests durchführen. Standardmäßig werden alle Tests ausgeführt, aber Sie können einen der folgenden mit dem Flag -e oder --enumerate angeben:
Sie können einen bestimmten Host zum Scannen angeben, indem Sie den Parameter -u oder --url übergeben:
droopescan scan drupal -u example.org
Sie können auch das Argument drupal weglassen. Dies löst eine „CMS-Identifikation“ aus, wie folgt:
droopescan scan -u example.org
Mehrere URLs können mit dem Parameter -U oder --url-file gescannt werden. Dieser Parameter sollte auf den Pfad einer Datei gesetzt werden, die eine Liste von URLs enthält.
droopescan scan drupal -U list_of_urls.txt
Das Argument drupal kann auch in diesem Beispiel weggelassen werden. Für jede Website werden mehrere GET-Anfragen zur CMS-Identifikation durchgeführt. Wenn die Website als ein unterstütztes CMS erkannt wird, wird sie gescannt und zur Ausgabeliste hinzugefügt. Dies kann z. B. nützlich sein, um droopescan über alle Websites Ihrer Organisation auszuführen.
droopescan scan -U list_of_urls.txt
Das folgende Codebeispiel enthält eine Liste von URLs, eine pro Zeile:
http://localhost/drupal/6.0/
http://localhost/drupal/6.1/
http://localhost/drupal/6.10/
http://localhost/drupal/6.11/
http://localhost/drupal/6.12/
Eine Datei mit URLs und einem Wert, der den Standard-Host-Header überschreibt, getrennt durch Tabulatoren oder Leerzeichen, ist ebenfalls für URL-Dateien geeignet. Dies ist praktisch, wenn Sie einen Scan über einen großen Bereich von Hosts durchführen und unnötige DNS-Abfragen vermeiden möchten. Zur Verdeutlichung ein Beispiel unten:
192.168.1.1 example.org
http://192.168.1.1/ example.org
http://192.168.1.2/drupal/ example.org
Es ist verlockend zu testen, ob der Scanner für ein bestimmtes CMS funktioniert, indem man die offizielle Website scannt (z. B. wordpress.org für WordPress), aber die offiziellen Websites laufen selten mit Vanilla-Installationen ihres jeweiligen CMS oder machen unorthodoxe Dinge. Zum Beispiel betreibt wordpress.org die neueste Version von WordPress, die von droopescan überhaupt nicht als WordPress erkannt wird, weil die Prüfsummen mit keiner bekannten WordPress-Version übereinstimmen.
Die Anwendung unterstützt vollständig .netrc-Dateien und http_proxy-Umgebungsvariablen.
Verwenden Sie eine .netrc-Datei für die Basisauthentifizierung. Eine Beispiel-netrc-Datei (eine Datei namens .netrc, die in Ihrem Home-Verzeichnis abgelegt wird) könnte wie folgt aussehen:
machine secret.google.com
login [email protected]
password Winter01
Sie können die Variablen http_proxy und https_proxy setzen. Diese ermöglichen es Ihnen, einen übergeordneten HTTP-Proxy zu setzen, in dem Sie komplexere Authentifizierungsarten verwalten können (z. B. Fiddler, ZAP, Burp).
export http_proxy='user:password@localhost:8080'
export https_proxy='user:password@localhost:8080'
droopescan scan drupal --url http://localhost/drupal
WARNUNG: Aus Designgründen erlaubt droopescan selbstsignierte oder anderweitig ungültige Zertifikate, um Intercepting-Proxys und das Testen von Anwendungen mit schlechtem SSL zu ermöglichen. ˙ ͜ʟ˙
Diese Anwendung unterstützt sowohl die „Standardausgabe“ (für Menschen bestimmt) als auch JSON (besser für Maschinen geeignet). Diese Ausgabe ist zwischen Hauptversionen stabil.
Dies kann mit dem Flag --output gesteuert werden. Eine Beispiel-JSON-Ausgabe könnte wie folgt aussehen (abgesehen vom übermäßigen Leerraum):
{
"themes": {
"is_empty": true,
"finds": [
]
},
"interesting urls": {
"is_empty": false,
"finds": [
{
"url": "https:\/\/www.drupal.org\/CHANGELOG.txt",
"description": "Default changelog file."
},
{
"url": "https:\/\/www.drupal.org\/user\/login",
"description": "Default admin."
}
]
},
"version": {
"is_empty": false,
"finds": [
"7.29",
"7.30",
"7.31"
]
},
"plugins": {
"is_empty": false,
"finds": [
{
"url": "https:\/\/www.drupal.org\/sites\/all\/modules\/views\/",
"name": "views"
},
[...snip...]
]
}
}
Einige Attribute könnten im JSON-Objekt fehlen, wenn Teile des Scans nicht ausgeführt wurden.
So sieht die Ausgabe mehrerer Websites aus; jede Zeile enthält ein gültiges JSON-Objekt wie oben gezeigt.
$ droopescan scan drupal -U six_and_above.txt -e v
{"host": "http://localhost/drupal-7.6/", "version": {"is_empty": false, "finds": ["7.6"]}}
{"host": "http://localhost/drupal-7.7/", "version": {"is_empty": false, "finds": ["7.7"]}}
{"host": "http://localhost/drupal-7.8/", "version": {"is_empty": false, "finds": ["7.8"]}}
{"host": "http://localhost/drupal-7.9/", "version": {"is_empty": false, "finds": ["7.9"]}}
{"host": "http://localhost/drupal-7.10/", "version": {"is_empty": false, "finds": ["7.10"]}}
{"host": "http://localhost/drupal-7.11/", "version": {"is_empty": false, "finds": ["7.11"]}}
{"host": "http://localhost/drupal-7.12/", "version": {"is_empty": false, "finds": ["7.12"]}}
{"host": "http://localhost/drupal-7.13/", "version": {"is_empty": false, "finds": ["7.13"]}}
{"host": "http://localhost/drupal-7.14/", "version": {"is_empty": false, "finds": ["7.14"]}}
{"host": "http://localhost/drupal-7.15/", "version": {"is_empty": false, "finds": ["7.15"]}}
{"host": "http://localhost/drupal-7.16/", "version": {"is_empty": false, "finds": ["7.16"]}}
{"host": "http://localhost/drupal-7.17/", "version": {"is_empty": false, "finds": ["7.17"]}}
{"host": "http://localhost/drupal-7.18/", "version": {"is_empty": false, "finds": ["7.18"]}}
{"host": "http://localhost/drupal-7.19/", "version": {"is_empty": false, "finds": ["7.19"]}}
{"host": "http://localhost/drupal-7.20/", "version": {"is_empty": false, "finds": ["7.20"]}}
{"host": "http://localhost/drupal-7.21/", "version": {"is_empty": false, "finds": ["7.21"]}}
{"host": "http://localhost/drupal-7.22/", "version": {"is_empty": false, "finds": ["7.22"]}}
{"host": "http://localhost/drupal-7.23/", "version": {"is_empty": false, "finds": ["7.23"]}}
{"host": "http://localhost/drupal-7.24/", "version": {"is_empty": false, "finds": ["7.24"]}}
{"host": "http://localhost/drupal-7.25/", "version": {"is_empty": false, "finds": ["7.25"]}}
{"host": "http://localhost/drupal-7.26/", "version": {"is_empty": false, "finds": ["7.26"]}}
{"host": "http://localhost/drupal-7.27/", "version": {"is_empty": false, "finds": ["7.27"]}}
{"host": "http://localhost/drupal-7.28/", "version": {"is_empty": false, "finds": ["7.28"]}}
{"host": "http://localhost/drupal-7.29/", "version": {"is_empty": false, "finds": ["7.29"]}}
{"host": "http://localhost/drupal-7.30/", "version": {"is_empty": false, "finds": ["7.30"]}}
{"host": "http://localhost/drupal-7.31/", "version": {"is_empty": false, "finds": ["7.31"]}}
{"host": "http://localhost/drupal-7.32/", "version": {"is_empty": false, "finds": ["7.32"]}}
{"host": "http://localhost/drupal-7.33/", "version": {"is_empty": false, "finds": ["7.33"]}}
{"host": "http://localhost/drupal-7.34/", "version": {"is_empty": false, "finds": ["7.34"]}}
Wenn die Dinge nicht so laufen wie gewünscht, können Sie mit dem Befehl --debug-requests überprüfen, warum.
Eine Beispielausgabe könnte wie folgt aussehen:
computer:~/droopescan# droopescan scan silverstripe -u http://localhost -n 10 -e p --debug-requests
[head] http://localhost/framework/... 403
[head] http://localhost/cms/css/layout.css... 404
[head] http://localhost/framework/css/UploadField.css... 200
[head] http://localhost/misc/test/error/404/ispresent.html... 404
[head] http://localhost/widgetextensions/... 404
[head] http://localhost/orbit/... 404
[head] http://localhost/sitemap/... 404
[head] http://localhost/simplestspam/... 404
[head] http://localhost/ecommerce_modifier_example/... 404
[head] http://localhost/silverstripe-hashpath/... 404
[head] http://localhost/timeline/... 404
[head] http://localhost/silverstripe-hiddenfields/... 404
[head] http://localhost/addressable/... 404
[head] http://localhost/silverstripe-description/... 404
[+] No plugins found.
[+] Scan finished (0:00:00.058422 elapsed)
Der Parameter --debug existiert ebenfalls und kann verwendet werden, um interne Abläufe der Anwendung zu debuggen.
Sie können einen aktuellen Bericht über die Fähigkeiten des Scanners erhalten, indem Sie den folgenden Befehl ausführen:
droopescan stats
Eine Beispielausgabe könnte wie folgt aussehen:
Functionality available for ‘drupal’:
- Enumerate plugins (XXXX plugins.)
- Enumerate themes (XXXX themes.)
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version X.X.X-alphaXX, X.XX, X.XX.)
Functionality available for ‘joomla’:
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version XX.X, X.X.X, X.X.XX.rcX.)
Functionality available for ‘wordpress’:
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version X.X.X, X.X.X, X.X.X.)
Functionality available for ‘silverstripe’:
- Enumerate plugins (XXX plugins.)
- Enumerate themes (XX themes.)
- Enumerate interesting urls (X urls.)
- Enumerate version (up to version X.X.XX, X.X.XX, X.X.XX.)
Es ist wichtig zu überprüfen, ob die neueste verfügbare Version für die CMS-Installation in droopescan verfügbar ist, da sonst die Ergebnisse ungenau sein können.
Sie können Unterstützung für Ihr Lieblings-CMS hinzufügen. Der Prozess ist eigentlich recht einfach, und viele Informationen können durch einen Blick auf die Datei example.py im Ordner plugins/ gewonnen werden.
Diese Datei sollte als gute Grundlage für Ihre Implementierung dienen.
Sie können ein eigenes Plugin für Joomla erstellen und es wie folgt aktivieren:
$ cp plugins/example.py plugins/joomla.py
$ cp plugins.d/example.conf plugins.d/joomla.conf
Sie müssen dann in plugins/joomla.py einige Dinge ändern:
@controller.expose(help='example scanner')
def joomla(self):
self.plugin_init()
Wir müssen auch die Datei plugins.d/joomla.conf ändern und wie folgt anpassen:
[joomla]
enable_plugin = true
Wir sollten uns nun in einem Zustand befinden, der wie folgt aussieht:
$ droopescan scan joomla
[+] --url parameter is required.
Ihr nächster Schritt wäre, eine gültige Plugin-Wortliste, eine gültige Theme-Wortliste, eine versions.xml-Datei und optional eine Liste interessanter URLs zu generieren, sowie alle Variablen in joomla.py durch für Ihre Implementierung korrekte Werte zu ersetzen.
Das Plugin muss sich automatisch aktualisieren lassen, damit ein Pull-Request akzeptiert wird. Weitere Dokumentation wird möglicherweise später bereitgestellt, aber vorerst beachten Sie, dass update_version_check, update_version, update_plugins_check und update_plugins implementiert werden müssen. Als Referenz überprüfen Sie bitte die Datei drupal.py. Dies ist erforderlich, um sicherzustellen, dass Plugins auf dem neuesten Stand gehalten werden.
Pull-Requests, die neue Plugins erstellen, sind willkommen, sofern die Wartung dieser Plugins automatisch erfolgt.
Bitte denken Sie daran, Ihre Pull-Requests gegen den Development-Zweig und nicht gegen den Master zu stellen. Issues können im Issue-Tracker hier auf GitHub gemeldet werden.
Um Tests auszuführen, müssen einige Abhängigkeiten installiert sein. Die Ausführung der folgenden Befehle führt zu deren Installation und zur Durchführung der Tests:
apt-get install libxslt1-dev libxml2-dev zlib1g-dev python python-pip python-dev python3 python3-pip python3-dev
pip install -r requirements.txt -r requirements_test.txt
pip3 install -r requirements.txt -r requirements_test.txt
./droopescan test
Sie können einzelne Tests mit dem Flag -s ausführen:
./droopescan test -s test_integration_drupal
Das Projekt ist unter der AGPL-Lizenz lizenziert. Siehe LICENSE-Datei.