14 KiB
macOS Keychain
{{#include ../../banners/hacktricks-training.md}}
मुख्य कीचेन
- यूजर कीचेन (
~/Library/Keychains/login.keychain-db), जिसका उपयोग यूजर-विशिष्ट क्रेडेंशियल्स जैसे एप्लिकेशन पासवर्ड, इंटरनेट पासवर्ड, यूजर-जनित सर्टिफिकेट, नेटवर्क पासवर्ड, और यूजर-जनित सार्वजनिक/निजी कुंजियों को स्टोर करने के लिए किया जाता है। - सिस्टम कीचेन (
/Library/Keychains/System.keychain), जो सिस्टम-व्यापी क्रेडेंशियल्स जैसे WiFi पासवर्ड, सिस्टम रूट सर्टिफिकेट, सिस्टम निजी कुंजियाँ, और सिस्टम एप्लिकेशन पासवर्ड को स्टोर करता है। /System/Library/Keychains/*में सर्टिफिकेट जैसे अन्य घटक मिल सकते हैं।- iOS में केवल एक कीचेन है जो
/private/var/Keychains/में स्थित है। इस फ़ोल्डर मेंTrustStore, सर्टिफिकेट प्राधिकरण (caissuercache) और OSCP प्रविष्टियों (ocspache) के लिए डेटाबेस भी होते हैं। - ऐप्स कीचेन में केवल उनके एप्लिकेशन पहचानकर्ता के आधार पर उनके निजी क्षेत्र में प्रतिबंधित होंगे।
पासवर्ड कीचेन एक्सेस
ये फ़ाइलें, जबकि इनमें अंतर्निहित सुरक्षा नहीं है और इन्हें डाउनलोड किया जा सकता है, एन्क्रिप्टेड हैं और इन्हें डिक्रिप्ट करने के लिए यूजर का प्लेनटेक्स्ट पासवर्ड आवश्यक है। डिक्रिप्शन के लिए Chainbreaker जैसे टूल का उपयोग किया जा सकता है।
कीचेन प्रविष्टियों की सुरक्षा
ACLs
कीचेन में प्रत्येक प्रविष्टि एक्सेस कंट्रोल सूचियों (ACLs) द्वारा शासित होती है जो यह निर्धारित करती है कि कौन कीचेन प्रविष्टि पर विभिन्न क्रियाएँ कर सकता है, जिसमें शामिल हैं:
- ACLAuhtorizationExportClear: धारक को रहस्य का स्पष्ट पाठ प्राप्त करने की अनुमति देता है।
- ACLAuhtorizationExportWrapped: धारक को दूसरे प्रदान किए गए पासवर्ड के साथ एन्क्रिप्टेड स्पष्ट पाठ प्राप्त करने की अनुमति देता है।
- ACLAuhtorizationAny: धारक को कोई भी क्रिया करने की अनुमति देता है।
ACLs के साथ एक विश्वसनीय एप्लिकेशन की सूची होती है जो बिना प्रॉम्प्ट के ये क्रियाएँ कर सकती है। यह हो सकता है:
- N
il(कोई प्राधिकरण आवश्यक नहीं, सभी विश्वसनीय हैं) - एक खाली सूची (कोई भी विश्वसनीय नहीं है)
- विशिष्ट एप्लिकेशनों की सूची।
इसके अलावा, प्रविष्टि में कुंजी ACLAuthorizationPartitionID हो सकती है, जिसका उपयोग teamid, apple, और cdhash की पहचान के लिए किया जाता है।
- यदि teamid निर्दिष्ट है, तो प्रविष्टि के मान को बिना प्रॉम्प्ट के एक्सेस करने के लिए उपयोग की जाने वाली एप्लिकेशन को समान teamid होना चाहिए।
- यदि apple निर्दिष्ट है, तो ऐप को Apple द्वारा साइन किया जाना चाहिए।
- यदि cdhash निर्दिष्ट है, तो ऐप को विशेष cdhash होना चाहिए।
कीचेन प्रविष्टि बनाना
जब Keychain Access.app का उपयोग करके एक नया प्रविष्टि बनाई जाती है, तो निम्नलिखित नियम लागू होते हैं:
- सभी ऐप्स एन्क्रिप्ट कर सकते हैं।
- कोई ऐप्स निर्यात/डिक्रिप्ट नहीं कर सकते (यूजर को प्रॉम्प्ट किए बिना)।
- सभी ऐप्स इंटीग्रिटी चेक देख सकते हैं।
- कोई ऐप्स ACLs को बदल नहीं सकते।
- partitionID को
appleपर सेट किया जाता है।
जब एक एप्लिकेशन कीचेन में एक प्रविष्टि बनाता है, तो नियम थोड़े अलग होते हैं:
- सभी ऐप्स एन्क्रिप्ट कर सकते हैं।
- केवल बनाने वाला एप्लिकेशन (या कोई अन्य ऐप्स जो स्पष्ट रूप से जोड़े गए हैं) निर्यात/डिक्रिप्ट कर सकते हैं (यूजर को प्रॉम्प्ट किए बिना)।
- सभी ऐप्स इंटीग्रिटी चेक देख सकते हैं।
- कोई ऐप्स ACLs को नहीं बदल सकते।
- partitionID को
teamid:[teamID here]पर सेट किया जाता है।
कीचेन तक पहुँच
security
# List keychains
security list-keychains
# Dump all metadata and decrypted secrets (a lot of pop-ups)
security dump-keychain -a -d
# Find generic password for the "Slack" account and print the secrets
security find-generic-password -a "Slack" -g
# Change the specified entrys PartitionID entry
security set-generic-password-parition-list -s "test service" -a "test acount" -S
# Dump specifically the user keychain
security dump-keychain ~/Library/Keychains/login.keychain-db
APIs
Tip
कीचेन एन्यूमरेशन और सीक्रेट्स का डंपिंग जो प्रॉम्प्ट नहीं जनरेट करेगा उसे LockSmith टूल से किया जा सकता है।
अन्य API एंडपॉइंट्स SecKeyChain.h सोर्स कोड में पाए जा सकते हैं।
Security Framework का उपयोग करके प्रत्येक कीचेन एंट्री की जानकारी सूचीबद्ध करें और प्राप्त करें या आप एप्पल के ओपन सोर्स CLI टूल security** को भी चेक कर सकते हैं।** कुछ API उदाहरण:
- API
SecItemCopyMatchingप्रत्येक एंट्री के बारे में जानकारी देता है और जब आप इसका उपयोग करते हैं तो कुछ विशेषताएँ सेट कर सकते हैं: kSecReturnData: यदि सत्य है, तो यह डेटा को डिक्रिप्ट करने की कोशिश करेगा (संभावित पॉप-अप से बचने के लिए इसे झूठा सेट करें)kSecReturnRef: कीचेन आइटम का संदर्भ भी प्राप्त करें (यदि बाद में आप देखते हैं कि आप बिना पॉप-अप के डिक्रिप्ट कर सकते हैं तो इसे सत्य सेट करें)kSecReturnAttributes: एंट्रीज़ के बारे में मेटाडेटा प्राप्त करेंkSecMatchLimit: कितने परिणाम लौटाने हैंkSecClass: किस प्रकार की कीचेन एंट्री
प्रत्येक एंट्री के ACLs प्राप्त करें:
- API
SecAccessCopyACLListके साथ आप कीचेन आइटम के लिए ACL प्राप्त कर सकते हैं, और यह ACLs की एक सूची लौटाएगा (जैसेACLAuhtorizationExportClearऔर अन्य पहले उल्लेखित) जहाँ प्रत्येक सूची में: - विवरण
- विश्वसनीय एप्लिकेशन सूची। यह हो सकता है:
- एक ऐप: /Applications/Slack.app
- एक बाइनरी: /usr/libexec/airportd
- एक समूह: group://AirPort
डेटा निर्यात करें:
- API
SecKeychainItemCopyContentप्लेनटेक्स्ट प्राप्त करता है - API
SecItemExportकुंजियों और प्रमाणपत्रों को निर्यात करता है लेकिन सामग्री को एन्क्रिप्टेड निर्यात करने के लिए पासवर्ड सेट करना पड़ सकता है
और ये हैं बिना प्रॉम्प्ट के एक सीक्रेट निर्यात करने की आवश्यकताएँ:
- यदि 1+ विश्वसनीय ऐप्स सूचीबद्ध हैं:
- उचित अधिकार की आवश्यकता है (
Nil, या सीक्रेट जानकारी तक पहुँचने के लिए अनुमति प्राप्त ऐप्स की सूची का भाग होना) - कोड सिग्नेचर PartitionID से मेल खाना चाहिए
- कोड सिग्नेचर एक विश्वसनीय ऐप से मेल खाना चाहिए (या सही KeychainAccessGroup का सदस्य होना चाहिए)
- यदि सभी एप्लिकेशन विश्वसनीय हैं:
- उचित अधिकार की आवश्यकता है
- कोड सिग्नेचर PartitionID से मेल खाना चाहिए
- यदि कोई PartitionID नहीं है, तो यह आवश्यक नहीं है
Caution
इसलिए, यदि 1 एप्लिकेशन सूचीबद्ध है, तो आपको उस एप्लिकेशन में कोड इंजेक्ट करने की आवश्यकता है।
यदि apple partitionID में इंगित है, तो आप इसे
osascriptके साथ एक्सेस कर सकते हैं इसलिए कुछ भी जो सभी एप्लिकेशनों को partitionID में apple के साथ भरोसा कर रहा है। इसके लिएPythonका भी उपयोग किया जा सकता है।
Two additional attributes
- Invisible: यह UI कीचेन ऐप से एंट्री को छिपाने के लिए एक बूलियन फ्लैग है
- General: यह मेटाडेटा को स्टोर करने के लिए है (इसलिए यह एन्क्रिप्टेड नहीं है)
- Microsoft सभी रिफ्रेश टोकन को संवेदनशील एंडपॉइंट तक पहुँचने के लिए प्लेन टेक्स्ट में स्टोर कर रहा था।
References
{{#include ../../banners/hacktricks-training.md}}