شرح Get-WinEvent: اربط 4624 و4634 وافهم جلسات الدخول بدل الاكتفاء باسم المستخدم
لقيت اسم حساب في سجل ويندوز، وتبي تعرف متى دخل ومتى انتهت جلسته. البحث بالاسم يطلع أحداثًا كثيرة: دخول شبكة، وتشغيل خدمة، وجلسة تفاعلية، وربما أكثر من جلسة بنفس الوقت. لو جمعتها كلها في خط واحد، قد تحكي قصة ما حصلت أصلًا.
Get-WinEvent يساعدك تضيق القراءة وتحلل أحداثًا محددة، لكن جودة الاستنتاج تعتمد على الحقول التي تربطها. بنقرأ هنا سجلات جهاز تدريب مصرح به، ونفهم 4624 و4634، ونميز الجهاز والوقت وLogon ID والهوية. لا نولد محاولات دخول ولا نمسح سجلات؛ الهدف تحليل بيانات متاحة وفق التصريح.
4624 يثبت إنشاء جلسة، ولا يثبت قراءة ملف
توثيق Microsoft يصف 4624 كحدث ينشأ عند إنشاء جلسة دخول على الجهاز الوجهة الذي تم الوصول إليه. لذلك مكان الحدث مهم: إذا كنت تبحث عن دخول إلى خادم تطبيق، لا تفترض أن كل دليل سيكون في Security على وحدة التحكم بالدومين. المصادقة المركزية وجلسة المورد قد تظهران في طبقات مختلفة.
الحدث ليس تقريرًا كاملًا عن كل ما فعله الحساب بعد الدخول. قد يثبت جلسة، لكنه لا يثبت أن المستخدم فتح ملفًا معينًا أو حصل على صلاحية إدارة قاعدة بيانات. تحتاج سجلًا أو اختبارًا مناسبًا للعملية المطلوبة. هذه نقطة مهمة لمختبر الاختراق: نجاح المصادقة لا يساوي نجاح كل وصول لاحق.
كذلك عدد أحداث 4624 لا يساوي عدد الأشخاص أمام الشاشة. حساب خدمة قد ينشئ جلسات، وحساب مستخدم قد يظهر في أكثر من نوع دخول. لا تحول كل سطر إلى «الموظف دخل الجهاز». اربط نوع الدخول وسياق الحساب ومصدر الحدث حتى تعرف الوصف المناسب.
خلنا نفترض أن trainee01 يتصل بمشاركة على FILE01. وجود حدث لجلسة شبكة قد يوافق هذا النشاط، لكنه لا يثبت قراءة ملف التقارير. إذا كان هدف اختبارك الوصول إلى ملف وهمي، احتفظ بدليل تلك العملية بشكل مستقل. عندها يضيف السجل سياقًا مفيدًا بدل أن يكون بديلًا عن إثبات لا يقدمه.
Subject وTarget: اسم الحساب في أي قسم؟
في 4624 يمكن أن ترى هوية ضمن Subject وهوية ضمن معلومات الجلسة الجديدة أو Target. لا تختَر أول اسم ظهر في النص وتعتبره صاحب الدخول المقصود. مرجع Microsoft يميز الجهة التي أبلغت أو استدعت الحدث عن الهوية التي أنشئت لها الجلسة. أسماء الحقول في XML تساعد عندما تختلف لغة عرض الواجهة.
ابحث عن TargetUserName وTargetDomainName وTargetUserSid عندما تراجع هوية الجلسة الجديدة، وقارنها مع سياق الحدث كاملًا. لا تعتمد على الاسم وحده إذا كان ممكنًا وجود حساب محلي وحساب دومين بنفس الاسم. نطاق الحساب أو SID يساعد في الفصل، خصوصًا في لابات تضم عدة أجهزة ودومينات.
المصدر الشبكي أيضًا يحتاج تفسيرًا. عنوان IP ليس اسم شخص، وغياب عنوان واضح لا يثبت أن الحدث مزيف. بعض أنواع الدخول لا تعطيك نفس المعلومات الشبكية، وقد تتأثر القراءة بوسيط أو طريقة تنفيذ. سجل ما ظهر بدل ملء الفراغات بتوقعات عن جهاز العميل.
عندما تعرض النتيجة في تقرير، اكتب الحقول التي استخدمتها للربط. «الحساب ظهر في السجل» عبارة ناقصة؛ الأفضل توضيح الهوية في Target، والجهاز الذي أنشأ الجلسة، ونوع الدخول، والوقت. هذا يجعل القارئ قادرًا يراجع استنتاجك، ويمنع خلط هوية خدمة نظام محلية مع المستخدم الذي كنت تختبره.
فلترة القراءة من المصدر بدل تحميل السجل كله
Get-WinEvent يقبل FilterHashtable، وتوضح Microsoft أن الفلترة بهذه الطريقة أكثر كفاءة من جلب سجل كبير ثم تصفيته عبر Where-Object. هذا مفيد عمليًا: حدد السجل ورقم الحدث والنافذة الزمنية قبل العرض. لا تبدأ بقراءة كل Security لعدة أيام إذا كان اختبارك استغرق دقائق.
مثال قراءة محلية في جهاز التدريب: Get-WinEvent -FilterHashtable @{LogName='Security';Id=4624,4634;StartTime=(Get-Date).AddMinutes(-30)} -MaxEvents 200 | Select-Object TimeCreated,Id,MachineName,RecordId,Message. النافذة والنهاية القصوى هنا أمثلة تعليمية، وليستا توصية تغطية ثابتة لكل بيئة. اختر ما يناسب الحدث الذي تتبعه.
الافتراضي في Get-WinEvent عرض الأحدث أولًا. لذلك إذا طلبت MaxEvents 200، فقد تتوقف قبل بداية النافذة إن كانت كثيفة. لا تسم هذه القراءة «كل أحداث نصف الساعة» دون التأكد من عدم قص النتائج. يمكن إعادة قراءة نافذة أصغر محددة أو تصميم جمع مناسب مع الفريق عندما تحتاج تغطية كاملة.
إذا رفضت قراءة Security، فهذا خطأ صلاحية أو سياق يحتاج معالجة مع صاحب النظام، وليس دليلًا أن السجل فارغ. وإذا رجعت رسالة أن لا أحداث تطابق الاستعلام، راجع الوقت والجهاز والسجل والأرقام قبل الحكم على النشاط. فصل فشل الاستعلام عن عدم وجود نتائج أساسي في أي أداة تحليل.
اقرأ XML بأسماء الحقول، لا بترتيب مصفوفة محفوظ
خاصية Message مفيدة للقراءة البشرية، لكنها قد تكون طويلة ومتأثرة بلغة النظام. عند الحاجة إلى تفسير حقول محددة، تستطيع قراءة XML للحدث باستخدام ToXml. مثال في المختبر: $event = Get-WinEvent -FilterHashtable @{LogName='Security';Id=4624;StartTime=(Get-Date).AddMinutes(-30)} -MaxEvents 1 ثم $event.ToXml(). هذا يعرض حدثًا واحدًا، ولا يثبت أنه الحدث الذي يخص تجربتك حتى تطابق حقوله.
في XML سترى System ثم EventData. الأول يعطي معلومات مثل الجهاز والوقت ومعرف السجل، والثاني يضم حقولًا مسماة تخص نوع الحدث. ابحث عن الاسم المعروض بدل نسخ رقم عنصر من شرح قديم يقول إن Properties[5] هو المستخدم دائمًا. اختلاف النسخة أو الحدث يمكن أن يجعل الاعتماد على الموضع مضللًا.
سجل EventID وVersion وProvider مع الحقول المؤثرة إذا كنت تقارن مصادر أو نسخ Windows. لا تحتاج نشر XML كامل لكل حدث، لكن احتفظ بالمقتطف الأصلي داخل المشروع كي تقدر تراجع طريقة الاستخراج. وإذا بنيت سكربت تحويل، اختبره على عينات فعلية من النسخ التي سيقرأها بدل فرض أن البنية متطابقة.
القراءة بأسماء الحقول تحسن الدقة، لكنها لا تلغي السؤال عن معنى الحقل. TargetLogonId ليس RecordId، واسم جهاز المصدر ليس دائمًا Computer الذي أنشأ الحدث. لا تربط أحداثًا لأن قيمًا متشابهة ظهرت في مكانين مختلفين. المعنى يأتي أولًا، ثم تختار المفتاح الذي يناسب الربط.
Logon ID يربط جلسة على نفس الجهاز وبين إعادة التشغيل
توثيق 4634 يوضح أنه يمثل انتهاء جلسة الدخول، ويمكن ربطه بـ4624 باستخدام Logon ID. ويذكر قيدًا مهمًا: هذا المعرف فريد بين عمليات إعادة التشغيل على نفس الكمبيوتر فقط. لا تتعامل معه كمعرف جلسة عالمي صالح لكل الدومين وكل الأيام.
إذا ظهر 0x123abc على FILE01 وعلى APP01، تشابه القيمة لا يثبت أنها نفس الجلسة. تحتاج الجهاز والسياق الزمني وحدود إعادة التشغيل. كذلك لا تجعل نفس اسم المستخدم مفتاحًا وحيدًا؛ قد توجد جلسات متعددة للحساب على الجهاز نفسه. اربط الحقول التي تخص الجلسة المقصودة، ثم راجع تسلسل الوقت.
RecordId يساعدك تشير إلى حدث داخل سجل معين، لكنه ليس بديلًا عن Logon ID عند مقارنة بداية الجلسة ونهايتها. لكل واحد وظيفة مختلفة. في ورقة العمل احتفظ بالجهاز والسجل ومعرف الحدث ومعرف الجلسة والوقت، بدل عمود واحد اسمه ID يجمع قيمًا غير متجانسة.
إذا لم تجد 4634 مطابقًا داخل النافذة، لا تعلن أن الجلسة ما زالت نشطة الآن. ربما انتهت بعد نهاية القراءة، أو لم تشمل التغطية الحدث، أو حصلت إعادة تشغيل أو تغير في الاحتفاظ. اكتب أن نهاية مطابقة لم تُرصد في البيانات المقروءة. هذا استنتاج مضبوط يترك الباب للتحقق بدل صناعة حالة حالية من سجل ناقص.
أنواع الدخول: فرّق بين الشبكة والخدمة والجلسة التفاعلية
من القيم المعروفة Logon Type 2 للدخول التفاعلي، و3 للشبكة، و5 للخدمة، و10 للتفاعلي البعيد. هذه أمثلة تساعد في توجيه القراءة وليست قائمة كاملة. وجود Type 3 لا يعني أن المستخدم جلس أمام سطح المكتب على الخادم، ووجود Type 5 يناسب سياق خدمة يحتاج فهم هويتها ووظيفتها.
عند مراجعة حساب خدمة، راجع هل نوع الدخول يوافق الدور المعتمد. حساب مخصص لخدمة يظهر في جلسة تفاعلية قد يستحق سؤالًا، لكنه ليس دليل اختراق وحده. اطلب سياق اختبار أو إدارة أو تغيير قبل وصف النشاط. كذلك الحساب العادي قد يظهر في وصول شبكة مشروع لا يمثل جلسة عمل كاملة.
خلنا نفترض أنك اختبرت مشاركة من CLIENT01 إلى FILE01. تتوقع سياق شبكة على المورد، وليس بالضرورة نفس نوع حدث تسجيل الدخول المحلي على جهاز العميل. إذا فتشت الجهاز الخطأ أو النوع الخطأ، قد تقول إن السجلات ناقصة رغم أنك تبحث عن ملاحظة مختلفة عما أنتجته العملية.
في تحليل Purple Team أو مراجعة أثر اختبار، اكتب الفعل المقصود ثم الإشارات المتوقعة على كل جهاز. لا تحفظ رقمًا وتراقبه في كل مكان. ربط الفعل بموقع السجل ونوع الدخول والهوية يوفر لك تفسيرًا يمكن اختباره، ويساعد الفريق يعرف هل المشكلة تغطية أو استعلامًا أو توقعًا غير صحيح.
الوقت: UTC في البيانات قد يختلف عن عرض الواجهة
عندما تقارن سجلًا مع ملاحظات اختبار أو لوحة مركزية، ثبّت المنطقة الزمنية. قد يعرض XML وقت SystemTime بنهاية Z، بينما تعرض الواجهة وقتًا محليًا. لا تعتبر فرق ساعات دليل تأخير أو أن الحدث يخص يومًا آخر قبل توحيد القراءة. سجل الوقت الأصلي ووقت العرض الذي استخدمته في المقارنة.
نافذة «آخر نصف ساعة» باستخدام Get-Date تعتمد على ساعة جهاز تنفيذ الاستعلام. إذا كانت الساعة مختلفة أو كنت تحلل ملفًا قديمًا، قد تختار نافذة لا تشمل بياناتك. استخدم بداية ونهاية صريحتين مناسبتيْن للتحليل عندما تكون البيانات محفوظة، وراجع المنطقة الزمنية وطريقة إنشاء قيم DateTime بدل الاعتماد على تاريخ مكتوب بصيغة غامضة.
في مثال تدريبي، الطالب يسجل أن نشاطه بدأ 10:15 محليًا، والسجل يعرض 07:15Z. قد تكون القراءتان متوافقتين وفق المنطقة الزمنية، وليس بينهما تأخير ثلاث ساعات. لا تفترض منطقة ثابتة لكل مختبر؛ افحصها فعليًا. كذلك وقت وصول الحدث لمنصة مركزية ليس بالضرورة وقت إنشائه على المصدر.
ابن خطًا زمنيًا صغيرًا يحفظ المصدر والوقت ومعناه: إنشاء حدث، وصول للمنصة، أو وقت إجراء المختبر. خلط هذه الأوقات يعطي تسلسلًا مضللًا. وإذا كان عندك انحراف ساعة مثبت، اذكر أثره على الربط بدل تعديل السجل أو ملء الفجوة بحدث تتوقع أنه المناسب.
ملف EVTX محفوظ: احتفظ بمصدره وحدود جمعه
إذا أعطاك فريق المراقبة ملفًا محفوظًا، سجّل الجهاز الذي جُمعت منه البيانات، والسجل والنافذة التي شملها التصدير، ووقت تسليم الملف. لا تستخدم MachineName الذي يخص جهاز التحليل بدل الكمبيوتر الموجود داخل الحدث. واحتفظ بالنسخة الأصلية في مساحة المشروع حتى تقدر تعيد القراءة عندما تتغير طريقة التحليل.
يدعم Get-WinEvent قراءة ملفات سجلات محفوظة عبر Path؛ اختر الملف الذي أُتيح لك وفق التصريح، ولا تفتش مجلدات أخرى بحثًا عن معلومات إضافية غير مطلوبة. نتيجة الملف تعكس محتواه، لا الحالة الحية للجهاز الآن.
إذا لم توجد أحداث قبل تاريخ معين، اسأل هل التصدير بدأ هناك أو هل انتهى الاحتفاظ قبل ذلك. ملف صغير لا يثبت أن الجهاز كان هادئًا، وقد يكون مجرد عينة. هذه الحدود يجب أن تظهر في التقرير قبل أي استنتاج عن غياب جلسة أو نهاية نشاط.
تمرين مصرح: دخول واحد وقراءة محدودة ثم مقارنة
في جهاز تدريب مع بيانات وهمية، اتفق على فعل مشروع واحد معروف، مثل فتح جلسة مستخدم تدريب بالطريقة المعتادة ثم إنهائها. لا تغير سياسة التدقيق في جهاز إنتاج ولا تولد محاولات فاشلة واسعة. إذا كان السجل المطلوب غير متاح في اللاب، جهز التدقيق مع صاحب البيئة ضمن إعداد التدريب، أو استخدم عينة سجل تعليمية معروفة المصدر.
سجل الجهاز والهوية ووقت البداية والنهاية ونوع الفعل. بعدها اقرأ نافذة صغيرة من السجل المتاح، وحدد 4624 الذي يطابق هوية الجلسة وسياقها. ابحث عن 4634 مناسب بنفس الجهاز ومعرف الجلسة ضمن الحدود الزمنية الصحيحة. إذا ظهرت أحداث إضافية للحساب، اشرح لماذا لم تربطها بدل حذفها من القصة دون تفكير.
اكتب النتيجة على ثلاث طبقات: الفعل الذي تعرف أنه جرى، الأحداث التي شاهدتها، والاستنتاج الذي تسمح به. مثلًا «أُنشئت جلسة تدريب وانتهت، ووجدت أحداثًا مطابقة في النافذة المحددة». لا تضف أن المستخدم قرأ موردًا أو شغّل أمرًا آخر إذا لم يوجد دليل لتلك العملية.
بعد التمرين أعد نفس التحليل من ملاحظاتك فقط. إذا احتجت تتذكر أين كانت الشاشة أو أي حقل نسخته، حسّن السجل. مهارة Get-WinEvent ليست كتابة Hashtable فقط؛ هي اختيار نافذة ومصدر وحقول تمنع الخلط. هذه المهارة تفيد في اختبار اختراق مصرح وتحليل أثره ومراجعة رصد الفريق، دون الحاجة إلى نشاط هجومي كي تتعلمها.
المراجع: Get-WinEvent https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.diagnostics/get-winevent?view=powershell-5.1 وFilterHashtable https://learn.microsoft.com/en-us/powershell/scripting/samples/creating-get-winevent-queries-with-filterhashtable وتعريف 4624 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-4624 و4634 https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-10/security/threat-protection/auditing/event-4634 . طابق الحقول مع نسخة الحدث في بياناتك قبل بناء ربط آلي.