انتقل إلى المحتوى

التشغيل التلقائي عبر سجل 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 ذات حجم خاطئ.

استراتيجية التحقيق

  1. ابدأ بالملخص:
  2. فئات COM والأوامر التي تتجاوز نظائرها على مستوى الجهاز؛
  3. إدخالات StartupApproved التي لا تقابلها قيمة Run؛
  4. الآليات التي نادرًا ما تحتوي على إدخالات (ifeo_debugger، silent_process_exit، appinit_dlls، appcert_dlls، uac_bypass_command، file_association، logon_script، dotnet_profiler).
  5. قارن حزم LSA وBootExecute وKnownDLLs وشاشات مراقبة الطباعة ومساعدات netsh مع بنية نظيفة من إصدار Windows نفسه.
  6. حلّ ImagePath مقابل نظام الملفات ($MFT، والتجزئات، والتوقيعات)، وافحص مسارات ملف تعريف المستخدم وProgramData وTemp.
  7. اربط KeyLastWrittenUTC مع أحداث سجل Windows في Security وSysmon، وإنشاء العمليات، وPrefetch، وAmcache.
  8. استخدم parse-registry read --recover-deleted للعثور على عمليات التشغيل التلقائي التي أُزيلت من هذه المفاتيح.

مزيد من التفاصيل