
أداة لدراسة البرامج الضارة الخاصة بـ JavaScript.
أداة لتحليل جافاسكريبت الخبيثة.
ما عليك سوى تثبيت box-js من npm:
npm install box-js --global
يتوفر box-js أيضًا:
- كوحدة Cuckoo (انظر دليل
integrationsو Nwinternights/Cuckoo_Boxjs);- كملف Docker (انظر
integrations/README.md);- كحزمة في توزيعات لمحترفي الأمن (REMnux, BlackArch);
- كجزء من تطبيقات مفتوحة المصدر (Intel Owl);
- كجزء من خدمات جهات خارجية تجارية (any.run).
لنفترض أن لديك عينة تسمى sample.js: لتحليلها، قم بتشغيل الأمر التالي
box-js sample.js
من المحتمل أن ترغب أيضًا في تنزيل أي حمولات؛ استخدم العلم --download لتمكين التنزيل. وإلا، سيحاكي المحرك خطأ 404، بحيث يتم خداع السكريبت ليعتقد أن موقع التوزيع معطل ويتصل بأي مواقع بديلة.
سيقوم Box.js بمحاكاة بيئة JScript في ويندوز، وطباعة ملخص للمحاكاة على وحدة التحكم، وإنشاء مجلد باسم sample.js.results (إذا كان موجودًا بالفعل، سينشئ sample.js.1.results وهكذا). سيحتوي هذا المجلد على:
analysis.log، سجل للتحليل كما طُبع على الشاشة؛snippets.json، قائمة بأجزاء الكود التي نفذتها العينة (جافاسكريبت، أوامر شيل، إلخ)؛urls.json، قائمة عناوين URL التي تم الاتصال بها؛active_urls.json، قائمة عناوين URL التي يبدو أنها تسقط برامج ضارة نشطة؛resources.json، تدفقات ADODB (أي الملفات التي كتبها السكريبت على القرص) مع أنواع الملفات وهاشاتها؛IOC.json، قائمة بالسلوكيات التي تم تحديدها كمؤشرات اختراق (IOCs). تتضمن هذه الوصول إلى السجل، والملفات المكتوبة، وطلبات HTTP، وما إلى ذلك.يمكنك تحليل هذه بنفسك، أو يمكنك إرسالها تلقائيًا إلى Malwr أو VirusTotal أو صندوق رمل Cuckoo: لمزيد من المعلومات، قم بتشغيل box-export --help.
لمزيد من العزل، يُنصح بتشغيل التحليل في حاوية Docker مؤقتة. راجع
integrations/README.mdلمزيد من المعلومات.
إذا كنت ترغب في أتمتة التحليل، يمكنك استخدام رموز الإرجاع - الموثقة في
integrations/README.md- للتمييز بين أنواع الأخطاء المختلفة.
يتضمن مستودع box-js من git ملف boilerplate.js. يعرّف هذا الملف بعض الإصدارات الوهمية لكائنات المتصفح الشائعة مثل document. حاول إعادة تشغيل التحليل باستخدام الخيار --prepended-code=DIR/boilerplate.js، حيث DIR هو دليل مستودع box-js المستنسخ أو باستخدام --prepended-code=default. يخبر الخيار --prepended-code box-js بإضافة الجافاسكريبت في الملف المحدد قبل العينة التي يتم تحليلها.
لاحظ أنه يمكنك نسخ boilerplate.js وإضافة الفئات والكائنات الوهمية الخاصة بك حسب الحاجة. استخدم خيار سطر الأوامر --prepended-code=show-default لطباعة المسار الكامل لملف boilerplate.js الافتراضي الخاص بـ box-js.
بينما يُستخدم box.js عادةً على ملفات فردية، يمكنه أيضًا تشغيل تحليلات دفعية. يمكنك ببساطة تمرير قائمة من الملفات أو المجلدات لتحليلها:
box-js sample1.js sample2.js /var/data/mySamples ...
افتراضيًا، سيقوم box.js بمعالجة العينات بالتوازي، حيث يقوم بتشغيل تحليل واحد لكل نواة. يمكنك استخدام إعداد مختلف عن طريق تحديد قيمة لـ --threads: على وجه الخصوص، ستزيل القيمة 0 الحد، مما يجعل box-js يولد أكبر عدد ممكن من خيوط التحليل مما يؤدي إلى تحليل سريع جدًا ولكن قد يؤدي إلى تحميل زائد على النظام (لاحظ أن التحليلات عادةً ما تكون مقيدة بوحدة المعالجة المركزية، وليس بالذاكرة).
يمكنك استخدام --loglevel=warn لإسكات الرسائل المتعلقة بالتحليل وعرض معلومات التقدم فقط.
بعد انتهاء التحليل، يمكنك استخراج عناوين URL النشطة على النحو التالي:
cat ./*.results/active_urls.json | sort | uniq
NAME DESCRIPTION
-h, --help إظهار نص المساعدة والخروج
-v, --version إظهار إصدار الحزمة والخروج
--license إظهار الترخيص والخروج
--debug التوقف عند حدوث خطأ في المحاكاة، حتى في "الوضع الدفعي"، وتمرير رمز الخروج
.
--loglevel مستوى التسجيل (debug, verbose, info, warning, error - الافتراضي "info")
--threads عند التشغيل في الوضع الدفعي، كم عدد التحليلات التي يجب تشغيلها في نفس الوقت (0 =
غير محدود، الافتراضي: بعدد نوى وحدة المعالجة المركزية)
--download تنزيل الحمولات فعليًا
--encoding ترميز العينة المدخلة (سيتم اكتشافه تلقائيًا افتراضيًا)
--timeout سينتهي وقت السكريبت بعد هذا العدد من الثواني (الافتراضي 10)
--output-dir الموقع على القرص لكتابة ملفات ومجلدات النتائج إليها (الافتراضي هو
الدليل الحالي)
--preprocess معالجة مسبقة لشفرة المصدر الأصلية (تسهل الهندسة العكسية، لكنها تستغرق
بضع ثوانٍ)
--unsafe-preprocess معالجة مسبقة أكثر عدوانية. غالبًا ما تؤدي إلى كود أفضل، ولكنها قد تتعطل في
بعض الحالات الحدية (على سبيل المثال، إعادة تعريف النماذج الأولية)
--prepended-code ملف أو دليل إدخال يحتوي على كود يجب إضافته قبل ملفات JS
التي نحللها. إذا تم إعطاء دليل، يسبق محتويات جميع الملفات
في الدليل. إذا تم إعطاء 'default'، يتم استخدام boilerplate.js الافتراضي الذي
يأتي مع box-js. إذا تم إعطاء 'show-default'، يتم طباعة مسار boilerplate.js
والخروج (مفيد إذا كنت تريد نسخ وتعديل كود boilerplate الافتراضي).
--fake-script-engine محرك السكريبت الذي سيتم الإبلاغ عنه في WScript.FullName و WScript.Name (مثال.
'cscript.exe', 'wscript.exe', أو 'node'). الافتراضي هو wscript.exe.
--fake-cl-args وسائط سطر أوامر السكريبت الوهمية. في السلسلة يجب أن تكون مفصولة بفاصلة
.
--fake-sample-name اسم ملف وهمي لاستخدامه للعينة التي يتم تحليلها. يمكن أن يكون مسارًا كاملاً أو مجرد
اسم الملف. إذا كان لديك '\' في المسار، فاهربها كـ '\\' في هذه
القيمة لوسيطة سطر الأوامر (مثال. --fake-sample-name=C:\\foo\\bar.js).
--fake-language حدد رمز اللغة لإرجاعه لـ Win32_OperatingSystem.OSLanguage.
القيم المدعومة هي 'spanish' و 'english' و 'portuguese'.
--fake-domain حدد مجال المستخدم لإرجاعه لـ WScript.Network.UserDomain.
--fake-download تزوير أن طلبات HTTP تعمل وإرجاع حمولة وهمية
--no-kill لا تقتل التطبيق عند حدوث أخطاء وقت التشغيل
--no-echo عندما يطبع السكريبت بيانات، لا تطبعها على وحدة التحكم
--no-rewrite لا تعيد كتابة شفرة المصدر على الإطلاق، بخلاف دعم `@cc_on`
--no-catch-rewrite لا تعيد كتابة عبارات try..catch لجعل الاستثناء عالمي النطاق
--no-cc_on-rewrite لا تعيد كتابة `/*@cc_on <...>@*/` إلى `<...>`
--no-eval-rewrite لا تعيد كتابة `eval` بحيث يتم إعادة كتابة وسيطته
--no-file-exists إرجاع `false` لـ Scripting.FileSystemObject.FileExists(x)
--limit-file-checks تبديل القيمة الافتراضية لفحوصات وجود المجلد/الملف إذا تم إجراء العديد من الفحوصات
(حاول كسر حلقات فحص الملفات اللانهائية).
--no-folder-exists إرجاع `false` لـ Scripting.FileSystemObject.FileExists(x)
--function-rewrite إعادة كتابة استدعاءات الدوال من أجل التقاط استدعاءات eval
--no-rewrite-prototype لا تعيد كتابة تعبيرات مثل `function A.prototype.B()` كـ `A.prototype.B =
function()`
--no-hoist-prototype لا ترفع تعبيرات مثل `function A.prototype.B()` (مضمنة ضمن
no-rewrite-prototype)
--no-shell-error لا تطرح خطأ وهميًا عند تنفيذ `WScriptShell.Run` (يطرح خطأ وهميًا
افتراضيًا للتظاهر بأن مواقع التوزيع معطلة، بحيث يحاول السكريبت الاتصال بكل موقع)
--no-typeof-rewrite لا تعيد كتابة `typeof` (على سبيل المثال `typeof ActiveXObject`، الذي يجب أن يرجع
'unknown' في معيار JScript وليس 'object')
--proxy [تجريبي] استخدم الوكيل المحدد للتنزيلات. هذا غير مهم إذا
لم يكن العلم --download موجودًا.
--windows-xp محاكاة ويندوز XP (تؤثر على قيمة متغيرات البيئة)
--dangerous-vm استخدم وحدة `vm`، بدلاً من `vm2`. يمكن اختراق هذا الصندوق الرملي، لذا **لا
تستخدم هذا** إلا إذا كنت متأكدًا 100% مما تفعله. يساعد في تصحيح الأخطاء من خلال
إعطاء تتبعات مكدس صحيحة.
--rewrite-loops إعادة كتابة بعض أنواع الحلقات لجعل التحليل أسرع
--throttle-writes تقليل الإبلاغ وتتبع بيانات كتابات الملفات التي تكتب الكثير من البيانات
--throttle-commands إيقاف التحليل إذا تم تشغيل الكثير من الأوامر نفسها
--extract-conditional-code استخراج الكود الفعلي للتحليل من تعليقات JScript الشرطية (/*@if(...).
--loose-script-name إعادة كتابة فحوصات == بحيث تقارن اسم السكريبت الحالي باسم سكريبت محدد
مكتوب بشكل ثابت دائمًا ترجع true.
--real-script-name إرجاع اسم الملف الحقيقي للسكريبت الذي يتم تحليله حاليًا بدلاً من اسم وهمي
.
--activex-as-ioc تسجيل جميع استدعاءات ActiveX كمؤشرات اختراق ومحاولة تحديد ما إذا كان الاستدعاء مشوشًا
في شفرة المصدر JS.
--ignore-wscript-quit تجاهل استدعاءات WSCript.Quit() ومتابعة التنفيذ.
--ignore-rewrite-errors تحليل العينة الأصلية إذا فشلت أي إعادة كتابة للعينة.
المصدر الأول للمعلومات هو مخرجات وحدة التحكم. في التحليل الناجح، سيطبع عادةً شيئًا كهذا:
Using a 10 seconds timeout, pass --timeout to specify another timeout in seconds
Analyzing sample.js
Header set for http://foo.bar/baz: User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Emulating a GET request to http://foo.bar/baz
Downloaded 301054 bytes.
Saved sample.js.results/a0af1253-597c-4eed-9e8f-5b633ff5f66a (301054 bytes)
sample.js.results/a0af1253-597c-4eed-9e8f-5b633ff5f66a has been detected as data.
Saved sample.js.results/f8df7228-7e0a-4241-9dae-c4e1664dc5d8 (303128 bytes)
sample.js.results/f8df7228-7e0a-4241-9dae-c4e1664dc5d8 has been detected as PE32 executable (GUI) Intel 80386, for MS Windows.
http://foo.bar/baz is an active URL.
Executing sample.js.results/d241e130-346f-4c0c-a698-f925dbd68f0c in the WScript shell
Header set for http://somethingelse.com/: User-Agent Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Emulating a GET request to http://somethingelse.com/
...
في هذه الحالة، نحن نرى برنامج إسقاط يقوم بتنزيل ملف من http://foo.bar/baz، مع تعيين رأس HTTP User-Agent إلى Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0). ثم، يشرع في فك تشفيره، وكتابة النتيجة على القرص (ملف PE32 قابل للتنفيذ). أخيرًا، يقوم بتشغيل بعض الأوامر في شل ويندوز.
sample.js.results/a0af1253-597c-4eed-9e8f-5b633ff5f66a سيحتوي على الحمولة كما تم تنزيلها من http://foo.bar/baz؛sample.js.results/f8df7228-7e0a-4241-9dae-c4e1664dc5d8 سيحتوي على الحمولة الفعلية (ملف PE قابل للتنفيذ)؛sample.js.results/d241e130-346f-4c0c-a698-f925dbd68f0c سيحتوي على الأمر الذي تم تشغيله في شل ويندوز.يتم طباعة كل طلب HTTP على الطرفية وتسجيله في urls.json. عناوين URL المكررة لا يتم إدراجها (أي طلب نفس URL مرتين سيؤدي إلى سطر واحد فقط في urls.json).
active_urls.json يحتوي على قائمة عناوين URL التي أدت في النهاية إلى حمولة قابلة للتنفيذ. هذا الملف هو الأكثر إثارة للاهتمام، إذا كنت تبحث عن إزالة مواقع التوزيع.
snippets.json يحتوي على كل قطعة كود صادفها box-js، سواء كانت جافاسكريبت، أو أمر cmd.exe، أو سكريبت PowerShell.
resources.json يحتوي على كل ملف كتبته العينة على القرص. على سبيل المثال، إذا حاول التطبيق حفظ Hello world! إلى $PATH/foo.txt، فسيكون محتوى resources.json:
{
"9a24...": {
"path": "(path)\\foo.txt",
"type": "ASCII text, with no line terminators",
"md5": "86fb269d190d2c85f6e0468ceca42a20",
"sha1": "d3486ae9136e7856bc42212385ea797094475802",
"sha256": "c0535e4be2b79ffd93291305436bf889314e4a3faec05ecffcbb7df31ad9e51a"
}
}
ملف resources.json مهم أيضًا: انتبه لأي مورد قابل للتنفيذ (مثل "type": "PE32 executable (GUI) Intel 80386, for MS Windows").
لوحظ أن بعض السكريبتات في البرية تستخدم new Date().getYear() بينما الصحيح هو new Date().getFullYear(). إذا لم تظهر عينة أي سلوك مشبوه، انتبه لفحوصات Date.
إذا واجهت ملفات .JSE، قم بتجميع وحدة فك التشفير وتشغيلها هكذا:
cc decoder.c -o decoder
./decoder foo.jse bar.js
node run bar.js
قد تصادف أحيانًا مكونات غير مدعومة. في هذه الحالة، يمكنك فتح مشكلة على GitHub، أو محاكاة المكون بنفسك إذا كنت تعرف الجافاسكريبت.
سيبدو الخطأ عادةً هكذا (قد تختلف أرقام الأسطر):
1 Jan 00:00:00 - Unknown ActiveXObject WinHttp.WinHttpRequest.5.1
Trace
at kill (/home/CapacitorSet/box-js/run.js:24:10)
at Proxy.ActiveXObject (/home/CapacitorSet/box-js/run.js:75:4)
at evalmachine.<anonymous>:1:6471
at ContextifyScript.Script.runInNewContext (vm.js:18:15)
at ...
يمكنك أن ترى أنه تم رفع الاستثناء في Proxy.ActiveXObject، والذي يبدو هكذا:
function ActiveXObject(name) {
name = name.toLowerCase();
/* ... */
switch (name) {
case "wscript.shell":
return require("./emulator/WScriptShell");
/* ... */
default:
kill(`Unknown ActiveXObject ${name}`);
break;
}
}
أضف case "winhttp.winhttprequest.5.1" جديدًا (لاحظ الأحرف الصغيرة!)، واجعله يُرجع كائن ES6 Proxy (مثل ProxiedWinHttpRequest). يُستخدم هذا لالتقاط الميزات غير المنفذة بمجرد طلبها من قبل العينة الخبيثة:
/* emulator/WinHttpRequest.exe */
const lib = require("../lib");
module.exports = function ProxiedWinHttpRequest() {
return new Proxy(new WinHttpRequest(), {
get: function(target, name, receiver) {
switch (name) {
/* أضف هنا "مصائد" خاصة باستخدام عبارات case */
default:
if (name in target) return target[name];
else lib.kill(`WinHttpRequest.${name} not implemented!`)
}
}
})
}
function WinHttpRequest() {
}
أعد تشغيل التحليل: سيفشل مرة أخرى، ويخبرك بالضبط ما الذي لم يتم تنفيذه.
1 Jan 00:00:00 - WinHttpRequest.open not implemented!
Trace
at kill (/home/CapacitorSet/box-js/run.js:24:10)
at Object.ProxiedWinHttpRequest.Proxy.get (/home/CapacitorSet/box-js/run.js:89:7)
قم بمحاكاة WinHttpRequest.open حسب الحاجة:
function WinHttpRequest() {
this.open = function(method, url) {
URLLogger(method, url);
this.url = url;
}
}
وكرر العملية حتى يتم محاكاة الكود دون أخطاء.
@CapacitorSet: المطور الأصلي
@kirk-sayre-work: الصيانة
--output-directory