WSC रिवर्स इंजीनियरिंग ने मेरी छुट्टी कैसे खराब कर दी
(blog.es3n1n.eu)- सियोल यात्रा के दौरान बनाया गया defendnot एक ऐसा टूल था जो Windows Security Center (WSC) service API को सीधे कॉल करके Windows Defender को disable करने की कोशिश करता था, और यह कई दिनों की reverse engineering में बदल गया
- पिछला टूल no-defender मौजूदा antivirus code का उपयोग करके WSC में यह register कराता था कि कोई दूसरा antivirus मौजूद है, और लगभग 1.5k GitHub stars पाने के बाद antivirus vendor के DMCA अनुरोध पर हटा दिया गया
- शुरुआत में WSC की COM API calls को लगभग 1 घंटे में reproduce कर लिया गया, लेकिन WSC calling process को verify करता था, इसलिए सामान्य process से access denied मिला
- analysis में पता चला कि WSC WinDefend SID, admin privileges, signature, और PE के
DllCharacteristicsमेंForceIntegrityflag की जांच करता है, और अंतिम implementation मेंTaskmgr.exeइस्तेमाल किया गया - arm64 MacBook, अमेरिका में remote PC, Parsec की 210ms latency, और Shadow.tech VM जैसे उलझे हुए environment में
ctx.binpath error और autorun power condition की समस्या ठीक करके implementation पूरा किया गया
defendnot बनाने की पृष्ठभूमि
- defendnot एक ऐसा टूल है जो Windows Security Center service API का सीधे उपयोग करके Windows Defender को disable करता है
- implementation की असली चुनौती WSC call खुद नहीं थी, बल्कि उसे रोकने वाली verification conditions और असुविधाजनक work environment को एक-एक करके bypass करना था
- WSC की अधिक तकनीकी documentation बाद में कोई और प्रकाशित करेगा
1 साल पहले no-defender और DMCA
- लगभग 1 साल पहले जारी किया गया no-defender Windows Defender को बंद करने के लिए antivirus के लिए बने Windows API का उपयोग करता था
- इस API का मकसद system को यह बताना था कि “दूसरा antivirus मौजूद है, इसलिए Defender scan चलाने की ज़रूरत नहीं है”
- इस हिस्से को संभालने वाला system component Windows Security Center(WSC) है
- no-defender मौजूदा antivirus के third-party code का उपयोग करके उस antivirus को WSC में register होने के लिए मजबूर करता था
- रिलीज़ के कुछ ही हफ्तों में इसे लगभग 1.5k stars मिले, और इस्तेमाल किए गए antivirus vendor ने DMCA takedown अनुरोध भेजा तो repository की सामग्री हटाकर बात वहीं खत्म कर दी गई
सियोल यात्रा के दौरान फिर शुरू हुआ WSC analysis
- सियोल के Airbnb में ठहरने के दौरान MrBruh ने no-defender को देखते हुए संदेश भेजा कि वह यह जांच रहा है कि क्या antivirus binary के बिना “clean” implementation संभव है
- आम तौर पर CTF या x86 reversing के लिए अलग x86 laptop साथ लाया जाता था, लेकिन इस यात्रा में सिर्फ M4Pro MacBook था
- x86 reversing hardware न होने जैसी प्रतिकूल स्थिति में भी, दोस्तों के उठने से पहले के समय का उपयोग करके WSC analysis शुरू किया गया
Day 1: WSC COM API reproduce करना और पहली access denial
- MrBruh ने नवीनतम WSC binaries दीं, और पहले इस्तेमाल किए गए antivirus के WSC registration implementation को reference बनाया गया
- WSC में antivirus vendors के लिए इस्तेमाल होने वाली COM API है, और मौजूदा antivirus जैसी calls को लगभग 1 घंटे में reproduce कर लिया गया
- Parallels में arm64 Windows boot करके test किया गया, लेकिन नतीजा access denied था
- पिछले अनुभव से पता था कि WSC API call करने वाले process को verify करता है, और शुरुआत में signature verification पर शक हुआ
- जब मौजूदा antivirus द्वारा WSC काम के लिए इस्तेमाल किए जाने वाले process में code inject किया गया, तो नए antivirus registration और status update COM calls सही से काम करने लगे
antivirus binary हटाने की कोशिश
- ताकि नया project फिर से पुराने antivirus vendor की आपत्ति का शिकार न हो, antivirus binary की जगह system-provided binary इस्तेमाल करने की कोशिश की गई
- पहले target process के रूप में
cmd.exeचुना गया, लेकिन WSC API calls फिर भी reject हो गईं wscsvc.dllदेखने पर ऐसा code मिला जो calling process के PPL होने की जांच करता था- साधारण
CreateProcessAसे बना process PPL protected process नहीं था, और उस रात तड़के इससे आगे प्रगति नहीं हो सकी
Day 2: असुविधाजनक remote debugging environment बनाना
- arm64 MacBook पर x86 Windows को ठीक से संभालना मुश्किल था, और arm64 environment में काम करने या x64dbg न इस्तेमाल कर पाने वाली स्थिति से बचना था
- दोस्त pindos ने PC access दिया, और Parsec से remote connection किया गया
- कोरिया से अमेरिका में मौजूद PC से जुड़ने के कारण औसत latency लगभग 210ms थी
- उस समय workflow बहुत झंझट भरा था
- Parallels के Windows arm64 में MSVC से modules build करना
- shared folder से build outputs host के साथ share करना
- AnyDesk से outputs को pindos के PC पर चल रहे VM में copy करना
- Parsec की 210ms latency में WSC service debug करना
- environment इतना असुविधाजनक था कि development और analysis की गति काफी धीमी हो गई
WSC service debugging और WinDefend SID
- WSC service,
svchostद्वारा चलाया जाने वाला DLL है, और debugger attach होने से रोकने वाला मुख्य तत्व PPL protection था - VM में test mode चालू किया गया, और kernel mode में कुछ lines के code वाले driver से target process का PPL हटाया गया
- जब
cmd.exeWSC से antivirus registration मांगता था, तो failure pointWscServiceUtils::CreateExternalBaseFromCallerथा - यह function RPC client का impersonation करने के बाद calling process token में
WinDefendSID होने की जांच करता था - उस समय Windows token behavior की समझ कम थी, इसलिए लगा कि
WinDefendका impersonation करने से check pass हो जाएगा - नींद की कमी की हालत में यह भी गलत समझ लिया गया कि मौजूदा antivirus binary भी इस
IsMembercheck को pass करती है
WinDefend impersonation की कोशिश और विफलता
- Windows tokens के बारे में कुछ घंटे सीखने के बाद, ऐसा implementation बनाया गया जिसमें WinDefend SID वाले token के साथ चलने पर WSC check pass हो जाए
cmdपरWinDefendSID जोड़कर code चलाया गया, लेकिन COM callSTATUS_SUCCESSलौटाने के बावजूद असली नए antivirus registration नहीं हुआ- यह तरीका आखिरकार बेकार साबित हुआ, और अगले दिन फिर से verification करनी पड़ी
Day 3: असली verification algorithm का पुनर्निर्माण
- दोबारा जांच करने पर पता चला कि मौजूदा antivirus binary WinDefend SID check pass नहीं करती थी
- उस check को pass करने पर Windows Defender के WSC object तक पहुंच मिलती थी, लेकिन सिर्फ WSC call से Defender को तुरंत disable नहीं किया जा सकता था, इसलिए इसका कोई उपयोग नहीं था
- WinDefend impersonation code हटाकर conditional की दूसरी branch का analysis किया गया
- उस branch में calling binary के लिए यह जांचा जाता था
- process elevated है या नहीं
- binary signature valid है या नहीं
- PE के
DllCharacteristicsमें कोई specific flag है या नहीं
CSecurityVerificationManager::CreateExternalBaseFromPESettingsमें जांचा जाने वालाDllCharacteristicsflag ForceIntegrity था- WSC द्वारा किए जाने वाले binary checks को reproduce करने वाला code defendnot repository के
wsc-binary-checkfolder में बनाया गया, और इसे System32 binaries पर test किया गया
Taskmgr.exe का उपयोग और ctx.bin bug
- दोस्त को फिर से PC इस्तेमाल करना था, इसलिए VM में सीधे Parsec से connect किया गया, लेकिन software encoding जुड़ने से environment और भी धीमा हो गया
cmd.exeकी जगहTaskmgr.exeइस्तेमाल किया गया, लेकिन फिर भी RPC error आया- latency और input समस्याओं के कारण उसी VM में debugging मुश्किल हो गई, और सिफारिश पर shadow.tech subscription के लिए $30 चुकाए गए
- Shadow.tech VM में Windows version पुराना था, इसलिए
wscsvccode नवीनतम version की तरह एक function में बहुत ज़्यादा inline नहीं था, और decompilation भी पढ़ने में आसान थी - असली error का कारण WSC को दिया गया AV name गलत होना था
defendnot-loaderसेdefendnot.dllतक data भेजने के लिए serialized parameters वालेctx.binका उपयोग किया जाता था- status tracking के लिए IPC अलग से लागू किया गया था, लेकिन settings pass करने में पुराने no-defender code का
ctx.binतरीका बचा रह गया था ctx.binpath खोजने वाला functionnodefend.dllनहीं, बल्किTaskmgr.exemodule के base folder को आधार बना रहा था- नतीजतन AV name के रूप में null byte pass हुआ, और WSC ने उस buffer को reject कर दिया
- path समस्या ठीक करने के बाद test सफल रहा
code cleanup और autorun समस्या
- उसी दिन काम खत्म करने के लिए सुबह 8 बजे तक code cleanup और अतिरिक्त features पर काम किया गया
- अतिरिक्त features में खुद को autorun में जोड़ने की सुविधा भी शामिल थी
- सुबह 8 बजे तक सिर्फ autorun सही से काम नहीं कर रहा था, और कई तरीके आज़माने के बाद असफल होकर सो गए
- अगले दिन दोबारा देखने पर पता चला कि task scheduler task बनाते समय power से जुड़े दो checkboxes इसकी वजह थे
- laptop AC power से connected नहीं था, इसलिए task run नहीं हुआ, और वे flags हटाते ही autorun काम करने लगा
- इसके बाद कुछ और घंटे code साफ़ किया गया और काम पूरा किया गया
समापन
- काम खुद में मजेदार था, लेकिन कई दिनों तक दोहराई गई environment समस्याएँ और remote debugging workflow ऐसा अनुभव था जिसे दोबारा नहीं झेलना चाहेंगे
- खास तौर पर arm64 MacBook, remote x86 VM, high latency, slow encoding, और बाद में सामने आया file path bug ने implementation की कठिनाई बहुत बढ़ा दी
- WSC पर अधिक तकनीकी documentation बाद में अलग से प्रकाशित की जाएगी
1 टिप्पणियां
Hacker News की टिप्पणियां
Defender को बंद करने का सबसे invasive लेकिन असरदार तरीका था live Linux USB से boot करके
C:\ProgramData\Microsoft\Windows Defenderका नाम बदलना, और फिर उसी जगह एक खाली file बना देनासंदर्भ के लिए, WSC का मतलब Windows Security Center है
the antivirus I was usingवाली अभिव्यक्ति से काफी confusion हुआ। समझ नहीं आया कि उस antivirus company के पास लेखक को DMCA takedown request भेजने की क्या वजह होगीशायद मतलब यह है कि लेखक ने किसी दूसरे antivirus को reverse engineer करके उसका कुछ हिस्सा open-source project में डाल दिया। लेकिन
Impersonating WinDefendजैसे title भी दिख रहे थे, इसलिए अंत में यह जानने की उत्सुकता है कि क्या लेखक ने किसी तरह copyright law तोड़ा थाउद्धृत paragraph से ठीक पहले लिखा है कि “project ने पहले से मौजूद antivirus का third-party code इस्तेमाल किया, और उस antivirus को WSC में antivirus के रूप में register होने के लिए force किया”
यह code cursed-सा लगता है:
https://github.com/es3n1n/defendnot/blob/master/defendnot-lo...
अगर सच में जानना है कि क्या हो रहा है, तो यहां देखें:
https://github.com/es3n1n/defendnot/blob/master/cxx-shared/s...
उदाहरण के लिए D language में scope के अंत में execute होने वाले statement का concept language में built-in है
संक्षेप में, यह AI ने नहीं लिखा है। यह code function call को तब तक defer करता है जब तक object scope से बाहर नहीं निकलता। implementation में C macros का इस्तेमाल करके आवश्यक C lambda/anonymous function definition के कुछ हिस्सों को छोड़ने वाला छोटा syntax बनाया गया है, और deferred call को manage करने के लिए unique variable name generate किया गया है
लेकिन resulting syntax C macros के लिए आम convention यानी uppercase notation से बचता है, और पहली नजर में object pointer के function call जैसा दिखता है। अगर आप इस pattern से परिचित नहीं हैं या उम्मीद करते हैं कि macro अलग तरह से दिखेगा, तो यह confusing हो सकता है
कुछ लोगों के लिए यह इतना common और useful है कि खास contexts में इसे लगभग idiom माना जा सकता है। technical explanation के लिए https://news.ycombinator.com/item?id=43959403#43960905 macro के काम को अच्छी तरह समझाता है
छुट्टी के दौरान Windows के virtual desktops को reverse engineer किया और छुट्टी बहुत बेहतर हो गई। पिछले साल की सबसे अच्छी memory यह महसूस करना था कि reverse engineering सच में मजेदार है
कई interesting चीजें भी सीखीं; Windows के RPC के नीचे एक undocumented messaging layer है: https://csandker.io/2022/05/24/Offensive-Windows-IPC-3-ALPC....
अगर profile picture anime character हो, तो हर बार पता चल जाता है कि post अच्छी होगी। बाद में जब किसी खराब Windows environment में लौटना पड़े, उसके लिए save कर लिया
जिन्हें जानना है: WSC का मतलब Windows Security Center है। मुझे भी search करना पड़ा था
कोई WSC बंद क्यों करना चाहेगा?
अगर आप EDR vendor हैं, तो यह Windows Firewall को suppress या disable करने के लिए इस्तेमाल की जा सकने वाली obfuscated API call है। उदाहरण के लिए, मेरा मानना है कि CrowdStrike Windows Firewall इस्तेमाल कर सकता है या अपना implementation—दोनों possible हैं
netcat.exeचलाने से मना करके nanny की तरह दखल दे, यह मुझे मंजूर नहींहाल ही में https://nostarch.com/windows-security-internals पढ़ी, और इस post की वजह से वह बात काफी ज्यादा समझ आई
Windows में ऐसी backend चीजें मोटे तौर पर कैसे चलती हैं, यह थोड़ा जानता था, लेकिन timing अच्छी थी। उस book का last chapter भी, इस post के लेखक ने जैसे cover किया है, tokens और SID में काफी detail से जाता है