Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
dpapi-ng — Python DPAPI NG Decryptor for non-Windows Platforms | Kitploit
أدوات/GitHubGitHub/jborean93/dpapi-ng
Encryption/Decryption ToolsDigital ForensicsCryptographyAuthenticationRed Teaming
GitHubjborean93/dpapi-ng

dpapi-ng

Python DPAPI NG Decryptor for non-Windows Platforms

عرض المستودع
716منذ سنة واحدةتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

dpapi_ng - مكتبة بايثون لفك/تشفير DPAPI-NG

Test workflow codecov PyPI version License

مكتبة بايثون لفك وتشفير DPAPI NG، والمعروف أيضًا باسم CNG DPAPI. صُممت لمحاكاة سلوك NCryptUnprotectSecret وNCryptProtectSecret. يمكن استخدامها على المضيفات غير العاملة بنظام ويندوز لفك/تشفير الأسرار المحمية بـ DPAPI NG، مثل كلمة مرور PFX المحمية للمستخدم، أو كلمة مرور LAPS المشفرة. يمكنها إما فك تشفير أي كائنات DPAPI NG باستخدام نسخة محلية غير متصلة من المفتاح الجذر للنطاق، أو فك/تشفير باستخدام بيانات اعتماد المستخدم المقدم لاسترداد المعلومات المطلوبة عبر RPC.

حاليًا، لا تُدعم إلا واصفات الحماية التالية:

النوعالغرض
SIDيمكن للمستخدم SID أو أعضاء مجموعة SID فقط فك تشفير السر

يطبق هذا بروتوكول MS-GKDI Group Key Distribution Protocol.

المتطلبات

  • CPython 3.9+
  • cryptography >= 3.1
  • dnspython >= 2.0.0
  • pyspnego >= 0.9.0

كيفية التثبيت

لتثبيت dpapi-ng بجميع الميزات الأساسية، شغّل

root@kitploit:~
python -m pip install dpapi-ng

مصادقة Kerberos

لن يتم تثبيت دعم مصادقة Kerberos افتراضيًا لأنه يعتمد على مكتبات النظام ووجود مترجم صالح. يمكن تثبيت مكتبة krb5 والمترجم عن طريق تثبيت هذه الحزم:

root@kitploit:~
# Debian/Ubuntu
apt-get install gcc python3-dev libkrb5-dev

# Centos/RHEL
yum install gcc python-devel krb5-devel

# Fedora
dnf install gcc python-devel krb5-devel

# Arch Linux
pacman -S gcc krb5

بمجرد التثبيت، يمكن تثبيت الحزم الإضافية لـ Kerberos في بايثون باستخدام

root@kitploit:~
python -m pip install dpapi-ng[kerberos]

يجب أيضًا تكوين Kerberos للتواصل مع النطاق، لكن هذا خارج نطاق هذه الصفحة.

من المصدر

root@kitploit:~
git clone https://github.com/jborean93/dpapi-ng.git
cd dpapi-ng
pip install -e .

أمثلة

تتوفر واجهة برمجة تطبيقات متزامنة (sync) وغير متزامنة (asyncio) لفك/تشفير كائن ثنائي (blob).

root@kitploit:~
import dpapi_ng


### DECRYPTION ###
dpapi_ng_blob = b"..."
decrypted_blob = dpapi_ng.ncrypt_unprotect_secret(dpapi_ng_blob)

# async equivalent to the above
decrypted_blob = await dpapi_ng.async_ncrypt_unprotect_secret(dpapi_ng_blob)


### ENCRYPTION ###
data = b"..."
target_sid = "S-1-5-21-XXXXXXXXXX-XXXXXXXXXX-XXXXXXXXXX-XXXX"
dpapi_ng_blob = dpapi_ng.ncrypt_protect_secret(data, target_sid)

# async equivalent to the above
dpapi_ng_blob = await dpapi_ng.async_ncrypt_protect_secret(data, target_sid)

لفك تشفير الكائن، يجب استرداد المفتاح المحدد في الكائن من وحدة تحكم النطاق التي أنشأت الكائن. لتشفير كائن، يجب استرداد مفتاح المجموعة لـ SID الهدف المحدد. لفك التشفير، يتم استرداد اسم مضيف وحدة تحكم النطاق تلقائيًا عبر بحث DNS SRV عن _ldap._tcp.dc._msdcs.{domain_name} باستخدام اسم النطاق الموجود في كائن DPAPI-NG أو بالقيمة المحددة في وسيط server. للتشفير، يتم تحديد اسم مضيف وحدة تحكم النطاق إما باستخدام وسيط domain_name لإجراء بحث DNS SRV، أو وسيط server مباشرة، أو باستخدام نطاق بحث النظام (إن وجد). سيحاول المصادقة باستخدام معرف المستخدم الحالي، والذي يوجد على لينكس فقط إذا تم استدعاء kinit مسبقًا لاسترداد تذكرة المستخدم. خلاف ذلك، إذا لم تتوفر هوية، يمكن استخدام الوسيطين username وpassword لتحديد مستخدم مخصص.

يمكن استخدام الوسائط التالية مع ncrypt_unprotect_secret وasync_ncrypt_unprotect_secret وncrypt_protect_secret وasync_ncrypt_protect_secret.

  • server: استخدم هذا الخادم كهدف RPC إذا احتاج مفتاح إلى الاسترداد
  • username: اسم المستخدم للمصادقة عبر اتصال RPC
  • password: كلمة المرور للمصادقة عبر اتصال RPC
  • auth_protocol: بروتوكول المصادقة (negotiate، kerberos، ntlm) لاستخدامه في اتصال RPC
  • cache: ذاكرة تخزين مؤقت لتخزين المفاتيح المستردة للعمليات المستقبلية

