
Um scanner baseado em plugins que auxilia pesquisadores de segurança a identificar problemas em vários CMSs, principalmente Drupal e Silverstripe.
Um scanner baseado em plugins que auxilia pesquisadores de segurança a identificar problemas em vários CMS.
O uso do droopescan para atacar alvos sem consentimento mútuo prévio é ilegal. É responsabilidade do usuário final obedecer todas as leis locais, estaduais e federais aplicáveis. Os desenvolvedores não assumem nenhuma responsabilidade e não são responsáveis por qualquer uso indevido ou dano causado por este programa. Observe que, embora o droopescan produza a versão mais provável do CMS instalada no host remoto, qualquer correlação entre números de versão e vulnerabilidades deve ser feita manualmente pelo usuário.
CMS suportados são:
Funcionalidade parcial para:
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)
Você pode obter uma lista completa de opções executando:
droopescan --help
droopescan scan --help
Porque o droopescan:
A instalação é fácil usando pip:
apt-get install python-pip
pip install droopescan
A instalação manual é a seguinte:
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
O branch master corresponde à última versão (o que está no pypi). O branch de desenvolvimento é instável e todos os pull requests devem ser feitos contra ele.
Instalação do pacote BlackArch (mantido por terceiros):
sudo pacman -S droopescan
Você pode construir uma imagem docker e executar o droopescan a partir do Docker:
git clone https://github.com/droope/droopescan.git
cd droopescan
docker build -t droope/droopescan .
# exibir ajuda
docker run --rm droope/droopescan
# exemplo escaneando um site drupal
docker run --rm droope/droopescan scan drupal -u https://drupal.example.com
O Droopescan visa ser o mais preciso por padrão, sem sobrecarregar o servidor alvo devido a requisições concorrentes excessivas. Devido a isso, por padrão, um grande número de requisições será feito com quatro threads; altere essas configurações usando os argumentos --number e --threads, respectivamente.
Esta ferramenta é capaz de realizar quatro tipos de testes. Por padrão, todos os testes são executados, mas você pode especificar um dos seguintes com a flag -e ou --enumerate:
Você pode especificar um host específico para escanear passando o parâmetro -u ou --url:
droopescan scan drupal -u example.org
Você também pode omitir o argumento drupal. Isso acionará a “identificação do CMS”, da seguinte forma:
droopescan scan -u example.org
Várias URLs podem ser escaneadas utilizando o parâmetro -U ou --url-file. Este parâmetro deve ser definido como o caminho de um arquivo que contém uma lista de URLs.
droopescan scan drupal -U list_of_urls.txt
O parâmetro drupal também pode ser omitido neste exemplo. Para cada site, serão feitas várias requisições GET para realizar a identificação do CMS, e se o site for considerado um CMS suportado, ele é escaneado e adicionado à lista de saída. Isso pode ser útil, por exemplo, para executar o droopescan em todos os sites da sua organização.
droopescan scan -U list_of_urls.txt
O bloco de código abaixo contém um exemplo de lista de URLs, uma por linha:
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/
Um arquivo contendo URLs e um valor para substituir o cabeçalho de host padrão, separados por tabulações ou espaços, também é aceitável para arquivos de URL. Isso pode ser útil ao realizar um escaneamento em uma grande faixa de hosts e você deseja evitar consultas DNS desnecessárias. Para esclarecer, um exemplo abaixo:
192.168.1.1 example.org
http://192.168.1.1/ example.org
http://192.168.1.2/drupal/ example.org
É bastante tentador testar se o scanner funciona para um CMS específico escaneando o site oficial (por exemplo, wordpress.org para wordpress), mas os sites oficiais raramente executam instalações puras de seus respectivos CMS ou fazem coisas não ortodoxas. Por exemplo, wordpress.org executa a versão bleeding edge do wordpress, que não será identificada como wordpress pelo droopescan porque as somas de verificação não correspondem a nenhuma versão conhecida do wordpress.
O aplicativo suporta totalmente arquivos .netrc e variáveis de ambiente http_proxy.
Use um arquivo .netrc para autenticação básica. Um arquivo netrc de exemplo (um arquivo chamado .netrc colocado no diretório home do seu root) poderia ser assim:
machine secret.google.com
login [email protected]
password Winter01
Você pode definir as variáveis http_proxy e https_proxy. Elas permitem definir um proxy HTTP pai, no qual você pode lidar com tipos mais complexos de autenticação (por exemplo, Fiddler, ZAP, Burp)
export http_proxy='user:password@localhost:8080'
export https_proxy='user:password@localhost:8080'
droopescan scan drupal --url http://localhost/drupal
AVISO: Por design, para permitir proxies de interceptação e o teste de aplicações com SSL ruim, o droopescan permite certificados auto-assinados ou inválidos. ˙ ͜ʟ˙
Este aplicativo suporta tanto a "saída padrão", destinada ao consumo humano, quanto JSON, que é mais adequada para consumo por máquinas. Esta saída é estável entre versões principais.
Isso pode ser controlado com a flag --output. Um exemplo de saída JSON seria o seguinte (sem o excesso de espaços em branco):
{
"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...]
]
}
}
Alguns atributos podem estar faltando no objeto JSON se partes do escaneamento não forem executadas.
É assim que a saída multi-site se parece; cada linha contém um objeto JSON válido, como mostrado acima.
$ 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 as coisas não estão saindo exatamente como você espera, você pode verificar o motivo usando o comando --debug-requests.
Alguma saída pode ser assim:
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)
O parâmetro --debug também existe e pode ser usado para depurar os internos do aplicativo.
Você pode obter um relatório atualizado sobre as capacidades do scanner executando o seguinte comando
droopescan stats
Alguma saída de exemplo pode ser assim:
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 verificar se a versão mais recente disponível para a instalação do CMS está disponível dentro do droopescan, caso contrário, os resultados podem ser imprecisos.
Você pode adicionar suporte para o seu CMS favorito. O processo é realmente bastante simples, e muitas informações podem ser vislumbradas visualizando o arquivo example.py na pasta plugins/.
Este arquivo deve servir bem como base para sua implementação.
Você pode criar seu próprio plugin para Joomla e habilitá-lo da seguinte forma:
$ cp plugins/example.py plugins/joomla.py
$ cp plugins.d/example.conf plugins.d/joomla.conf
Você então precisa ir para plugins/joomla.py e alterar algumas coisas:
@controller.expose(help='example scanner')
def joomla(self):
self.plugin_init()
Também precisamos alterar o arquivo plugins.d/joomla.conf e alterá-lo para o seguinte:
[joomla]
enable_plugin = true
Agora devemos estar em um estado que se parece com o seguinte:
$ droopescan scan joomla
[+] --url parameter is required.
Seu próximo passo seria gerar uma wordlist de plugins válida, uma wordlist de temas válida, um arquivo versions.xml, e opcionalmente uma lista de URLs interessantes, bem como substituir todas as variáveis que estão em joomla.py por valores corretos para sua implementação.
O plugin precisa ser atualizado automaticamente para que um pull request seja aceito. Mais documentação pode ser disponibilizada posteriormente, mas por enquanto, lembre-se de que os métodos update_version_check, update_version, update_plugins_check e update_plugins precisam ser implementados. Para referência, revise o arquivo drupal.py. Isso é necessário para garantir que os plugins sejam mantidos atualizados.
Pull requests que criam novos plugins são bem-vindos, desde que a manutenção desses plugins seja feita automaticamente.
Por favor, lembre-se de fazer seus pull requests contra o branch de desenvolvimento ao invés do master. Issues podem ser abertas no rastreador de issues aqui no GitHub.
Para executar os testes, algumas dependências devem ser instaladas. Executar os seguintes comandos resultará na instalação delas e na execução dos testes:
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
Você pode executar testes individuais com a flag -s.
./droopescan test -s test_integration_drupal
O projeto é licenciado sob a licença AGPL. Consulte o arquivo LICENSE.