Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
masscan — TCP-Portscanner, der asynchron SYN-Pakete versendet und das gesamte Internet in unter 5 Minuten scannt. | Kitploit
Tools/GitHubGitHub/robertdavidgraham/masscan
AufklärungNetzwerkkartierungPort-ScanningInformationsbeschaffungPenetrationstests
GitHubrobertdavidgraham/masscan

masscan

TCP-Portscanner, der asynchron SYN-Pakete versendet und das gesamte Internet in unter 5 Minuten scannt.

Repository anzeigen
25.9k3.2kvor 3 MonatenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

unittests

MASSCAN: Massen-IP-Port-Scanner

Dies ist ein Port-Scanner für das Internet-Maßstab. Er kann das gesamte Internet in weniger als 5 Minuten scannen, indem er 10 Millionen Pakete pro Sekunde überträgt, von einer einzigen Maschine.

Seine Verwendung (Parameter, Ausgabe) ähnelt nmap, dem bekanntesten Port-Scanner. Im Zweifelsfall versuchen Sie eine dieser Funktionen – Funktionen, die weit verbreitete Scans vieler Maschinen unterstützen, werden unterstützt, während detaillierte Scans einzelner Maschinen nicht unterstützt werden.

Intern verwendet er asynchrone Übertragung, ähnlich wie Port-Scanner wie scanrand, unicornscan und ZMap. Er ist flexibler und erlaubt beliebige Port- und Adressbereiche.

HINWEIS: masscan verwendet seinen eigenen ad hoc TCP/IP-Stack. Alles andere als einfache Port-Scans kann zu Konflikten mit dem lokalen TCP/IP-Stack führen. Das bedeutet, dass Sie entweder die Option --src-ip verwenden müssen, um von einer anderen IP-Adresse aus zu laufen, oder --src-port verwenden, um zu konfigurieren, welche Quellports masscan verwendet, und dann auch die interne Firewall (wie pf oder iptables) konfigurieren, um diese Ports vom Rest des Betriebssystems zu trennen.

Dieses Tool ist kostenlos, aber Sie können in Betracht ziehen, Geld für seine Entwicklung beizutragen: Bitcoin-Wallet-Adresse: 1MASSCANaHUiyTtR3bJ2sLGuMw5kDBaj4T

Bauen

Auf Debian/Ubuntu geht es ungefähr wie folgt. Es hat eigentlich keine anderen Abhängigkeiten als einen C-Compiler (wie gcc oder clang).

root@kitploit:~
sudo apt-get --assume-yes install git make gcc
git clone https://github.com/robertdavidgraham/masscan
cd masscan
make

Dadurch wird das Programm im Unterverzeichnis masscan/bin abgelegt. Um es zu installieren (unter Linux) führen Sie aus:

root@kitploit:~
make install

Der Quellcode besteht aus vielen kleinen Dateien, daher geht das Bauen viel schneller, wenn Sie den Multithread-Build verwenden. Dies erfordert mehr als 2 GB auf einem Raspberry Pi (und bricht ab), daher sollten Sie eine kleinere Zahl wie -j4 anstelle aller möglichen Threads verwenden.

root@kitploit:~
make -j

