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 Taschenmesser 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.
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
Es gibt unterschiedliche Implementierungen von netcat, welche sich unter anderem in der Syntax unterscheiden. Im Folgenden ist die ursprüngliche Variante von Hobbit beschrieben.
Grundsätzlich unterscheidet Netcat zwischen zwei verschiedenen Modi:
- Server
netcat -l -p lokalport
(lokalport ist ein lokaler Port)- Nach dem Aufruf wartet („lauscht“: -l) Netcat auf dem mit -p angegebenen Port für unbegrenzte Zeit auf eine eingehende Verbindung. Nachdem eine Verbindung aufgebaut und wieder geschlossen wurde, beendet Netcat sich.
- Client
netcat zielserver zielport
- Hier ist zielserver der Hostname oder die IP-Adresse eines Hosts, mit dem Netcat sich verbinden soll, und zielport eine Portnummer, zum Beispiel 80 bei HTTP-Server. 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 Namen kopie
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 mit 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-Prozesses:
$ netcat ziel 2000 < original
Im fehlerlosen Fall erzeugt weder die Netcat-Instanz auf Computer start, noch auf Computer ziel irgendwelche Ausgaben auf der Shell. Sie beenden sich nach Fertigstellung des Transfers (da die Shell durch den '<'-Operator bedingt automatisch ein EOF-Zeichen sendet). Auf weitere eingehende Daten wartet die Instanz auf dem Computer ziel, wenn sie mit dem Parameter -k gestartet wird. In diesem Fall muss sie zum Beispiel per Tastenkombination Strg + C beendet werden.
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 auf dem lokalen Computer, welcher dem ersten Webbrowser die Datei hallo.txt präsentiert.
$ ( echo "HTTP/1.0 200 Ok"; echo; cat hallo.txt; ) | netcat -l 8090
Zum Abrufen wird im Webbrowser die URL http://localhost:8090/
eingegeben. Dieser zeigt dann einen Speicherdialog oder die Datei direkt an.
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-Port 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 umgekehrt. 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 den Datenstrom. 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 eine der Netcat-Weiterentwicklungen 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 schädliches oder 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 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.[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.[6] Socat ist eine Reimplementation und kann außer TCP und UDP auch SCTP verwenden, über Proxyserver arbeiten und unterstützt ebenfalls Verschlüsselung.[7] Eine weitere nicht vollständig kompatible Variante ist Netcat6, das auch IPv6 unterstützt und diverse Performance-Optimierungen enthält, unter anderem den Nagle-Algorithmus.[8]
Auch der Portscanner Nmap liefert eine um viele Features ergänzte Netcat-Reimplementierung namens Ncat mit. Diese kann auch über IPv6, SCTP und Unix Domain Sockets kommunizieren und HTTP- und SOCKS-Proxys verwenden (ersteres auch serverseitig). An Sicherheits-Features unterstützt Ncat SSL für Verschlüsselung und Authentifizierung sowie Zugangsbeschränkungen auf Hostname-Basis. Des Weiteren sind ein zum Datenaustausch zwischen mehreren Clients dienender Connection-Brokering-Modus und ein darauf aufbauender einfacher Chat-Server enthalten.[9]
Weblinks
nc(1)
: arbitrary TCP and UDP connections and listens – OpenBSD General Commands Manualnc(1)
: TCP/IP swiss army knife – Debian GNU/Linux Ausführbare Programme oder Shell-Befehle Handbuchseite- Johannes Franken: Netcat: Anwendungsbeispiele. 12. August 2006, abgerufen am 3. März 2009 (Vortrag).
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.
- Signatur von Netcat Symantec
- GNU Netcat
- OpenBSD netcat
- Netcat 4 wince
- Cryptcat
- Socat
- Netcat6
- Ncat