#rust

Rootkits sind nicht verschwunden — sie sehen nur nicht mehr so aus

Wie aufwändig sind moderne Rootkits wirklich — und warum kommen sie in der Forensik heute kaum noch vor?

Ich beschäftige mich viel mit IT-Forensik, und mir ist in den letzten Jahren etwas aufgefallen: Rootkits kommen mir zur Analyse kaum noch unter. Früher war das ein fester Bestandteil des Bedrohungsbilds — ein versteckter Prozess hier, ein gepatchter System Call dort, ein Treiber, der sich aus der Modulliste verabschiedet hat. Heute? Fast nichts mehr. Das hat mich neulich zu einem reinen Gedankenspiel angeregt: Wie aufwändig wäre so etwas mit modernen Mitteln eigentlich noch, speziell in Rust ? Und ist das heutzutage überhaupt noch sinnvoll möglich?

Wichtig vorab: Das hier ist keine Bauanleitung, keine Umsetzung, nichts Operationalisierbares. Es ist ein Gedankenspiel aus der Perspektive jemandes, der Verteidiger-Werkzeuge verstehen will, indem er sich überlegt, wie die andere Seite denkt. Genau das macht Forensik übrigens aus — man muss die Werkzeuge nicht gebaut haben, aber man sollte ahnen, wie sie gedacht sind, um ihre Spuren zu lesen.

wisp: eine Reverse-Shell über DNS — und warum das Protokoll immer noch ein Sicherheitsproblem ist

DNS als C2-Kanal ist kein Relikt: dnscat2 stammt aus den 2010ern, aber das Grundproblem — fast jedes Netz lässt DNS raus — ist ungelöst. wisp ist eine Machbarkeitsstudie in Rust, die das Konzept auf modernen Stand bringt: E2E-verschlüsselte Reverse-Shell über DNS, X25519/Ed25519/ChaCha20-Poly1305, Forward Secrecy, Wordlist-Encoding statt Base32, DoH-CDN-Egress — und ein Bootstrap-Modell ohne jemals geliefertes PSK: jedes gestempelte Binary trägt sein eigenes Token, das beim ersten Frame verbraucht wird. Dazu `!get`-Exfiltration über denselben Tunnel, ein IRC-Betreiberkanal über Tor, daemonisierte Linux-Clients (fork+setsid, Self-Delete), Dead-Drop-Schlafmodus mit `!sleep`/`!wake`, A-Record-Transport zur S3-Mimikry, System-Introspektion (!top, !ps, !netstat) und Session-Management mit !alias, !note, !attach und !wipe. Ein Vergleich mit dnscat2 — und konkrete SNORT-Regeln, mit denen ein SOC genau solche Tunnel aufspürt.

DNS ist das Protokoll, das jeder Firewall durchlässt. Nicht aus Konfigurationsfehler, sondern aus Notwendigkeit: Ohne Namensauflösung funktioniert in einem modernen Netz schlicht nichts — also bleibt Port 53/udp offen, fast immer sowohl Richtung des rekursiven Resolvers des Hauses als auch, häufig genug, Richtung beliebiger öffentlicher Resolver im Internet. Genau das ist der Spalt, durch den sich Exfiltration und Command-and-Control seit drei Jahrzehnten quetschen. dnscat2 hat das 2014 vorgemacht; das Tool ist in die Jahre gekommen, das Prinzip nicht.

Dieser Beitrag stellt wisp (ursprünglich dc - für dnscat) vor — ein Projekt, das ich als Machbarkeitsstudie gebaut habe, um zwei Dinge zu zeigen: erstens, dass ein modernes, kryptografisch hartes DNS-Tunnel-Tool heute ohne viel Aufwand möglich ist, und zweitens — und das ist mir mindestens genauso wichtig —, dass die Verteidigungsseite das nur erkennt, wenn sie es aktiv sucht. wisp ist zugleich Angriffs-POC und Argument für DNS-Firewalling, Response-Rate-Limiting, Egress-Filtering freier Resolver und DoH-Blocking. Wer nur eines davon macht, verliert schon. Zur Reverse-Shell kommt eine !get-Exfiltration über denselben E2E-Kanal — und ein Bootstrap-Modell, das kein PSK jemals ausliefert: jedes gestempelte Binary trägt sein eigenes Token, das beim ersten Frame verbraucht wird.

POC — nur für autorisierte Systeme. wisp ist eine Machbarkeitsstudie für Security-Research und autorisierte Red-Team-Demonstrationen. Es darf ausschließlich in Netzen und an Systemen betrieben werden, die man selbst besitzt oder für die man ausdrücklich autorisiert ist. Unerlaubter Einsatz ist illegal. E2E verschlüsselt den Inhalt des Tunnels, nicht seine Existenz — wer einen solchen Kanal aufbaut, erzeugt messbaren DNS-Verkehr, und genau dieser Verkehr ist, wie der zweite Teil des Beitrags zeigt, erkennbar.

Tor als CRD: ein eigener Operator statt Sidecar-Bastelei

Warum ich den inoffiziellen tor-controller durch einen eigenen, in Rust geschriebenen Operator ersetzt habe — ein gemeinsamer Tor-Daemon pro Namespace, Onion-Services und Onion-Proxies dynamisch über den Control-Port, plus kuratierte obfs4-Bridges

Tor-Konnektivität im Cluster hatte ich bisher zusammengesteckt: pro Pod ein client-only tor plus ein oder zwei socat-Sidecars, die lokale TCP-Ports in Onion-Services übersetzten — genau das Setup, das ich im IRC-Bouncer-Beitrag beschrieben habe. Das funktioniert, skaliert aber nicht als Muster: Jeder Workload, der eine .onion erreichen oder selbst eine anbieten wollte, brachte seinen eigenen Tor-Prozess und seine eigene Klebeschicht mit. Also habe ich das Ganze zu dem gemacht, was es im Lab sein sollte: einer Custom Resource. tor-operator ist ein eigener, in Rust geschriebener Kubernetes-Operator, der Tor-Konnektivität in beide Richtungen als CRD anbietet.

choom: Terminal-Sharing à la tmate, aber schlank — und auf dem Weg zu E2E

tmate ist genial und gefährlich zugleich: ein voller tmux-Fork in ~50k Zeilen C, der auf dem Relay als root läuft. Vor einer Weile habe ich eine schlanke Python-Reimplementierung gebaut, die nur den Sharing-Kern behält. Jetzt habe ich sie nach Rust portiert — eine einzige statische ~4-MB-Binary, unprivilegiertes SSH-Relay, kompromisslos auf Sicherheit getrimmt. Was choom kann, wie man meinen öffentlichen Server choom.sh nutzt, warum „trust the operator" bauartbedingt gilt — und wie ein E2E-Client das aufbricht.

Es gibt diesen einen Moment beim Remote-Support, den jeder kennt: Jemand sitzt vor einem kaputten Terminal, beschreibt am Telefon umständlich, was auf dem Schirm steht, und tippt dann doch wieder das Falsche. Was ich in dem Moment will, ist keine 478-MB-Electron-Bildschirm-Sharing-Software — ich will sein Terminal sehen, am besten mitschreiben können, und zwar in dem Augenblick, in dem es brennt. Genau dafür gibt es tmate . tmate ist großartig. tmate ist aber auch ein Stück Software, dem ich nicht mehr blind vertrauen wollte. Dieser Beitrag erzählt, warum ich mir stattdessen mein eigenes Werkzeug gebaut habe — choom1 —, was es kann, wie man es benutzt, und wo die Grenze liegt.