"सीक्रेट" DPAPI या DPAPI पेंटेस्टर्स के लिए

OFFZONE-2018 में हमारी टीम के प्रदर्शन के परिणामों पर आधारित दूसरा लेख। इस बार, मेनट्रैक "विंडोज डीपीएपीआई" सेक्रेटिकी "या पेंटेस्टर्स के लिए डीपीएपीआई के साथ एक चर्चा पर विचार करें।"

चेतावनी! बहुत सारे मधुमक्खी!

RedTeam अभियानों का संचालन करते समय, मैं BlueTeam की प्रतिक्रिया के लिए कम कारण देना चाहता हूं, लेकिन कई हो सकते हैं। उदाहरण के लिए, उपयोगकर्ता पासवर्ड या प्रमाणपत्र प्राप्त करने के लिए mimikatz चलाना। यहां तक ​​कि अगर हम Kaspersky से उसे "ओटमाज़्वेट" करने में सक्षम थे, तो ब्लूटेम में Sysmon, Microsoft ATA आदि जैसे विशेष उपकरणों का उपयोग करके ट्रैक करने की क्षमता है। उसी समय, मैं एक समझौता उपयोगकर्ता मशीन से अधिकतम जानकारी प्राप्त करना चाहूंगा। RedTeam द्वारा वास्तविक ब्लूटेम टीमों का मुकाबला करने के लिए बार-बार किए गए अभियानों के दौरान, हम इस निष्कर्ष पर पहुंचे कि उन कार्यों से बचना आवश्यक है जो सिस्टम समझौता के संकेतक के रूप में काम कर सकते हैं। उपयोगकर्ता के लिए ऑपरेटिंग सिस्टम द्वारा प्रदान किए गए कानूनी तंत्र और कार्यों के उपयोग के माध्यम से यह लक्ष्य प्राप्त करना संभव है।

ऐसे कानूनी उपकरणों में से एक डीपीएपीआई (विंडोज डेटा प्रोटेक्शन एपीआई) तंत्र है, जिसका उपयोग संवेदनशील उपयोगकर्ता डेटा (मुख्य रूप से पासवर्ड, क्रिप्टोग्राफ़िक कुंजियाँ, आदि) को एन्क्रिप्ट करने के लिए ऑपरेटिंग सिस्टम और विभिन्न अनुप्रयोगों द्वारा किया जाता है। डीपीएपीआई बहुत ही सरल है। : केवल 2 कार्य हैं - "डेटा एन्क्रिप्ट करें" और "डिक्रिप्ट डेटा"। इस लेख में मैं इस बात पर विचार करना चाहूंगा कि RedTeam अभियानों के दौरान इस तरह का एक तंत्र पंचकों के लिए कैसे उपयोगी है।

DPAPI क्या है? केवल संक्षेप में और रूसी में


2000 के बाद से, सभी विंडोज ओएस ने उपयोगकर्ता डेटा को सुरक्षित रखने के लिए DPAPI इंजन का उपयोग करना शुरू कर दिया है।

यदि हम DPAPI के माध्यम से एन्क्रिप्ट किए गए डेटा को डिक्रिप्ट करने के लिए हमने रिपोर्ट में जांच की गई सभी क्रिप्टोग्राफ़ी को छोड़ देते हैं, तो हमें इसकी आवश्यकता है: एक मास्टर कुंजी, एक उपयोगकर्ता SID, उपयोगकर्ता का पासवर्ड हैश, और DPAPI स्वयं (एन्क्रिप्टेड DPAPI डेटा)।

सामान्य तौर पर, प्रक्रिया इस तरह दिखती है:



हमारे "क्रिप्टोग्राफ़िक हैट" के अंदर कई अलग-अलग क्रिप्टोकरंसी हैं जिन्हें हम इस लेख में नहीं मानेंगे, ताकि पाठक को अधिभार न डालें। हम केवल ध्यान दें कि DPAPI का मुख्य भाग तथाकथित मास्टरकी (मास्टर कुंजी) है। सरल शब्दों में, मास्टर कुंजी, प्रीके का उपयोग करके एन्क्रिप्ट किए गए यादृच्छिक डेटा का 64 बाइट है, जो उपयोगकर्ता के पासवर्ड और उसके SID से उत्पन्न होता है।


अतिरिक्त पैरामीटर प्रीकी पीढ़ी में भी भाग लेते हैं: पुनरावृत्तियों (IterN), नमक और HMAC की संख्या, जो एक मामले में अलग-अलग हो सकती है। इन मापदंडों के मूल्यों को एक फ़ाइल में मास्टर कुंजी के साथ संग्रहीत किया जाता है।

इस प्रकार, उपयोगकर्ता के पासवर्ड, उसके SID को जानने और मास्टर कुंजी फ़ाइल (HMAC, Salt, InterN) से पीढ़ी के मापदंडों को पढ़ने के बाद, हम एक प्रीकी उत्पन्न कर सकते हैं और मास्टर कुंजी को डिक्रिप्ट कर सकते हैं, अर्थात। बहुत बेतरतीब 64 बाइट्स प्राप्त करें, जिनका उपयोग हम डीपीएपीआई ब्लॉब्स को डिक्रिप्ट करने के लिए करेंगे।

यदि मैं अपना पासवर्ड बदलूं तो क्या होगा?


आमतौर पर, उपयोगकर्ता पासवर्ड नियमित अंतराल पर बदलते रहते हैं। यदि उपयोगकर्ता पासवर्ड बदलता है तो क्या होगा? पिछला कहां गया? दरअसल, मास्टर कुंजी को डिक्रिप्ट करने के लिए, आपको उपयोगकर्ता का पासवर्ड जानना होगा, और हर बार सभी मास्टर मास्टर कुंजी को फिर से क्रिप्टोकरंट करना बहुत महंगा होगा। इस मामले में, विंडोज में सब कुछ सोचा गया है।

