
Die modulare, verteilte Fingerprinting-Engine
Scannerl ist eine modulare, verteilte Fingerprinting-Engine, die von Kudelski Security implementiert wurde. Scannerl kann Tausende von Zielen auf einem einzelnen Host fingerabdrücken, lässt sich aber ebenso einfach auf mehrere Hosts verteilen. Scannerl ist für Fingerprinting das, was zmap für Port-Scans ist.
Scannerl funktioniert unter Debian/Ubuntu/Arch (wird aber wahrscheinlich auch auf anderen Distributionen laufen). Es verwendet eine Master/Slave-Architektur, bei der der Master-Knoten die Arbeit (zu fingerabdruckende Hosts) an seine Slaves (lokal oder remote) verteilt. Die gesamte Bereitstellung ist für den Benutzer transparent.
Bei der Verwendung herkömmlicher Fingerprinting-Tools für groß angelegte Analysen stoßen Sicherheitsforscher oft auf zwei Einschränkungen: Erstens sind diese Tools typischerweise für das Scannen vergleichsweise weniger Hosts auf einmal ausgelegt und daher für große IP-Adressbereiche ungeeignet. Zweitens: Wenn ein großer Bereich von IP-Adressen, die durch IPS-Geräte geschützt sind, fingerabgedrückt wird, ist die Wahrscheinlichkeit höher, auf die schwarze Liste gesetzt zu werden, was zu einem unvollständigen Informationssatz führen kann. Scannerl wurde entwickelt, um diese Einschränkungen zu umgehen, indem es nicht nur die Möglichkeit bietet, mehrere Hosts gleichzeitig zu fingerabdrucken, sondern auch die Last auf eine beliebige Anzahl von Hosts zu verteilen. Scannerl macht die Verteilung dieser Aufgaben zudem völlig transparent, was die Einrichtung und Wartung von groß angelegten Fingerprinting-Projekten trivial macht. Dies ermöglicht es, sich auf die Analysen zu konzentrieren, anstatt sich der herkulischen Aufgabe des manuellen Verwaltens und Verteilens von Fingerprinting-Prozessen zu widmen. Zusätzlich zum Geschwindigkeitsfaktor wurde Scannerl so konzipiert, dass sich spezifische Fingerprinting-Analysen mit nur wenigen Codezeilen einfach einrichten lassen. Nicht nur die Erstellung eines Fingerprinting-Clusters ist einfach einzurichten, sondern er kann auch durch das Hinzufügen von fein abgestimmten Scans zu Ihren Fingerprinting-Kampagnen optimiert werden.
Es ist das schnellste Werkzeug, um groß angelegte Fingerprinting-Kampagnen durchzuführen.
Weitere Informationen:
Inhaltsverzeichnis
Weitere Informationen finden Sie im Wiki.
Die verschiedenen Installationsoptionen finden Sie auf der Wiki-Installationsseite
Um aus dem Quellcode zu installieren, installieren Sie zunächst Erlang (mindestens v.18), indem Sie das richtige Paket für Ihre Plattform wählen: Erlang-Downloads
Installieren Sie die erforderlichen Pakete:
# on debian
$ sudo apt install erlang erlang-src rebar
# on arch
$ sudo pacman -S erlang-nox rebar
Dann bauen Sie scannerl:
$ git clone https://github.com/kudelskisecurity/scannerl.git
$ cd scannerl
$ ./build.sh
Erhalten Sie die Nutzungsinformationen durch Ausführen von
$ ./scannerl -h
Scannerl ist im AUR für Arch-Linux-Benutzer verfügbar
DEBs (Ubuntu, Debian) sind in den Releases verfügbar.
RPMs (OpenSUSE, CentOS, Red Hat) sind unter https://build.opensuse.org/package/show/home:chapeaurouge/scannerl verfügbar.
Für einen verteilten Scan werden zwei Arten von Knoten benötigt:
Der Master-Knoten muss scannerl installiert und kompiliert haben, während die Slave-Knoten nur Erlang installiert haben müssen. Die gesamte Einrichtung ist transparent und wird automatisch vom Master-Knoten durchgeführt.
Anforderungen für einen verteilten Scan:
$ ./scannerl -h
____ ____ _ _ _ _ _ _____ ____ _
/ ___| / ___| / \ | \ | | \ | | ____| _ \| |
\___ \| | / _ \ | \| | \| | _| | |_) | |
___) | |___ / ___ \| |\ | |\ | |___| _ <| |___
|____/ \____/_/ \_\_| \_|_| \_|_____|_| \_\_____|
USAGE
scannerl MODULE TARGETS [NODES] [OPTIONS]
MODULE:
-m <mod> --module <mod>
mod: the fingerprinting module to use.
arguments are separated with a colon.
TARGETS:
-f <target> --target <target>
target: a list of target separated by a comma.
-F <path> --target-file <path>
path: the path of the file containing one target per line.
-d <domain> --domain <domain>
domain: a list of domains separated by a comma.
-D <path> --domain-file <path>
path: the path of the file containing one domain per line.
NODES:
-s <node> --slave <node>
node: a list of node (hostnames not IPs) separated by a comma.
-S <path> --slave-file <path>
path: the path of the file containing one node per line.
a node can also be supplied with a multiplier (<node>*<nb>).
OPTIONS:
-o <mod> --output <mod> comma separated list of output module(s) to use.
-p <port> --port <port> the port to fingerprint.
-t <sec> --timeout <sec> the fingerprinting process timeout.
-T <sec> --stimeout <sec> slave connection timeout (default: 10).
-j <nb> --max-pkt <nb> max pkt to receive (int or "infinity").
-r <nb> --retry <nb> retry counter (default: 0).
-c <cidr> --prefix <cidr> sub-divide range with prefix > cidr (default: 24).
-M <port> --message <port> port to listen for message (default: 57005).
-P <nb> --process <nb> max simultaneous process per node (default: 28232).
-Q <nb> --queue <nb> max nb unprocessed results in queue (default: infinity).
-C <path> --config <path> read arguments from file, one per line.
-O <mode> --outmode <mode> 0: on Master, 1: on slave, >1: on broker (default: 0).
-v <val> --verbose <val> be verbose (0 <= int <= 255).
-K <opt> --socket <opt> comma separated socket option (key[:value]).
-l --list-modules list available fp/out modules.
-V --list-debug list available debug options.
-A --print-args Output the args record.
-X --priv-ports use only source port between 1 and 1024.
-N --nosafe keep going even if some slaves fail to start.
-w --www DNS will try for www.<domain>.
-b --progress show progress.
-x --dryrun dry run.
Weitere Informationen finden Sie im Wiki.
Scannerl kann auf dem lokalen Host ohne andere Hosts verwendet werden. Es wird jedoch weiterhin einen Slave-Knoten auf demselben Host erstellen, von dem aus es ausgeführt wird. Daher müssen die unter Verteiltes Setup beschriebenen Anforderungen ebenfalls erfüllt sein.
Eine schnelle Möglichkeit, dies zu erreichen, ist sicherzustellen, dass Ihr Host sich selbst auflösen kann, mit
grep -q "127.0.1.1\s*`hostname`" /etc/hosts || echo "127.0.1.1 `hostname`" | sudo tee -a /etc/hosts
und erstellen Sie einen SSH-Schlüssel (falls noch nicht vorhanden) und fügen Sie ihn zu authorized_keys hinzu (Sie benötigen einen laufenden SSH-Server):
cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys
Das folgende Beispiel führt einen HTTP-Banner-Grab auf google.com vom lokalen Host aus
./scannerl -m httpbg -d google.com
Um einen verteilten Scan durchzuführen, müssen die Hosts, die von scannerl zur Verteilung der Arbeit verwendet werden, vorbereitet werden. Weitere Informationen finden Sie unter Verteiltes Setup.
Scannerl erwartet eine Liste der zu verwendenden Slaves (bereitgestellt durch die -s oder -S Schalter).
./scannerl -m httpbg -d google.com -s host1,host2,host3
Scannerl listet die verfügbaren Module (sowohl Ausgabemodule als auch Fingerprinting-Module) mit dem -l Schalter auf:
$ ./scannerl -l
Fingerprinting modules available
================================
bacnet UDP/47808: Bacnet identification
chargen UDP/19: Chargen amplification factor identification
fox TCP/1911: FOX identification
httpbg TCP/80: HTTP Server header identification
- Arg1: [true|false] follow redirection [Default:false]
httpsbg SSL/443: HTTPS Server header identification
https_certif SSL/443: HTTPS certificate graber
imap_certif TCP/143: IMAP STARTTLS certificate graber
modbus TCP/502: Modbus identification
mqtt TCP/1883: MQTT identification
mqtts TCP/8883: MQTT over SSL identification
mysql_greeting TCP/3306: Mysql version identification
pop3_certif TCP/110: POP3 STARTTLS certificate graber
smtp_certif TCP/25: SMTP STARTTLS certificate graber
ssh_host_key TCP/22: SSH host key graber
Output modules available
========================
csv output to csv
- Arg1: [true|false] save everything [Default:true]
csvfile output to csv file
- Arg1: [true|false] save everything [Default:false]
- Arg2: File path
file output to file
- Arg1: File path
file_ip output to stdout (only ip)
- Arg1: File path
file_mini output to file (only ip and result)
- Arg1: File path
file_resultonly output to file (only result)
- Arg1: File path
stdout output to stdout
stdout_ip output to stdout (only IP)
stdout_mini output to stdout (only ip and result)
Argumente können Modulen mit einem Doppelpunkt übergeben werden. Beispiel für das file Ausgabemodul:
./scannerl -m httpbg -d google.com -o file:/tmp/result
Das von scannerl an die Ausgabemodule zurückgegebene Ergebnis hat die folgende Form:
{module, target, port, result}
Wobei
module: das verwendete Modul (Erlang-Atom)target: IP oder Hostname (String oder IPv4-Adresse)port: der Port (Integer)result: siehe untenDer result-Teil hat die Form:
{{status, type},Value}
Wobei {status, type} eines der folgenden Tupel ist:
{ok, result}: Das Fingerprinting des Ziels war erfolgreich{error, up}: Das Fingerprinting war nicht erfolgreich, aber das Ziel hat geantwortet{error, unknown}: Das Fingerprinting ist fehlgeschlagenValue ist der zurückgegebene Wert – entweder ein Atom oder eine Liste von Elementen
Scannerl wurde mit Blick auf Modularität entwickelt und implementiert. Es ist einfach, neue Module hinzuzufügen:
Um neue Module zu erstellen, folgen Sie einfach dem Verhalten (fp_module.erl für Fingerprinting-Module und out_behavior.erl für Ausgabemodule) und implementieren Sie Ihre Module.
Neue Module können entweder zur Kompilierzeit oder dynamisch als externe Datei hinzugefügt werden.
Weitere Informationen finden Sie auf der Wiki-Seite.
Zögern Sie nicht, ein Issue oder einen PR zu eröffnen.
Copyright(c) 2017 Nagravision SA.
Dieses Programm ist freie Software: Sie können es unter den Bedingungen der GNU General Public License Version 3, wie von der Free Software Foundation veröffentlicht, weiterverteilen und/oder modifizieren.
Dieses Programm wird in der Hoffnung verteilt, dass es nützlich sein wird, aber OHNE JEGLICHE GEWÄHRLEISTUNG; ohne die stillschweigende Garantie der HANDELSÜBLICHKEIT oder der EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Weitere Details finden Sie in der GNU General Public License.
Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Wenn nicht, sehen Sie unter http://www.gnu.org/licenses/.