
Web shell स्कैनर और एनालाइज़र।
वेब शेल विश्लेषक एक क्रॉस-प्लेटफॉर्म स्टैंड-अलोन बाइनरी है जो विशेष रूप से वेब शेल होने के संदेह वाली फ़ाइलों की पहचान, डिकोडिंग और टैगिंग के उद्देश्य से बनाई गई है। वेब शेल विश्लेषक, वेब शेल स्कैनर प्रोजेक्ट (http://github.com/tstillz/webshell-scan) का बड़ा भाई है, जो केवल रेगेक्स के माध्यम से फ़ाइलों को स्कैन करता है, बिना किसी डिकोडिंग या विशेषता विश्लेषण के।
स्कैनर के साथ प्रदान किए गए रेगेक्स और इसके अंतर्निहित डिकोडिंग रूटीन डिस्क पर प्रत्येक वेब शेल को खोजने की गारंटी नहीं देते हैं और कुछ गलत सकारात्मक परिणामों की पहचान कर सकते हैं। यह भी अनुशंसा की जाती है कि आप प्रोडक्शन सिस्टम पर चलाने से पहले विश्लेषक का परीक्षण करें और इसके प्रभाव का आकलन करें। विश्लेषक की कोई वारंटी नहीं है, अपने जोखिम पर उपयोग करें।
PHP, ASP/X वेब शेल को सपोर्ट करता है। JSP/X, CFM और अन्य प्रकारों पर काम चल रहा है।स्कैन की गई प्रत्येक फ़ाइल को PRE और/या POST क्रिया के माध्यम से चलाया जा सकता है:
PreDecodeActions फ़ंक्शन के पीछे का विचार किसी मिलान स्ट्रिंग या पैटर्न की पहचान करने, उसकी रॉ मैच सामग्री प्राप्त करने, परिभाषित डिकोडिंग/क्लीनअप चरणों को निष्पादित करने और अंतिम आउटपुट को पुनः-स्कैनिंग/प्रसंस्करण के लिए विश्लेषण इंजन को वापस भेजने के लिए रेगेक्स का उपयोग करना था। इसका एक बहुत ही सरल उदाहरण Base64 डिकोडिंग है। बेस64 एनकोडेड वेब शेल के विरुद्ध किसी भी डिटेक्शन लॉजिक की जांच करने के लिए, हमें पहले base64 की सभी परतों को हटाना होगा। ऐसा करने के लिए, हम निम्नलिखित PreDecodeAction का उपयोग कर सकते हैं:
{
Name: "PHP_Base64Decode",
Regex: *regexp.MustCompile(`(?i)(?:=|\s+)(base64_decode\('('?\"?[A-Za-z0-9+\/=]+'?\"?))`),
DataCapture: *regexp.MustCompile(`(?i)((?:'|")[A-Za-z0-9+\/=]+(?:'|"))`),
PreDecodeActions: []cm.Action{
{Function: cm.StringReplace, Arguments: []interface{}{"\"", "", -1}},
{Function: cm.StringReplace, Arguments: []interface{}{"'", "", -1}},
},
Functions: []cm.Base_Func{cm.DecodeBase64},
},
उपरोक्त ब्लॉक को देखते हुए, पहले हमारे पास फ़ंक्शन का नाम, मिलान के लिए उपयोग किया जाने वाला रेगेक्स, डेटा कैप्चर रेगेक्स (कभी-कभी आप कैप्चर करने बनाम मिलान करने के लिए समायोजित करना चाह सकते हैं) और PreDecodeActions हैं। इस मामले में, मिलान टेक्स्ट पर फ़ंक्शन cm.DecodeBase64 लागू करने से पहले, सिस्टम पहले निम्नलिखित आइटम " और ' को हटा देगा। PostDecodeActions इसके विपरीत काम करता है, जहां आउटपुट की जांच डिकोडिंग करने के बाद की जाती है। इस मॉडल का उपयोग करके, हम कई कस्टम डिकोडर बना सकते हैं जिनमें अनंत PRE/POST और डिकोडिंग फ़ंक्शन हों जो अधिकांश वेब शेल विश्लेषण आवश्यकताओं को संभाल सकें।
डिटेक्शन एक रेगेक्स है जिसके साथ एक नाम और विवरण होता है। इस मॉडल के पीछे का विचार डिटेक्शन को मॉड्यूलर और स्केलेबल बनाना था और वास्तविक डिटेक्शन के संदर्भ में रखना था। डिटेक्शन विशेषताओं के समान प्रारूप साझा करते हैं, सिवाय इसके कि विशेषताएं कोई डिटेक्शन उत्पन्न नहीं कर सकतीं, वे केवल एक मौजूदा डिटेक्शन में संदर्भ जोड़ सकती हैं। आइए नीचे दिए गए उदाहरण डिटेक्ट लॉजिक ब्लॉक को देखें:
{
Name: "Generic_Embedded_Executable",
Description: "Looks for magic bytes associated with a PE file",
Regex: *regexp.MustCompile(`(?i)(?:(?:0x)?4d5a)`),
},
रेगेक्स के आधार पर, हम देख सकते हैं कि यह मैजिक हेडर बाइट्स 4D 5A के आधार पर एक एम्बेडेड विंडोज PE फ़ाइल की तलाश कर रहा है। यदि मिल जाता है, तो इससे एक डिटेक्शन होगा और फ़ाइल के लिए एक JSON रिपोर्ट उत्पन्न होगी। वर्तमान में, डिटेक्शन फ़ाइल एक्सटेंशन के आधार पर या सभी फ़ाइल प्रकारों के लिए सामान्य रूप से लागू होते हैं। उदाहरण के लिए, PHP के लिए डिकोडिंग रूटीन cm.GlobalMap.Function_Php के अंतर्गत परिभाषित होते हैं और विशेषताओं के लिए टैग cm.GlobalMap.Tags_Php के अंतर्गत परिभाषित होते हैं। फ़ंक्शन cm.GlobalMap.Function_Generics और cm.GlobalMap.Tags_Generics के अंतर्गत टैग सभी वेब शेल एक्सटेंशन पर कैच-ऑल के रूप में लागू होते हैं।
विशेषता टैगिंग एक नई अवधारणा है जिसे मैंने बनाया है जो मौजूदा वेब शेल डिटेक्शन में "संदर्भ" जोड़ता है। विशेषताएं अकेले वर्तमान में अपने आप कोई डिटेक्शन उत्पन्न नहीं कर सकती हैं। पारंपरिक स्कैन इंजन में, एक स्कैनर केवल तभी अलर्ट करेगा जब कोई वेब शेल डिटेक्ट होता है, लेकिन वेब शेल की संभावित क्षमताओं (विशेषताओं) में बहुत कम या कोई अतिरिक्त संदर्भ प्रदान नहीं करेगा। विशेषता टैग डिटेक्शन लॉजिक के समान काम करते हैं, हालांकि वे केवल एक डिटेक्शन की पहचान होने के बाद दिखाई देते हैं और अपने आप डिटेक्शन उत्पन्न नहीं कर सकते। नीचे दिए गए उदाहरण लॉजिक को देखें:
cm.GlobalMap.Tags_Php = []cm.TagDef{
{
Name: "PHP_Database_Operations",
Description: "Looks for common PHP functions used for interacting with a database.",
Regex: *regexp.MustCompile(`(?i)(?:'mssql_connect\|mysql_exec\()`),
Attribute: true,
},
}
हम देखते हैं कि स्ट्रक्ट Tags_Php के अंतर्गत, हमने एक नया PHP टैग बनाया है। स्कैनिंग के दौरान जब कोई मिलान मिलता है, तो Attribute फ्लैग की जाँच की जाती है और यदि True पर सेट है, तो डिटेक्ट किए गए वेब शेल में टैग PHP_Database_Operations को उसकी JSON रिपोर्ट में आवृत्ति और मिलान टेक्स्ट ब्लॉक के साथ जोड़ा जाएगा, जैसा कि नीचे दिए गए उदाहरण आउटपुट में दिखाया गया है:
{
"filePath": "/testers/1.php",
"size": 66109,
"md5": "6793d8ebab93e5a0f91e5a331221f331",
"timestamps": {
"birth": "2019-02-03 02:02:22",
"created": "2020-07-29 02:50:15",
"modified": "2019-02-03 02:02:22",
"accessed": "2020-07-29 02:51:07"
},
"matches": {
"FilesMAn": 5,
"FilesMan": 29,
"cmd": 20,
"eval(": 4,
"exec(": 2,
"ipconfig": 1,
"netstat": 2,
"passthru(": 1,
"shell_exec(": 1
},
"decodes": {
"Generic_Base64Decode": 40,
"Generic_Multiline_Base64Decode": 165
},
"tags": {
"Generic_Embedding_Code_C": {
"bind(": 2,
"listen(": 2
},
"PHP_Banned_Function": {
"exec(": 3,
"get_current_user(": 1,
"getmyuid(": 1,
"link(": 7,
"listen(": 2,
"passthru(": 1,
"realpath(": 1,
"set_time_limit(": 1
},
"PHP_Database_Operations": {
"mysql_query(": 1
},
"PHP_Disk_Operations": {
"@chmod(": 1,
"@filegroup(": 4,
"@fileowner(": 4,
"@rename(": 2,
"fopen(": 7,
"fwrite(": 6
}
}
}
ये टैग न केवल यह परिभाषित करने में मदद करते हैं कि एक वेब शेल क्या कर सकता है, बल्कि यह IR सलाहकारों जैसी टीमों को लाइव रिस्पांस एंगेजमेंट करते समय एक पिवट पॉइंट प्रदान करते हैं कि आगे कहाँ देखना है।
कोई नहीं! बस अपने OS के लिए बाइनरी डाउनलोड करें, वह निर्देशिका प्रदान करें जिसे आप स्कैन करना चाहते हैं (अन्य तर्क वैकल्पिक हैं) और इसे चलने दें।
बिना किसी तर्क के wsa चलाने पर निम्नलिखित विकल्प दिखाई देते हैं:
/Users/beastmode$ ./wsa
Options:
-dir string
Directory to scan for web shells
-pretty
If set to true, the analyzer will output the results in a json indented form
-raw_contents
If a match is found, grab the raw contents and base64 + gzip compress the file into the JSON object.
-size int
Specify max file size to scan (default is 10 MB) (default 10)
-verbose
If set to true, the analyzer will print all files analyzer, not just matches
एकमात्र आवश्यक तर्क dir है। यदि आप चाहें तो अन्य प्रोग्राम डिफ़ॉल्ट को ओवरराइड कर सकते हैं।
विश्लेषक का आउटपुट कंसोल (स्टैंडर्ड आउटपुट) पर लिखा जाएगा। नीचे उदाहरण दिया गया है (सर्वोत्तम परिणामों के लिए, stdout को एक json फ़ाइल में भेजें और ऑफ़लाइन समीक्षा/पोस्ट प्रोसेस करें):
Linux: ./wsa -dir /opt/www
Windows: wsa.exe -dir C:\Windows\Inetput\wwwroot
### STDOUT और पूर्ण वेब शेल फ़ाइल एन्कोडेड और संपीड़ित के साथ:
Linux: ./wsa -dir /opt/www -raw_contents=true > scan_results.json
एक बार विश्लेषक समाप्त हो जाने पर, यह समग्र स्कैन मेट्रिक्स को STDOUT पर आउटपुट करेगा, जैसा कि नीचे दिए गए उदाहरण में दिखाया गया है:
{"scanned":311,"matches":122,"noMatches":189,"directory":"/webshell-master/php","scanDuration":1.4757737378333333,"systemInfo":{"hostname":"Beast","envVars":[""],"username":"beastmode","userID":"501","realName":"The Beast","userHomeDir":"/Users/beastmode"}}