एक विशेष फ़ाइल (CREDHIST) है, जिसका कार्य पिछले सभी उपयोगकर्ता पासवर्ड को संग्रहीत करना है। इसे उपयोगकर्ता के वर्तमान पासवर्ड के साथ एन्क्रिप्ट किया गया है और स्टैक पर संग्रहीत किया गया है। यदि सिस्टम अचानक मास्टर कुंजी को डिक्रिप्ट करने में विफल रहता है, तो यह निम्नानुसार आगे बढ़ता है: वर्तमान पासवर्ड का उपयोग करते हुए, यह CREDHIST में पहले रिकॉर्ड को डिक्रिप्ट करता है। पासवर्ड मास्टर कुंजी को फिर से डिक्रिप्ट करने की कोशिश कर रहा है, और इसी तरह जब तक चेन में मौजूद पासवर्ड बाहर नहीं निकलते या मास्टर कुंजी को डिक्रिप्ट नहीं किया जाता है।

एक डोमेन नियंत्रक की निजी कुंजी के बारे में थोड़ा


जैसा कि आपने अनुमान लगाया होगा, DPAPI डोमेन उपयोगकर्ताओं सहित सभी उपयोगकर्ताओं पर लागू होता है। किसी ऐसे उपयोगकर्ता को पासवर्ड रीसेट करने में सक्षम होने के लिए जो कुछ शुक्रवार की रात की पार्टी के बाद इसे सफलतापूर्वक भूल गया है, आपको एक अतिरिक्त कुंजी की आवश्यकता है जिसे एक सुरक्षित स्थान पर संग्रहीत किया जाएगा। Microsoft के अनुसार, ऐसा विश्वसनीय स्थान एक डोमेन नियंत्रक है।

उपयोगकर्ता पासवर्ड रीसेट करने के बाद मास्टर कुंजी को डिक्रिप्ट करने के लिए तंत्र का सार इस प्रकार है: आरएसए कुंजी की एक जोड़ी - निजी और सार्वजनिक - डोमेन नियंत्रक पर बनाई गई है। निजी कुंजी को NTDS डेटाबेस में डोमेन नियंत्रक पर संग्रहीत किया जाता है और इसे BCKUPKEY_xxxx कहा जाता है (नीचे दिया गया आंकड़ा देखें), और सार्वजनिक कुंजी को सभी डोमेन सिस्टम में वितरित किया जाता है और इसे उत्पन्न होने पर मास्टर कुंजी की डुप्लिकेट बनाने के लिए उपयोग किया जाता है।

डोमेन मशीन पर एक मास्टर कुंजी बनाने के बाद, इसकी डुप्लिकेट भी बनाई जाती है (या बल्कि, मास्टर कुंजी सामग्री इसकी 64 बाइट्स है), जिसे एक फाइल में मुख्य मास्टर कुंजी के साथ संग्रहीत किया जाता है और इसे डोमेन कुंजी कहा जाता है। यदि आप मुख्य मास्टर कुंजी खो देते हैं, अर्थात। उपयोगकर्ता के पासवर्ड को रीसेट करते समय, सिस्टम डोमेन नियंत्रक को इसकी एक डुप्लिकेट भेजता है और इसे डिक्रिप्ट करने के लिए कहता है। नियंत्रक, उपयोगकर्ता को अधिकृत करता है, डुप्लिकेट को डिक्रिप्ट करता है और इसे सिस्टम में लौटाता है, जिसके बाद मास्टर कुंजी सामग्री पहले से ही नए पासवर्ड के साथ फिर से एन्क्रिप्ट की जाती है।



डोमेन में उपयुक्त विशेषाधिकार (सबसे अधिक बार व्यवस्थापक) होने पर, आप इन निजी RSA कुंजियों को डोमेन नियंत्रक से प्रतिकृति तंत्र के माध्यम से प्राप्त कर सकते हैं और डोमेन मशीनों पर बनाए गए मास्टर कुंजी के आगे डिक्रिप्शन के लिए उनका उपयोग कर सकते हैं। यह mimikatz या DSInternals का उपयोग करके किया जा सकता है। आप इसके बारे में mimikatz wiki या DSInternals ब्लॉग में पढ़ सकते हैं।

मास्टर कुंजी कहाँ संग्रहीत हैं और वे क्या हैं?


मास्टर कुंजी उपयोगकर्ता और प्रणाली हो सकती है, जो इस बात पर निर्भर करती है कि किसके रहस्यों को एन्क्रिप्ट किया गया है। उपयोगकर्ता मास्टर कुंजी को उपयोगकर्ता प्रोफ़ाइल में निम्नलिखित तरीके से संग्रहीत किया जाता है:

Users\%USER%\AppData\Roaming\Microsoft\Protect\%SID%\

बस मामले में, सिस्टम उपयोगकर्ता द्वारा उपयोग की जाने वाली सभी मास्टर कुंजियों को संग्रहीत करता है। सब के बाद, वह पहले से नहीं जानती है कि किस मास्टर को एक कुंजी के साथ कुछ डिक्रिप्ट करने की आवश्यकता होगी। उपयोग की गई वर्तमान कुंजी का GUID पसंदीदा फ़ाइल में संग्रहीत है।



सिस्टम मास्टर कुंजियाँ निम्नलिखित तरीके से संग्रहीत की जाती हैं:
windows\system32\Microsoft\Protect\S-1-5-18\

