التشغيل التلقائي عبر سجل Windows¶
ما هي¶
يبدأ Windows البرامج ويحمّل ملفات DLL من مواقع كثيرة في سجل Windows: عند الإقلاع، وعند تسجيل الدخول،
وعند بدء برنامج ما أو خروجه، وعند فتح cmd.exe، وعند إنشاء فئة COM، أو عندما يحمّل المخزن المؤقت
للطباعة (spooler) أو LSA أو netsh أو خدمة الوقت المكونات الإضافية الخاصة به. يستخدم المهاجمون هذه
المواقع لتحقيق الاستمرارية، وتصعيد الامتيازات، وحقن ملفات DLL، كما تستخدمها البرامج المشروعة أيضًا.
يقرؤها Juntei من SOFTWARE وSYSTEM وNTUSER.DAT وUsrClass.dat في جدول واحد. ويكتب سجلًا واحدًا
لكل برنامج أو ملف DLL أو حزمة، ويوسم كلًا منها بتقنية MITRE ATT&CK الخاصة به.
أفضل استنتاج: كوّنت الخلية هذا البرنامج أو ملف DLL ليبدأ أو يُحمَّل. ولا يثبت ذلك أن البرنامج قد شُغّل. فتشغيله يتطلب الشروط التي تحددها الآلية (تسجيل دخول، أو بدء البرنامج الخاضع للتصحيح، أو إنشاء الفئة)، وأدلة أخرى على التنفيذ.
المواقع¶
| الخلية | ما الذي يُقرأ |
|---|---|
SOFTWARE |
Microsoft\Windows\CurrentVersion\Run وRunOnce (+Setup) وRunOnceEx وRunServices(Once) وPolicies\Explorer\Run، مع نسخها في Wow6432Node ونسخ وضع التثبيت في Terminal Server؛ وExplorer\StartupApproved\Run وRun32 وStartupFolder؛ وWinlogon (Shell، Userinit، Taskman، AppSetup، GinaDLL، … وNotify)؛ وAppInit_DLLs في Windows مع LoadAppInit_DLLs؛ وDebugger في Image File Execution Options\* (مع UseFilter) وVerifierDlls؛ وMonitorProcess في SilentProcessExit\*؛ وStubPath في Active Setup\Installed Components\*؛ وNetSh؛ وAutoRun في Command Processor |
SYSTEM |
Control\Session Manager (BootExecute، SetupExecute، Execute، PendingFileRenameOperations، KnownDLLs، AppCertDlls، ومتغيرات محلل أداء .NET (profiler) في Environment)؛ وAuthentication وSecurity وNotification Packages (+OSConfig) في Control\Lsa؛ وSecurityProviders؛ وشاشات المراقبة والموفرون ومعالجات الطباعة في Control\Print؛ وServices\W32Time\TimeProviders |
NTUSER.DAT |
مفاتيح Run الخاصة بالمستخدم وStartupApproved؛ وLoad وRun في Windows NT\CurrentVersion\Windows؛ وShell في Winlogon؛ وEnvironment (UserInitMprLogonScript، ومحلل أداء .NET)؛ وSCRNSAVE.EXE في Control Panel\Desktop؛ وPackagedAppXDebug؛ وAutoRun في Command Processor؛ وSoftware\Classes (بوصفه UsrClass.dat) |
UsrClass.dat |
CLSID\*\InprocServer32 وLocalServer32 (ونظائرهما في Wow6432Node)؛ وshell\open\command لأنواع البرامج (exefile، batfile، scrfile، …) ولما تبدؤه البرامج ذاتية رفع الامتيازات (ms-settings، mscfile، Folder، …)؛ وActivatableClasses\…\DebugInformation |
اجمع كل خلية مع سجلات المعاملات الخاصة بها. توجد خلايا المستخدمين في Users\<name>\NTUSER.DAT
وUsers\<name>\AppData\Local\Microsoft\Windows\UsrClass.dat.
تحذيرات للمحلل¶
- يُبلَغ عن الإعدادات الافتراضية أيضًا. معظم السجلات على نظام نظيف هي إعدادات Windows الافتراضية:
Userinitهوuserinit.exe؛Shellهوexplorer.exe؛- لكل من
KnownDLLsوحزم LSA وشاشات مراقبة الطباعة ومساعدات netsh ومكونات Active Setup إدخالات قياسية.
ابحث عمّا يختلف عن بنية نظيفة من الإصدار نفسه.
- لا يغطي StartupApproved سوى قائمة Startup في Task Manager. فهو يبيّن ما إذا كان إدخال Run
أو ملف في مجلد Startup معطّلًا هناك، ومتى. ويُبلَغ عن الإدخال الذي لا تقابله قيمة Run، مع التفاصيل
"only in StartupApproved". ويمكن أن يكشف ذلك عن تشغيل تلقائي أُزيل.
- يحتاج OverridesMachineRegistration إلى خلية SOFTWARE الخاصة بالنظام. تُفحص فئة COM أو الأمر
الخاص بالمستخدم مقابلها، ويُعثر عليها بالطريقة نفسها التي يُعثر بها على خلية SYSTEM الخاصة
بالمضيف. والتجاوز هو نمط اختطاف COM (T1546.015). كما تسجّل OneDrive وغيرها من عمليات التثبيت لكل
مستخدم فئات خاصة بها لا تتجاوز شيئًا.
- لا يُفصل ImagePath وArgs عن سطر الأوامر إلا حيث يمكن التمييز بينهما.
- يُفصل البرنامج المحاط بعلامات اقتباس عند علامة الاقتباس الختامية.
- تُعدّ الكلمة الأولى التي لا تتضمن مجلدًا هي البرنامج (cmd /c …).
- وفي غير ذلك يكون الفصل عند أقصر بداية تنتهي بامتداد برنامج.
قد يشغّل المسار غير المحاط بعلامات اقتباس والمتضمن مسافات برنامجًا مختلفًا (C:\Program.exe) إن وُجد.
- يحدد GlobalFlag قيمة Enabled لكل من VerifierDlls وMonitorProcess. لا يُحمَّل VerifierDlls
إلا مع 0x100. ولا يعمل MonitorProcess إلا مع 0x200 ومع 0x1 في ReportingMode ضمن
SilentProcessExit\<program>. والوضع 2 (تفريغ dump) أو 4 (إشعار) لا يشغّل شيئًا، ويسمّي Details
علامات الوضع.
- KeyLastWrittenUTC هو آخر كتابة للمفتاح، لا للقيمة. وتشترك فيه عدة قيم.
التحليل باستخدام Juntei¶
Usage: juntei parse-registry persistence <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find SOFTWARE, SYSTEM, NTUSER.DAT and UsrClass.dat hives
-f, --file <FILE> Parse one of them
--log1/--log2 Supply transaction logs explicitly
--no-logs Do not replay logs
Filtering:
--all-control-sets Every control set of a SYSTEM hive, not only the one in use
Output:
-o, --output <FILE> Save records
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-registry persistence -d collection/ -o persistence.csv
juntei parse-registry persistence -f NTUSER.DAT -t jsonl \
| jq 'select(.Mechanism != "com_server" or .OverridesMachineRegistration == true)'
يحصي الملخص السجلات حسب الآلية. كما يسرد إدخالات StartupApproved\Run وRun32 التي بقيت دون قيمة
Run الخاصة بها (ليس لملفات مجلد Startup ما تفقده)، وفئات COM والأوامر الخاصة بالمستخدم التي تتجاوز
نظائرها على مستوى الجهاز.
وكسائر أوامر parse-registry، يرفض هذا الأمر قيمة -o تكون أحد الملفات التي يقرؤها، حتى مع -C.
ويشمل ذلك الخلية، وسجلات المعاملات الخاصة بها، وخليتي SYSTEM وSOFTWARE الخاصتين بالنظام، سواء بالمسار
أو بالارتباط الرمزي أو بالارتباط الصلب. وعندما يتعذر عليه التحديد، لا يكتب.
حقول الإخراج¶
| الحقل | التفسير |
|---|---|
Host، SourcePath، HiveType |
سياق المضيف، والخلية المصدر ونوعها. |
User، UserSID |
لخلايا المستخدمين: مجلد ملف التعريف، ومعرّف SID. ويأتي معرّف SID من اسم المفتاح الجذر في UsrClass.dat، وإلا فمن ProfileList في النظام. |
Mechanism |
run، run_once، winlogon، ifeo_debugger، silent_process_exit، appinit_dlls، appcert_dlls، boot_execute، lsa_security_package، com_server، uac_bypass_command، … |
AttackTechnique |
تقنية MITRE ATT&CK، حيثما انطبقت إحداها (T1547.001، T1546.012، …). |
KeyPath، ValueName |
المفتاح تحت جذر الخلية (الأسماء كما كُتبت) والقيمة (فارغة: القيمة الافتراضية). |
Data |
نص القيمة، أو عنصر واحد من قائمة. ويكون فارغًا عندما تتعذر قراءته، أو عندما لا يسمّي الإدخالَ سوى StartupApproved. |
ImagePath، Args |
البرنامج أو ملف DLL، والوسيطات، حيثما أمكن التمييز بينهما (انظر أعلاه). |
Enabled، DisabledAtUTC |
ما يقوله StartupApproved أو LoadAppInit_DLLs أو GlobalFlag (مع ReportingMode) أو UseFilter أو IsInstalled أو Enabled الخاص بموفر الوقت أو ScreenSaveActive. ويكون فارغًا عندما لا يقول أي منها شيئًا. |
Details |
مزيد من المعلومات: ما تفعله عملية إعادة تسمية معلّقة، واسم فئة COM، وReportingMode، وFilterFullPath، وShellComponent في Active Setup، … |
OverridesMachineRegistration |
لفئة COM أو أمر خاص بالمستخدم: ما إذا كان الجهاز يسجّل الفئة/الأمر نفسه. ويكون فارغًا دون خلية SOFTWARE الخاصة بالنظام. |
WOW64 |
تحت Wow6432Node: للبرامج ذات 32 بت. |
KeyLastWrittenUTC |
آخر كتابة للمفتاح. |
DataRaw |
بايتات القيمة (بالنظام الست عشري)، عندما لا تكون نصًا أو لا تكون UTF-16 صالحًا. |
TransactionLogStatus، LogsApplied |
سياق استرداد سجل Windows. |
Problems |
أنواع قيم خاطئة، أو بيانات تتعذر قراءتها، أو إدخالات StartupApproved ذات حجم خاطئ. |
استراتيجية التحقيق¶
- ابدأ بالملخص:
- فئات COM والأوامر التي تتجاوز نظائرها على مستوى الجهاز؛
- إدخالات
StartupApprovedالتي لا تقابلها قيمةRun؛ - الآليات التي نادرًا ما تحتوي على إدخالات (
ifeo_debugger،silent_process_exit،appinit_dlls،appcert_dlls،uac_bypass_command،file_association،logon_script،dotnet_profiler). - قارن حزم LSA و
BootExecuteوKnownDLLsوشاشات مراقبة الطباعة ومساعدات netsh مع بنية نظيفة من إصدار Windows نفسه. - حلّ
ImagePathمقابل نظام الملفات ($MFT، والتجزئات، والتوقيعات)، وافحص مسارات ملف تعريف المستخدم وProgramDataوTemp. - اربط
KeyLastWrittenUTCمع أحداث سجل Windows في Security وSysmon، وإنشاء العمليات، وPrefetch، وAmcache. - استخدم
parse-registry read --recover-deletedللعثور على عمليات التشغيل التلقائي التي أُزيلت من هذه المفاتيح.