
Modulares Framework zum Auffinden und Analysieren offener Verzeichnisse im Web. Durchsucht URLs, extrahiert Inhalte, wendet YARA/ClamAV-Scans an und gibt Ergebnisse an MISP, SQLite oder die Konsole für Threat Intelligence aus.
SubCrawl ist ein Framework, das von Patrick Schläpfer, Josh Stroschein und Alex Holland des Threat Research-Teams von HP Inc. entwickelt wurde. SubCrawl wurde entwickelt, um offene Verzeichnisse zu finden, zu scannen und zu analysieren. Das Framework ist modular aufgebaut und besteht aus vier Komponenten: Eingabemodule, Verarbeitungsmodule, Ausgabemodule und der zentralen Crawling-Engine. URLs sind die primären Eingabewerte, die das Framework analysiert und zu einem Warteschlangensystem hinzufügt, bevor es sie durchläuft. Das Parsen der URLs ist ein wichtiger erster Schritt, da es aus einer eingereichten URL zusätzliche URLs generiert, indem es nacheinander Unterverzeichnisse entfernt, bis keine mehr übrig sind. Dieser Prozess stellt einen vollständigeren Scanversuch eines Webservers sicher und kann zur Entdeckung zusätzlicher Inhalte führen. Insbesondere verwendet SubCrawl keine Brute-Force-Methode zur Erkennung von URLs. Der gesamte gescannte Inhalt stammt aus den Eingabe-URLs, dem Parsen der URL und der Erkennung während des Crawlings. Wenn ein offenes Verzeichnis entdeckt wird, extrahiert die Crawling-Engine Links aus dem Verzeichnis zur Auswertung. Die Crawling-Engine bestimmt, ob der Link ein weiteres Verzeichnis oder eine Datei ist. Verzeichnisse werden zur Crawling-Warteschlange hinzugefügt, während Dateien von den Verarbeitungsmodulen weiter analysiert werden. Für jede gescannte URL werden Ergebnisse generiert und gespeichert, wie z.B. die SHA256- und Fuzzy-Hashes des Inhalts, ob ein offenes Verzeichnis gefunden wurde oder Übereinstimmungen mit YARA-Regeln. Schließlich werden die Ergebnisdaten gemäß einem oder mehreren Ausgabemodulen verarbeitet, von denen es derzeit drei gibt. Das erste bietet eine Integration mit MISP, das zweite gibt die Daten einfach auf der Konsole aus, und das dritte speichert die Daten in einer SQLite-Datenbank. Da das Framework modular ist, ist es nicht nur einfach zu konfigurieren, welche Eingabe-, Verarbeitungs- und Ausgabemodule gewünscht werden, sondern auch unkompliziert, neue Module zu entwickeln.
Abbildung 1 - SubCrawl-Architektur
SubCrawl unterstützt zwei verschiedene Betriebsmodi. Erstens kann SubCrawl im Run-Once-Modus gestartet werden. In diesem Modus gibt der Benutzer die zu scannenden URLs in einer Datei an, wobei jeder Eingabewert durch einen Zeilenumbruch getrennt ist. Der zweite Betriebsmodus ist der Dienstmodus. In diesem Modus läuft SubCrawl im Hintergrund und verlässt sich auf die Eingabemodule, um die zu scannenden URLs bereitzustellen. Abbildung 1 zeigt eine Übersicht über die Architektur von SubCrawl. Die Komponenten, die in beiden Betriebsmodi verwendet werden, sind blau, Run-Once-Modus-Komponenten sind gelb und Dienstmodus-Komponenten sind grün.
Basierend auf dem gewählten Ausführungsmodus müssen weitere Vorbedingungen erfüllt sein.
SubCrawl ist in Python3 geschrieben. Darüber hinaus sind mehrere Pakete erforderlich, bevor SubCrawl ausgeführt werden kann. Der folgende Befehl kann verwendet werden, um alle erforderlichen Pakete vor dem Ausführen von SubCrawl zu installieren. Führen Sie den folgenden Befehl aus dem Verzeichnis crawler aus:
$ sudo apt install build-essential
$ pip3 install -r requirements.txt
Wenn SubCrawl im Dienstmodus gestartet wird, kann dies mit Docker erfolgen. Aus diesem Grund ist die Installation von Docker und Docker Compose erforderlich. Gute Installationsanleitungen hierfür finden Sie direkt auf der Docker.com-Website.
SubCrawl verfügt über eine integrierte Hilfe über das Argument -h/--help oder durch einfaches Ausführen des Skripts ohne Argumente.
******** ** ****** **
**////// /** **////** /**
/** ** **/** ** // ****** ****** *** ** /**
/*********/** /**/****** /** //**//* //////** //** * /** /**
////////**/** /**/**///**/** /** / ******* /** ***/** /**
/**/** /**/** /**//** ** /** **////** /****/**** /**
******** //******/****** //****** /*** //******** ***/ ///** ***
//////// ////// ///// ////// /// //////// /// /// ///
~~ Harvesting the Open Web ~~
usage: subcrawl.py [-h] [-f FILE_PATH] [-k] [-p PROCESSING_MODULES] [-s STORAGE_MODULES]
optional arguments:
-h, --help show this help message and exit
-f FILE_PATH, --file FILE_PATH
Path of input URL file
-k, --kafka Use Kafka Queue as input
-p PROCESSING_MODULES, --processing PROCESSING_MODULES
Processing modules to be executed comma separated.
-s STORAGE_MODULES, --storage STORAGE_MODULES
Storage modules to be executed comma separated.
Available processing modules:
- ClamAVProcessing
- JARMProcessing
- PayloadProcessing
- TLSHProcessing
- YARAProcessing
Available storage modules:
- ConsoleStorage
- MISPStorage
- SqliteStorage
Dieser Modus eignet sich, wenn Sie schnell eine überschaubare Anzahl von Domains scannen möchten. Dazu müssen die zu scannenden URLs in einer Datei gespeichert werden, die dann als Eingabe für den Crawler dient. Das Folgende ist ein Beispiel für die Ausführung im Run-Once-Modus. Beachten Sie, dass das Argument -f mit einem Pfad zu einer Datei verwendet wird.
python3 subcrawl.py -f urls.txt -p YARAProcessing,PayloadProcessing -s ConsoleStorage
Mit dem Dienstmodus kann eine größere Anzahl von Domains gescannt und die Ergebnisse gespeichert werden. Basierend auf dem ausgewählten Speichermodul können die Daten dann detaillierter analysiert und ausgewertet werden. Um die Ausführung des Dienstmodus für den Benutzer so einfach wie möglich zu gestalten, haben wir alle Funktionen in ein Docker-Image integriert. Im Dienstmodus werden die zu scannenden Domains über Eingabemodule bezogen. Standardmäßig werden neue Malware- und Phishing-URLs von URLhaus und PhishTank heruntergeladen und zur Überprüfung in die Warteschlange gestellt. Die gewünschten Verarbeitungs- und Speichermodule können direkt in der config.yml eingetragen werden. Standardmäßig sind die folgenden Verarbeitungsmodule unter Verwendung des SQLite-Speichers aktiviert:
Zusätzlich zum SQLite-Speichermodul wurde eine einfache Weboberfläche entwickelt, die das Anzeigen und Verwalten der gescannten Domains und URLs ermöglicht.