इसी तरह उपयोगकर्ता के साथ - एक मास्टर कुंजी का उपयोग किया जाता है, जिसका नाम Preferred फ़ाइल में पाया जा सकता है, जहां कभी उपयोग की गई सभी कुंजी संग्रहीत होती हैं।



खैर, यह डीपीएपीआई पेंटेस्टर को क्या दे सकता है?


चूंकि DPAPI एक कानूनी और सरल तंत्र है, इसलिए विभिन्न अनुप्रयोग इसका उपयोग करने का प्रयास करते हैं। क्योंकि यह सुविधाजनक और सुरक्षित है। समय के लिए, निश्चित रूप से।

उदाहरण के लिए, DPAPI का उपयोग क्लाइंट और सिस्टम प्रमाणपत्रों की निजी कुंजी, WIFI चाबियाँ, क्रोम (कुकीज़, पासवर्ड), ड्रॉपबॉक्स, स्काइप, RSA SecurID (एक सॉफ़्टवेयर एप्लिकेशन जो एक बार की चाबियाँ उत्पन्न करता है) को एन्क्रिप्ट करने के लिए किया जाता है। और यह किसी भी तरह से एक विस्तृत सूची नहीं है।

पेंटर का काम आवश्यक ब्लब्स को डिक्रिप्ट करना और पासवर्ड, कुकीज़ इत्यादि प्राप्त करना है।

ऐसा करने के कई तरीके हैं। एक तरह से या किसी अन्य, वे सभी दो टेपों को उबालते हैं - ऑनलाइन और ऑफलाइन। ऑनलाइन डिक्रिप्शन तब होता है जब उपयोगकर्ता की मशीन पर हम डेटा को डिक्रिप्ट करने के लिए सिस्टम फंक्शन्स को कॉल करते हैं और इनपुट में DPAPI बूँद को पास करते हैं, और सिस्टम स्वयं सब कुछ करता है - यह मास्टर कुंजी की खोज करता है जिसके साथ बूँद को एन्क्रिप्ट किया गया था, उपयोगकर्ता के SID का उपयोग करके इसे डिक्रिप्ट करता है और एक पासवर्ड हैश एलएसएएसएस मेमोरी में संग्रहीत है।

नीचे दिया गया आंकड़ा DPAPI को कॉल करने का एक उदाहरण दिखाता है, जो एन्क्रिप्शन और डिक्रिप्शन के लिए कार्य करता है।



सबसे पहले, हम अपने गुप्त (इस मामले में, शब्द "पासवर्ड") को एन्क्रिप्ट करते हैं, जिसे [Security.Cryptography.ProtectedData] :: Protect () फ़ंक्शन कहते हैं। और हम यह दो बार करते हैं - पहले मामले में उपयोगकर्ता की मास्टर कुंजी (पैरामीटर करंटियर) का उपयोग करके, और दूसरे में - सिस्टम मास्टर कुंजी (पैरामीटर लोकल माचाइन)। फिर हम उलटा फ़ंक्शन को कॉल करके परिणामी बूँद को डिक्रिप्ट कर सकते हैं - [Security.Cryptography.ProtectedData] :: UnProtect ()।

इसके अलावा, इस मामले में, CurrentUser या LocalMachine पैरामीटर का मान मायने नहीं रखता, क्योंकि सिस्टम खुद को बूँद को डिकोड करने के लिए उपयुक्त एक मास्टर कुंजी पाता है, और आवश्यक सब कुछ करता है। दोनों ही मामलों में, हमें अपना प्रारंभिक रहस्य मिलता है - शब्द "पासवर्ड" (इसके बाइट-बाय-बिट प्रतिनिधित्व)।

ऑनलाइन डिक्रिप्ट करते समय, यह समझना महत्वपूर्ण है कि आप किस संदर्भ में अनप्रोटेक्ट () फ़ंक्शन कह रहे हैं। डिक्रिप्शन सफल होने के लिए, आपको उपयोगकर्ता सत्र में होना चाहिए या नए सत्र के तहत लॉग इन करना होगा। बात पासवर्ड हैश की है, जो LSASS मेमोरी में संग्रहीत है। यदि आप उपयोगकर्ता के सत्र के बाहर कॉल करते हैं (उदाहरण के लिए, आपने सिस्टम में psexec या मीटरप्रेटर के माध्यम से लॉग इन किया है), तो आपके पास मास्टर कुंजी को डिक्रिप्ट करने के लिए आवश्यक पासवर्ड हैश नहीं है। वह निश्चित रूप से, अगले सत्र में है, लेकिन LSASS आपको यह नहीं देगा, क्योंकि यह एक और सत्र है, हालांकि यह उसी उपयोगकर्ता के तहत बनाया गया था। सफल ऑनलाइन डिक्रिप्शन के लिए, आपको या तो GUI के माध्यम से लॉग इन उपयोगकर्ता द्वारा शुरू की गई किसी भी प्रक्रिया में माइग्रेट करना होगा, या सिस्टम में पूरी तरह से लॉग इन करना होगा, उदाहरण के लिए, RDP के माध्यम से।

डीपीएपीआई ब्लॉब्स के ऑनलाइन डिक्रिप्शन के लिए पॉवरशेल का विकल्प mimiktaz के लिए कॉल हो सकता है: / असुरक्षित पैरामीटर के साथ ब्लॉब। इनपुट पर, उसे DPAPI बूँद के साथ एक बाइनरी फ़ाइल दी जाती है, और आउटपुट पर हमें डिक्रिप्टेड डेटा मिलता है। Mimikatz का उपयोग करने वाले अधिक मामलों का वर्णन हार्मजे0 के ब्लॉग पर किया गया है

