Netcat

Aus mxlinuxusers.de

netcat[Bearbeiten | Quelltext bearbeiten]

Möchte man Dateien mal schnell ohne großen Aufwand übers Netz von einem Rechner zum anderen kopieren muss es nicht immer SAMBA oder NFS sein. Neben scp kann dafür u.a. auch netcat benutzt werden.

netcat ist ein einfaches Unix-Programm, das über Netzwerkverbindungen per TCP oder UDP Daten liest und schreibt. Es wurde als zuverlässiges »Backend«-Programm entwickelt, das entweder direkt oder von anderen Programmen und Skripten aus benutzt werden kann. Gleichzeitig ist es ein funktionsreiches Netzwerk-Debugging- und -Erkundungsprogramm, weil es beinahe jede Art von Verbindung aufbauen kann, die man benötigt, und einige interessante Funktionen eingebaut hat. Nicht umsonst wird es wegen seiner Vielseitigkeit auch als "Schweizer Taschenmesser für TCP/IP" bezeichnet.

Allerdings überträgt netcat die Daten unverschlüsselt, so daß man beim Datentransfer übers Internet lieber cryptcat benutzen sollte, das ähnliche - allerdings abgespeckte - Funktionen wie netcat besitzt, dafür aber die zu übertragenden Daten mit der Methode Twofish verschlüsselt.

Installation[Bearbeiten | Quelltext bearbeiten]

In den Repos liegen drei Varianten von netcat, von denen aber nur die letzten zwei tatsächlich in Betracht kommen.

  • netcat
    • Dies ist nur ein Pseudopaket, das von der voreingestellten Version von netcat abhängt, um das Upgrade zu vereinfachen. Sollte es also installiert sein, kann es entfernt werden.
  • netcat-traditional
    • Das ist die ursprüngliche Version, oder anders gesagt, das „klassische“ netcat. Gegenüber dem nachfolgenden netcat-openbsd fehlen einige neue Funktionen. Trotzdem erfüllt es seine Aufgabe völlig und wer sich nicht unbedingt in alle Feinheiten von netcat vertiefen möchte, kann ohne Bedenken auch zu netcat-traditional greifen, zumal viele ältere Anleitungen sich noch auf dieses klassische netcat beziehen.
  • netcat-openbsd
    • Dieses Paket enthält die OpenBSD-Implementierung von netcat, inklusive Unterstützung für IPv6, Proxys und Unix-Sockets.

Optionen[Bearbeiten | Quelltext bearbeiten]

Option Beschreibung
-c SHELL-KOMMANDO führt nach der Verbindungsaufnahme das SHELL-KOMMANDO aus (gefährlich!)
-e DATEI führt nach der Verbindungsaufnahme die in DATEI gespeicherten Kommandos aus (gefährlich!)
-b erlaubt Broadcast
-h Hilfe
-i SEK Anzahl Sekunden für die Verzögerung beim Senden von Zeilen oder beim Port-Scannen
-k wartet nach Verbindungsende auf eine neue Verbindungsaufnahme
-l wartet (lauscht) auf eingehende Verbindungen (Serverseite)
-n akzeptiert nur numerische IP-Adressen, keine DNS
-o DATEI schreibt einen Hexdump des Datenverkehrs nach DATEI. Kann u.a. zur Fehleranalyse benutzt werden
-p PORT Nummer des Ports, der benutzt wird
-r zufällige Auswahl des lokalen und entfernten Ports
-q SEKUNDEN wartet nach Verbindungsende noch die Anzahl SEKUNDEN bis zum Abbruch
-s ADRESSE lokale Adresse der Quelle
-T tos set Type Of Service
-t Telnet-Modus, ermöglicht die Verbindungsaufnahme über Telnet. Steht nicht bei allen netcat-Varianten zur Verfügung
-u UDP Modus (schneller als TCP, es findet aber keine Kontrolle statt, ob die übertragenen Daten auch korrekt ankommen)
-v ausführliche Meldungen (nützlich zur Fehlersuche)
-w SEKUNDEN wartet Anzahl Sekunden bis die Verbindung aufgegeben wird
-C benutzt CR/LF zum Zeilenumbruch. Nützlich für Übertrgungen nach Windows, da dort CR/LF der Standard für das Zeilenende ist
-z Portscanner-Modus (zero-I/O mode), es wird nur nach lauschenden Diensten gescannt ohne Daten zu schicken