Obwohl Linux die primäre Zielplattform ist, läuft der Code gut auf vielen anderen Systemen (Windows, macOS, usw.). Hier sind einige zusätzliche Build-Informationen:

  • Windows w/ Visual Studio: Verwenden Sie das VS10-Projekt
  • Windows w/ MinGW: Einfach make eingeben
  • Windows w/ Cygwin: Funktioniert nicht
  • Mac OS X /w XCode: Verwenden Sie das XCode4-Projekt
  • Mac OS X /w Befehlszeile: Einfach make eingeben
  • FreeBSD: gmake eingeben
  • andere: Versuchen Sie, einfach alle Dateien zusammenzukompilieren, cc src/*.c -o bin/masscan

Unter macOS scheinen die x86-Binaries unter ARM-Emulation genauso schnell zu laufen.

Verwendung

Die Verwendung ist ähnlich wie bei nmap. Um ein Netzwerksegment nach einigen Ports zu scannen:

root@kitploit:~
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112

Dies wird:

  • das 10.x.x.x-Subnetz und die 2603:3001:2d00:da00::x-Subnetze scannen
  • Port 80 und den Bereich 8000 bis 8100 scannen, also insgesamt 102 Ports, auf beiden Subnetzen
  • die Ausgabe auf <stdout> ausgeben, die in eine Datei umgeleitet werden kann

Um die vollständige Liste der Optionen zu sehen, verwenden Sie die --echo-Funktion. Diese gibt die aktuelle Konfiguration aus und beendet sich. Diese Ausgabe kann als Eingabe zurück in das Programm verwendet werden:

root@kitploit:~
# masscan -p80,8000-8100 10.0.0.0/8 2603:3001:2d00:da00::/112 --echo > xxx.conf
# masscan -c xxx.conf --rate 1000

Banner-Prüfung

Masscan kann mehr tun, als nur zu erkennen, ob Ports offen sind. Es kann auch die TCP-Verbindung und Interaktion mit der Anwendung auf diesem Port abschließen, um einfache "Banner"-Informationen zu erfassen.

Masscan unterstützt die Banner-Prüfung auf den folgenden Protokollen:

  • FTP
  • HTTP
  • IMAP4
  • memcached
  • POP3
  • SMTP
  • SSH
  • SSL
  • SMBv1
  • SMBv2
  • Telnet
  • RDP
  • VNC

Das Problem dabei ist, dass masscan seinen eigenen TCP/IP-Stack enthält, der vom System, auf dem es ausgeführt wird, getrennt ist. Wenn das lokale System ein SYN-ACK vom getesteten Ziel empfängt, antwortet es mit einem RST-Paket, das die Verbindung beendet, bevor masscan das Banner erfassen kann.

Der einfachste Weg, dies zu verhindern, besteht darin, masscan eine separate IP- Adresse zuzuweisen. Dies würde wie eines der folgenden Beispiele aussehen:

root@kitploit:~
# masscan 10.0.0.0/8 -p80 --banners --source-ip 192.168.1.200
  # masscan 2a00:1450:4007:810::/112 -p80 --banners --source-ip 2603:3001:2d00:da00:91d7:b54:b498:859d

Die von Ihnen gewählte Adresse muss im lokalen Subnetz liegen und darf nicht von einem anderen System verwendet werden. Masscan wird Sie warnen, wenn Sie einen Fehler gemacht haben, aber Sie könnten die Kommunikation der anderen Maschine für mehrere Minuten stören, also seien Sie vorsichtig.

In einigen Fällen, wie z.B. bei WLAN, ist dies nicht möglich. In diesen Fällen können Sie den Port, den masscan verwendet, per Firewall schützen. Dadurch wird verhindert, dass der lokale TCP/IP-Stack das Paket sieht, aber masscan sieht es trotzdem, da es den lokalen Stack umgeht. Für Linux würde dies wie folgt aussehen:

root@kitploit:~
# iptables -A INPUT -p tcp --dport 61000 -j DROP
# masscan 10.0.0.0/8 -p80 --banners --source-port 61000

Sie sollten wahrscheinlich Ports wählen, die nicht mit Ports kollidieren, die Linux ansonsten für Quellports wählen könnte. Sie können den Bereich sehen, den Linux verwendet, und diesen Bereich neu konfigurieren, indem Sie in die Datei schauen:

root@kitploit:~
/proc/sys/net/ipv4/ip_local_port_range

Auf der neuesten Version von Kali Linux (2018-August) liegt dieser Bereich zwischen 32768 und 60999, daher sollten Sie Ports entweder unter 32768 oder über 61000 wählen.

Das Setzen einer iptables-Regel hält nur bis zum nächsten Neustart an. Sie müssen nachschlagen, wie Sie die Konfiguration je nach Ihrer Distribution speichern können, z.B. mit iptables-save und/oder iptables-persistent.

Auf Mac OS X und BSD gibt es ähnliche Schritte. Um die zu vermeidenden Bereiche herauszufinden, verwenden Sie einen Befehl wie den folgenden:

root@kitploit:~
# sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last

Auf FreeBSD und älteren MacOS-Versionen verwenden Sie einen ipfw-Befehl:

root@kitploit:~
# sudo ipfw add 1 deny tcp from any to any 40000 in
# masscan 10.0.0.0/8 -p80 --banners --source-port 40000

Auf neueren MacOS- und OpenBSD-Versionen verwenden Sie das pf-Paketfilter-Dienstprogramm. Bearbeiten Sie die Datei /etc/pf.conf, um eine Zeile wie die folgende hinzuzufügen:

root@kitploit:~
block in proto tcp from any to any port 40000:40015

Um dann die Firewall zu aktivieren, führen Sie den Befehl aus:

root@kitploit:~
# pfctl -E

Wenn die Firewall bereits läuft, starten Sie entweder neu oder laden Sie die Regeln mit dem folgenden Befehl neu:

root@kitploit:~
# pfctl -f /etc/pf.conf

Windows antwortet nicht mit RST-Paketen, daher sind keine dieser Techniken notwendig. Allerdings ist masscan immer noch so ausgelegt, dass es am besten mit einer eigenen IP-Adresse funktioniert. Sie sollten es daher, wann immer möglich, auf diese Weise ausführen, auch wenn es nicht streng notwendig ist.

Das Gleiche ist für andere Prüfungen erforderlich, wie z.B. die --heartbleed-Prüfung, die nur eine Form der Banner-Prüfung ist.

So scannen Sie das gesamte Internet

Obwohl es für kleinere, interne Netzwerke nützlich ist, ist das Programm wirklich für das gesamte Internet konzipiert. Es könnte etwa so aussehen:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535

Das Scannen des gesamten Internets ist schlecht. Zum einen reagieren Teile des Internets schlecht auf das Scannen. Zum anderen verfolgen einige Websites Scans und fügen Sie einer Sperrliste hinzu, was dazu führt, dass Sie von nützlichen Teilen des Internets ausgesperrt werden. Daher möchten Sie viele Bereiche ausschließen. Um Bereiche auf die schwarze Liste zu setzen oder auszuschließen, verwenden Sie die folgende Syntax:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535 --excludefile exclude.txt

Dies gibt die Ergebnisse nur auf der Befehlszeile aus. Sie möchten sie wahrscheinlich stattdessen in einer Datei speichern. Daher möchten Sie so etwas wie:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535 -oX scan.xml

Dies speichert die Ergebnisse in einer XML-Datei, sodass Sie die Ergebnisse einfach in eine Datenbank oder ähnliches auslesen können.

Aber das geht nur mit der Standardrate von 100 Paketen/Sekunde, was ewig dauern würde, um das Internet zu scannen. Sie müssen es wie folgt beschleunigen:

root@kitploit:~
# masscan 0.0.0.0/0 -p0-65535 --max-rate 100000

Dies erhöht die Rate auf 100.000 Pakete/Sekunde, was das gesamte Internet (abzüglich Ausschlüsse) in etwa 10 Stunden pro Port scannen wird (oder 655.360 Stunden, wenn alle Ports gescannt werden).

Das Bemerkenswerte an dieser Befehlszeile ist, dass dies alles nmap-kompatible Optionen sind. Darüber hinaus werden für Sie auch "unsichtbare", mit nmap kompatible Optionen gesetzt: -sS -Pn -n --randomize-hosts --send-eth. Ebenso ist das Format der XML-Datei von nmap inspiriert. Es gibt natürlich viele Unterschiede, da die asynchrone Natur des Programms zu einem grundlegend anderen Ansatz des Problems führt.

Die obige Befehlszeile ist etwas umständlich. Anstatt alles auf der Befehlszeile zu übergeben, kann es stattdessen in einer Datei gespeichert werden. Die obigen Einstellungen würden wie folgt aussehen:

root@kitploit:~
# Mein Scan
rate =  100000.00
output-format = xml
output-status = all
output-filename = scan.xml
ports = 0-65535
range = 0.0.0.0-255.255.255.255
excludefile = exclude.txt

Um diese Konfigurationsdatei zu verwenden, verwenden Sie -c:

root@kitploit:~
# masscan -c myscan.conf

Dies erleichtert auch die Wiederholung eines Scans.

Standardmäßig lädt masscan zuerst die Konfigurationsdatei /etc/masscan/masscan.conf. Alle späteren Konfigurationsparameter überschreiben die in dieser Standardkonfigurationsdatei. Dort habe ich meinen "excludefile"-Parameter abgelegt, damit ich ihn nie vergesse. Es funktioniert einfach automatisch.

Ausgabe erhalten

Standardmäßig erzeugt masscan ziemlich große Textdateien, aber es ist einfach, sie in jedes andere Format zu konvertieren. Es gibt fünf unterstützte Ausgabeformate:

  1. xml: Verwenden Sie einfach den Parameter -oX <Dateiname>. Oder verwenden Sie die Parameter --output-format xml und --output-filename <Dateiname>.

  2. binary: Dies ist das integrierte Format von masscan. Es erzeugt viel kleinere Dateien, so dass wenn ich das Internet scannen möchte, meine Festplatte nicht voll wird. Sie müssen sie jedoch parsen. Die Befehlszeilenoption --readscan liest binäre Scandateien. Die Verwendung von --readscan mit der -oX-Option erzeugt eine XML-Version der Ergebnisdatei.

  3. grepable: Dies ist eine Implementierung der Nmap -oG Ausgabe, die leicht von Befehlszeilenwerkzeugen geparst werden kann. Verwenden Sie einfach den Parameter -oG <Dateiname>. Oder verwenden Sie die Parameter --output-format grepable und --output-filename <Dateiname>.

  4. json: Dies speichert die Ergebnisse im JSON-Format. Verwenden Sie einfach den Parameter -oJ <Dateiname>. Oder verwenden Sie die Parameter --output-format json und .

Vergleich mit Nmap

Wo sinnvoll, wurde alle Mühe unternommen, das Programm nmap-Benutzern vertraut zu machen, obwohl es sich grundlegend unterscheidet. Masscan ist auf das Scannen großer Bereiche mit vielen Maschinen optimiert, während nmap für intensives Scannen einer einzelnen Maschine oder eines kleinen Bereichs konzipiert ist.

Zwei wichtige Unterschiede sind:

  • keine Standardports zum Scannen, Sie müssen -p <Ports> angeben
  • Zielhosts sind IP-Adressen oder einfache Bereiche, keine DNS-Namen, noch die ausgefallenen Subnetzbereiche, die nmap verwenden kann (wie 10.0.0-255.0-255).

Sie können sich masscan so vorstellen, dass die folgenden Einstellungen dauerhaft aktiviert sind:

  • -sS: führt nur SYN-Scan durch (derzeit, wird sich in Zukunft ändern)
  • -Pn: pingt Hosts nicht zuerst an, was für den asynchronen Betrieb grundlegend ist
  • -n: es findet keine DNS-Auflösung statt
  • --randomize-hosts: Scan vollständig randomisiert, immer, Sie können dies nicht ändern
  • --send-eth: sendet mit rohem libpcap

Wenn Sie eine Liste zusätzlicher nmap-kompatibler Einstellungen wünschen, verwenden Sie den folgenden Befehl:

root@kitploit:~
# masscan --nmap

Übertragungsrate (WICHTIG!!)

Dieses Programm spuckt Pakete sehr schnell aus. Unter Windows oder von VMs aus kann es 300.000 Pakete/Sekunde schaffen. Unter Linux (ohne Virtualisierung) schafft es 1,6 Millionen Pakete pro Sekunde. Das ist schnell genug, um die meisten Netzwerke zu schmelzen.

Beachten Sie, dass es nur Ihr eigenes Netzwerk schmelzen wird. Es randomisiert die Ziel-IP-Adressen, so dass es kein entferntes Netzwerk überlasten sollte.

Standardmäßig ist die Rate auf 100 Pakete/Sekunde eingestellt. Um die Rate auf eine Million zu erhöhen, verwenden Sie so etwas wie --rate 1000000.

Wenn Sie das IPv4-Internet scannen, werden Sie viele Subnetze scannen, so dass obwohl eine hohe Rate von ausgehenden Paketen besteht, jedes Zielsubnetz eine kleine Rate eingehender Pakete erhält.

Bei IPv6-Scans hingegen konzentrieren Sie sich tendenziell auf ein einziges Zielsubnetz mit Milliarden von Adressen. Daher wird Ihr Standardverhalten das Zielnetzwerk überlasten. Netzwerke stürzen oft unter der Last ab, die masscan erzeugen kann.

Design

Dieser Abschnitt beschreibt die wichtigsten Designfragen des Programms.

Code-Layout

Die Datei main.c enthält die main()-Funktion, wie Sie es erwarten würden. Sie enthält auch die Funktionen transmit_thread() und receive_thread(). Diese Funktionen wurden bewusst flach gehalten und stark kommentiert, so dass Sie das Design des Programms lesen können, indem Sie Schritt für Schritt durch jede dieser Funktionen gehen.

Asynchron

Dies ist ein asynchrones Design. Mit anderen Worten, es ist zu nmap das, was der nginx-Webserver zu Apache ist. Es hat getrennte Sende- und Empfangsthreads, die weitgehend unabhängig voneinander sind. Es ist die gleiche Art von Design wie in scanrand, unicornscan und ZMap.

Da es asynchron ist, läuft es so schnell, wie es die zugrunde liegende Paketübertragung erlaubt.

Randomisierung

Ein wesentlicher Unterschied zwischen Masscan und anderen Scannern ist die Art und Weise, wie es Ziele randomisiert.

Das grundlegende Prinzip ist, eine einzelne Indexvariable zu haben, die bei Null beginnt und für jeden Probe um eins erhöht wird. In C-Code wird dies ausgedrückt als:

root@kitploit:~
for (i = 0; i < range; i++) {
    scan(i);
}

Wir müssen den Index in eine IP-Adresse übersetzen. Nehmen wir an, Sie möchten alle "privaten" IP-Adressen scannen. Das wäre die Tabelle von Bereichen wie:

root@kitploit:~
192.168.0.0/16
10.0.0.0/8
172.16.0.0/12

In diesem Beispiel werden die ersten 64k Indizes an 192.168.x.x angehängt, um die Zieladresse zu bilden. Dann werden die nächsten 16 Millionen an 10.x.x.x angehängt. Die restlichen Indizes im Bereich werden auf 172.16.x.x angewendet.

In diesem Beispiel haben wir nur drei Bereiche. Wenn wir das gesamte Internet scannen, haben wir in der Praxis mehr als 100 Bereiche. Das liegt daran, dass Sie viele Teilbereiche auf die schwarze Liste setzen oder ausschließen müssen. Dadurch wird der gewünschte Bereich in Hunderte kleinerer Bereiche zerlegt.

Dies führt zu einem der langsamsten Teile des Codes. Wir übertragen 10 Millionen Pakete pro Sekunde und müssen für jeden einzelnen Probe einen Indexvariablen in eine IP-Adresse umwandeln. Wir lösen dies, indem wir eine "binäre Suche" in einer kleinen Menge Speicher durchführen. Bei dieser Paketrate beginnen Cache-Effizienzen die Algorithmus-Effizienzen zu dominieren. Es gibt in der Theorie viele effizientere Techniken, aber sie alle erfordern so viel Speicher, dass sie in der Praxis langsamer sind.

Wir nennen die Funktion, die einen Index in eine IP-Adresse übersetzt, die pick()-Funktion. In der Verwendung sieht es so aus:

root@kitploit:~
for (i = 0; i < range; i++) {
    ip = pick(addresses, i);
    scan(ip);
}

Masscan unterstützt nicht nur IP-Adressbereiche, sondern auch Portbereiche. Das bedeutet, wir müssen aus der Indexvariablen sowohl eine IP-Adresse als auch einen Port auswählen. Das ist ziemlich einfach:

root@kitploit:~
range = ip_count * port_count;
for (i = 0; i < range; i++) {
    ip   = pick(addresses, i / port_count);
    port = pick(ports,     i % port_count);
    scan(ip, port);
}

Dies führt zu einem weiteren teuren Teil des Codes. Die Division/Modulo-Operationen liegen bei etwa 90 Taktzyklen oder 30 Nanosekunden auf x86-CPUs. Wenn wir mit einer Rate von 10 Millionen Paketen/Sekunde senden, haben wir nur 100 Nanosekunden pro Paket. Ich sehe keine Möglichkeit, dies besser zu optimieren. Glücklicherweise können zwei solcher Operationen gleichzeitig ausgeführt werden, so dass die Durchführung von zwei dieser Operationen, wie oben gezeigt, nicht teurer ist als eine.

Es gibt tatsächlich einige einfache Optimierungen für die oben genannten Leistungsprobleme, aber sie alle basieren auf i++, der Tatsache, dass die Indexvariable während des Scans eins nach dem anderen erhöht wird. Eigentlich müssen wir diese Variable randomisieren. Wir müssen die Reihenfolge der IP-Adressen, die wir scannen, randomisieren, sonst blasen wir Zielnetzwerke, die nicht für diese Geschwindigkeit ausgelegt sind, weg. Wir müssen unseren Verkehr gleichmäßig über das Ziel verteilen.

Die Art und Weise, wie wir randomisieren, besteht einfach darin, die Indexvariable zu verschlüsseln. Per Definition ist Verschlüsselung zufällig und erzeugt eine 1-zu-1-Abbildung zwischen der ursprünglichen Indexvariablen und der Ausgabe. Dies bedeutet, dass während wir linear durch den Bereich gehen, die ausgegebenen IP-Adressen völlig zufällig sind. Im Code sieht dies so aus:

root@kitploit:~
range = ip_count * port_count;
for (i = 0; i < range; i++) {
    x = encrypt(i);
    ip   = pick(addresses, x / port_count);
    port = pick(ports,     x % port_count);
    scan(ip, port);
}

Dies hat auch große Kosten. Da der Bereich eine unvorhersehbare Größe hat, anstatt einer schönen geraden Potenz von 2, können wir keine billigen binären Techniken wie UND (&) und XOR (^) verwenden. Stattdessen müssen wir teure Operationen wie MODULO (%) verwenden. In meinen aktuellen Benchmarks dauert es 40 Nanosekunden, um die Variable zu verschlüsseln.

Diese Architektur ermöglicht viele coole Funktionen. Zum Beispiel unterstützt sie "Shards". Sie können 5 Maschinen einrichten, die jeweils ein Fünftel des Scans durchführen, oder range / shard_count. Shards können mehrere Maschinen oder einfach mehrere Netzwerkadapter auf derselben Maschine oder sogar (wenn Sie möchten) mehrere IP-Quelladressen auf demselben Netzwerkadapter sein.

Oder Sie können einen 'Seed' oder 'Key' für die Verschlüsselungsfunktion verwenden, so dass Sie jedes Mal eine andere Reihenfolge erhalten, wenn Sie scannen, wie x = encrypt(seed, i).

Wir können den Scan auch anhalten, indem wir das Programm beenden, und uns einfach den aktuellen Wert von i merken, um ihn später neu zu starten. Das mache ich während der Entwicklung oft. Wenn ich sehe, dass bei meinem Internetscan etwas schief läuft, drücke ich , um den Scan zu stoppen, und starte ihn neu, nachdem ich den Fehler behoben habe.

Eine weitere Funktion sind Wiederholungen/Retries. Pakete gehen manchmal im Internet verloren, so dass Sie zwei Pakete hintereinander senden können. Allerdings kann etwas, das ein Paket fallen lässt, auch das unmittelbar folgende Paket fallen lassen. Daher sollten Sie die Kopie etwa eine Sekunde später senden. Das ist einfach. Wir haben bereits eine 'rate'-Variable, die die Anzahl der Pakete pro Sekunde ist, mit der wir senden, so dass die Wiederholungsfunktion einfach darin besteht, i + rate als Index zu verwenden. Eines Tages werde ich eine Studie über das Internet durchführen und zwischen "Back-to-Back", "1 Sekunde", "10 Sekunden" und "1 Minute" Wiederholungen auf diese Weise unterscheiden, um zu sehen, ob es einen Unterschied gibt, was verloren geht.

C10-Skalierbarkeit

Die asynchrone Technik ist als Lösung für das "c10k-Problem" bekannt. Masscan ist für die nächste Skalierungsstufe konzipiert, das "C10M-Problem".

Die C10M-Lösung besteht darin, den Kernel zu umgehen. Es gibt drei primäre Kernel-Bypass-Mechanismen in Masscan:

  • benutzerdefinierter Netzwerktreiber
  • TCP-Stack im Benutzermodus
  • Synchronisation im Benutzermodus

Masscan kann den PF_RING DNA-Treiber verwenden. Dieser Treiber überträgt Pakete direkt vom Userspace-Speicher zum Netzwerktreiber ohne Kernel-Beteiligung. Damit kann Software, selbst mit einer langsamen CPU, Pakete mit der maximalen Rate senden, die die Hardware erlaubt. Wenn Sie 8 10-Gbit/s-Netzwerkkarten in einen Computer einbauen, könnte dies bedeuten, dass er 100 Millionen Pakete pro Sekunde senden könnte.

Masscan hat seinen eigenen integrierten TCP-Stack zum Erfassen von Bannern von TCP-Verbindungen. Das bedeutet, dass es problemlos 10 Millionen gleichzeitige TCP-Verbindungen unterstützen kann, vorausgesetzt, der Computer hat genügend Arbeitsspeicher.

Masscan hat keinen "Mutex". Moderne Mutexe (auch Futexe genannt) sind meist im Benutzermodus, aber sie haben zwei Probleme. Das erste Problem ist, dass sie Cache-Zeilen schnell zwischen CPUs hin- und herspringen lassen. Das zweite ist, dass sie bei Konflikten einen Systemaufruf in den Kernel durchführen, was die Leistung tötet. Ein Mutex auf dem schnellen Pfad eines Programms schränkt die Skalierbarkeit stark ein. Stattdessen verwendet Masscan "Ringe", um Dinge zu synchronisieren, wie zum Beispiel wenn der TCP-Stack im Benutzermodus im Empfangsthread ein Paket senden muss, ohne den Sendethread zu stören.

PortabilitätDer Code läuft gut auf Linux, Windows und Mac OS X. Alle wichtigen Teile sind

in Standard-C (C90). Daher lässt er sich mit Visual Studio und Microsofts Compiler, dem Clang/LLVM-Compiler auf Mac OS X sowie GCC auf Linux kompilieren.

Windows und Macs sind nicht für den Paketversand optimiert und erreichen nur etwa 300.000 Pakete pro Sekunde, während Linux 1.500.000 Pakete pro Sekunde schafft. Das ist wahrscheinlich ohnehin schneller, als du brauchst.

Sicherer Code

Es wird eine Prämie für Sicherheitslücken angeboten (siehe VULNINFO.md für weitere Informationen).

Dieses Projekt verwendet sichere Funktionen wie safe_strcpy() anstelle unsicherer Funktionen wie strcpy().

Dieses Projekt verfügt über automatisierte Unit-Regressionstests (make regress).

Kompatibilität

Es wurde viel Mühe darauf verwendet, die Ein-/Ausgabe wie bei nmap aussehen zu lassen, womit jeder, der Portscans durchführt, vertraut ist (oder sein sollte).

IPv6- und IPv4-Koexistenz

Masscan unterstützt IPv6, aber es gibt keinen speziellen Modus – beide werden gleichzeitig unterstützt. (Es gibt keine -6-Option – sie ist immer verfügbar).

In jedem Beispiel zur Verwendung von Masscan setzt du einfach eine IPv6-Adresse an die Stelle, an der du eine IPv4-Adresse siehst. Du kannst IPv4- und IPv6-Adressen gleichzeitig in einem Scan angeben. Die Ausgabe enthält die entsprechende Adresse an derselben Stelle ohne spezielle Kennzeichnung.

Denk daran, dass der IPv6-Adressraum wirklich groß ist. Du wirst wahrscheinlich keine großen Bereiche scannen wollen, außer vielleicht die ersten 64k Adressen eines Subnetzes, die über DHCPv6 vergeben wurden.

Stattdessen wirst du wahrscheinlich große Adresslisten aus einer Datei scannen wollen (--include-file dateiname.txt), die du aus anderen Quellen hast. Wie überall sonst kann diese Datei sowohl IPv4- als auch IPv6-Adressen enthalten. Die Testdatei, die ich verwende, enthält 8 Millionen Adressen. Dateien dieser Größe benötigen ein paar zusätzliche Sekunden zum Einlesen beim Start (Masscan sortiert die Adressen und entfernt Duplikate vor dem Scannen).

Denk daran, dass Masscan seinen eigenen Netzwerkstack enthält. Der lokale Rechner, von dem du Masscan ausführst, muss daher nicht IPv6-fähig sein – obwohl das lokale Netzwerk IPv6-Pakete routen können muss.

PF_RING

Um mehr als 2 Millionen Pakete pro Sekunde zu erreichen, benötigst du einen Intel-10-Gbit/s-Ethernet- Adapter und einen speziellen Treiber namens "PF_RING ZC" von ntop. Masscan muss nicht neu kompiliert werden, um PF_RING zu verwenden. Um PF_RING zu nutzen, musst du die folgenden Komponenten bauen:

  • libpfring.so (installiert in /usr/lib/libpfring.so)
  • pf_ring.ko (ihr Kernel-Treiber)
  • ixgbe.ko (ihre Version des Intel-10-Gbit/s-Ethernet-Treibers)

Du musst nicht ihre Version von libpcap.so bauen.

Wenn Masscan erkennt, dass ein Adapter einen Namen wie zc:enp1s0 statt enp1s0 hat, wechselt es automatisch in den PF_RING ZC-Modus.

Eine ausführlichere Diskussion findet sich in PoC||GTFO 0x15.

Regressionstests

Das Projekt enthält einen integrierten Unit-Test:

root@kitploit:~
$ make test
bin/masscan --selftest
selftest: success!

Dies testet viele knifflige Teile des Codes. Du solltest dies nach dem Bauen durchführen.

Leistungstests

Um die Leistung zu testen, führe etwa Folgendes zu einer Wegwerf-Adresse aus, um deinen lokalen Router nicht zu überlasten:

root@kitploit:~
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --router-mac 66-55-44-33-22-11

Die unechte --router-mac hält Pakete im lokalen Netzwerksegment, sodass sie nicht ins Internet gelangen.

Du kannst auch im „Offline"-Modus testen, der angibt, wie schnell das Programm ohne den Sende-Overhead läuft:

root@kitploit:~
$ bin/masscan 0.0.0.0/4 -p80 --rate 100000000 --offline

Dieser zweite Benchmark zeigt grob, wie schnell das Programm laufen würde, wenn es PF_RING nutzen würde, das nahezu keinen Overhead hat.

Übrigens nutzt der Randomisierungsalgorithmus stark „Integer-Arithmetik", eine chronisch langsame Operation auf CPUs. Moderne CPUs haben die Geschwindigkeit dieser Berechnung verdoppelt, was masscan deutlich schneller macht.

Autoren

Dieses Tool wurde von Robert Graham erstellt: E-Mail: [email protected] Twitter: @ErrataRob

Lizenz

Copyright (c) 2013 Robert David Graham

Dieses Programm ist freie Software: Sie können es unter den Bedingungen der GNU Affero General Public License, Version 3 der Lizenz, weiterverbreiten und/oder modifizieren, wie von der Free Software Foundation veröffentlicht.

Dieses Programm wird in der Hoffnung verbreitet, dass es nützlich sein wird, aber OHNE JEDE GEWÄHRLEISTUNG; sogar ohne die stillschweigende Garantie der MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU Affero General Public License für weitere Details.

Sie sollten eine Kopie der GNU Affero General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, siehe https://www.gnu.org/licenses/.

Tool herunterladen
--output-filename <Dateiname>
  • list: Dies ist eine einfache Liste mit einem Host- und Portpaar pro Zeile. Verwenden Sie einfach den Parameter -oL <Dateiname>. Oder verwenden Sie die Parameter --output-format list und --output-filename <Dateiname>. Das Format ist:

    root@kitploit:~
    <Port-Status> <Protokoll> <Portnummer> <IP-Adresse> <POSIX-Zeitstempel>
    open tcp 80 XXX.XXX.XXX.XXX 1390380064