क्यू बॉल गिर गई। विद्याही के साथ मेरे खेत का क्या करें?


इस तथ्य के कारण कि DPAPI मास्टर कुंजी को उपयोगकर्ता के पासवर्ड पर एन्क्रिप्ट किया गया है, आप रिवर्स प्रक्रिया की कोशिश कर सकते हैं - अपने मास्टर कुंजी द्वारा उपयोगकर्ता के पासवर्ड को बाध्य करें। उदाहरण के लिए, हमें भेजे गए डॉक्स फ़ाइल से हमारे मैक्रो या डीडीई से एक रिवर्स कनेक्शन प्राप्त हुआ। हम उपयोगकर्ता की मास्टर कुंजी ले सकते हैं और विशेषाधिकारों और mimikatz लॉन्च के बिना उपयोगकर्ता के पासवर्ड को पुनर्स्थापित कर सकते हैं।

क्या मैं पासवर्ड ब्रूटफोर्स के लिए Hashcat या JohnTheRipper का उपयोग कर सकता हूं? लेकिन इससे पहले, आपको जॉन की रचना से उपयुक्त स्क्रिप्ट के साथ जानवर बल के लिए पैरामीटर प्राप्त करने की आवश्यकता है:

 ./DPAPImk2john.py –S <sid> -mk <masterkey> -c <domain|local> 

तब हम पहले से ही वीडियो कार्ड के साथ स्क्रिप्ट का परिणाम अपने खेत में भेज सकते हैं और आशा करते हैं कि उपयोगकर्ता के पास एक कमजोर पासवर्ड है, क्योंकि मास्टर कुंजी ब्रूट बल गति लगभग WPA2 गणना गति के बराबर है, अर्थात धीरे धीरे।

यहां यह ध्यान देने योग्य है कि जब डोमेन विंडोज 10 पर मास्टर कुंजी उत्पन्न होती है, तो प्रीके जनरेशन में PBKDF2 एल्गोरिथ्म के एक और 10,000 राउंड जोड़े जाते हैं। लेकिन इससे भी बदतर, न तो हास्कैट और न ही जॉनरिपर को इस बारे में पता है (कम से कम इस लेखन के समय), जिसका अर्थ है कि वे इस तरह के मास्टर कुंजी से पासवर्ड को हटाने में सक्षम नहीं होंगे।

"जो बुरा है, उसे दूर करने के लिए और फिर उसका पता लगाने के लिए ..."


जैसा कि हमने पहले उल्लेख किया है, उपयोगकर्ता की मशीन पर संदिग्ध कार्यों का निष्पादन Blueteam टीम से अतिरिक्त ब्याज को उत्तेजित कर सकता है, और यह, तदनुसार, इस तथ्य से भरा हुआ है कि RedTeam के सभी वहाँ समाप्त हो जाएंगे। एक उदाहरण एक एकाउंटेंट या सचिव के कंप्यूटर पर शक्तियों के प्रक्षेपण का है, जिसके बाद घटना की जांच की जाती है। अनावश्यक संदेह पैदा न करने के लिए, डीपीएपीआई ब्लॉब्स को डीकोड करने के लिए ऑफ़लाइन तरीकों का उपयोग करना बेहतर है। ऐसा करने के लिए, आपको सबसे पहले मशीन से अपनी जरूरत का हर सामान लेना होगा, अर्थात्:

  • उपयोगकर्ता मास्टर कुंजी
  • सिस्टम मास्टर कुंजी
  • CREDHIST फ़ाइल (यदि यह एक डोमेन मशीन नहीं है);
  • उपयोगकर्ता पासवर्ड (या उसके sha1 / ntlm हैश);
  • उपयोगकर्ता का एसआईडी;
  • DPAPI से लगता है कि हम डिक्रिप्ट करना चाहते हैं।

ऑफ़लाइन मोड में डिक्रिप्शन के लिए, हम विशेष टूल के बिना नहीं कर सकते। ऐसे उपकरण हो सकते हैं:

  • Mimikatz;
  • इम्पेकेट (18 वें संस्करण के साथ शुरू, इसकी डीपीएपीआई कार्यक्षमता है);
  • Dpapick ढांचा।

यह dpapick ढांचे के बारे में है जिसके बारे में हम अधिक विस्तार से बात करेंगे।

अजगर डाप्पिक ढांचा 2014 में शोधकर्ता जीन-मिशेल पिककोड द्वारा बनाया गया था और यह पायथन क्रिप्टो लाइब्रेरी पर DPAPI तंत्र का कार्यान्वयन है। अजगर का उपयोग, साथ ही साथ ढांचे की संरचना, इसे आसानी से विभिन्न DPAPI तंत्र के अनुकूल होने की अनुमति देता है। अपने मूल संस्करण में, dpapick मास्टर कुंजी को डिक्रिप्ट करने के लिए डोमेन बैकअप कुंजी का उपयोग करने में सक्षम नहीं था, और इसमें डोमेन मशीन मोड में विंडोज 10 पर बनाई गई मास्टर कुंजी को डिक्रिप्ट करने के लिए तंत्र का अभाव था।

इन कमियों को ठीक करने और DPAPI को डिक्रिप्ट करने के लिए कार्यक्षमता का विस्तार करने के बाद, dpapick DPAPI के ऑफ़लाइन डिकोडिंग के लिए एक बहुत अच्छा उपकरण बन गया। नीचे, उदाहरण के रूप में, हम DPAPI के माध्यम से एन्क्रिप्ट किए गए उपयोगकर्ता डेटा को डिक्रिप्ट करने के लिए इस ढांचे का उपयोग करने के लिए विकल्प दिखाएंगे।