بالإضافة إلى ذلك، تأخذ ncrypt_protect_secret وasync_ncrypt_protect_secret الوسيط الإضافي التالي.

  • domain_name: اسم النطاق/الغابة لاستخدامه عند البحث عن هدف RPC لاسترداد معلومات المفتاح
  • root_key_identifier: معرّف المفتاح الجذر UUID، وهو ضروري لجعل ذاكرة التخزين المؤقت تعمل مع هذه الوظائف

من الممكن أيضًا تشفير وفك تشفير كائن DPAPI-NG من خلال توفير المفتاح الجذر المخزن في النطاق. يمكن استرداده إما باستخدام هجوم دون اتصال أو عبر استعلام LDAP إذا كنت تعمل كمستخدم مسؤول نطاق. لاسترداد المفاتيح الجذرية للنطاق باستخدام PowerShell، يمكن تشغيل ما يلي:

root@kitploit:~
$configurationContext = (Get-ADRootDSE).configurationNamingContext
$getParams = @{
    LDAPFilter = '(objectClass=msKds-ProvRootKey)'
    SearchBase = "CN=Master Root Keys,CN=Group Key Distribution Service,CN=Services,$configurationContext"
    SearchScope = 'OneLevel'
    Properties = @(
        'cn'
        'msKds-KDFAlgorithmID'
        'msKds-KDFParam'
        'msKds-SecretAgreementAlgorithmID'
        'msKds-SecretAgreementParam'
        'msKds-PrivateKeyLength'
        'msKds-PublicKeyLength'
        'msKds-RootKeyData'
    )
}
Get-ADObject @getParams | ForEach-Object {
    [PSCustomObject]@{
        Version = 1
        RootKeyId = [Guid]::new($_.cn)
        KdfAlgorithm = $_.'msKds-KDFAlgorithmID'
        KdfParameters = [System.Convert]::ToBase64String($_.'msKds-KDFParam')
        SecretAgreementAlgorithm = $_.'msKds-SecretAgreementAlgorithmID'
        SecretAgreementParameters = [System.Convert]::ToBase64String($_.'msKds-SecretAgreementParam')
        PrivateKeyLength = $_.'msKds-PrivateKeyLength'
        PublicKeyLength = $_.'msKds-PublicKeyLength'
        RootKeyData = [System.Convert]::ToBase64String($_.'msKds-RootKeyData')
    }
}

يمكن استخدام أمر ldapsearch التالي خارج ويندوز:

root@kitploit:~
ldapsearch \
    -b 'CN=Master Root Keys,CN=Group Key Distribution Service,CN=Services,CN=Configuration,DC=domain,DC=test' \
    -s one \
    '(objectClass=msKds-ProvRootKey)' \
    cn \
    msKds-KDFAlgorithmID \
    msKds-KDFParam \
    msKds-SecretAgreementAlgorithmID \
    msKds-SecretAgreementParam \
    msKds-PrivateKeyLength \
    msKds-PublicKeyLength \
    msKds-RootKeyData

ملاحظة: على الأرجح سيحتاج ldapsearch إلى معلومات -H وربط المستخدم (user bind) ليعمل بنجاح.

يمكن تخزين المعلومات المستردة هناك في ذاكرة تخزين مؤقت واستخدامها في استدعاءات ncrypt_protect_secret وncrypt_unprotect_secret اللاحقة:

root@kitploit:~
import uuid

import dpapi_ng

cache = dpapi_ng.KeyCache()

root_key_id = uuid.UUID("76ec8b2d-d444-4f67-9db7-2f62b4358b35")
cache.load_key(
    b"...",                             # msKds-RootKeydata
    root_key_id,                        # cn
    version=1,
    kdf_algorithm="SP800_108_CTR_HMAC", # msKds-KDFAlgorithmID
    kdf_parameters=b"...",              # msKds-KDFParam
    secret_algorithm="DH",              # mskds-SecretAgreementAlgorithmID
    secret_parameters=b"...",           # msKds-SecretAgreementParam
    private_key_length=512,             # msKds-PrivateKeyLength
    public_key_length=2048,             # msKds-PublicKeyLength
)

dpapi_ng.ncrypt_unprotect_secret(b"...", cache=cache)

حاليًا، تم اختبار خوارزمية KDF SP800_108_CTR_HMAC وخوارزميات الاتفاق السري DH وECDH_P256 وECDH_P384 للتأكد من أنها تعمل. يجب أن تعمل خوارزمية الاتفاق السري ECDH_P521 أيضًا، لكنها غير مختبرة لأنه لا يمكن إنشاء بيئة اختبار بها حاليًا.

شكر خاص

أود أن أشكر الأشخاص التاليين (معرفات GitHub أو Twitter بين أقواس) لمساعدتهم في هذا المشروع:

  • Georg Sieber (@schorschii) لتنفيذه دعم التشفير
  • Grzegorz Tworek (@0gtweet) وMichał Grzegorzewski لتوفير مزيد من المعلومات حول سير عمل واجهة برمجة تطبيقات BCrypt* الداخلية المستخدمة في DPAPI-NG
  • Marc-André Moreau (@awakecoding) لمساعدته في الهندسة العكسية لبعض واجهات برمجة تطبيقات ويندوز ومناقشة بعض النظريات
  • SkelSec (@SkelSec) للمساعدة في استدعاءات RPC وكونه متاحًا كمنصة لنقاش نظرياتي بشكل عام
  • Steve Syfuhs (@SteveSyfuhs) لربطي ببعض مهندسي مايكروسوفت للمساعدة في فهم بعض المنطق غير الموثق

بدون صبرهم ومعرفتهم، ربما لم يكن هذا ممكنًا.

تنزيل الأداة