====== 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: $REDIR

Weiterleitung zu:

$REDIR

" 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'' \\