Falls diese Benutzeroberfläche für die spätere Auswertung der Daten nicht ausreicht, kann alternativ oder zusätzlich das MISP-Speichermodul aktiviert werden. Die entsprechenden Einstellungen müssen in der config.yml im Abschnitt MISP vorgenommen werden.
Die folgenden zwei Befehle reichen aus, um das GIT-Repository zu klonen, den Docker-Container zu erstellen und direkt zu starten. Anschließend ist die Weboberfläche unter der Adresse https://localhost:8000/ erreichbar. Bitte beachten Sie, dass die Eingabemodule nach dem Start der Container beginnen, URLs zur Verarbeitungswarteschlange hinzuzufügen, und die Engine beginnt, Hosts zu durchsuchen.
git clone https://github.com/hpthreatresearch/subcrawl.git
docker-compose up --build
Eingabemodule werden nur im Dienstmodus verwendet. Wenn SubCrawl im Run-Once-Modus gestartet wird, muss eine Datei mit den zu scannenden URLs bereitgestellt werden. Die folgenden zwei Eingabemodule wurden implementiert.
URLhaus ist ein prominenter Webdienst, der bösartige URLs verfolgt. Der Webdienst stellt auch Exporte mit neu erkannten URLs bereit. Diese Malware-URLs dienen als perfekte Eingabe für unseren Crawler, da wir hauptsächlich bösartige Domains analysieren möchten. Kürzlich eingereichte URLs werden abgerufen, und die Suchergebnisse werden nicht durch die API-Anfrage verfeinert (d.h. durch Tags oder andere verfügbare Parameter). Die HTTP-Anfrage, die in diesem Eingabemodul an die URLHaus-API gestellt wird, kann geändert werden, um die erhaltenen Ergebnisse weiter zu verfeinern.
PhishTank ist eine Website, die Phishing-URLs sammelt. Benutzer haben die Möglichkeit, neu gefundene Phishing-Seiten einzureichen. Ein Export mit aktiven Phishing-URLs kann über die API dieses Webdienstes generiert und heruntergeladen werden. Dies ist also auch eine ideale Sammlung für unseren Crawler.
SubCrawl wird mit mehreren Verarbeitungsmodulen ausgeliefert. Die Verarbeitungsmodule folgen alle einem ähnlichen Verhalten, wie sie Ergebnisse an die Kern-Engine zurückgeben. Wenn Übereinstimmungen gefunden werden, werden die Ergebnisse an die Kern-Engine zurückgegeben und später an die Speichermodule weitergeleitet. Nachfolgend finden Sie eine Liste der Verarbeitungsmodule.
Das SDHash-Verarbeitungsmodul wird verwendet, um einen Ähnlichkeits-Hash der HTTP-Antwort zu berechnen. Die Mindestgröße des Inhalts muss 512 Bytes betragen, um einen Hash erfolgreich berechnen zu können. Dies ist wahrscheinlich das komplizierteste Verarbeitungsmodul zu installieren, da es Protobuf erfordert und je nach Zielhost neu kompiliert werden muss. Daher ist dieses Verarbeitungsmodul standardmäßig deaktiviert. Eine bereits kompilierte Version finden Sie in crawler/processing/minisdhash/, die protobuf-2.5.0 und python3.6 erfordert. Diese Binärdateien wurden auf einem Ubuntu 18.04.5 LTS x64 kompiliert. Folgen Sie der Installationsanleitung:
# Protobuf installation
> apt-get update
> apt-get -y install libssl-dev libevent-pthreads-2.1-6 libomp-dev g++
> apt-get -y install autoconf automake libtool curl make g++ unzip
> wget https://github.com/protocolbuffers/protobuf/releases/download/v2.5.0/protobuf-2.5.0.zip
> unzip protobuf-2.5.0.zip
> cd protobuf-2.5.0
> ./configure
> make
> sudo make install
# Python3.6 installation
> apt-get install python3.6-dev
> sudo ldconfig
# SDHash installation
> git clone https://github.com/sdhash/sdhash.git
> cd sdhash
> make
> make install
> ldconfig
JARM ist ein von Salesforce entwickeltes Tool zur Fingerabdruckerkennung von TLS-Verbindungen. Das JARM-Verarbeitungsmodul führt einen Scan der Domain durch und gibt einen JARM-Hash zusammen mit der Domain an die Kern-Engine zurück. Abhängig von der Konfiguration eines Webservers weist der TLS-Handshake unterschiedliche Eigenschaften auf. Durch die Berechnung eines Hashs der Attribute dieses Handshakes können diese Unterschiede genutzt werden, um Webserver-Konfigurationen zu verfolgen.
Das TLSH-Verarbeitungsmodul ähnelt dem SDHash-Verarbeitungsmodul zur Berechnung eines Ähnlichkeits-Hashs. Der Vorteil von TLSH ist, dass die Installation viel einfacher ist und das Eingabeminimum mit 50 Bytes kleiner ist. Da die meisten Webshell-Anmeldungen relativ klein sind und der Schwerpunkt unserer Forschung waren, haben wir dieses Verarbeitungsmodul standardmäßig aktiviert.
Das YARA-Verarbeitungsmodul wird verwendet, um HTTP-Antwortinhalte mit YARA-Regeln zu scannen. Um dieses Verarbeitungsmodul aufzurufen, geben Sie den Wert YARAProcessing als Verarbeitungsmodul-Argument an. Der folgende Befehl lädt beispielsweise das YARA-Verarbeitungsmodul und gibt die Ausgabe über das ConsoleStorage-Speichermodul auf der Konsole aus.
python3 subcrawl.py -p YARAProcessing -s ConsoleStorage
Derzeit wird das YARA-Verarbeitungsmodul verwendet, um Webshell-Anmeldungen und verschiedene andere interessante Inhalte zu identifizieren. Die mit diesem Projekt enthaltenen YARA-Regeln:
Beispielausgabe:

Um zusätzliche YARA-Regeln hinzuzufügen, können Sie .YAR-Dateien zum Ordner yara-rules hinzufügen und dann die Regeldatei durch Hinzufügen einer include-Anweisung in combined-rules.yar einbinden.
Das ClamAV-Verarbeitungsmodul wird verwendet, um HTTP-Antwortinhalte während des Scans mit ClamAV zu scannen. Wenn eine Übereinstimmung gefunden wird, wird sie an die verschiedenen Ausgabemodule weitergegeben. Um dieses Verarbeitungsmodul aufzurufen, geben Sie den Wert ClamAVProcessing als Verarbeitungsmodul-Argument an. Der folgende Befehl lädt beispielsweise das ClamAV-Verarbeitungsmodul und gibt die Ausgabe über das ConsoleStorage-Speichermodul auf der Konsole aus.
python3 subcrawl.py -p ClamAVProcessing -s ConsoleStorage
Beispielausgabe:

Um dieses Modul zu nutzen, muss ClamAV installiert sein. Installieren Sie ClamAV über den APT-Paketmanager von einem Terminal aus:
$ sudo apt-get install clamav-daemon clamav-freshclam clamav-unofficial-sigs
Nach der Installation sollte der ClamAV-Update-Dienst bereits laufen. Wenn Sie jedoch manuell mit freshclam aktualisieren möchten, stellen Sie sicher, dass der Dienst gestoppt ist:
sudo systemctl stop clamav-freshclam.service
Und führen Sie dann freshclam manuell aus:
$ sudo freshclam
Überprüfen Sie abschließend den Status des ClamAV-Dienstes:
$ sudo systemctl status clamav-daemon.service
Wenn der Dienst nicht läuft, können Sie ihn mit systemctl starten:
$ sudo systemctl start clamav-daemon.service
Das Payload-Verarbeitungsmodul wird verwendet, um HTTP-Antwortinhalte mit der Bibliothek libmagic zu identifizieren. Zusätzlich kann SubCrawl so konfiguriert werden, dass interessante Inhalte wie PE-Dateien oder Archive gespeichert werden. Um dieses Verarbeitungsmodul aufzurufen, geben Sie den Wert PayloadProcessing als Verarbeitungsmodul-Argument an. Der folgende Befehl lädt beispielsweise das Payload-Verarbeitungsmodul und gibt die Ausgabe auf der Konsole aus:
python3 subcrawl.py -p PayloadProcessing -s ConsoleStorage
Es gibt keine zusätzlichen Abhängigkeiten für dieses Modul.
Beispielausgabe:

