Spaß mit Netcat

Oftmals befindet man sich in der Situation, Dateien schnell von einem Rechner zu einem anderen zu kopieren und es sind gerade keine SSH-Keys vorhanden, oder nicht bei dem verwendeten Benutzer hinterlegt. Ebenso ist es manchmal nützlich, schnell einen Server auf einem gewissen Port zu starten oder eine Verbindung aufzubauen, wenn beispielsweise curl gerade nicht zur Hand ist.

Deshalb möchte ich ein absolut unerlässliches Werkzeug vorstellen, das alle diese Aufgaben erledigen kann: Netcat.

“The Swiss-army knife for TCP/IP”

Netcat ist ein Kommandozeilenprogramm, das auf Netzwerk- oder Unix-Domain-Sockets mittels TCP oder UDP schreiben und von ihnen lesen kann. Es wurde ursprünglich für unixoide Betriebssysteme entwickelt, ist aber inzwischen auf der Windows-Plattform verfügbar. Ein- und Ausgaben werden über STDIN und STDOUT realisiert, so dass es wie alle Unix-Kommandozeilen-Tools leicht in Shell-Skripten verwendet werden kann.

Beispiele

Der Aufruf von Netcat variiert je nach verwendetem Betriebssystem; unter Linux in der Regel mit netcat, unter BSD und dessen Abkömmlingen (Mac OS X als prominentesten Vertreter) durch nc. Ebenfalls sind die Aufrufparameter leicht unterschiedlich (unter Linux verlangt -l zwingend -p). Ich beschränke mich im Folgenden auf OSX.

Dateien kopieren

Auf dem Zielhost B wird Netcat im Listening-Modus gestartet (es wird standardmäßig TCP verwendet), z. B. auf Port 12500. Ich möchte ein Verzeichnis foo vom Host A nun auf den Host B ins Verzeichnis bar übertragen:

Host B:

$ nc -l 12500 | tar -C bar -xvf -

Host A:

$ tar cvz - foo | nc host-b.example.com 12500

Remote-Syslogging testen

Wir wollten gerade die Funktionalität von logging-remote-syslog testen, hatten jedoch keinen konfigurierten Syslog-Dienst zur Hand, der Remote-Logging erlaubt. Das kann man jedoch zu Testzwecken problemlos mit Netcat erledigen, Syslog verwendet UDP auf Port 594.

Zunächst das kurze Ruby-Skript:

# encoding: utf-8
require 'rubygems'

require 'logging'
require 'logging/remote-syslog'

host = 'localhost'
port = '594'

logger = Logging.logger['MyApp']
logger.add_appenders(
  Logging.appenders.remote_syslog("Netcat", syslog_server: host, port: port)
)

logger.level = :info
logger.info 'Hello, Netcat!'

und der Netcat-Syslog-Server (Der sudo-Aufruf ist notwendig, da die ersten 1024 Ports privilegiert sind):

$ sudo nc -u -l 594
<14>Jun  7 15:49:46 flo2.s5.nix-wie-weg.de Netcat:  INFO  MyApp : Hello, Netcat!

Einfache Clients implementieren

Eine HTTP/1.0 GET-Anfrage (bei HTTP/1.1 wäre der Host-Header noch zu setzen):

$ printf "GET / HTTP/1.0\r\n\r\n" | nc www.google.com 80
HTTP/1.0 302 Found
Location: http://www.google.de/
Cache-Control: private
Content-Type: text/html; charset=UTF-8
...

Analog dazu kann man auch bequem E-Mails mit Netcat versenden (SMTP, Port 25).

Netcat als Portscanner

Um nach laufenden Diensten in einer gewissen Port-Range zu suchen, kann Netcat so gestartet werden:

$ nc -z www.nix-wie-weg.de 80-88
Connection to www.nix-wie-weg.de 80 port [tcp/http] succeeded!

Die vorgestellten Beispiel waren nur ein grober Überblick über die möglichen Anwendungsszenarien. Viele weitere Beispiele und eine ausführliche Dokumentation kann man an folgenden Stellen erhalten: