|
|
Zeile 219: |
Zeile 219: |
| = TMP = | | = TMP = |
| '''nc''' ('''n'''et'''c'''at) ist ein einfaches Werkzeug, um Netzwerkverbindungen über TCP, UDP und UNIX-Domain-Sockets aufzubauen | | '''nc''' ('''n'''et'''c'''at) ist ein einfaches Werkzeug, um Netzwerkverbindungen über TCP, UDP und UNIX-Domain-Sockets aufzubauen |
|
| |
| == Anwendung ==
| |
| === Client/Server-Modell ===
| |
| Starten Sie auf einer Konsole nc, um an einem bestimmten Port nach einer Verbindung zu lauschen.
| |
| $ '''nc -l 1234'''
| |
| nc lauscht jetzt auf Port 1234 auf eine Verbindung.
| |
|
| |
| Stellen Sie auf einer zweiten Konsole (oder einem zweiten Computer) eine Verbindung zu dem Computer und dem Port her, auf dem gelauscht wird:
| |
| $ '''nc -N 127.0.0.1 1234'''
| |
|
| |
| Es sollte nun eine Verbindung zwischen den Ports bestehen.
| |
| * Alles, was auf der zweiten Konsole eingegeben wird, wird mit der ersten verkettet und umgekehrt.
| |
| * Nach dem Verbindungsaufbau ist es nc eigentlich egal, welche Seite als 'Server' und welche Seite als 'Client' verwendet wird.
| |
| * Die Verbindung kann mit einem EOF ('^D') beendet werden, da das Flag -N angegeben wurde.
| |
|
| |
| Es gibt keine Option -c oder -e in diesem Netcat, aber Sie können trotzdem einen Befehl ausführen, nachdem die Verbindung hergestellt wurde, indem Sie Dateideskriptoren umleiten.
| |
| * Seien Sie hier vorsichtig, denn das Öffnen eines Ports und das Ausführen beliebiger Befehle auf Ihrer Site durch jeden, der damit verbunden ist, ist GEFÄHRLICH.
| |
|
| |
| Wenn Sie dies wirklich tun müssen, hier ein Beispiel:
| |
|
| |
| Auf 'Server'-Seite:
| |
| $ '''rm -f /tmp/f; mkfifo /tmp/f'''
| |
| $ '''cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f'''
| |
|
| |
| Auf 'Client'-Seite:
| |
| $ '''nc host.example.com 1234'''
| |
| $ '''(shell prompt from host.example.com)'''
| |
|
| |
| Dadurch erstellen Sie ein Fifo unter /tmp/f und veranlassen nc, auf Port 1234 der Adresse 127.0.0.1 auf der 'Server'-Seite zu lauschen, wenn ein 'Client' eine Verbindung herstellt. Verbindung erfolgreich zu diesem Port, /bin/sh wird auf der 'Server'-Seite ausgeführt und der Shell-Prompt wird an die 'Client'-Seite übergeben.
| |
|
| |
| Wenn die Verbindung beendet wird, wird auch nc beendet.
| |
| * Verwenden Sie -k, wenn Sie möchten, dass es weiter zuhört, aber wenn der Befehl beendet wird, wird es durch diese Option nicht neu gestartet oder nc am Laufen gehalten.
| |
| * Vergessen Sie auch nicht, den Dateideskriptor zu entfernen, wenn Sie ihn nicht mehr benötigen:
| |
| $ '''rm -f /tmp/f'''
| |
|
| |
| === Datenübertragung ===
| |
| Das Beispiel im vorherigen Abschnitt kann erweitert werden, um ein grundlegendes Datenübertragungsmodell zu erstellen.
| |
| * Alle Informationen, die an einem Ende der Verbindung eingegeben werden, werden an das andere Ende ausgegeben, und Eingabe und Ausgabe können einfach erfasst werden, um die Dateiübertragung zu emulieren.
| |
|
| |
| Beginnen Sie mit nc, um einen bestimmten Port zu überwachen, wobei die Ausgabe in einer Datei erfasst wird:
| |
| $ '''nc -l 1234 > filename.out'''
| |
|
| |
| Verbinden Sie sich mit einem zweiten Computer mit dem lauschenden nc-Prozess und füttern Sie ihn mit der zu übertragenden Datei:
| |
| $ '''nc -N host.example.com 1234 < filename.in'''
| |
|
| |
| Nachdem die Datei übertragen wurde, wird die Verbindung automatisch geschlossen.
| |
|
| |
| === Einen Server ansprechen ===
| |
| Manchmal ist es nützlich, mit Servern „von Hand“ zu kommunizieren, anstatt über eine Benutzeroberfläche.
| |
| * Es kann bei der Fehlerbehebung hilfreich sein, wenn möglicherweise überprüft werden muss, welche Daten ein Server als Antwort auf vom Client ausgegebene Befehle sendet.
| |
| * Um etwa die Startseite einer Website abzurufen:
| |
| $ '''printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80'''
| |
|
| |
| Beachten Sie, dass dies auch die vom Webserver gesendeten Header anzeigt.
| |
| * Sie können bei Bedarf mit einem Tool wie sed(1) gefiltert werden.
| |
|
| |
| Kompliziertere Beispiele können aufgebaut werden, wenn der Benutzer das vom Server geforderte Anforderungsformat kennt.
| |
| * Als weiteres Beispiel kann eine E-Mail sub an einen SMTP-Server übermittelt mit:
| |
|
| |
| $ '''nc [-C] localhost 25 << EOF'''
| |
| HELO host.example.com
| |
| MAIL FROM:<user@host.example.com>
| |
| RCPT TO:<user2@host.example.com>
| |
| DATA
| |
| Body of email.
| |
| .
| |
| QUIT
| |
| EOF
| |
|
| |
| === Port-Scanning ===
| |
| Es kann hilfreich sein zu wissen, welche Ports geöffnet sind und welche Dienste auf einem Zielcomputer ausgeführt werden.
| |
| * Das Flag -z kann verwendet werden, um nc anzuweisen, offene Ports zu melden,
| |
| anstatt eine Verbindung herzustellen.
| |
| * Normalerweise ist es nützlich, die ausführliche Ausgabe an stderr zu aktivieren, indem Sie diese Option in Verbindung mit der Option -v verwenden.
| |
|
| |
| Zum Beispiel:
| |
| $ '''nc -zv host.example.com 20-30'''
| |
| Connection to host.example.com 22 port [tcp/ssh] succeeded!
| |
| Connection to host.example.com 25 port [tcp/smtp] succeeded!
| |
|
| |
| Der Portbereich wurde angegeben, um die Suche auf die Ports 20–30 zu beschränken, und wird in aufsteigender Reihenfolge gescannt (es sei denn, das Flag -r ist gesetzt).
| |
|
| |
| Sie können auch eine Liste der zu scannenden Ports angeben, zum Beispiel:
| |
| $ '''nc -zv host.example.com http 20 22-23'''
| |
| nc: connect to host.example.com 80 (tcp) failed: Connection refused
| |
| nc: connect to host.example.com 20 (tcp) failed: Connection refused
| |
| Connection to host.example.com port [tcp/ssh] succeeded!
| |
| nc: connect to host.example.com 23 (tcp) failed: Connection refused
| |
|
| |
| Die Ports werden in der von Ihnen angegebenen Reihenfolge gescannt (es sei denn, das Flag -r ist gesetzt).
| |
|
| |
| Alternativ kann es hilfreich sein zu wissen, welche Serversoftware ausgeführt wird und welche Versionen.
| |
| * Diese Informationen sind oft in der Begrüßung enthalten.
| |
| Werbebanner.
| |
| * Um diese abzurufen, ist es notwendig, zunächst eine Verbindung herzustellen und die Verbindung dann zu trennen, wenn das Banner abgerufen wurde.
| |
| Dies kann erreicht werden, indem ein kleines Timeout mit dem Flag -w angegeben wird, oder vielleicht indem ein "QUIT"-Befehl an den Server ausgegeben wird:
| |
| $ '''echo "QUIT" | nc host.example.com 20-30'''
| |
| SSH-1.99-OpenSSH_3.6.1p2
| |
| Protocol mismatch.
| |
| 220 host.example.com IMS SMTP Receiver Version 0.84 Ready
| |
|
| |
| === Beispiele ===
| |
| Öffnen Sie eine TCP-Verbindung zu Port 42 von host.example.com mit Port 31337 als Quellport und einem Timeout von 5 Sekunden:
| |
| $ '''nc -p 31337 -w 5 host.example.com 42'''
| |
|
| |
| Öffnen Sie eine UDP-Verbindung zu Port 53 von host.example.com:
| |
| $ '''nc -u host.example.com 53'''
| |
|
| |
| Öffnen Sie eine TCP-Verbindung zu Port 42 von host.example.com mit 10.1.2.3 als IP für das lokale Ende der Verbindung:
| |
| $ '''nc -s 10.1.2.3 host.example.com 42'''
| |
|
| |
| Erstellen und hören Sie einen UNIX-Domain-Stream-Socket:
| |
| $ '''nc -lU /var/tmp/dsocket'''
| |
|
| |
| Verbinden Sie sich mit Port 42 von host.example.com über einen HTTP-Proxy unter 10.2.3.4, Port 8080.
| |
| * Dieses Beispiel könnte auch von ssh(1) verwendet werden; siehe das ProxyCommand-Directive in ssh_config(5) für weitere Informationen.
| |
| $ '''nc -x10.2.3.4:8080 -Xconnect host.example.com 42'''
| |
|
| |
| Dasselbe Beispiel noch einmal, diesmal wird die Proxy-Authentifizierung mit dem Benutzernamen „ruser“ aktiviert, wenn der Proxy dies erfordert:
| |
| $ '''nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42'''
| |
|
| |
| === Hinweise ===
| |
| * UDP-Port-Scans mit der Flag-Kombination -uz melden immer Erfolg, unabhängig vom Status des Zielcomputers.
| |
| * In Verbindung mit einem Traffic-Sniffer entweder auf dem Zielcomputer oder einem zwischengeschalteten Gerät könnte die Kombination -uz jedoch für die Kommunikationsdiagnose nützlich sein.
| |
| * Beachten Sie, dass die Menge des generierten UDP-Datenverkehrs entweder aufgrund von Hardwareressourcen und/oder Konfigurationseinstellungen begrenzt sein kann.
| |
|
| |
|
| </noinclude> | | </noinclude> |
topic - Kurzbeschreibung
Beschreibung
Netcat wird verwendet, um mit TCP-, UDP- oder UNIX-Domain-Sockets zu arbeiten
- TCP-Verbindungen öffnen
- UDP-Pakete senden
- TCP- und UDP-Ports abhören
- Ports scannen
netcat schreibt Fehlermeldungen auf STDERR (anders als telnet)
- Häufige Verwendung
- einfache TCP-Proxys
- Shellskript-basierte HTTP-Clients und -Server
- Netzwerk-Daemon testen
- SOCKS- oder HTTP-Proxy
- Befehl für ssh(1)
Installation
# apt install netcat
Syntax
$ nc [OPTIONEN] [ZIEL] [PORT]
Optionen
Option |
Bescheibung
|
-4
|
Verwenden Sie nur IPv4-Adressen.
|
-6
|
Verwenden Sie nur IPv6-Adressen.
|
-b
|
Übertragung zulassen.
|
-C
|
Senden Sie CRLF als Zeilenende.
- Jedes Zeilenvorschubzeichen (LF) aus den Eingabedaten wird in CR+LF übersetzt, bevor es in den Socket geschrieben wird.
- Zeilenvorschubzeichen, denen bereits ein Wagenrücklauf (CR) vorangestellt ist, werden nicht übersetzt.
- Empfangene Daten sind davon nicht betroffen.
|
-D
|
Aktivieren Sie das Debugging auf dem Socket.
|
-d
|
Versuchen Sie nicht, von stdin zu lesen.
|
-F
|
Übergeben Sie den ersten verbundenen Socket mit sendmsg(2) an stdout und beenden Sie es.
- Dies ist in Verbindung mit -X sinnvoll, um nc den Verbindungsaufbau mit einem Proxy durchführen zu lassen, den Rest der Verbindung dann aber einem anderen Programm zu überlassen (z
- ssh(1) mit der ssh_config(5) ProxyUseFdpass-Option).
- Kann nicht mit -U verwendet werden.
|
-h
|
Drucken Sie den nc-Hilfetext aus und verlassen Sie ihn.
|
-I length
|
Geben Sie die Größe des TCP-Empfangspuffers an.
|
-i interval
|
Schlafen Sie zwischen den gesendeten und empfangenen Textzeilen für Sekunden.
- Verursacht auch eine Verzögerungszeit zwischen Verbindungen zu mehreren Ports.
|
-k
|
Wenn eine Verbindung hergestellt ist, warten Sie auf eine andere.
- Benötigt -l.
- Bei Verwendung zusammen mit der Option -u wird der Server-Socket nicht verbunden und kann UDP-Datagramme von mehreren Hosts empfangen.
|
-l
|
Warten Sie auf eine eingehende Verbindung, anstatt eine Verbindung zu einem Remote-Host zu initiieren.
- Das Ziel und der zu überwachende Port können entweder als nicht optionale Argumente oder mit den Optionen -s bzw. -p angegeben werden.
- Kann nicht zusammen mit -x oder -z verwendet werden.
- Darüber hinaus werden alle mit der Option -w angegebenen Timeouts ignoriert.
|
-M ttl
|
Stellen Sie das TTL-/Hop-Limit für ausgehende Pakete ein.
|
-m minttl
|
Bitten Sie den Kernel, eingehende Pakete zu verwerfen, deren TTL / Hop-Limit unter minttl liegt.
|
-N
|
shutdown(2) die Netzwerkbuchse nach EOF am Eingang.
- Einige Server benötigen dies, um ihre Arbeit zu beenden.
|
-n
|
Führen Sie keine Domänennamenauflösung durch.
- Wenn ein Name ohne DNS nicht aufgelöst werden kann, wird ein Fehler gemeldet.
|
-O length
|
Legen Sie die Größe des TCP-Sendepuffers fest.
|
-P proxy_username
|
Gibt einen Benutzernamen an, der einem Proxyserver präsentiert werden soll, der eine Authentifizierung erfordert.
- Wenn kein Benutzername angegeben ist, wird keine Authentifizierung versucht.
- Die Proxy-Authentifizierung wird derzeit nur für HTTP CONNECT-Proxys unterstützt.
|
-p source_port
|
Geben Sie den Quellport an, den nc verwenden soll, abhängig von Berechtigungseinschränkungen und Verfügbarkeit.
|
-q seconds
|
Warten Sie nach EOF auf stdin die angegebene Anzahl von Sekunden und beenden Sie dann.
- Wenn Sekunden negativ sind, ewig warten (Standard).
- Die Angabe einer nicht negativen Sekunde impliziert -N.
|
-r
|
Wählen Sie Quell- und/oder Zielports zufällig statt sequentiell innerhalb eines Bereichs oder in der Reihenfolge, in der das System sie zuweist.
|
-S
|
Aktivieren Sie die RFC 2385 TCP MD5-Signaturoption.
|
-s sourceaddr
|
Legen Sie die Quelladresse fest, von der Pakete gesendet werden sollen, was auf Computern mit mehreren Schnittstellen nützlich ist.
- Gibt für UNIX-Domänen-Datagramm-Sockets die lokale temporäre Socket-Datei an, die erstellt und verwendet werden soll, damit Datagramme empfangen werden können.
- Kann nicht zusammen mit -x verwendet werden.
|
-T keyword
|
Ändern Sie den Wert der IPv4-TOS/IPv6-Verkehrsklasse.
- Das Schlüsselwort kann eines von „critical“, „inetcontrol“, „lowcost“, „lowdelay“, „netcontrol“, „throughput“, „reliability“ oder einer der DiffServ-Codepunkte sein: ef, af11 ...
- af43, cs0 ...
- cs7; oder eine Zahl in Hex oder Dezimal.
|
-t
|
Senden Sie RFC 854 DON'T- und WON'T-Antworten auf RFC 854 DO- und WILL-Anforderungen.
- Dadurch ist es möglich, nc zum Skripten von Telnet-Sitzungen zu verwenden.
|
-U
|
Verwenden Sie UNIX-Domain-Sockets.
- Kann nicht zusammen mit -F oder -x verwendet werden.
- Wenn der Name unter Linux mit einem at-Symbol (`@') beginnt, wird er als abstrakter Namespace-Socket gelesen: Das führende `@' wird vor dem Binden oder Verbinden durch ein NUL-Byte ersetzt.
- Einzelheiten finden Sie unter unix(7).
|
-u
|
Verwenden Sie UDP statt TCP.
- Kann nicht zusammen mit -x verwendet werden.
- Verwenden Sie für UNIX-Domain-Sockets einen Datagramm-Socket anstelle eines Stream-Sockets.
- Wenn ein UNIX-Domain-Socket verwendet wird, wird ein temporärer Empfangs-Socket in /tmp erstellt, es sei denn, das Flag -s ist angegeben.
|
-V rtable
|
Legen Sie die zu verwendende Routing-Tabelle fest.
|
-v
|
Erzeuge eine ausführlichere Ausgabe.
|
-W recvlimit
|
Beenden Sie nach dem Empfang von recvlimit-Paketen aus dem Netzwerk.
|
-w timeout
|
Verbindungen, die nicht hergestellt werden können oder nach Timeout-Sekunden im Leerlauf sind.
- Das Flag -w hat keine Auswirkung auf die Option -l, dh
- nc wird für immer auf eine Verbindung warten, mit oder ohne das Flag -w.
- Der Standardwert ist kein Timeout.
|
-X proxy_protocol
|
Verwenden Sie proxy_protocol, wenn Sie mit dem Proxy-Server sprechen.
- Unterstützte Protokolle sind 4 (SOCKS v.4), 5 (SOCKS v.5) und Connect (HTTPS-Proxy).
- Wenn das Protokoll nicht angegeben ist, wird SOCKS Version 5 verwendet.
|
-x proxy_address[:port]
|
Verbinden Sie sich mit dem Ziel über einen Proxy an Proxy_Adresse und Port.
- Wenn kein Port angegeben ist, wird der bekannte Port für das Proxy-Protokoll verwendet (1080 für SOCKS, 3128 für HTTPS).
- Eine IPv6-Adresse kann eindeutig angegeben werden, indem proxy_address in eckige Klammern gesetzt wird.
- Ein Proxy kann mit keiner der Optionen -lsuU verwendet werden.
|
-Z
|
DCCP-Modus.
|
-z
|
Scannen Sie nur nach lauschenden Daemons, ohne Daten an sie zu senden. * Kann nicht zusammen mit -l verwendet werden.
|
Parameter
Parameter |
Bedeutung
|
ZIEL |
kann eine numerische IP-Adresse oder ein symbolischer Hostname sein (es sei denn, die Option -n ist angegeben).
- Im Allgemeinen muss ein Ziel angegeben werden, es sei denn, die Option -l ist angegeben (in diesem Fall wird der lokale Host verwendet).
- Für UNIX-Domänen-Sockets ist ein Ziel erforderlich und ist der Socket-Pfad, zu dem eine Verbindung hergestellt werden soll (oder auf dem zu lauschen ist, wenn die Option -l angegeben ist).
|
PORT |
kann als numerische Portnummer oder als Dienstname angegeben werden.
- Portbereiche können als numerische Portnummern im Format nn-mm angegeben werden.
- Im Allgemeinen muss ein Zielport angegeben werden, es sei denn, die Option -U ist angegeben.
|
Anwendung
Fehlerbehebung
Konfiguration
Dateien
Anhang
Siehe auch
Dokumentation
RFC
Man-Pages
Info-Pages
Links
Projekt
Weblinks
TMP
nc (netcat) ist ein einfaches Werkzeug, um Netzwerkverbindungen über TCP, UDP und UNIX-Domain-Sockets aufzubauen