Verwendung[Bearbeiten | Quelltext bearbeiten]

Um beim Befehlsaufruf von netcat unabhängig von der verwendeten Variante (s.o) zu sein und auch um Schreibarbeit zu sparen, kann man netcat auch einfach als

nc

aufrufen.

netcat arbeitet nach dem Client-Server-Prinzip, das heisst es muss auf beiden Rechnern laufen, damit man damit arbeiten kann. Zuerst startet man es auf dem Server

nc -l PORT

wobei PORT ein geeigneter freier lokaler Port sein muss. So gestartet läuft netcat auf dem Server und lauscht dabei auf dem angegebenen Port auf eingehende Verbindungen von der Gegenseite, dem Client.

Dann startet man netcat auf dem Client:

nc [-u] ZIELRECHNER ZIELPORT
  • ZIELRECHNER = Hostname oder IP-Adresse des Rechners, mit dem man sich verbinden will
  • ZIELPORT = der Port, an dem netcat auf der Gegenseite lauscht
  • -u = optionaler Parameter, wenn angegeben benutzt netcat statt TCP das verbindungslose UDP.

Wichtig ist, daß netcat auf dem Zielrechner schon im Serverstatus laufen muss, sonst bricht netcat mit einer Fehlermeldung ab.

Zum weiteren Verständnis ist unbedingt wichtig zu wissen, daß alle ausgehenden Daten auf dem Client durch die Standardeingabe der Shell (stdin) über das Netzwerk an den Kommunikationspartner geschickt werden und die ankommenden Daten auf dem Server auf der Standardausgabe der Shell (stdout) ausgegeben werden. Dieser Mechanismus hat den Vorteil, daß die zu kopierenden Daten mittels Skripten bei Bedarf auch beliebig verarbeitet werden können. Beachten sollte man aber, daß zumindest das klassische netcat keine eigene Möglichkeit hat, die Daten verschlüsselt zu übertragen. Wird dies gewünscht, so muss man entweder vorher auf Linux-eigene Verschlüsselungen zurückgreifen oder das neuere netcat-openbsd benutzen.

Hört sich komplizierter an als es ist und wird hoffentlich durch die nacfolgenden kleinen Beispiele klarer.

Dateien kopieren[Bearbeiten | Quelltext bearbeiten]

für die folgenden Beispiele wird jetzt immer der willkürlich gewählte Port 2000 benutzt. kopieren von Datei ORIGINAL (vom Client) nach Datei KOPIE (auf dem Server ZIEL)

nc -l 2000 > ZIEL        # Starten von netcat auf Serverseite
nc ZIEL 2000 < ORIGINAL  # netcat auf Client schickt die Datei ORIGINL nach dem Server ZIEL

wurde alles richtig kopiert, so erfolgt Linux-typisch keinerlei Meldung und beide netcat beenden ihren Dienst. Möchte man netcat auf dem Server weiterlaufen lassen, so muss man ihm zusätzlich den Parameter -k mitgeben.

Bei größeren Dateien, z.B. ISOs, ist es wünschenswert, auch eine Fortschrittsanzeige zu haben. Dazu kann das Shell-Kommando pv benutzt werden:

nc -l 2000 > manjaro.iso
pv manjaro.iso | nc -w1 192.168.178.23 2000

dies erzeugt dann im Client-Terminal diese nützliche Fortschrittsanzeige:

1,25GiB 0:01:55 [11,1MiB/s] [================>                                                            ] 21% ETA 0:06:51

