- Netcat
-
Netcat, auch nc genannt, ist ein einfaches Werkzeug, um Daten von der Standardein- oder -ausgabe über Netzwerkverbindungen zu transportieren. Es arbeitet als Server oder Client mit den Protokollen TCP und UDP. Die Manpage bezeichnet es als TCP/IP swiss army knife (Schweizer Armeemesser für TCP/IP).
Das ursprüngliche Programm wurde 1996 von einer unbekannten Person mit dem Pseudonym Hobbit für die UNIX-Plattform geschrieben und ist inzwischen auf praktisch alle Plattformen portiert worden.
Inhaltsverzeichnis
Anwendung
Netcat ist ein typisches Unix-Programm, das die grundlegende Unix-Philosophie implementiert. Insbesondere arbeitet Netcat mit der universellen Schnittstelle von Datenströmen, ohne dabei deren Inhalt weiter klassifizieren zu müssen. Da Netcat ganz abstrakt mit sämtlichen Datenströmen arbeiten kann, lassen sich beliebig komplexe Arbeitsabläufe mit Netcat realisieren, vom einfachen Kopieren von Dateien über Streamen von Datenbeständen bis hin zu komplexen Proxy- oder Gateway-Diensten über Netzwerkgrenzen hinweg.
Syntax
Grundsätzlich unterscheidet Netcat zwischen zwei verschiedenen Modi: Dem Arbeiten als Server-Anwendung und als Client-Anwendung. Im ersten Fall lautet ein typischer Netcat-Aufruf
netcat -l -p lokalport
wobei lokalport einen lokalen TCP-Port angibt. Nach dem Aufruf wartet („lauscht“: -l) netcat auf dem angegebenen Port für unbegrenzte Zeit auf eine(!) eingehende Verbindung. Diese wiederum kann wie folgt ebenfalls mit netcat erstellt werden (zweiter Fall):
netcat zielserver zielport
Hier ist zielserver eine Domain oder eine IP-Adresse eines Hosts, mit dem netcat sich verbinden soll, während zielport im Allgemeinen ein TCP-Port, d. h. eine Zahl wie 1280 ist. Unter Angabe des Flags -u verwendet Netcat statt TCP das verbindungslose UDP. In diesem Client-Modus muss auf dem Zielrechner und -port schon eine Server-Anwendung warten, andernfalls beendet sich netcat mit einem Fehler.
In beiden Fällen gibt Netcat über Netzwerk einkommende Daten auf der Standardausgabe aus, während per Standardeingabe eingelesene Daten über das Netzwerk an den Kommunikationspartner geschickt werden. Werden diese Ein- und Ausgaben nicht umgeleitet kann der Anwender diese eingeben und lesen, d.h. hier fungieren die zwei netcat Aufrufe als ein einfaches Chat-Programm. Durch Umleitung oder Verwendung von Pipes oder FiFos kann Netcat in vielen Fällen Netzwerkkommunikationsfähigkeiten ermöglichen, wo sie nicht implementiert sind, zum Beispiel in Shells. So ist die oben rechts dargestellte Illustration allgemein gültig, da stdin und stdout beliebig angepasst werden können.
Anwendungsbeispiele
Einfaches Dateikopieren
Die Datei mit dem Namen
original
vom Computer start soll unter dem Namenkopie
auf einem Computer ziel abgelegt werden, wobei der Transfer via TCP-Port 2000 abgewickelt wird. Auf einer Shell am Computer ziel wird dafür Netcat im Server-Modus gestartet. Die Standardausgabe wird mittels dem Umleitungsoperator in die Datei kopie umgeleitet:netcat -l -p 2000 > kopie
Nachdem der Server auf Computer ziel läuft, kann auf Computer start in einer Shell Netcat im Client-Modus gestartet werden. Mithilfe eines Umleitungsoperators liest die Shell den Inhalt der Datei original aus und schreibt ihn in die Standardeingabe des aufgerufenen netcat-Programms.
netcat ziel 2000 < original
Im fehlerlosen Fall erzeugt weder die Netcat-Instanz auf Computer start, noch auf Computer ziel irgendwelche Ausgaben auf der Shell; die Instanz auf dem Computer start beendet sich nach Fertigstellung des Transfers (da die Shell durch den Operator bedingt automatisch ein EOF-Zeichen sendet), während die Instanz auf dem Computer ziel zum Beispiel per Tastenkombination Strg + C beendet werden muss, da sie auf weitere eingehende Daten wartet.
Mehrere Dateien kopieren
Nach demselben Schema laufen die meisten Dateiübertragungsszenarien, die sich Netcat zunutze machen. Eine alltäglichere Abwandlung dieses Szenarios ist die zusätzliche Verwendung des Packerprogramms tar, mit welchem komplette Verzeichnisstrukturen über Netzwerk kopiert werden können. Typischerweise kommt es in diesen Szenarien zu regelrechten Kaskaden von Programmen, die mittels Pipes miteinander verbunden sind, zum Beispiel in Anlehnung an das obige Beispiel ein Kommando auf dem Client-Rechner
tar vc * | gzip | netcat ziel 2000
sowie dazugehörig ein analoges Kommando auf dem Zielrechner
netcat -l -p 2000 | gunzip | tar vx
In diesem Beispiel werden alle Dateien im aktuellen Arbeitsverzeichnis von tar zu einem Stream gepackt, der über die Standardausgabe ausgegeben wird, von dem Kompressionsprogramm gzip komprimiert wird und dann über Netcat an eine Netcat-Serverinstanz auf dem Zielrechner geschickt wird, von gzip wieder dekomprimiert wird und von tar wieder zu einer Verzeichnisstruktur entpackt wird.
Einmal-Webserver zum Dateitransfer
Statt eines netcat-zu-netcat Transfers kann netcat auch die Sprache höherer Protokolle sprechen, wie zum Beispiel HTTP. Folgendes Kommando startet einen Webserver, welcher dem ersten Webbrowser die Datei hallo.txt präsentiert.
( echo "HTTP/1.0 200 Ok"; echo; cat hallo.txt; ) | nc -q 1 -l -p 8090
Zum Abrufen wird im Webbrowser die URL http://zielserver:8090/ eingegeben, dieser zeigt dann einen Speicherdialog oder die Datei direkt an.
Durch die oben erwähnte Unix-Philosophie kann dies leicht von einer Datei auf mehrere erweitert werden:
( echo "HTTP/1.0 200 Ok"; echo; (tar vc * | gzip); ) | nc -q 1 -l -p 8090
Komplexes Firewallumgehen
Netcat lässt sich ähnlich leicht dazu verwenden, Ports umzuleiten und so beispielsweise gezielt unzureichende Firewalls zu umgehen. Solche Anwendungsszenarien können schnell in eine rechtliche Grauzone gelangen, siehe dazu Missbrauch durch Netcat.
Die obige Grafik illustriert die Verwendung von Netcat als offenen Proxyserver, in Kombination mit inetd.[1] Wenn beispielsweise der mit Client beschriftete Host keine direkte Verbindung mit einem speziellen TCP-Port des mit Server beschrifteten Hosts aufbauen kann, so kann er sich den obigen Aufbau zunutze machen, in dem er statt der direkten Verbindung zum Server eine Verbindung zu einem speziellen TCP-Ports des mit Proxy beschrifteten Host aufbaut, an dem inetd lauscht. Dieser ruft daraufhin eine Netcat-Clientinstanz auf, die ihrerseits (voreingestellt) eine Verbindung zu dem TCP-Port des eigentlichen Servers aufbaut. Nun werden alle Ausgaben des eigentlichen Servers unverändert über Netcat und Inetd an den Client durchgereicht und andersrum. Auf diese Weise kann der Client völlig transparent mit dem eigentlichen Server kommunizieren, als wäre der Proxy gar nicht vorhanden.
Sicherheit
Netcat wird oft mit sicherheitsrelevanten Fragen in Verbindung gebracht. Hierbei treten üblicherweise zwei essentielle Fragestellungen auf.
Verschlüsselung
Netcat ändert grundsätzlich nicht die Streams, die das Programm verarbeitet. Daher verschlüsselt Netcat auch die zu übertragenden Daten nicht, bevor sie den Computer verlassen. Eine Verschlüsselung lässt sich im Anwendungsszenario beispielsweise durch Pipes vorschalten (siehe oben) oder es muss die netcat-Weiterentwicklung cryptcat (siehe unten) verwendet werden. Alternativ muss von vorneherein zu Programmen gegriffen werden, bei denen Verschlüsselung ein zentraler Bestandteil ist, zum Beispiel der OpenSSL-Client/Server als SSL-Implementierung oder SSH bzw. Secure Copy (SCP) zum sicheren Streamen oder Kopieren von Daten.
Missbrauch
Durch seine Universalität kann Netcat auch verwendet werden, um beispielsweise Backdoors auf einem System einzurichten. So stufen diverse Antivirenprogramme, unter anderem McAfee VirusScan, Ikarus, Avira AntiVir, AVG-Antivirus, Norton AntiVirus, Kaspersky Anti-Virus, Sophos AntiVirus und G Data AntiVirus, das Programm
nc.exe
als Werkzeug zur Sicherheitsüberprüfung oder als potentiell unerwünschtes Programm ein und verhindern dessen Ausführung.[2]Ports und Weiterentwicklungen
Chris Wysopal hat netcat auf Windows portiert. GNU Netcat ist eine komplette Reimplementierung und vollständig POSIX-kompatibel und wird von Giovanni Giacobbi betreut[3]. OpenBSD netcat ist eine weitere Reimplementierung, die aber nicht komplett kompatibel zum Ur-netcat ist, da die Syntax an OpenBSD Standards angepasst wurde (z. B. wird -p portnummer nicht unterstützt).[4] Andreas Bischoff hat die Windows-Version auf Windows CE (Pocket PC und Handheld PC) portiert.[5]
Cryptcat ist eine Weiterentwicklung von netcat die Verschlüsselung implementiert. Socat ist eine Reimplementation und kann außer TCP und UDP auch SCTP verwenden, über Proxyserver arbeiten und unterstützt ebenfalls Verschlüsselung.
Einzelnachweise
- ↑ Angemerkt sei, dass die Verwendung von inetd in dem Beispiel nicht notwendig wäre, eine (zweite) Netcat-Serverinstanz könnte die gleiche Aufgabe übernehmen
- ↑ Symantec: Signatur von netcat
- ↑ GNU Netcat – Projekthomepage
- ↑ http://www.openbsd.org/cgi-bin/cvsweb/src/usr.bin/nc/ OpenBSD netcat
- ↑ http://www.dr-bischoff.de/wince/Andreas_WINCE_stuff.html#netcat
Weblinks
nc(1)
– Linux-Manpage (Englisch)- Johannes Franken: Netcat: Anwendungsbeispiele. 12. August 2006, abgerufen am 3. März 2009 (Vortrag).
Kategorien:- Unix-Software
- Internetanwendung
Wikimedia Foundation.