
🖖 Schneller, moderner, benutzerfreundlicher Netzwerkscanner
sx ist der Kommandozeilen-Netzwerkscanner, der der UNIX-Philosophie folgt.
Ziel dieses Projekts ist es, den schnellsten Netzwerkscanner mit sauberem und einfachem Code zu erstellen.
Der einfachste Weg ist, von GitHub Releases herunterzuladen und die ausführbare Datei in Ihrem PATH zu platzieren.
Voraussetzungen:
Installieren Sie unter macOS zuerst die Xcode Command Line Tools, damit CGO gegen die systemeigene libpcap linken kann:
xcode-select --install
Führen Sie im Wurzelverzeichnis des Quellbaums Folgendes aus:
go build
Hier sind kurze Beispiele, wie Sie Netzwerke mit sx scannen können.
Durchsuchen Sie Ihr lokales Netzwerk und zeigen Sie die IP-Adresse, MAC-Adresse und den zugehörigen Hardware-Hersteller der verbundenen Geräte an:
sx arp 192.168.0.1/24
Beispielausgabe:
192.168.0.1 b0:be:76:40:05:8d TP-LINK TECHNOLOGIES CO.,LTD.
192.168.0.111 80:c5:f2:0b:02:e3 AzureWave Technology Inc.
192.168.0.171 88:53:95:2d:3c:af Apple, Inc.
mit JSON-Ausgabe:
sx arp --json 192.168.0.1/24
Beispielausgabe:
{"ip":"192.168.0.1","mac":"b0:be:76:40:05:8d","vendor":"TP-LINK TECHNOLOGIES CO.,LTD."}
{"ip":"192.168.0.111","mac":"80:c5:f2:0b:02:e3","vendor":"AzureWave Technology Inc."}
{"ip":"192.168.0.171","mac":"88:53:95:2d:3c:af","vendor":"Apple, Inc."}
5 Sekunden vor dem Beenden warten, um verzögerte Antwortpakete zu empfangen; standardmäßig wartet sx 300 Millisekunden:
sx arp --exit-delay 5s 192.168.0.1/24
Live-Scan-Modus, der das Netzwerk alle 10 Sekunden erneut scannt:
sx arp 192.168.0.1/24 --live 10s
Im Gegensatz zu nmap und anderen Scannern, die vor dem eigentlichen Scan implizit ARP-Anfragen durchführen, um IP-Adressen in MAC-Adressen aufzulösen, verwendet sx explizit das ARP-Cache-Konzept. Eine ARP-Cache-Datei ist eine einfache Textdatei, die pro Zeile einen JSON-String enthält (JSONL-Datei), mit denselben JSON-Feldern wie die oben beschriebene ARP-Scan-JSON-Ausgabe. Scans von Protokollen höherer Ebene wie TCP und UDP lesen die ARP-Cache-Datei von der Standardeingabe und starten dann den eigentlichen Scan.
Dies vereinfacht nicht nur das Design des Programms, sondern beschleunigt auch den Scanvorgang, da nicht jedes Mal ein ARP-Scan durchgeführt werden muss.
Nehmen wir an, dass der aktuelle ARP-Cache in der Datei arp.cache ist. Wir können ihn manuell erstellen oder den ARP-Scan wie unten gezeigt verwenden:
sx arp 192.168.0.1/24 --json | tee arp.cache
Sobald wir die ARP-Cache-Datei haben, können wir Scans von Protokollen höherer Ebene wie den TCP-SYN-Scan ausführen:
cat arp.cache | sx tcp -p 1-65535 192.168.0.171
Beispielausgabe:
192.168.0.171 22
192.168.0.171 443
In diesem Fall stellen wir fest, dass die Ports 22 und 443 offen sind.
Wenn während großer Scans send: No buffer space available erscheint, bedeutet dies in der Regel, dass der Sender die Kernel/Raw-Socket-Puffer überläuft. Die erste Abhilfe besteht darin, --rate hinzuzufügen und den Sendeburst zu verringern, z. B. -r 100000/s oder bei Bedarf niedriger. Auf manchen Systemen kann auch die Anpassung der OS-Socket/Puffergrenzen helfen, aber Ratenbegrenzung ist die primäre Lösung.
Scan mit JSON-Ausgabe:
cat arp.cache | sx tcp --json -p 1-65535 192.168.0.171
Beispielausgabe:
{"scan":"tcpsyn","ip":"192.168.0.171","port":22}
{"scan":"tcpsyn","ip":"192.168.0.171","port":443}
Mehrere Portbereiche scannen:
cat arp.cache | sx tcp -p 1-23,25-443 192.168.0.171
oder einzelne Ports:
cat arp.cache | sx tcp -p 22,443 192.168.0.171
oder die Option --ports-file verwenden, um eine Datei mit Ports oder Portbereichen (einer pro Zeile) zum Scannen anzugeben.
IP/Port-Paare aus einer Datei mit JSON-Ausgabe scannen:
cat arp.cache | sx tcp --json -f ip_ports_file.jsonl
Jede Zeile der Eingabedatei ist ein JSON-String, der die Felder ip und port enthalten muss.
Beispiel für eine Eingabedatei:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
Es ist möglich, die ARP-Cache-Datei mit den Optionen -a oder --arp-cache anzugeben:
sx tcp -a arp.cache -p 22,443 192.168.0.171
oder per stdin-Umleitung:
sx tcp -p 22,443 192.168.0.171 < arp.cache
Sie können auch den Unterbefehl tcp syn anstelle von tcp verwenden:
cat arp.cache | sx tcp syn -p 22 192.168.0.171
Der Unterbefehl tcp ist nur eine Kurzform für tcp syn, sofern nicht die Option --flags übergeben wird (siehe unten).
sx unterstützt das Scannen mit virtuellen Netzwerkschnittstellen (WireGuard, OpenVPN usw.). In diesem Fall ist die Verwendung des ARP-Caches nicht erforderlich, da diese Schnittstellen rohe IP-Pakete anstelle von Ethernet-Frames als Eingabe benötigen. Beispielsweise das Scannen einer IP-Adresse in einem VPN-Netzwerk:
sx tcp 10.1.27.1 -p 80 --json
Die meisten Netzwerkscanner versuchen, die Scanergebnisse zu interpretieren. Sie sagen zum Beispiel „dieser Port ist geschlossen“, anstatt „ich habe ein RST empfangen“. Manchmal haben sie recht. Manchmal nicht. Für Anfänger ist das einfacher, aber wenn man weiß, was man tut, versucht man ständig, aus der Interpretation des Programms abzuleiten, was wirklich passiert ist – insbesondere bei fortgeschritteneren Scantechniken.
sx versucht, diese Probleme zu überwinden. Es gibt Informationen über alle Antwortpakete für TCP-FIN-, NULL-, Xmas- und benutzerdefinierte TCP-Scans zurück. Die Informationen enthalten IP-Adresse, TCP-Port und alle im Antwortpaket gesetzten TCP-Flags.
Der TCP-FIN-Scan und seine anderen Varianten (NULL und Xmas) nutzen RFC793 Abschnitt 3.9:
SEGMENT ARRIVES
If the state is CLOSED (i.e., TCB does not exist) then
all data in the incoming segment is discarded. An incoming segment containing a RST is discarded. An incoming segment not containing a RST causes a RST to be sent in response. The acknowledgment and sequence field values are selected to make the reset sequence acceptable to the TCP that sent the offending segment.
Ein geschlossener Port sollte also ein Paket mit RST-Flag zurückgeben.
Dieser Abschnitt stellt auch fest:
If the state is LISTEN then
...
Any other control or text-bearing segment (not containing SYN) must have an ACK and thus would be discarded by the ACK processing. An incoming RST segment could not be valid, since it could not have been sent in response to anything sent by this incarnation of the connection. So you are unlikely to get here, but if you do, drop the segment, and return.
Der entscheidende Satz hier: drop the segment, und return. Ein offener Port auf den meisten Betriebssystemen wird also das TCP-Paket verwerfen, das außer SYN, ACK und RST beliebige Flags enthält.
Lassen Sie uns einen geschlossenen Port mit dem TCP-FIN-Scan scannen:
cat arp.cache | sx tcp fin --json -p 23 192.168.0.171
Beispielausgabe:
{"scan":"tcpfin","ip":"192.168.0.171","port":23,"flags":"ar"}
Das Feld flags enthält alle TCP-Flags im Antwortpaket, wobei jeder Buchstabe für eines der TCP-Flags steht:
s – SYN-Flaga – ACK-Flagf – FIN-Flagr – RST-Flagp – PSH-Flagu – URG-Flage – ECE-Flagc – CWR-Flagn – NS-FlagIn diesem Fall stellen wir fest, dass Port 23 ein Antwortpaket mit gesetzten ACK- und RST-Flags gesendet hat (typische Antwort für einen geschlossenen Port gemäß RFC793).
Wenn wir einen offenen Port scannen, erhalten wir keine Antwort (es sei denn, die Firewall täuscht die Antworten vor).
Andere Arten von TCP-Scans können analog durchgeführt werden.
TCP-NULL-Scan:
cat arp.cache | sx tcp null --json -p 23 192.168.0.171
TCP-Xmas-Scan:
cat arp.cache | sx tcp xmas --json -p 23 192.168.0.171
Es ist möglich, TCP-Pakete mit benutzerdefinierten TCP-Flags zu senden, indem die Option --flags verwendet wird.
Senden wir ein TCP-Paket mit gesetzten SYN-, FIN- und ACK-Flags, um das entfernte Betriebssystem zu identifizieren:
cat arp.cache | sx tcp --flags syn,fin,ack --json -p 23 192.168.0.171
Windows und MacOS werden nicht auf dieses Paket antworten, aber Linux sendet ein Antwortpaket mit RST-Flag.
Mögliche Argumente für die Option --flags:
syn – SYN-Flagack – ACK-Flagfin – FIN-Flagrst – RST-Flagpsh – PSH-Flagurg – URG-Flagece – ECE-Flagcwr – CWR-Flagns – NS-Flagsx kann bei der Untersuchung offener UDP-Ports helfen. Der UDP-Scan nutzt RFC1122 Abschnitt 4.1.3.1:
If a datagram arrives addressed to a UDP port for which there is no pending LISTEN call, UDP SHOULD send an ICMP Port Unreachable message.
Ähnlich wie bei TCP-Scans gibt sx Informationen über alle ICMP-Antwortpakete für den UDP-Scan zurück. Die Informationen enthalten IP-Adresse, ICMP-Pakettyp und -Code, die im Antwortpaket gesetzt sind.
Um beispielsweise einen DNS-Server auf einem Host zu erkennen, führen Sie Folgendes aus:
cat arp.cache | sx udp --json -p 53 192.168.0.171
Beispielausgabe:
{"scan":"udp","ip":"192.168.0.171","icmp":{"type":3,"code":3}}
In diesem Fall stellen wir fest, dass der Host ein ICMP-Antwortpaket mit dem Typ Destination Unreachable und dem Code Port Unreachable gesendet hat (typische Antwort für einen geschlossenen Port gemäß RFC1122).
Firewalls setzen normalerweise einen ICMP-Code, der sich von Port Unreachable unterscheidet, und können so leicht erkannt werden.
Manchmal muss die Geschwindigkeit begrenzt werden, mit der generierte Pakete gesendet werden. Dies kann mit der Option --rate erfolgen.
Beispielsweise um die Geschwindigkeit auf 1 Paket pro 5 Sekunden zu begrenzen:
cat arp.cache | sx tcp --rate 1/5s --json -p 22,80,443 192.168.0.171
Manchmal müssen einige IP-Adressen und Subnetze vom Scannen ausgeschlossen werden. Dies kann mit der Option --exclude erfolgen. Sie gibt eine Datei mit IPs oder Subnetzen in CIDR-Notation an, die ausgeschlossen werden sollen, eine pro Zeile.
Um beispielsweise RFC-1918-Adressen auszuschließen, erstellen Sie eine Datei ips.txt mit folgendem Inhalt:
10.0.0.0/8
172.16.0.0/16
192.168.0.0/16
Sie können auch Kommentare und Leerzeilen einfügen:
# exclude RFC 1918 addresses
10.0.0.0/8 # comment 1
172.16.0.0/12 # comment 2
192.168.0.0/16 # comment 3
0.0.0.0/8 # used in initialization procedures (RFC 6890)
# exclude RFC 5735 addresses
127.0.0.0/8 # loopback address
192.0.0.0/24 # reserved block for IETF protocol assignments
224.0.0.0/4 # allocated for use in IPv4 multicast address assignments
240.0.0.0/4 # reserved for future use
# exclude Amazon network
3.0.0.0/8
# ip addresses are valid as well
1.1.1.1
und führen Sie einen Scan mit der Option --exclude ips.txt durch.
Als Beispiel für die Zusammensetzung von Scans können Sie ARP- und TCP-SYN-Scans kombinieren, um einen Live-TCP-Portscanner zu erstellen, der periodisch das gesamte LAN-Netzwerk scannt.
Starten Sie einen Live-ARP-Scan und speichern Sie die Ergebnisse in der Datei arp.cache:
sx arp 192.168.0.1/24 --live 10s --json | tee arp.cache
Starten Sie in einem anderen Terminal einen TCP-SYN-Scan:
while true; do sx tcp -p 1-65535 -a arp.cache -f arp.cache; sleep 30; done
sx kann aktive SOCKS5-Proxys erkennen. Zum Scannen müssen Sie einen IP-Bereich oder eine JSONL-Datei mit IP/Port-Paaren angeben.
Zum Beispiel ein IP-Bereich-Scan:
sx socks -p 1080 10.0.0.1/16
IP/Port-Paare aus einer Datei mit JSON-Ausgabe scannen:
sx socks --json -f ip_ports_file.jsonl
Jede Zeile der Eingabedatei ist ein JSON-String, der die Felder ip und port enthalten muss.
Beispiel für eine Eingabedatei:
{"ip":"10.0.1.1","port":1080}
{"ip":"10.0.2.2","port":1081}
Sie können auch einen Bereich von Ports zum Scannen angeben:
sx socks -p 1080-4567 -f ips_file.jsonl
In diesem Fall werden nur IP-Adressen aus der Datei übernommen, und das Feld port ist nicht mehr erforderlich.
sx help
Beiträge, Probleme und Funktionswünsche sind willkommen.
Das Logo wurde von mikhailtsoy.com entworfen.
Dieses Projekt ist unter der MIT-Lizenz lizenziert. Siehe die Datei LICENSE für den vollständigen Lizenztext.