क्रोम - कुकीज़ और पासवर्ड ले और डिक्रिप्ट


क्रोम %localappdata%\Google\Chrome\User Data\Default\Cookies फ़ाइल %localappdata%\Google\Chrome\User Data\Default\Cookies में संग्रहीत की जाती हैं
लॉगिन डेटा फ़ाइल %localappdata%\Google\Chrome\User Data\Default\Login Data

दोनों फाइलें sqlite3 डेटाबेस हैं जिसमें संवेदनशील डेटा DPAPI के रूप में संग्रहीत किया जाता है। Dpapick के एक हिस्से के रूप में इस डेटा (उदाहरण / chrome.py) के लिए एक तैयार किए गए विच्छेदक (पार्सर) है। सफल डिक्रिप्शन के लिए, उन्हें मास्टर कुंजियों के साथ डायरेक्टरी, उपयोगकर्ता के पैर, उनके पासवर्ड या डोमेन नियंत्रक की निजी कुंजी का स्थान, साथ ही क्रोम (कुकी या लॉगिन डेटा) से sqlite3 फ़ाइल को निर्दिष्ट करना होगा।

उपयोगकर्ता पासवर्ड के साथ क्रोम कुकी की ऑफ़लाइन डिक्रिप्शन

 ./chrome.py --cookie <cookiefile> --sid <SID> --password <..> --masterkey <masterkeydir> 

उपयोगकर्ता के पासवर्ड से हैश का उपयोग करके क्रोम कुकी का ऑफ़लाइन डिक्रिप्शन

 ./chrome.py --cookie <cookiefile> --sid <SID> --hash <..> --masterkey <masterkeydir> 

किसी डोमेन नियंत्रक से निजी कुंजी का उपयोग करके क्रोम पासवर्ड का ऑफ़लाइन डिक्रिप्शन

 ./chrome.py --chrome <login file> --pkey <rsa-priv.pem> --masterkey <masterkeydir> 

ग्राहक प्रमाणपत्र के लिए DPAPI


क्लाइंट सर्टिफिकेट का उपयोग बहुत से स्थानों पर किया जाता है - ओटीपी, ईएफएस या वीपीएन, वेब एप्लिकेशन आदि में प्रमाणीकरण के लिए।

सार्वजनिक कुंजी प्रमाणपत्र स्वयं उपयोगकर्ता प्रोफ़ाइल में संग्रहीत हैं:
%APPDATA%\Microsoft\SystemCertificates\My\Certificates\
और निजी कुंजियाँ, जिनकी सहायता से हस्ताक्षर वास्तव में किए जाते हैं या अन्य क्रिप्टोग्राफ़िक संचालन DPAPI के माध्यम से एन्क्रिप्ट किए जाते हैं और पथ के साथ उपयोगकर्ता प्रोफ़ाइल में भी स्थित होते हैं:

 %APPDATA%\Roaming\Microsoft\Crypto\RSA\<SID>\ 

निजी प्रमाणपत्र कुंजियों को सफलतापूर्वक डिक्रिप्ट करने और फिर उपरोक्त फ़ाइलों के अलावा, पीएफएक्स फ़ाइलों को फिर से बनाने के लिए, हमें उपयोगकर्ता की मास्टर कुंजी, साथ ही उसकी एसआईडी और पासवर्ड (या नियंत्रक से एक निजी आरएसए कुंजी) की भी आवश्यकता है।

Dpapick और यूजर पासवर्ड का उपयोग करते हुए, हम इसे डिक्रिप्ट करते हैं:

 ./efs.py --certificates <cert dir> --rsakyes <RSA dir> --sid <..> --password <..> --masterkey <masterkeydir> 



स्क्रीनशॉट में वैकल्पिक rsaout पैरामीटर आपको PEM प्रारूप में अतिरिक्त रूप से RSA कुंजियों को निर्यात करने की अनुमति देता है। स्क्रिप्ट का परिणाम एक पासवर्ड के बिना एक पुनर्निर्मित पीएफएक्स फ़ाइल है, जिसे पहले से ही अपने आप को आयात किया जा सकता है और इसका उपयोग अपने इच्छित उद्देश्य के लिए किया जा सकता है। यदि उपरोक्त निर्देशिकाओं में कई प्रमाणपत्र और निजी कुंजी हैं, तो dpapick उनमें से प्रत्येक को डिक्रिप्ट करने और कई pxx फाइलें बनाने की कोशिश करेगा।

उचित पैरामीटर निर्दिष्ट करके मास्टर कुंजी को डिक्रिप्ट करने के लिए एक डोमेन निजी कुंजी का उपयोग करके समान कार्य किए जा सकते हैं:

 ./efs.py --certificates <cert dir> --rsakyes <RSA dir> --masterkey <masterkeydir> --pkey <domain bkp key> 

डोमेन के "चिप्स" के बारे में थोड़ा और


सक्रिय निर्देशिका डोमेन के बारे में बात करते हुए, यह क्रेडेंशियल रोमिंग के रूप में इस तरह की एक अद्भुत विशेषता का उल्लेख करने योग्य है - एक डोमेन फ़ंक्शन जब मास्टर कुंजी, एन्क्रिप्ट किए गए पासवर्ड और उपयोगकर्ता को सक्रिय निर्देशिका डोमेन में "यात्रा" के लिए प्रमाणपत्र। वे एक विशिष्ट मशीन से बंधे नहीं हैं और उस कंप्यूटर पर "पहुंचेंगे" जिस पर डोमेन उपयोगकर्ता लॉग इन करता है।