Speichermodule werden von der SubCrawl-Engine aufgerufen, nachdem alle URLs aus der Warteschlange gescannt wurden. Sie wurden mit zwei Zielen entwickelt. Erstens, die Ergebnisse des Scans unmittelbar nach Abschluss der Scan-Warteschlange zu erhalten, und zweitens, eine langfristige Speicherung und Analyse zu ermöglichen. Daher haben wir nicht nur ein ConsoleStorage-Modul implementiert, sondern auch eine Integration für MISP und ein SQLite-Speichermodul.
Um Ergebnisse direkt nach dem Scannen von URLs schnell zu analysieren, wird eine gut formatierte Ausgabe auf der Konsole ausgegeben. Diese Ausgabe eignet sich am besten, wenn SubCrawl im Run-Once-Modus verwendet wird. Dieser Ansatz funktionierte zwar gut zum Scannen einzelner Domains oder zur schnellen Ausgabe, ist aber für die langfristige Forschung und Analyse unhandlich.

Auch eine Integration mit einem Elastic-Cluster ist verfügbar. Jede URL zusammen mit ihren Daten wird als Ereignis indiziert. Dies beinhaltet die Ausgabe anderer Module wie Yara. Ein Standard-Dashboard wurde ebenfalls hinzugefügt, um den Einstieg in die Nutzung dieses Moduls zu erleichtern. Im Abschnitt elasticsearch müssen Aktualisierungen vorgenommen werden, die Folgendes umfassen:
Um dieses Ausgabemodul zu verwenden, geben Sie den Wert ElasticStorage mit dem Argument -s an.
Da die Installation und Konfiguration von MISP zeitaufwändig sein kann, haben wir ein weiteres Modul implementiert, das die Daten in einer SQLite-Datenbank speichert. Um die Daten dem Benutzer so einfach und klar wie möglich zu präsentieren, haben wir auch eine einfache Weboberfläche entwickelt. Mit dieser Webanwendung können die gescannten Domains und URLs mit allen ihren Attributen angezeigt und durchsucht werden. Da es sich nur um eine frühe Version handelt, wurden noch keine komplexen Vergleichsfunktionen implementiert.

