Co to jest Droopescan i jak można z niego efektywnie korzystać?
Rekonesans strony internetowej to jeden z elementów audytu bezpieczeństwa. To zadanie można w pewnym stopniu zautomatyzować, wybierając jeden spośród darmowych, open source’owych programów dostępnych w sieci. Jednym z takich narzędzi jest Droopescan.
Co to jest Droopescan?
Droopescan to skrypt pozwalający na przyspieszenie wstępnego rekonesansu audytowanej witryny, jeśli korzysta ona z jednego z wymienionych niżej CMS-ów. Skrypt pozwala na definiowanie własnych pluginów, które mogą pozwolić na jeszcze większą automatyzację procesu wstępnego rozeznania. Więcej na temat tworzenia własnych pluginów rozszerzających funkcjonalność skryptu znajdziesz w README.md na podlinkowanej wcześniej stronie narzędzia na Githubie.
Funkcje skanera Drupala
Możliwości Droopescan różnią się w zależności od systemu zarządzania treścią.
W Drupalu są to funkcje pozwalające na identyfikację:
- zainstalowanych pluginów,
- zainstalowanych skórek,
- ścieżek interesujących dla potencjalnego atakującego (takich jak panel logowania czy plik changelog),
- użytej wersji Drupala.
W Joomli i WordPressie można zidentyfikować interesujące atakującego ścieżki oraz użytą wersję tych systemów. W innym CMS-ie, Moodle, narzędzie Droopescan może rozpoznać zainstalowane pluginy i skórki oraz wykorzystywaną wersję systemu zarządzania treścią.
Natomiast w systemie Silverstripe zidentyfikujemy:
- zainstalowane pluginy,
- zainstalowane skórki,
- interesujące atakującego ścieżki,
- użytą wersję Silverstripe’a.
Metody instalacji skryptu
Twórcy przygotowali kilka metod instalacji skryptu. W zależności od naszych preferencji możemy wybrać najbardziej odpowiedni sposób.
Przy użyciu pip
Jest to rekomendowany przez twórców sposób instalacji:
apt-get install python-pip pip install droopescan
Instalacja manualna
Aby zainstalować skrypt manualnie, należy wywołać następujące komendy:
git clone https://github.com/droope/droopescan.git
cd droopescan
pip install -r requirements.txt
./droopescan scan --help
Na dystrybucji BlackArch
Do instalacji na dystrybucji BlackArch, twórcy rekomendują użycie pacmana:
sudo pacman -S droopescan
Docker
Droopescan można również zainstalować jako kontener dockerowy:
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
Unboxing
Skrypt Droopescan jest bardzo elastyczny i pozwala na skonfigurowanie skanu wedle naszego uznania. Dzięki ustawieniom możemy zmienić typ skanu, wybierając jeden z dostępnych frameworków, podać adres lub listę adresów do przeskanowania i wiele, wiele innych. Oto pełna lista możliwych do skonfigurowania opcji.
Komendy
droopescan scan --help
Otwiera listę dostępnych komend.
droopescan scan
{drupal|joomla|moodle|silverstripe|wordpress}
Uruchamia skrypty odpowiedzialne za skanowanie witryny korzystającej z wybranego CMS-a.
droopescan scan --debug
Uruchamia debug output.
droopescan scan --quiet
Uruchamia tryb cichy, który nie pokazuje informacji o skanie w trakcie jego trwania.
droopescan scan -u {URL} oraz droopescan scan --url {URL}
Pozwalają na zdefiniowanie celu skanu.
droopescan scan -U {URL_FILE} oraz droopescan scan --url-file {URL_FILE}
Pozwalają na zdefiniowanie ścieżki do pliku, w którym znajdują się docelowe witryny skanu. Struktura pliku powinna wyglądać następująco:
> cat example.txt http://localhost/drupal/8.9.0/ http://localhost/drupal/8.7.1/ http://localhost/drupal/8.9.13/ http://example.com
droopescan scan -e {a, t, p, v, i} oraz droopescan scan --enumerate {a, t, p, v, i}
Pozwalają na zdefiniowanie tego, co skrypt powinien skanować:
- p - pluginy,
- t - skórki,
- v - wersję,
- i - przydatne linki,
- a (domyślnie) - wszystko.
droopescan scan --method {not_found, forbidden, ok}
Pozwala na określenie, jaki typ błędu jest traktowany jako indykator oraz czy dana ścieżka istnieje. Dla niektórych serwerów jest to 403, dla innych 404. Domyślnie skrypt sam stara się to wywnioskować.
droopescan scan --verb {head, get}
Pozwala na określenie typu żądania, którym będzie posługiwał się skrypt. Opcją domyślną jest head.
droopescan scan --number {NUMBER} droopescan scan -n {NUMBER}
Określa liczbę słów do sprawdzenia ze słownika pluginów lub skórek. Jest to domyślnie tysiąc. Jeśli chcemy użyć wszystkich dostępnych, należy wpisać all.
droopescan scan --plugins-base-url {PLUGINS_BASE_URL}
Pozwala na określenie ścieżki, pod którą przechowywane są pluginy w CMS-ie. Bez podania tego parametru skrypt sprawdza domyślną ścieżkę dla danego systemu.
droopescan scan --themes-base-url {THEMES_BASE_URL}
Pozwala na określenie ścieżki, pod którą przechowywane są skórki w CMS-ie. Bez podania tego parametru skrypt sprawdza domyślną ścieżkę dla danego systemu.
droopescan scan --timeout {TIMEOUT}
Określa w sekundach, ile czasu skrypt powinien czekać na odpowiedź HTTP.
droopescan scan --no-follow-redirects
Ustawienie tej flagi zapobiega podążaniu za przekierowaniami.
droopescan scan --host {HOST}
Nadpisuje nagłówek zapytania host na podaną wartość.
droopescan scan --user-agent {USER_AGENT}
Nadpisuje header User Agent zapytania.
droopescan scan --massscan-override
Użycie tej flagi zastępuje domyślne wartości tymi, które są dogodne dla masowego skanowania hostów.
droopescan scan --threads {THREADS} oraz droopescan scan -t {THREADS}
Liczba wątków użytych do skanowania. Domyślnie 4.
droopescan scan --threads-identify {THREADS_IDENTIFY}
Liczba wątków użytych do identyfikacji CMS.
droopescan scan --threads-scan {THREADS_SCAN}
Liczba wątków użytych do masowego skanowania hostów.
droopescan scan --threads-enumerate {THREADS_ENUMERATE}
Liczba wątków użytych do identyfikacji pluginów.
droopescan scan --output {standard, json} oraz droopescan scan -o {standard, json}
Pozwalają na określenie formatu outputu zwracanego przez skrypt.
droopescan scan --hide-progressbar
Ustawienie tej flagi pozwala na wyłączenie progressbara.
droopescan scan --debug-requests
Ustawienie tej flagi wypisuje w konsoli zawartość wszystkich zapytań HTTP wywołanych przez skrypt wraz z odpowiedzią otrzymaną od serwera. Włączenie tej flagi wyłącza wątkowanie skanowania oraz progressbary.
droopescan scan --error-log {ERROR_LOG}
Pozwala na zdefiniowanie pliku, do którego będą logowane wszystkie błędy skanowania.
droopescan scan --resume
Przywraca skanowanie do etapu, w którym zostało ostatnio zakończone. Jest to przydatna opcja w przypadku korzystania ze skanowania masowego.
Przykład użycia Droopescan
Nasza testowa strona korzysta z Drupala 8.9.15 i zawiera listę wielu popularnych modułów. Korzysta z niestandardowej skórki, a logowanie do panelu administracyjnego odbywa się pod domyślną ścieżką.
Do rozpoczęcia skanu wykorzystamy komendę:
droopescan scan drupal -u example.com
Poniżej prezentujemy wynik skanu.
➜ droopescan git:(master) docker run --rm droope/droopescan scan drupal -u example.com
modules [ === ] 224/4000 (5%)[+] Got an HTTP 500 response.
modules [ ==== ] 287/4000 (7%)[+] Got an HTTP 500 response.
modules [ ==== ] 288/4000 (7%)[+] Got an HTTP 500 response.
modules [ ======== ] 626/4000 (15%)[+] Got an HTTP 500 response.
modules [ ============== ] 1053/4000 (26%)[+] Got an HTTP 500 response.
modules [ ============== ] 1056/4000 (26%)[+] Got an HTTP 500 response.
modules [ ================ ] 1272/4000 (31%)[+] Got an HTTP 500 response.
modules [ ============================ ] 2227/4000 (55%)[+] Got an HTTP 500 response.
modules [ ================================ ] 2509/4000 (62%)[+] Got an HTTP 500 response.
modules [ =============================================== ] 3746/4000 (93%)[+] Got an HTTP 500 response.
[+] Accepted redirect to https://www.example.com/
[+] Plugins found:
image_widget_crop https://www.example.com/sites/all/modules/image_widget_crop/
flexslider_views_slideshow https://www.example.com/sites/all/modules/flexslider_views_slideshow/
service_links https://www.example.com/sites/all/modules/service_links/
compact_forms https://www.example.com/sites/all/modules/compact_forms/
strongarm https://www.example.com/sites/default/modules/strongarm/
video_embed_field https://www.example.com/sites/default/modules/video_embed_field/
tablefield https://www.example.com/sites/default/modules/tablefield/
ctools https://www.example.com/modules/contrib/ctools/
https://www.example.com/modules/contrib/ctools/README.txt
https://www.example.com/modules/contrib/ctools/LICENSE.txt
token https://www.example.com/modules/contrib/token/
https://www.example.com/modules/contrib/token/README.md
https://www.example.com/modules/contrib/token/LICENSE.txt
pathauto https://www.example.com/modules/contrib/pathauto/
https://www.example.com/modules/contrib/pathauto/README.md
https://www.example.com/modules/contrib/pathauto/LICENSE.txt
metatag https://www.example.com/modules/contrib/metatag/
https://www.example.com/modules/contrib/metatag/CHANGELOG.txt
https://www.example.com/modules/contrib/metatag/README.txt
https://www.example.com/modules/contrib/metatag/LICENSE.txt
field_group https://www.example.com/modules/contrib/field_group/
https://www.example.com/modules/contrib/field_group/CHANGELOG.txt
https://www.example.com/modules/contrib/field_group/README.txt
https://www.example.com/modules/contrib/field_group/LICENSE.txt
google_analytics https://www.example.com/modules/contrib/google_analytics/
https://www.example.com/modules/contrib/google_analytics/README.md
https://www.example.com/modules/contrib/google_analytics/LICENSE.txt
redirect https://www.example.com/modules/contrib/redirect/
https://www.example.com/modules/contrib/redirect/README.txt
https://www.example.com/modules/contrib/redirect/LICENSE.txt
colorbox https://www.example.com/modules/contrib/colorbox/
https://www.example.com/modules/contrib/colorbox/README.txt
https://www.example.com/modules/contrib/colorbox/LICENSE.txt
features https://www.example.com/modules/contrib/features/
https://www.example.com/modules/contrib/features/LICENSE.txt
devel https://www.example.com/modules/contrib/devel/
https://www.example.com/modules/contrib/devel/README.txt
https://www.example.com/modules/contrib/devel/LICENSE.txt
admin_toolbar https://www.example.com/modules/contrib/admin_toolbar/
https://www.example.com/modules/contrib/admin_toolbar/CHANGELOG.txt
https://www.example.com/modules/contrib/admin_toolbar/README.txt
https://www.example.com/modules/contrib/admin_toolbar/LICENSE.txt
better_exposed_filters https://www.example.com/modules/contrib/better_exposed_filters/
https://www.example.com/modules/contrib/better_exposed_filters/README.txt
https://www.example.com/modules/contrib/better_exposed_filters/LICENSE.txt
paragraphs https://www.example.com/modules/contrib/paragraphs/
https://www.example.com/modules/contrib/paragraphs/README.txt
https://www.example.com/modules/contrib/paragraphs/LICENSE.txt
smtp https://www.example.com/modules/contrib/smtp/
https://www.example.com/modules/contrib/smtp/README.txt
https://www.example.com/modules/contrib/smtp/LICENSE.txt
search_api https://www.example.com/modules/contrib/search_api/
https://www.example.com/modules/contrib/search_api/CHANGELOG.txt
https://www.example.com/modules/contrib/search_api/README.md
https://www.example.com/modules/contrib/search_api/LICENSE.txt
entity_reference_revisions https://www.example.com/modules/contrib/entity_reference_revisions/
https://www.example.com/modules/contrib/entity_reference_revisions/LICENSE.txt
linkit https://www.example.com/modules/contrib/linkit/
https://www.example.com/modules/contrib/linkit/README.md
https://www.example.com/modules/contrib/linkit/LICENSE.txt
eu_cookie_compliance https://www.example.com/modules/contrib/eu_cookie_compliance/
https://www.example.com/modules/contrib/eu_cookie_compliance/README.md
https://www.example.com/modules/contrib/eu_cookie_compliance/LICENSE.txt
scheduler https://www.example.com/modules/contrib/scheduler/
https://www.example.com/modules/contrib/scheduler/README.md
https://www.example.com/modules/contrib/scheduler/LICENSE.txt
simple_sitemap https://www.example.com/modules/contrib/simple_sitemap/
https://www.example.com/modules/contrib/simple_sitemap/README.md
https://www.example.com/modules/contrib/simple_sitemap/LICENSE.txt
google_tag https://www.example.com/modules/contrib/google_tag/
https://www.example.com/modules/contrib/google_tag/README.md
addtoany https://www.example.com/modules/contrib/addtoany/
https://www.example.com/modules/contrib/addtoany/README.txt
https://www.example.com/modules/contrib/addtoany/LICENSE.txt
advagg https://www.example.com/modules/contrib/advagg/
https://www.example.com/modules/contrib/advagg/README.md
https://www.example.com/modules/contrib/advagg/LICENSE.txt
config_update https://www.example.com/modules/contrib/config_update/
https://www.example.com/modules/contrib/config_update/README.txt
https://www.example.com/modules/contrib/config_update/LICENSE.txt
robotstxt https://www.example.com/modules/contrib/robotstxt/
https://www.example.com/modules/contrib/robotstxt/README.txt
https://www.example.com/modules/contrib/robotstxt/LICENSE.txt
config_filter https://www.example.com/modules/contrib/config_filter/
https://www.example.com/modules/contrib/config_filter/README.md
https://www.example.com/modules/contrib/config_filter/LICENSE.txt
menu_link_attributes https://www.example.com/modules/contrib/menu_link_attributes/
https://www.example.com/modules/contrib/menu_link_attributes/README.md
https://www.example.com/modules/contrib/menu_link_attributes/LICENSE.txt
migrate_plus https://www.example.com/modules/contrib/migrate_plus/
https://www.example.com/modules/contrib/migrate_plus/README.txt
https://www.example.com/modules/contrib/migrate_plus/LICENSE.txt
checklistapi https://www.example.com/modules/contrib/checklistapi/
https://www.example.com/modules/contrib/checklistapi/README.md
https://www.example.com/modules/contrib/checklistapi/LICENSE.txt
config_split https://www.example.com/modules/contrib/config_split/
https://www.example.com/modules/contrib/config_split/README.md
https://www.example.com/modules/contrib/config_split/LICENSE.txt
migrate_tools https://www.example.com/modules/contrib/migrate_tools/
https://www.example.com/modules/contrib/migrate_tools/README.txt
https://www.example.com/modules/contrib/migrate_tools/LICENSE.txt
config_ignore https://www.example.com/modules/contrib/config_ignore/
schema_metatag https://www.example.com/modules/contrib/schema_metatag/
https://www.example.com/modules/contrib/schema_metatag/README.txt
https://www.example.com/modules/contrib/schema_metatag/LICENSE.txt
tvi https://www.example.com/modules/contrib/tvi/
https://www.example.com/modules/contrib/tvi/README.txt
https://www.example.com/modules/contrib/tvi/LICENSE.txt
svg_image https://www.example.com/modules/contrib/svg_image/
https://www.example.com/modules/contrib/svg_image/README.md
https://www.example.com/modules/contrib/svg_image/LICENSE.txt
link_attributes https://www.example.com/modules/contrib/link_attributes/
https://www.example.com/modules/contrib/link_attributes/README.md
https://www.example.com/modules/contrib/link_attributes/LICENSE.txt
facets https://www.example.com/modules/contrib/facets/
https://www.example.com/modules/contrib/facets/README.txt
https://www.example.com/modules/contrib/facets/LICENSE.txt
yoast_seo https://www.example.com/modules/contrib/yoast_seo/
https://www.example.com/modules/contrib/yoast_seo/README.txt
https://www.example.com/modules/contrib/yoast_seo/LICENSE.txt
panels_everywhere https://www.example.com/modules/contrib/panels_everywhere/
stage_file_proxy https://www.example.com/modules/contrib/stage_file_proxy/
https://www.example.com/modules/contrib/stage_file_proxy/README.md
https://www.example.com/modules/contrib/stage_file_proxy/LICENSE.txt
entity_reference_display https://www.example.com/modules/contrib/entity_reference_display/
https://www.example.com/modules/contrib/entity_reference_display/README.md
https://www.example.com/modules/contrib/entity_reference_display/LICENSE.txt
we_megamenu https://www.example.com/modules/contrib/we_megamenu/
https://www.example.com/modules/contrib/we_megamenu/README.md
https://www.example.com/modules/contrib/we_megamenu/LICENSE.txt
ckeditor_codemirror https://www.example.com/modules/ckeditor_codemirror/
[+] No themes found.
[+] Possible version(s):
8.9.10
8.9.11
8.9.12
8.9.13
8.9.14
8.9.15
8.9.16
8.9.17
8.9.6
8.9.7
8.9.8
8.9.9
[+] Possible interesting urls found:
Default admin - https://www.example.com/user/login
Default changelog file - https://www.example.com/CHANGELOG.txt
[+] Scan finished (0:16:25.708460 elapsed)
Analiza wyników
Narzędzie Droopescan pomogło w identyfikacji wielu modułów użytych na stronie i dostarczyło linki do plików, które umożliwiły tę identyfikację. Skrypt zidentyfikował użytą wersję Drupala jako jedną z minor update od 8.9.6 do 8.9.17 oraz wykrył ścieżkę do panelu logowania i pliku CHANGELOG.txt. Niestety w przypadku audytowanej witryny nie udało się zidentyfikować użytej skórki.
Droopescan - podsumowanie
Skrypt Droopescan przyspiesza proces wstępnego rekonesansu audytowanej witryny. Jest to rozwiązanie szybkie, stabilne, aktualizowane na bieżąco, pozwalające wątkować skanowanie wielu witryn jednocześnie i wymaga jedynie Pythona. Wynik skanowania jest prezentowany w przyjazny dla użytkownika sposób. Istnieje możliwość zapisu wyników w formacie JSON, który może być później dowolnie przetwarzany, aby, na przykład, za pomocą specjalnie do tego zaprojektowanej aplikacji, przeglądać wyniki w jeszcze bardziej przyjazny sposób lub żeby wykorzystać wyniki w kolejnych krokach audytu. Jeśli jesteś zainteresowany tematem kontrolowania bezpieczeństwa aplikacji, nasz zespół wsparcia Drupala może Cię wspomóc swoją ekspercką wiedzą.