जब यह "सुविधा" चालू हो जाती है, तो उपयोगकर्ता द्वारा आयात किए जाने वाले सभी प्रमाणपत्र, साथ ही साथ उसकी सभी निजी कुंजी और पासवर्ड, AD में उड़ जाते हैं और संबंधित खाता विशेषताओं में संग्रहीत किए जाते हैं: msPKIAccountCrdentailas और msPKIDIDAPIMasterKeys।

आप देख सकते हैं कि यह AD के अंदर कैसा दिखता है, उदाहरण के लिए, ldapsearch के माध्यम से:

 ldapsearch -x -h dc1.lab.local -D “user1@lab.local" -s sub "samAccountname=user1" ldapsearch -x -h dc1.lab.local -D "admin@lab.local" -s sub "samAccountname=anyuser" 



डिफ़ॉल्ट रूप से, एक उपयोगकर्ता केवल अपने खाते के लिए DPAPI विशेषताएँ प्राप्त कर सकता है। लेकिन उन्नत विशेषाधिकारों के साथ, यह किसी भी खाते के लिए किया जा सकता है, जिसमें कंप्यूटर खाता भी शामिल है।

क्रेडेंशियल रोमिंग एक बहुत ही सुविधाजनक तकनीक है जो न केवल एडमिट के लिए है, बल्कि पेंटेस्टर्स के लिए भी है। डोमेन नियंत्रक को ldap के माध्यम से एक्सेस करने के बाद, आप DPAPI (उदाहरण के लिए, नेटवर्क ड्राइव से कनेक्ट करने के लिए पासवर्ड) के माध्यम से एन्क्रिप्ट किए गए सभी उपयोगकर्ता प्रमाणपत्र, उसके मास्टर कुंजी और पासवर्ड को मर्ज कर सकते हैं।

और dpapick में ऐसी कार्यक्षमता क्यों नहीं जोड़ते हैं, हमने सोचा - और उसे सिखाया कि कैसे स्वचालित रूप से ldap के माध्यम से एक डोमेन नियंत्रक से प्रमाण पत्र निकालें, उन्हें डिक्रिप्ट करें और pfx फ़ाइलों को उत्पन्न करें।

 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --password Password1 ./efs.py –ldap-server <..> --ldap-connect admin:Passw0rd@lab.local --ldap-user user1 --pkey <rsa-priv.pem> 



स्क्रिप्ट निष्पादित करने के लिए, डोमेन नियंत्रक को एक ldap सर्वर के रूप में निर्दिष्ट करना आवश्यक है, इसे कनेक्ट करने का विवरण, उस खाते का नाम जिसके लिए हमें प्रमाण पत्र प्राप्त होता है और मास्टर कुंजी (नियंत्रक की एक निजी बैकअप कुंजी) को डिक्रिप्ट करने के लिए एक पासवर्ड होता है।

ड्रॉपबॉक्स। 60 सेकंड में चला गया ...


ड्रॉपबॉक्स उपयोगकर्ता के रहस्यों को संग्रहीत करने के लिए DPAPI का उपयोग करने का एक और उदाहरण है। ड्रॉपबॉक्स के लिए प्राधिकरण टोकन फ़ाइलों में संग्रहीत हैं:

 c:\users\<username>\Appdata\Local\Dropbox\instance1\config.dbx c:\users\<username>\Appdata\Local\Dropbox\instance_db\instanse.dbx 

ये कनेक्शन के लिए डेटा युक्त sqlite3 डेटाबेस एन्क्रिप्टेड हैं। एन्क्रिप्शन के लिए, एक सममित कुंजी का उपयोग किया जाता है, जो बदले में DPAPI के माध्यम से एन्क्रिप्ट किया जाता है और रजिस्ट्री में संग्रहीत किया जाता है:

HKCU\SOFTWARE\Dropbox\ks
HKCU\SOFTWARE\Dropbox\ks1


इस प्रकार, ड्रॉपबॉक्स अपहरण का सामान्य क्रम निम्नानुसार है:

  1. हम कंप्यूटर से दो डेटाबेस फाइलें लेते हैं;
  2. हमें रजिस्ट्री से चाबी मिलती है और dpapick का उपयोग करके उन्हें डिक्रिप्ट किया जाता है;
  3. DPAPI का उपयोग करते हुए, हम अपनी मशीन पर प्राप्त कुंजियों को एन्क्रिप्ट करते हैं और उन्हें रजिस्ट्री में डालते हैं;
  4. हमारी मशीन पर हम डेटाबेस फ़ाइलों को प्रतिस्थापित करते हैं और ड्रॉपबॉक्स चलाते हैं।

आपको पता होना चाहिए कि उपरोक्त रजिस्ट्री शाखाओं के लिए विशेष अनुमतियां निर्धारित हैं। उन्हें केवल उपयोगकर्ता द्वारा पढ़ा जा सकता है। न तो प्रशासक और न ही सिस्टम उन्हें पढ़ सकता है। इस प्रकार, यदि आप किसी अन्य उपयोगकर्ता (यहां तक ​​कि एक व्यवस्थापक) की ओर से रजिस्ट्री तक पहुंचते हैं, तो आपको पहले निर्दिष्ट रजिस्ट्री शाखाओं पर उपयुक्त अनुमतियों को सेट करना होगा। उदाहरण के लिए, ऐसा (पावरशेल):

 $Sid="S-1-5-21-3463664321-2923530833-3546627382-1000"; $key=[Microsoft.Win32.Registry]::USERS.OpenSubKey("$sid\SOFTWARE\Dropbox\ks",[Microsoft.Win32.RegistryKeyPermissionCheck]::ReadWriteSubTree,[System.Security.AccessControl.RegistryRights]::ChangePermissions); $acl = $key.GetAccessControl(); $rule = New-Object System.Security.AccessControl.RegistryAccessRule ("administrator","FullControl","Allow"); $acl.SetAccessRule($rule); $key.SetAccessControl($acl); $key_path = "REGISTRY::HKEY_USERS\$Sid\SOFTWARE\Dropbox\ks"; (Get-ItemProperty -Path $key_path -Name Client).Client; 

