
Uno scanner basato su plugin che aiuta i ricercatori di sicurezza a identificare problemi con diversi CMS, principalmente Drupal e Silverstripe.
Uno scanner basato su plugin che aiuta i ricercatori di sicurezza a identificare problemi in diversi CMS.
L'utilizzo di droopescan per attaccare target senza previo consenso reciproco è illegale. È responsabilità dell'utente finale rispettare tutte le leggi locali, statali e federali applicabili. Gli sviluppatori non si assumono alcuna responsabilità e non sono responsabili per qualsiasi uso improprio o danno causato da questo programma. Si noti che, sebbene droopescan mostri la versione più probabile del CMS installata sul server remoto, qualsiasi correlazione tra numeri di versione e vulnerabilità deve essere effettuata manualmente dall'utente.
I CMS supportati sono:
Funzionalità parziale per:
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)
Puoi ottenere l'elenco completo delle opzioni eseguendo:
droopescan --help
droopescan scan --help
Perché droopescan:
L'installazione è semplice usando pip:
apt-get install python-pip
pip install droopescan
L'installazione manuale è la seguente:
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
Il ramo master corrisponde all'ultima release (quello che c'è in pypi). Il ramo development è instabile e tutte le pull request devono essere fatte contro di esso.
Installazione del pacchetto BlackArch (mantenuto da terze parti):
sudo pacman -S droopescan
Puoi creare un'immagine Docker ed eseguire droopescan da Docker:
git clone https://github.com/droope/droopescan.git
cd droopescan
docker build -t droope/droopescan .
# display help
docker run --rm droope/droopescan
# example scanning a drupal site
docker run --rm droope/droopescan scan drupal -u https://drupal.example.com
Droopescan mira ad essere il più accurato possibile per impostazione predefinita, senza sovraccaricare il server di destinazione a causa di richieste simultanee eccessive. Per questo motivo, per impostazione predefinita, viene effettuato un gran numero di richieste con quattro thread; puoi modificare queste impostazioni usando rispettivamente gli argomenti --number e --threads.
Questo strumento è in grado di eseguire quattro tipi di test. Per impostazione predefinita vengono eseguiti tutti i test, ma puoi specificare uno dei seguenti con il flag -e o --enumerate:
Puoi specificare un host particolare da scansionare passando il parametro -u o --url:
droopescan scan drupal -u example.org
Puoi anche omettere l'argomento drupal. Questo attiverà l'“identificazione del CMS”, in questo modo:
droopescan scan -u example.org
È possibile scansionare più URL utilizzando il parametro -U o --url-file. Questo parametro deve essere impostato sul percorso di un file che contiene un elenco di URL.
droopescan scan drupal -U list_of_urls.txt
Il parametro drupal può anche essere omesso in questo esempio. Per ogni sito, verranno effettuate diverse richieste GET per eseguire l'identificazione del CMS e, se il sito viene considerato un CMS supportato, viene scansionato e aggiunto all'elenco di output. Questo può essere utile, ad esempio, per eseguire droopescan su tutti i siti della tua organizzazione.
droopescan scan -U list_of_urls.txt
Il blocco di codice sottostante contiene un esempio di elenco di URL, uno per riga:
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/
Un file contenente URL e un valore per sovrascrivere l'header host predefinito separati da tabulazioni o spazi è accettabile anche per i file URL. Questo può essere utile quando si esegue una scansione su una vasta gamma di host e si desidera evitare query DNS inutili. Per chiarire, un esempio di seguito:
192.168.1.1 example.org
http://192.168.1.1/ example.org
http://192.168.1.2/drupal/ example.org
È molto allettante testare se lo scanner funziona per un particolare CMS scansionando il sito ufficiale (es. wordpress.org per wordpress), ma i siti ufficiali raramente eseguono installazioni vanilla dei rispettivi CMS o fanno cose non ortodosse. Ad esempio, wordpress.org esegue la versione bleeding edge di wordpress, che non verrà identificata come wordpress da droopescan perché i checksum non corrispondono a nessuna versione conosciuta di wordpress.
L'applicazione supporta completamente i file .netrc e le variabili d'ambiente http_proxy.
Usa un file .netrc per l'autenticazione di base. Un esempio di file netrc (un file chiamato .netrc posizionato nella directory home dell'utente root) potrebbe assomigliare a questo:
machine secret.google.com
login [email protected]
password Winter01
Puoi impostare le variabili http_proxy e https_proxy. Queste ti permettono di impostare un proxy HTTP padre, nel quale puoi gestire tipi di autenticazione più complessi (es. Fiddler, ZAP, Burp)
export http_proxy='user:password@localhost:8080'
export https_proxy='user:password@localhost:8080'
droopescan scan drupal --url http://localhost/drupal
ATTENZIONE: Per progettazione, per consentire proxy di intercettazione e il test di applicazioni con SSL non valido, droopescan permette certificati autofirmati o comunque non validi. ˙ ͜ʟ˙
Questa applicazione supporta sia l'“output standard”, pensato per il consumo umano, sia JSON, più adatto al consumo da parte di macchine. Questo output è stabile tra le versioni principali.
Questo può essere controllato con il flag --output. Un esempio di output JSON potrebbe essere il seguente (a meno dell'eccessivo spazio bianco):
{
"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...]
]
}
}
Alcuni attributi potrebbero mancare dall'oggetto JSON se parti della scansione non vengono eseguite.
Ecco come appare l'output multi-sito; ogni riga contiene un oggetto JSON valido come mostrato sopra.
$ 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"]}}
Quando le cose non vanno esattamente come vorresti, puoi verificare il perché usando il comando --debug-requests.
Un output potrebbe assomigliare a questo:
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)
Esiste anche il parametro --debug che può essere utilizzato per eseguire il debug degli interni dell'applicazione.
Puoi ottenere un report aggiornato sulle capacità dello scanner eseguendo il seguente comando
droopescan stats
Un esempio di output potrebbe essere:
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.)
È importante verificare che l'ultima versione disponibile per l'installazione del CMS sia presente in droopescan, altrimenti i risultati potrebbero essere inaccurati.
Puoi aggiungere il supporto per il tuo CMS preferito. Il processo è in realtà abbastanza semplice e molte informazioni possono essere intuite visualizzando il file example.py nella cartella plugins/.
Questo file dovrebbe servire come base per la tua implementazione.
Puoi creare il tuo plugin per Joomla e abilitarlo come segue:
$ cp plugins/example.py plugins/joomla.py
$ cp plugins.d/example.conf plugins.d/joomla.conf
Devi quindi andare in plugins/joomla.py e cambiare alcune cose:
@controller.expose(help='example scanner')
def joomla(self):
self.plugin_init()
Dobbiamo anche cambiare il file plugins.d/joomla.conf e modificarlo come segue:
[joomla]
enable_plugin = true
Ora dovremmo essere in uno stato che assomiglia a questo:
$ droopescan scan joomla
[+] --url parameter is required.
Il tuo passo successivo sarebbe generare una wordlist di plugin valida, una wordlist di temi valida, un file versions.xml e, opzionalmente, un elenco di URL interessanti, oltre a sostituire tutte le variabili che sono in joomla.py con valori corretti per la tua implementazione.
Il plugin deve aggiornarsi automaticamente affinché una pull request venga accettata. Ulteriore documentazione potrebbe essere resa disponibile in seguito, ma per ora tieni presente che devono essere implementate le funzioni update_version_check, update_version, update_plugins_check e update_plugins. Per riferimento, consulta il file drupal.py. Questo è necessario per garantire che i plugin siano mantenuti aggiornati.
Le pull request che creano nuovi plugin sono benvenute, a condizione che la manutenzione di tali plugin sia effettuata automaticamente.
Ricorda di fare le tue pull request contro il ramo development piuttosto che master. Le segnalazioni possono essere fatte sul tracker delle issue qui su GitHub.
Per eseguire i test, è necessario installare alcune dipendenze. Eseguire i seguenti comandi le installerà e farà partire i test:
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
Puoi eseguire singoli test con il flag -s.
./droopescan test -s test_integration_drupal
Il progetto è concesso in licenza AGPL. Vedi il file LICENSE.