MISP ist eine Open-Source-Bedrohungsinformationsplattform mit einem flexiblen Datenmodell und einer API zum Speichern und Analysieren von Bedrohungsdaten. SubCrawl speichert gecrawlte Daten in MISP-Ereignissen, veröffentlicht ein Ereignis pro Domain und fügt alle identifizierten offenen Verzeichnisse als Attribute hinzu. MISP erlaubt es Benutzern außerdem, Tags für Ereignisse und Attribute zu definieren. Dies ist hilfreich für Ereignisvergleiche und Linkanalysen. Da dies eines unserer primären Forschungsziele war, haben wir die Daten von URLHaus angereichert, wenn wir die Ausgabe von SubCrawl nach MISP exportieren. URLHaus annotiert seine Daten mithilfe von Tags, die verwendet werden können, um eine Malware-Familie oder einen Bedrohungsakteur zu identifizieren, der mit einer URL verbunden ist. Für jede offene Verzeichnis-URL fragt das Modul lokal gespeicherte URLHaus-Daten ab und fügt die URLHaus-Tags zum MISP-Ereignis hinzu, wenn sie übereinstimmen. Um eine Ansammlung nicht zusammenhängender Attribute für jedes MISP-Ereignis zu vermeiden, haben wir ein neues MISP-Objekt für gescannte URLs mit dem Namen opendir-url erstellt. Dies stellt sicher, dass zusammengehörige Attribute zusammengehalten werden, was einen besseren Überblick über die Daten ermöglicht.

Vorlagen für Verarbeitungs- und Speichermodule werden als Teil des Frameworks bereitgestellt.
Verarbeitungsmodule finden Sie unter crawler->processing und eine Beispielmoduldatei example_processing.py in diesem Verzeichnis. Die Vorlage bietet die erforderliche Vererbung und Importe, um die Ausführung durch das Framework sicherzustellen. Die Funktion init dient der Modulinitialisierung und erhält eine Instanz des Loggers und der globalen Konfiguration. Der Logger wird verwendet, um Protokollinformationen von den Verarbeitungsmodulen sowie im gesamten Framework bereitzustellen.
Die Funktion process wird implementiert, um jede HTTP-Antwort zu verarbeiten. Zu diesem Zweck erhält sie die URL und den rohen Antwortinhalt. Hier wird die Arbeit des Moduls implementiert. Diese Funktion sollte ein Wörterbuch mit den folgenden Feldern zurückgeben:
Ein eindeutiger Klassenname muss definiert werden und wird verwendet, um dieses Modul zu definieren, wenn es über das Argument -p oder als Standard-Verarbeitungsmodul in der Konfigurationsdatei eingeschlossen wird.
Fügen Sie abschließend eine Import-Anweisung in __init__.py mit Ihrem Klassennamen hinzu:
from .<REPLACE>_processing import <REPLACE>Processing
Speichermodule finden Sie unter crawler->storage und eine Beispielmoduldatei example_storage.py in diesem Verzeichnis. Ähnlich wie bei den Verarbeitungsmodulen dient die Funktion init der Modulinitialisierung und erhält eine Instanz des Loggers und der globalen Konfiguration. Die Funktion store_results erhält in Abständen, die durch die Batch-Größe in der Konfigurationsdatei definiert sind, strukturierte Daten von der Engine.
Ein eindeutiger Klassenname muss definiert werden und wird verwendet, um das Modul zu laden, wenn es über das Argument -s oder als Standard-Verarbeitungsmodul in der Konfigurationsdatei eingeschlossen wird.
2021:
SubCrawl ist unter der MIT-Lizenz lizenziert.