कुंजियाँ ks और ks1 में DPAPI बूँद और md5 HMAC DPAPI बूँद (अंतिम 16 बाइट्स) से पहले dbx संस्करण के हेडर (8 बाइट्स) होते हैं। DPAPI बूँद अपने आप 9 वीं बाइट 0x01000000D0 से शुरू होती है ... इन बाइट्स को बेस 64 फॉर्मेट में एक फाइल में कॉपी किया जाना चाहिए, जिसे बाद में dpapick के माध्यम से डिक्रिप्ट किया जाता है:

 ./filegeneric.py --sid <..> --password <..> --masterkey <..> --base64file <..> 

फिर, अपनी मशीन पर, आपको हमारी मास्टर-की के साथ अंतिम चरण में प्राप्त कुंजियों को एन्क्रिप्ट करना होगा और परिणाम को उपयुक्त रजिस्ट्री शाखाओं में डालना होगा।

एन्क्रिप्शन के लिए, पॉवरशेल का उपयोग करना सबसे सुविधाजनक है:

 $hdata="4efebbdf394d4003317fc5c357beac4b"; [Byte[]] $dv0_entropy = 0xd1,0x14,0xa5,0x52,0x12,0x65,0x5f,0x74,0xbd,0x77,0x2e,0x37,0xe6,0x4a,0xee,0x9b; $data = ($hdata -split "(?<=\G\w{2})(?=\w{2})" | %{ [Convert]::ToByte( $_, 16 ) }); Add-Type -AssemblyName System.Security; $dk1 = [system.security.cryptography.protecteddata]::Protect($data,$dv0_entropy,[System.Security.Cryptography.DataProtectionScope]::CurrentUser); $pr=([System.BitConverter]::ToString($dk1));$pr $OBJ_hmac = New-Object System.Security.Cryptography.HMACMD5 $hmac = $OBJ_hmac.ComputeHash($dk1) $pr=([System.BitConverter]::ToString($hmac));$pr 

इस स्थिति में, HData वह कुंजी है जो डिक्रिप्शन चरण में प्राप्त की गई थी। DV0_entropy डीपीएपीआई में डीबीओएक्स द्वारा उपयोग की जाने वाली एन्ट्रापी स्थिरांक है। परिणामी बूँद के लिए, आपको सामने से 8 बाइट हैडर 0x00000000F6000000, और HMACMD5 + 0x00 को पीछे से असाइन करना होगा
उसके बाद, आप उचित रजिस्ट्री कुंजियों को डेटा लिख ​​सकते हैं।

DPAPI और RSA SecurID


RSA SecurID एक क्लाइंट प्रोग्राम है जिसका उपयोग RSA द्वारा विकसित एक बार के पासवर्ड को जनरेट करने के लिए किया जाता है।

यह बड़ी कंपनियों के लिए काफी लोकप्रिय चीज है और केवल डीपीएपीआई का उपयोग करती है, केवल थोड़ी अधिक जटिल। इस मामले में, आरएसए इंजीनियरों ने भ्रमित होने का फैसला किया और अधिक जटिल DPAPI योजनाओं को लागू किया।