Möchte man mehrere Dateien (z.B. alle Dateien eines Verzeichnisses) kopieren, so kann man sie z.B. mit Hilfe eines Packprogrammes (hier tar und zip) auf dem Client zu einer gepackten Datei zusammenfassen und auf der Serverseite in ähnlicher Seite wieder entpacken:

nc -l 2000 | gunzip | tar vx    # Entpacken der ursprünglichen Verzeichnisstruktur auf dem Zielrechner
tar vc * | gzip | nc ziel 2000  # Packen aller Dateien (*) im aktuellen Verzeichnis

Anmerkung für alle tar Ent- und Ungewöhnten: vc und vx sind Opionen des tar-Kommandos

  • v = ausführliche Ausgabe (verbose)
  • c = Archiv erstellen (create)
  • x = Archiv entpacken (extract)

netcat als einfacher Chatservice[Bearbeiten | Quelltext bearbeiten]

Starte auf dem einen Rechner netcat auf einem freien und nicht durch Firewall blockierten PORT:

nc -l -v -p PORT

es sollte folgende Ausgabe kommen:

listening on [any] PORT ...

auf dem anderen Rechner ebenfalls netcat auf der gleichen Portnummer starten:

nc IP PORT
  • IP = IP-Adresse oder Hostname der Gegenstelle
  • PORT = gleiche Portnummer wie auf der Gegenstelle

Im Erfolgsfall erscheint auf der Gegenstelle folgende Meldung:

connect to [192.168.178.23] from caia.lokal.com [192.168.178.21] 35820

von nun an wird jede Eingabe auf dem einen Rechner als Echo auf dem anderen Rechner angezeigt, so daß man sich gegenseitig unterhalten kann.

Abbruch mit Strg+C

netcat als Portscanner[Bearbeiten | Quelltext bearbeiten]

netcat kann auch als schneller Portscanner benutzt werden. Die Ergebnisse sind nicht immer so exakt und ausführlich wie bei nmap, reichen aber für einfache Untersuchungen durchaus.

nc -z -v IP PORT
  • IP = IP-Adresse oder Hostname des zu untersuchenden Rechners
  • PORT = Portnummer, es kann auch ein Bereich angegeben werden:
nc -z -v caia 1-1024
caia.lokal.com [192.168.178.21] 445 (microsoft-ds) open
caia.lokal.com [192.168.178.21] 139 (netbios-ssn) open
caia.lokal.com [192.168.178.21] 111 (sunrpc) open
caia.lokal.com [192.168.178.21] 80 (http) open

netcat zur Fernwartung[Bearbeiten | Quelltext bearbeiten]

netcat kann auch benutzt werden, um auf einem entfernten Rechner Shell-Kommandos auszuführen.

Zuerst muss dazu auf dem entfernten Rechner eine Shell und wie üblich ein Port geöffnet werden:

nc -l -e /bin/bash -p 11111

Dann kann man sich vom heimischen Rechner aus dort einloggen

nc IP PORT

wie gewohnt, IP ist die IP-Adresse bzw. der Hostname des entfernten Rechners und PORT die freigegebene Portnummer, in diesem Beispiel also 11111.

Ist dies geschehen, kann man auf dem entfenrten Rechner jedes mögliche Kommando ausführen, so als ob man davor sitzen würde:

ls -l
pwd

aber eben auch

rm -r *

oder schlimmere Dinge.

Deshalb, und weil dies jeder könnte (ohne Authentifizierung!), der die IP und den Port kennt oder ausprobiert, sollte man das nur im lokalen oder anders abgesicherten Netzwerk tun. Außerdem darf man nie vergessen, daß die Übertragung bei netcat immer unverschlüsselt abläuft.

Trotzdem kann diese Anwendung nützlich sein, wenn man z.B. dem Sohnemann helfen möchte, der gerade verzweifelt vor dem Laptop im heimischen Bastelkeller sitzt, aber selbst hat man gerade keine Lust oder Gelegenheit vom eigenen Bürozimmer unter dem Dach herunterzusteigen.

Weblinks[Bearbeiten | Quelltext bearbeiten]