.

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ą.

W ramach wsparcia dla Drupala utrzymujemy istniejące strony internetowe i rozbudowujemy je o nowe funkcjonalności