टोकन डेटा को फ़ाइल %LOCALAPPDATA%\RSA\SecurIDStorage में संग्रहीत किया जाता है, जो कि sqlite3 डेटाबेस है। प्रत्येक एन्क्रिप्ट किए गए टोकन में इसका एन्क्रिप्टेड EnTokenSid (कोड पीढ़ी एल्गोरिथ्म के प्रारंभिक आरंभ के लिए पैरामीटर) होता है। EnTokenSid DBKey, टोकन और उपयोगकर्ता SID के SID के आधार पर उत्पन्न होता है, और DBKey पहले से ही DPAPI डिक्रिप्शन DBKeyEnc द्वारा निम्न क्रम में बनाई गई है:
DBKeyEnc = DPAPI(CurrenUser, DPAPI(LocalSystem(DBKey))

यानी सबसे पहले, DB कुंजी को सिस्टम मास्टर कुंजी के साथ एन्क्रिप्ट किया गया है, और फिर परिणामी DPAPI बूँद को फिर से उपयोगकर्ता मास्टर कुंजी के साथ एन्क्रिप्ट किया गया है।

डेटाबेस में भी CheckSum से CryptoCheckSum है:
CryptoCheckSum = DPAPI बूँद (CurrenUser)

इस प्रकार, अपनी मशीन पर काम करने के लिए विलय किए गए SecurIDStorage के लिए, आपको यह करना होगा:

  1. इस तथ्य के कारण कि उपयोगकर्ता का SID EncTokenSid के गठन में शामिल है, वर्चुअल मशीन पर वर्तमान उपयोगकर्ता SID को उसी मान पर सेट करना आवश्यक है, जिस उपयोगकर्ता के SecurIDStorage डेटाबेस से लिया गया है। SysInternals से न्यूसिड उपयोगिता हमें इसमें मदद करेगी;
  2. उपयोगकर्ता की मास्टर कुंजी और पासवर्ड या डोमेन निजी कुंजी का उपयोग करके DBKeyEnc को डिक्रिप्ट करें (यदि मशीन एक डोमेन है);
  3. सिस्टम मास्टर कुंजी और DPAPI_SYSTEM पैरामीटर के मूल्य का उपयोग करके पिछले डिक्रिप्शन के परिणाम को डिक्रिप्ट करें;
  4. उपयोगकर्ता की मास्टर कुंजी का उपयोग करके CryptoCheckSum को डिक्रिप्ट करें
  5. अपनी वर्चुअल मशीन पर पहले से ही रिवर्स ऑर्डर में प्राप्त DBKey और चेकसम मानों को एन्क्रिप्ट करें;
  6. SecurID के कुछ संस्करणों में, आपको वर्चुअल मशीन के HDD आकार को उसी आकार में सेट करने की आवश्यकता होगी, जैसा कि स्रोत मशीन के HDD आकार, कार्यक्रम इसे स्टार्टअप पर जाँचता है।

जैसा कि ऊपर उल्लेख किया गया है, उपयोगकर्ता की मास्टर कुंजी के अलावा DBKeyEnc को डिक्रिप्ट करने के लिए, हमें एक सिस्टम मास्टर कुंजी की आवश्यकता होगी, साथ ही साथ DPAPI_SYSTEM, जिसके साथ सिस्टम मास्टर कुंजी डिक्रिप्ट किए गए हैं। DAPPI_SYSTEM वास्तव में पहले से गठित एक प्रीकी है, जो सिस्टम मास्टर कुंजी के गठन में भाग लेता है। आप इसे LSASS मेमोरी (mimikatz के माध्यम से या प्रक्रिया डंप का विश्लेषण करके) या संबंधित रजिस्ट्री शाखाओं (HKLM \ SYSTEM, HKLM \ SECURITY) से प्राप्त कर सकते हैं, उन्हें डंप कर सकते हैं और एक ही Impacket का विश्लेषण कर सकते हैं।

फिर हम निम्न DPAPI_SYSTEM का उपयोग करके dpapick (parser उदाहरण / filegeneric.py) का उपयोग करके आवश्यक ब्लब्स को डिक्रिप्ट कर सकते हैं, जैसा कि निम्नलिखित स्क्रीनशॉट में दिखाया गया है:

1) mimikatz ऑफ़लाइन के माध्यम से DPAPI_SYSTEM प्राप्त करना



2) Impacket ऑफ़लाइन के माध्यम से DPAPI_SYSTEM प्राप्त करना



3) उपयोगकर्ता और सिस्टम मास्टर कुंजी के साथ DPAPIck डिक्रिप्शन



धोखा की चादर


ताकि आप विशिष्ट डेटा के स्थान को न भूलें, हम उन्हें एक अलग अनुभाग में रखेंगे:

कस्टम मास्टर कुंजी

 %APPDATA%\Microsoft\Protect\<SID>\* 

सिस्टम मास्टर कुंजी

 Windows\System32\Microsoft\Protect\* 

DPAPI_SYSTEM

 LSASecrets – online SYSTEM, SECURITY (reg save …, system\backup, etc) 

उपयोगकर्ता प्रमाणपत्र

 %APPDATA%\Microsoft\SystemCertificates\My\Certificates\ %APPDATA%\Microsoft\Crypto\RSA\<SID>\ 

सिस्टम प्रमाण पत्र

 HKLM:\SOFTWARE\Microsoft\SystemCertificates\MY\Certificates\* C:\Programdata\Microsoft\Crypto\RSA\MachineKeys\ 

क्रोम

 %localappdata%\Google\Chrome\User Data\Default\Cookies %localappdata%\Google\Chrome\User Data\Default\Login Data 

ड्रॉपबॉक्स

 HKCU\SOFTWARE\Dropbox\ks HKCU\SOFTWARE\Dropbox\ks1 %APPDATA%\Local\Dropbox\instance1\config.dbx %APPDATA%\Local\Dropbox\instance_db\instanse.dbx 

Rsa securid

 %LOCALAPPDATA%\RSA\SecurIDStorage 

थोड़ा निष्कर्ष


DPAPI एक भव्य चीज है - मुख्य बात यह है कि यह समझने के लिए कि इसका उपयोग पेंट्स और रेडटैम अध्ययन करते समय कैसे किया जा सकता है।

इस लेख में, हमने केवल कुछ उदाहरणों पर ध्यान दिया जहां DPAPI डिक्रिप्शन लागू किया जा सकता है। वास्तव में, दायरा बहुत व्यापक है। उदाहरण के लिए, हमने RDP (* .rdg), Icloud (pList फ़ाइल), Skype (*। Xml), वाई-फाई से कनेक्ट करने की कुंजी पर विचार नहीं किया। हर जगह DPAPI लागू किया जाता है और इसी पार्सर को dpapick ढांचे के हिस्से के रूप में लागू किया जाता है।

हमारे GitHub पर dpapick का एक संशोधित संस्करण उपलब्ध है । हम आपसे DPAPI को डिक्रिप्ट करने के लिए इस उपकरण का उपयोग करने का आग्रह करते हैं और हम dpapick के आगे विकास के लिए आभारी होंगे।

और टेलीग्राम में हमारे चैनल में कुछ दिलचस्प जानकारी मिल सकती है। हम RedTeam की आंखों के माध्यम से आईबी के बारे में बताते हैं।

PS एक शांत सम्मेलन के लिए OFFZONE-2018 के आयोजकों को धन्यवाद!

PPS यहां लेख का दूसरा भाग

Source: https://habr.com/ru/post/hi434514/


All Articles