
DNS-Tunneling-Tool, das PowerShell und Nslookup verwendet, um Daten zu exfiltrieren und Payloads über DNS-TXT/MX-Einträge auszuliefern, wobei der Constrained Language Mode und Endpunktschutz umgangen werden.
Inspiriert von meiner jüngsten Arbeit mit Cobalt Strike DNS-Beacons und in Verbindung mit einem Leitbild, Microsoft Defender für Endpunkt zu umgehen, habe ich einige Zeit damit verbracht, zu untersuchen, wie DNS genutzt werden könnte, um eine Nutzlast auf einen Zielcomputer zu übertragen. Ich wollte mich zudem selbst herausfordern, indem ich versuchte, dies auf eine Weise zu tun, die selbst dann möglich ist, wenn PowerShell sich im Constrained Language Mode befindet. Diese Forschung richtete sich an neuere Windows-Implementierungen (d.h. Win10+, Server 2019+), aber wie später zu sehen sein wird, könnte es auch in älteren Versionen möglich sein.
DNS-Tunneling ist eine Technik, die es schon lange gibt und von einer Vielzahl von Angreifern genutzt wird. Im Wesentlichen wird das DNS-Protokoll als Mittel zur Dateninfiltration/-exfiltration oder als C2-Kommunikationskanal verwendet. Es gibt zahlreiche Blogbeiträge, auf die Sie für weitere Informationen zu diesem Thema zurückgreifen können.
Da es sich um eine so alte und bekannte Technik handelt, haben viele Unternehmen Erkennungsmethoden implementiert, um sie zu verhindern.
Der bevorzugte DNS-Eintragstyp für DNS-Tunneling war historisch gesehen TXT. Dies liegt daran, dass TXT-Einträge mehr Daten aufnehmen können als andere Einträge und zudem groß-/kleinschreibungssensitiv sind, was bei anderen Einträgen nicht der Fall ist und Auswirkungen haben kann, sobald wir über Kodierung sprechen.
Der Constrained Language Mode (CLM) ist ein restriktiver Sprachmodus für PowerShell, der die Fähigkeiten und die erlaubte Funktionalität von PowerShell erheblich einschränkt. Kurz gesagt sind .NET, COM-Objekte und Angreifer-Favoriten wie (new-object net.webclient).downloadstring... nicht verfügbar. Dieser Link bietet weitere Informationen. Organisationen setzen diese Richtlinie für normale Benutzer als Teil von Angriffsflächenreduzierungsregeln durch. Dies erschwert uns als Angreifer das Leben.
Die meisten sollten zumindest oberflächlich mit DNS vertraut sein, durch die Verwendung von Tools wie Nslookup. Aber grundsätzlich sendet der Client eine Abfrage und der DNS-Server gibt eine Antwort auf diese Abfrage zurück. Es gibt verschiedene Arten von DNS-Einträgen: CNAME, A, AAAA, TXT, MX und NS, um nur einige zu nennen. Jeder dieser Einträge kann unterschiedliche Informationen speichern und zurückgeben. Diese Einträge werden in einer Zonefile konfiguriert, die von einem DNS-Server bereitgestellt wird.
Ein Beispiel für eine Zonefile ist hier zu sehen:``` $ORIGIN example.com. @ 3600 SOA ns1.p30.dynect.net. ( zone-admin.dyndns.com. ; address of responsible party 2016072701 ; serial number 3600 ; refresh period 600 ; retry period 604800 ; expire time 1800 ) ; minimum ttl 86400 NS ns1.p30.dynect.net. 86400 NS ns2.p30.dynect.net. 86400 NS ns3.p30.dynect.net. 86400 NS ns4.p30.dynect.net. 3600 MX 10 mail.example.com. 3600 MX 20 vpn.example.com. 3600 MX 30 mail.example.com. 60 A 204.13.248.106 3600 TXT "v=spf1 includespf.dynect.net ~all" mail 14400 A 204.13.248.106 vpn 60 A 216.146.45.240 webapp 60 A 216.146.46.10 webapp 60 A 216.146.46.11 www 43200 CNAME example.com.
Wenn man NS-Einträge für example.com abfragen würde, würde die Abfrage ns1.p30.dynect.net, ns2.p30.dynect.net, ns3.p30.dynect.net und ns4.p30.dynect.net zurückgeben.
# Forschung
## Domainnamen-Registrierung
Bevor wir beginnen, müssen wir kurz darüber sprechen, wie man DNS-Einträge so einrichtet, dass sie auf eine IP verweisen, die wir kontrollieren und auf der wir einen DNS-Server betreiben. Wie unten gezeigt, habe ich eine Domain gekauft und DNS-Einträge eingerichtet, die den Subdomain "dns" auf den Subdomain "ns1" verweisen lassen, dem die öffentliche IP des Servers zugewiesen ist.

Das bedeutet, dass alle Anfragen nach "dns.edu....com" an "ns1.edu....com" weitergeleitet werden, der die IP 3..86 zugewiesen ist. Auf dieser IP werden wir einen DNS-Server einrichten, um unsere Einträge auszuliefern. Darauf kommen wir später zurück.
## Ein clientseitiges Tool finden
Meine Suche begann mit einer einfachen Google-Suche nach "powershell dns module", die [diesen](https://docs.microsoft.com/en-us/powershell/module/dnsclient/?view=windowsserver2022-ps) Link zurückgab. Von besonderem Interesse war der Befehl `Resolve-DnsName`. Es scheint sich im Grunde um eine PowerShell-Implementierung des bekannten Nslookup.exe-Binärprogramms zu handeln. Beachten Sie, dass bestimmte Record-Typen angefordert werden können:

Ok, wir haben also ein PowerShell-Modul, das DNS-Abfragen durchführen und die Antwort abrufen kann. Funktioniert es im Constrained Language Mode (CLM)? Die Antwort lautet: so ungefähr.
Wie Sie hier sehen können, wenn ich ein neues PowerShell-Fenster öffne, `Resolve-DnsName` ausführe, PowerShell in den CLM versetze (und mit dem einfachen `::WriteLine`-Aufruf teste) und dann `Resolve-DnsName` erneut ausführe, funktioniert es ohne Probleme:

Wenn ich jedoch ein neues PowerShell-Fenster öffne und es sofort in den CLM versetze und dann versuche, `Resolve-DnsName` auszuführen, schlägt es fehl:

Es scheint, dass ein Modul, das zuvor geladen wurde, auch nach der Aktivierung des CLM ausgeführt werden kann, der CLM jedoch das Laden verhindert, wenn es noch nicht geladen wurde. Da ich im Hinblick auf eine Zielumgebung, in der der CLM für Benutzer standardmäßig aktiviert ist (und ohne zu wissen, ob bestimmte Module vorab geladen sind oder ob DnsClient dazugehört), entschied ich mich an diesem Punkt, `Resolve-DnsName` hinter mir zu lassen und mich wieder dem guten alten Nslookup.exe zuzuwenden.

Nslookup.exe ist ein fester Bestandteil des IT-Werkzeugkastens und ein sehr bekanntes Binärprogramm, das für legitime Zwecke verwendet wird. Die Chancen stehen gut, dass es auch in Umgebungen, in denen Anwendungs-Whitelisting ein Thema ist, ausgeführt werden darf.
Nslookup wird im Wesentlichen dieselben Informationen wie unsere `Resolve-DnsName`-Abfrage zurückgeben; wir müssen die Daten nur etwas anders verarbeiten, wenn es so weit ist.
## Ein ausführbares Programm in DNS-Einträge verwandeln?
Ok, wir haben also eine Möglichkeit, DNS-Abfragen auf dem Opfercomputer durchzuführen. Wie können wir unsere Nutzlast in einem Format bereitstellen, das Nslookup abrufen kann?