
जावास्क्रिप्ट मैलवेयर का अध्ययन करने के लिए एक उपकरण।
दुर्भावनापूर्ण जावास्क्रिप्ट का विश्लेषण करने के लिए एक उपकरण।
npm से बस box-js इंस्टॉल करें:
npm install box-js --global
box-js निम्न रूप में भी उपलब्ध है:
- Cuckoo मॉड्यूल के रूप में (देखें
integrationsनिर्देशिका और Nwinternights/Cuckoo_Boxjs);- Dockerfile के रूप में (देखें
integrations/README.md);- सुरक्षा पेशेवरों के लिए डिस्ट्रोस में पैकेज के रूप में (REMnux, BlackArch);
- ओपन सोर्स एप्लिकेशन के भाग के रूप में (Intel Owl);
- वाणिज्यिक तृतीय-पक्ष सेवाओं के भाग के रूप में (any.run)।
मान लीजिए कि आपके पास sample.js नामक एक नमूना है: इसका विश्लेषण करने के लिए, बस चलाएँ
box-js sample.js
संभवतः आप किसी भी पेलोड को डाउनलोड भी करना चाहेंगे; डाउनलोड सक्षम करने के लिए --download फ़्लैग का उपयोग करें। अन्यथा, इंजन 404 त्रुटि का अनुकरण करेगा, ताकि स्क्रिप्ट को यह सोचने में धोखा दिया जाए कि वितरण साइट डाउन है और किसी भी फ़ॉलबैक साइट से संपर्क करे।
Box.js Windows JScript वातावरण का अनुकरण करेगा, कंसोल पर अनुकरण का सारांश प्रिंट करेगा, और sample.js.results नामक एक फ़ोल्डर बनाएगा (यदि यह पहले से मौजूद है, तो यह sample.js.1.results और इसी तरह बनाएगा)। इस फ़ोल्डर में शामिल होगा:
analysis.log, विश्लेषण का एक लॉग जैसा कि स्क्रीन पर मुद्रित हुआ था;snippets.json, नमूने द्वारा निष्पादित कोड के टुकड़ों की एक सूची (जावास्क्रिप्ट, शेल कमांड, आदि);urls.json, संपर्क किए गए URL की एक सूची;active_urls.json, URL की एक सूची जो सक्रिय मैलवेयर छोड़ने लगते हैं;resources.json, ADODB स्ट्रीम (अर्थात फ़ाइलें जो स्क्रिप्ट ने डिस्क पर लिखी थीं) फ़ाइल प्रकारों और हैश के साथ;IOC.json, IOC (Indicators of Compromise) के रूप में पहचाने गए व्यवहारों की एक सूची। इनमें रजिस्ट्री एक्सेस, लिखी गई फ़ाइलें, HTTP अनुरोध आदि शामिल हैं।आप इनका स्वयं विश्लेषण कर सकते हैं, या आप इन्हें स्वचालित रूप से Malwr, VirusTotal या Cuckoo सैंडबॉक्स में सबमिट कर सकते हैं: अधिक जानकारी के लिए box-export --help चलाएँ।
अधिक अलगाव के लिए, विश्लेषण को अस्थायी Docker कंटेनर में चलाने की अनुशंसा की जाती है। अधिक जानकारी के लिए
integrations/README.mdदेखें।
यदि आप विश्लेषण को स्वचालित करना चाहते हैं, तो आप रिटर्न कोड का उपयोग कर सकते हैं -
integrations/README.mdमें दस्तावेजित - विभिन्न प्रकार की त्रुटियों के बीच अंतर करने के लिए।
git से box-js रिपॉजिटरी में एक boilerplate.js फ़ाइल शामिल है। यह फ़ाइल document जैसे सामान्य ब्राउज़र ऑब्जेक्ट्स के कुछ स्टबbed संस्करणों को परिभाषित करती है। --prepended-code=DIR/boilerplate.js विकल्प के साथ अपने विश्लेषण को फिर से चलाने का प्रयास करें, जहाँ DIR क्लोन किए गए box-js रिपॉजिटरी की निर्देशिका है या --prepended-code=default के साथ। --prepended-code विकल्प box-js को बताता है कि दी गई फ़ाइल में जावास्क्रिप्ट को विश्लेषण किए जा रहे नमूने में prepend करे।
ध्यान दें कि आप boilerplate.js कॉपी कर सकते हैं और आवश्यकतानुसार अपने स्वयं के स्टबbed क्लास, ऑब्जेक्ट आदि जोड़ सकते हैं। डिफ़ॉल्ट box-js boilerplate.js फ़ाइल का पूर्ण पथ प्रिंट करने के लिए --prepended-code=show-default कमांड लाइन विकल्प का उपयोग करें।
जबकि box.js का उपयोग आमतौर पर एकल फ़ाइलों पर किया जाता है, यह बैच विश्लेषण भी चला सकता है। आप विश्लेषण करने के लिए फ़ाइलों या फ़ोल्डरों की एक सूची पास कर सकते हैं:
box-js sample1.js sample2.js /var/data/mySamples ...
डिफ़ॉल्ट रूप से box.js नमूनों को समानांतर में संसाधित करेगा, प्रति कोर एक विश्लेषण चलाएगा। आप --threads के लिए एक मान निर्दिष्ट करके एक अलग सेटिंग का उपयोग कर सकते हैं: विशेष रूप से, 0 सीमा हटा देगा, जिससे box-js जितना संभव हो उतने विश्लेषण थ्रेड उत्पन्न करेगा और बहुत तेज़ विश्लेषण के परिणामस्वरूप लेकिन संभवतः सिस्टम को ओवरलोड करेगा (ध्यान दें कि विश्लेषण आमतौर पर CPU-बाउंड होते हैं, RAM-बाउंड नहीं)।
आप केवल प्रगति जानकारी प्रदर्शित करने और विश्लेषण-संबंधी संदेशों को शांत करने के लिए --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 =
असीमित, डिफ़ॉल्ट: जितने CPU कोर की संख्या)
--download पेलोड को वास्तव में डाउनलोड करें
--encoding इनपुट नमूने का एन्कोडिंग (डिफ़ॉल्ट रूप से स्वचालित रूप से पहचाना जाएगा)
--timeout स्क्रिप्ट इस कई सेकंड के बाद टाइमआउट हो जाएगी (डिफ़ॉल्ट 10)
--output-dir परिणाम फ़ाइलों और फ़ोल्डरों को लिखने के लिए डिस्क पर स्थान (डिफ़ॉल्ट
वर्तमान निर्देशिका)
--preprocess मूल स्रोत कोड को प्रीप्रोसेस करें (रिवर्स इंजीनियरिंग को आसान बनाता है, लेकिन कुछ
सेकंड लगते हैं)
--unsafe-preprocess अधिक आक्रामक प्रीप्रोसेसिंग। अक्सर बेहतर कोड में परिणाम होता है, लेकिन कुछ
किनारे के मामलों पर टूट सकता है (जैसे प्रोटोटाइप को फिर से परिभाषित करना)
--prepended-code इनपुट फ़ाइल या निर्देशिका जिसमें कोड है जिसे JS फ़ाइल(फ़ाइलों) के सामने
prepend किया जाना चाहिए जिसका हम विश्लेषण कर रहे हैं। यदि निर्देशिका दी गई है, तो
निर्देशिका में सभी फ़ाइलों की सामग्री prepend करता है। यदि 'default' दिया गया है, तो
box-js के साथ आने वाली डिफ़ॉल्ट boilerplate.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 Scripting.FileSystemObject.FileExists(x) के लिए `false` लौटाएं
--limit-file-checks यदि कई जाँचें की जाती हैं तो फ़ोल्डर/फ़ाइल मौजूदगी जाँच के लिए डिफ़ॉल्ट मान स्विच करें
(अनंत फ़ाइल जाँच लूप को तोड़ने का प्रयास करें)।
--no-folder-exists Scripting.FileSystemObject.FileExists(x) के लिए `false` लौटाएं
--function-rewrite eval कॉल को पकड़ने के लिए फ़ंक्शन कॉल को पुनर्लेखन करें
--no-rewrite-prototype `function A.prototype.B()` जैसे व्यंजकों को `A.prototype.B =
function()` के रूप में पुनर्लेखन न करें
--no-hoist-prototype `function A.prototype.B()` जैसे व्यंजकों को hoist न करें (no-rewrite-prototype द्वारा निहित)
--no-shell-error `WScriptShell.Run` निष्पादित करते समय नकली त्रुटि न फेंकें (यह डिफ़ॉल्ट रूप से एक नकली
त्रुटि फेंकता है ताकि यह दिखावा करे कि वितरण साइटें डाउन हैं, जिससे
स्क्रिप्ट प्रत्येक साइट को पोल करने का प्रयास करेगी)
--no-typeof-rewrite `typeof` को पुनर्लेखन न करें (जैसे `typeof ActiveXObject`, जिसे JScript मानक में
'unknown' लौटाना चाहिए न कि 'object')
--proxy [प्रयोगात्मक] डाउनलोड के लिए निर्दिष्ट प्रॉक्सी का उपयोग करें। यह प्रासंगिक नहीं है यदि
`--download` फ़्लैग मौजूद नहीं है।
--windows-xp Windows XP का अनुकरण करें (पर्यावरण चर के मान को प्रभावित करता है)
--dangerous-vm `vm` मॉड्यूल का उपयोग करें, `vm2` के बजाय। यह सैंडबॉक्स तोड़ा जा सकता है, इसलिए **इसका उपयोग न करें**
जब तक कि आप 100% सुनिश्चित न हों कि आप क्या कर रहे हैं। सही स्टैक ट्रेस देकर डीबगिंग में मदद करता है।
--rewrite-loops विश्लेषण को तेज़ बनाने के लिए कुछ प्रकार के लूपों को पुनर्लेखन करें
--throttle-writes फ़ाइल लेखन की रिपोर्टिंग और डेटा ट्रैकिंग को सीमित करें जो बहुत अधिक डेटा लिखते हैं
--throttle-commands यदि समान कमांड बहुत अधिक चलाए गए हैं तो विश्लेषण रोक दें
--extract-conditional-code JScript सशर्त टिप्पणियों (/*@if(...) से विश्लेषण के लिए वास्तविक कोड निकालें।
--loose-script-name == जाँचों को पुनर्लेखन करें ताकि वर्तमान स्क्रिप्ट नाम की एक हार्ड कोडेड
स्क्रिप्ट नाम से तुलना हमेशा सत्य लौटाए।
--real-script-name वर्तमान में विश्लेषित स्क्रिप्ट का वास्तविक फ़ाइल नाम लौटाएँ न कि नकली
नाम।
--activex-as-ioc सभी ActiveX कॉल को IOC के रूप में लॉग करता है और यह निर्धारित करने का प्रयास करता है कि कॉल 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 एक्जीक्यूटेबल)। अंत में, यह Windows शेल में कुछ कमांड चलाता है।
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 में वह कमांड होगा जो Windows शेल में चलाया गया था।प्रत्येक 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) {
/* यहाँ "विशेष" trap को case statements के साथ जोड़ें */
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