دليل استخبارات تهديد Sysmon ، الجزء 3. تحليل متقدم لتهديدات Sysmon الرسومية





هذه المقالة هي الدفعة الثالثة والأخيرة في سلسلة تحليل مخاطر Sysmon. جميع الأجزاء الأخرى من السلسلة:



الجزء 1. تقديم

الجزء الثاني من تحليل سجل Sysmon . استخدام بيانات حدث Sysmon لاكتشاف التهديدات ،

الجزء 3. التحليل المتقدم لتهديدات Sysmon باستخدام الرسوم البيانية (نحن هنا)



البحث عن الرسوم البيانية الفرعية غير القياسية باستخدام بيانات حدث Sysmon (مثال بسيط)



قبل أن ننظر إلى مثال لتحديد الانحرافات في الرسوم البيانية الفرعية التي تشير إلى وجود تهديد محتمل (وإذا كانت هذه الكلمات لا توقظ الشخص الذي يذاكر كثيرا في داخلك ، فلن يوقظك شيء!) ، فلنقم باستطراد بسيط.



في هذه المرحلة ، يجب أن أصدر تحذيرًا: لا يمكن لهذا المنشور ، إلى جانب الكود الموجود على GitHub ، أن يحل محل حل على مستوى المؤسسات. فإنه يمكن أن تساعد في تحديد التهديدات على نطاق أصغر، ولكن مهمتي النبيلة هو مساعدة محترفي تكنولوجيا المعلومات الأمنية فهم وتقدير حلول الحماية من التهديدات في العالم الحقيقي. وإحدى طرق تحقيق ذلك هي إنشاء الحل بنفسك (بمساعدتي).



ستساعدك التجارب في المنزل على فهم مدى صعوبة توسيع نطاق برامج اكتشاف التهديدات التي تتم في المنزل. سيتعين عليك العمل مع مجموعات البيانات الضخمة وكل ما يتعلق بها: التنظيف (وهي مهمة صعبة للغاية) ، والمعالجة الفعالة (العثور على هياكل البيانات ، والخوارزميات ، وما إلى ذلك) وتقديم النتائج مع عدد قليل من الإيجابيات الخاطئة بحيث ثم نفس الزملاء لم يتسلقوا عليك بقبضاتهم. مع هذا في الاعتبار، قد ترغب في النظر في ready- جعل الكشف عن التهديد الحل ... ولكن فقط بعد الانتهاء لدينا سلسلة من المقالات وإجراء التجارب الخاصة بك.



تحديد أوزان الرسم البياني



تتمثل إحدى الطرق السهلة لإنشاء حل دفاع عن التهديدات لا يعتمد على توقيعات البرامج الضارة في استخدام الرسم البياني للتهديد من الجزء السابق .



يربط مثل هذا الرسم البياني عقد العملية بناءً على إدخالات من سجل أحداث Sysmon.

يرجى ملاحظة ما يلي: لم أفصل كل حدث بدء عملية (معرف الحدث 1 في أحداث Sysmon) في قمة منفصلة. بدلاً من ذلك ، قمت بإنشاء رسم بياني أكثر تجريدًا يوضح ، على سبيل المثال ، أن رأس PowerShell يحتوي على رابط واحد لأي تطبيق يتم تشغيله من تحت أي مستخدم - رابط واحد لبرنامج Excel ، وآخر للمتصفح ، وما إلى ذلك.



عرض شجرة PSQuickGraph للرسم البياني لتهديد Sysmon الخاص بي.  لاحظ الفرع الشاذ تحت cmd.exe



عرض شجرة PSQuickGraph للرسم البياني لتهديد Sysmon الخاص بي. انتبه إلى الفرع الشاذ تحت cmd.exe





ومع ذلك ، ما زلنا نرغب في تتبع وتيرة العمليات الجارية. على سبيل المثال ، إذا أطلق PowerShell "whoami" مرة واحدة ومحرر Windows القديم "Notepad.exe" 10 مرات ، فيجب تمييز حواف الرسم البياني التي تنطلق من قمة PowerShell بـ "الأوزان" المقابلة من 1 و 10 ، على التوالي. هل هذا منطقي؟



في العديد من أبسط خوارزميات اكتشاف التهديدات ، يصبح هذا الوزن مقياسًا لمقارنة مناطق الرسم البياني. النقطة الأساسية هي أن الرسم البياني الفرعي الذي يكون متوسط ​​وزنه أقل مقارنةً بمتوسط ​​الوزن بشكل عام أمر مريب.

أليس كذلك؟ القمة التي نادرا ما تتم زيارتها هي منطقة شاذة. لذلك ، إذا كانت إجراءات المستخدم في تحليل التهديدات المحتملة تتجه نحو رسم بياني فرعي نادر الاستخدام ، فيجب عليك رفع مستوى الإنذار إلى اللون الأصفر.



النهج الذي أصفه ونصوص PowerShell أدناه غير مخصص للاستخدام لأغراض عملية للبنى التحتية الكبيرة. ولكن بالنسبة لخادم منفصل ، قد يكون الحل ناجحًا ، أو على الأقل يوفر تحققًا مستقلاً من حلول الشركات التي تستخدمها.



هل ذكرت أن خوارزميات PowerShell الخاصة بـ Doug Finke لهياكل البيانات هي أدوات رائعة وفعالة؟ بدون عمله ، لم أكن لأحقق أي شيء في مشروع الرسم البياني الخاص بي. شكرا مرة أخرى دوغ!



باستخدام مكتبة PowerShell الخاصة به من وظائف الرسم البياني الجميلة ، يمكنني بسهولة حساب وزن مخطط تهديد Sysmon الخاص بي باستخدام عدد قليل من خطوط PS ، وأيضًا معرفة متوسط ​​وزن الرأس للرسم البياني بأكمله. أثناء عبوره للرسم البياني ، يحدد الكود أيضًا لكل رأس وزن جميع حوافه الصادرة:



$AW=0 #average weight
$GW=0 #total weight

$mset = [System.Collections.ArrayList]@() #master set of subraphs
#calculate total weight by summing up the frequencies or weights of the edges
foreach ($e in $g.getAllEdges() ) {
    $GW = $GW + $e.weight
}
write-host "Weight of Graph: " $GW
$AW = $GW / $g.vertices.count
write-host "Average weight per vertex: " $AW

#assign weight of edges to vertice
for ($i=0; $i -lt $g.vertices.count; $i++) { 
   $w=0
   $v=$g.vertices[$i]
   foreach($e in $v.getEdges()) {
      if($e -eq $null) {continue}
      $w=$w + $e.weight
   }
   $v.value.Weight = $w
}


الكود أعلاه يقوم بالحسابات التي نحتاجها. في هذه الحالة ، يمكن اعتبار كل قمة على أنها تكرار للزيارات ، اعتمادًا على الحواف الصادرة.



الجزء الأصعب من نصي البياني للرسم البياني الشاذ في PowerShell - والذي سأعرضه لك قريبًا - هو العثور على مناطق الرسم البياني الأقل احتمالًا لحدوثها ، ثم العثور على أكبر مخطط فرعي يحتوي عليها. قد تحتاج إلى تصفح كتاب علوم الكمبيوتر القديم لإكمال هذه المهمة. لكن في الواقع ليس من الصعب الكتابة!



لقد استخدمت البحث الكلاسيكي عن عرض النطاق الأول للرسم البياني الخاص بي عن طريق زيارة كل رأس ، ثم توسيعه على حساب الرؤوس المجاورة حتى يصل الرسم البياني الفرعي إلى حد معين اعتمادًا على متوسط ​​وزن الرأس. مثله:



function extend-subgraph($v, $t) {
    $vertexQueue = New-Object Queue
    
    #initialize
    $vertexQueue.enqueue($v)
    $h=$v.value.Weight
    $s=@() #subgraph
    $s+=$v
    $extend=$false
    while (!$vertexQueue.isEmpty()) { #bfs
        $currentVertex = $vertexQueue.dequeue()
        $es= $currentVertex.getEdges()
        foreach($e in $es) {
            $ev= $e.endVertex                
            if ((($h + $ev.value.Weight)/($s.count+1) -lt $th)  {        
                #extend the sub-graph
                $s+=$ev
                $h =$h + $ev.value.weight
                #queue it up
                $vertexQueue.enqueue($ev)
            }
        }


ملاحظة سريعة لعشاق DIY: استخدم نوع المصمم لإنشاء مجموعة من المصفوفات وستوفر على نفسك الكثير من الصداع.



التهديدات منخفضة الوزن والرسوم البيانية الفرعية



هناك العديد من الخوارزميات المختلفة للرسوم البيانية الشاذة. يعتمد النموذج الذي استخدمته على رسم بياني معين وجدته على الإنترنت - وسأعطي رابطًا بمجرد أن أجده مرة أخرى.



بشكل عام ، تكمن المشكلة الرئيسية في الاكتشاف العملي للتهديدات في العثور على مجموعة بيانات جيدة لتشكيل خط أساس. بصفتي مدونًا متفرغًا ومتخصصًا في اكتشاف التهديدات ، لم أتمكن مطلقًا من إنشاء سجل Sysmon مثير للاهتمام بما فيه الكفاية يحتوي على العديد من التطبيقات المختلفة. كان من الصعب جدًا إنشاء رسوم بيانية فرعية شاذة حيث لم يكن لدي انتشار كبير بما يكفي في الأوزان. بطريقة أو بأخرى ، عند استخدام خادم حقيقي ، قد ينتهي بك الأمر بمجموعة بيانات أفضل بكثير من الاستخدام العرضي لمثيل AWS Windows ، كما في حالتي.



كان نص PS للرسوم البيانية الشاذة التي كتبتها قادرًا تمامًا على إنتاج رسوم بيانية فرعية مشبوهة ذات أوزان متوسطة منخفضة. وقد تمكنت حتى من التقاط بعض البيئات المثيرة للاهتمام (انظر أدناه).



خوارزمية ترجيح الرسم البياني الفرعي قيد التنفيذ: بيئة ممتعة مع رسم فرعي منخفض الوزن # 7



خوارزمية أوزان الرسم البياني الفرعي قيد التنفيذ: بيئة مثيرة للاهتمام ذات وزن منخفض للرسم 7





كما ذكرت سابقًا ، هناك خوارزميات أخرى لاكتشاف الانحرافات في الرسوم البيانية بمقاييس أخرى غير الأوزان البسيطة التي تستحق التعلم. يبحث أحدهم عن مجموعات من الرؤوس "المتشابهة" ويلاحظ اتصالات أو اتصالات بين بيئات مختلفة. في هذه الحالة ، يكمن الشذوذ في المستخدم أو العملية التي تربط البيئات من خلال بعض الخصائص الأخرى. هذا منطقي ، أليس كذلك؟



إذا كان الطالب الذي يذاكر كثيرا داخلك قويًا في داخلك ، يمكنك التحقق من SCAN(خوارزمية التجميع الهيكلي للشبكات) ، والتي تقوم بما ورد أعلاه. باستخدام خوارزميات PowerShell الخاصة بـ Doug Finke ، يمكنك حتى استخدامها. أنا بنفسي أريد أن أتولى هذا المشروع وأضعه قريبًا على GitHub .



العثور على الحالات الشاذة من خلال المشي العشوائي



لننهي هذا القسم بطريقة أخرى للعثور على الحالات الشاذة في مخطط التهديد. أشرت إلى هذا النهج في نهاية الجزء السابق . بالنسبة لي ، كشخص لديه رياضيات على "أنت" ، فهو أكثر سهولة. وسيتعرف عشاق البرنامج التلفزيوني القديم numb3rs على الفور على مفهوم سلاسل ماركوف [تطهير الحلق].



بالنسبة لأي شخص آخر ، يمكنك التفكير في هذا على أنه "مسيرة عشوائية" عبر الرسم البياني. في كل رأس من الرؤوس ، نرمي نردًا ونختار حافة الرسم البياني اعتمادًا على وزنها: كلما زاد وزن الحافة ، زادت فرصة تتبعنا لها. تحتاج إلى تقسيم الرسم البياني إلى جزأين - يُسمى الرسم البياني ثنائي الأجزاء في نظرية الرسم البياني - مع المستخدمين من جزء والتطبيقات في الجزء الآخر.



بعد ذلك ، يمكنك الترتيبجميع تطبيقات الرأس التي يمكن الوصول إليها من المستخدم بناءً على احتمال الوصول إلى قمة معينة. لتحليل التهديد ، سوف تبحث بعد ذلك عن التطبيقات قيد التشغيل ، وإذا كان لدى أي منها احتمال ضئيل للغاية للوصول إليها ، فربما تكون قد وجدت تهديدًا حقيقيًا!



بالإضافة إلى كارما لشخص ربطها بخوارزمية PageRank من Google. سأصف هذا بمزيد من التفصيل في القسم التالي ، ولكن يمكن للمهتمين استخدام العبارة العشوائية على Google مع إعادة التشغيل .



نظرية الاجتياز العشوائي وممارسة EQL



لنأخذ استطراداً آخر ونحلل ما نحاول تحقيقه باستخدام سجل Sysmon ، وهو أداة رائعة لاكتشاف التهديدات وإجراء تحقيقات ما بعد الحادث.



  • , Sysmon. Sysmon , .
  • 2 Sysmon , , .
  • في الجزء الثالث ، بحثنا في لمحة عامة عن خوارزمية بسيطة واحدة تعتبر الوصلات الطرفية كأوزان. يمكن أن تشكل أقسام الرسم البياني التي تزن أقل (من حيث الحواف) من إجمالي متوسط ​​الوزن على الرسم البياني بأكمله تهديدًا محتملاً. سأقوم بتحميل نصوص PowerShell النصية للخوارزميات من هذا القسم إلى GitHub الخاص بي (بعد التمرير فوقها).


تتمثل ميزة هذه الأساليب في أنها لا تعتمد على أوامر محددة أو أسماء عمليات يغيرها المهاجمون باستمرار أو يخفونها.

بالإضافة إلى ذلك ، هناك طريقة أخرى تعتمد على الاحتمالات لاكتشاف نقاط الضعف. دعنا نلقي نظرة فاحصة عليها.



الاجتياز العرضي للرسم البياني لنقاط الضعف من البيانات المستندة إلى أحداث Sysmon



بدلاً من تحليل بنية الرسم البياني نفسه ، يمكننا التفكير في الروابط كمسار أو خريطة طريق ، حيث يكون كل تطبيق نقطة توقف منفصلة على طول الطريق. من بيانات سجل Sysmon ، يمكننا الحصول على التردد الذي يبدأ به كل تطبيق من التطبيق الأصلي.



إذا نظرت إلى نص الرسم البياني للتهديد الخاص بي على GitHub ، فستجد أن هذا التردد مخزن داخل كل كائن حافة باستخدام خوارزميات PowerShell الرائعة من Doug Finke.



يمكننا اعتبار تكرار عبور كل من حواف الرسم البياني للضعف احتمالية!



يمكننا اعتبار تكرار عبور كل من حواف الرسم البياني للضعف احتمالية!





تتمثل الخطوة التالية في استخدام هذه المعلومات للعثور على احتمالية ، على سبيل المثال ، تشغيل تطبيق PowerShell taskmgr.exe أو محلل عمليات Windows أو المفكرة أو hostname.exe.



ما الذي سأحصل عليه؟



باختصار: يمكنني إنشاء مصفوفة انتقال احتمالية ، يحبها أتباع ماركوفوشائع الاستخدام في أنظمة النمذجة. في الواقع ، رمي النرد ، والانتقال إلى التطبيق التالي في الرسم البياني ، وتكرار هذه الإجراءات هو اجتياز عشوائي للرسم البياني. في النهاية ، تصنف هذه الطريقة الرياضية كل رأس من الرسم البياني وفقًا لاحتمال الوصول إلى هناك من نقطة البداية. وستكتشف ، على سبيل المثال ، أن تشغيل جداول البيانات من Windows Explorer عملية شائعة للغاية ، وأن Windows Script Host Engine من الناحية النظرية غير قياسي للغاية ، وبالتالي ، من المحتمل أن يكون مؤشر تهديد.

تُعرف هذه الطريقة باسم Random Walk With Restart (المشار إليها فيما يلي - RWWR ، المشي العشوائي مع إعادة التشغيل) وهي أحد أشكال خوارزمية تصنيف Google PageRank الأسطورية الآن .

دعنا نلقي نظرة على جزء من السيناريو كتبته لحساب هذه الرتب:



#lets build a row
$row= @(0)*$g.vertices.count
$w=0

foreach($e in $start.getEdges()) {    #calculate total frequency
    $w+=$e.weight
}
if ($w -eq 0)  {   #make it connected
$row[$ix] =1
}
else {  #we assign probabilitys
    #now create transition probability
    foreach($e in $start.getEdges()) {
        $ev = $e.endVertex
        $p = $e.weight
        $jx = v-index $ev.value.Key
        $row[$jx]= $p/$w #normalize by dividing by total
    }
}
$P[$ix] = $row  #yay! One row added to transition matrix


لكل رأس ، أحسب التردد الناتج لجميع الجيران ثم أعين احتمالية كل انتقال خلال التطبيع إلى الإجمالي. وبالتالي ، إذا كان لدى PowerShell.exe 20 زيارة لجميع جيرانه ، ولكن تمت زيارة nc.exe مرة واحدة فقط من الجزء العلوي من PowerShell.exe ، فإن احتمال الذهاب سيكون 1/20 أو 0.05. هل هذا منطقي؟



تكمن الصعوبة في حساب المصفوفة المستخدمة في RWWR ، ولكن بالنسبة لأولئك الذين حضروا دروس النمذجة الاحتمالية ، لن يكون هذا الإجراء صعبًا. هناك مقالة مراجعة جيدة حول هذا الموضوع على موقع ميديوم .



البرنامج النصي الخاص بي ، والذي أطلق عليه اسم "random-rater" ، يصنف ويخرج أصغر 10القيم من القائمة. بهذه الطريقة ، يمكنك الحصول على التطبيقات التي لديها أقل احتمالية للتشغيل ، بدءًا من قمة معينة في الرسم البياني للتهديد. إليك النتيجة عند استخدام PowerShell.exe كنقطة بداية:



يمكن أن تنتج خوارزمية Random Walk With Restart تصنيفًا مشابهًا لجوجل للتهديدات.  هممم ، whoami هو الأقل احتمالا للبدء



يمكن أن تنتج خوارزمية Random Walk With Restart تصنيفًا مشابهًا لجوجل للتهديدات. Hmmm ، whoami هو الأقل احتمالًا للتشغيل.





كملاحظة عملية وتحذير ، تجدر الإشارة إلى أن PWWR ستكون مشكلة بيانات ضخمة في نظام حقيقي. حتى في حالة سجل Sysmon الصغير الخاص بي ، كان التأخر في الحساب ملحوظًا جدًا نظرًا للعدد الكبير من عمليات النقطة العائمة.



لغة استعلام الأحداث (EQL) لتحليل التهديدات



في الوقت الحالي ، تجدر الإشارة إلى أن البائعين الذين يستخدمون أساليب أكثر تطورًا لاكتشاف التهديدات في منتجاتهم يتجاوزون ما يمكنك فعله بمفردك. وبالتأكيد ، بدقة أعلى بكثير.



بالنسبة لأولئك الذين يرغبون في الغوص في موضوع اكتشاف التهديدات ، ولكن لا يريدون العمل مع البرامج النصية الخاصة بي - أفهم ذلك! - توجد لغة استعلام الأحداث أو EQL . هذا هو مشروع مفتوح المصدر لتطبيق Sysmon دخول لغة الاستعلام، والتي يمكنك معرفة المزيد عنها في شاملة للغاية آخر... لا يعد EQL رائعًا للتحقيق في الحوادث فحسب ، بل يمكن استخدامه أيضًا كأداة طالما لديك نسخة حديثة من سجل Sysmon.



توفر مجموعة EQL معالج حدث يحول السجل إلى JSON يمكن للبشر قراءته. يمكنك التحقق من نسخة من فرعي على GitHub. على عكس نص PS النصي الخاص بمسار العرض والتهديد الثابت ، يتيح لك EQL إجراء استفسارات بسرعة.



لنفترض أنني مهتم بجميع قذائف cmd.exe التي تم إطلاقها نيابة عن scvhost.exe - قد تكون هذه علامة على استخدام المهاجم لكل من psexec.exe أو smb.exe. سيبدو الطلب كما يلي:



استخدام EQL للعثور على قذائف cmd.exe التي تم إطلاقها من ملف Svchost.exe.  بالمناسبة ، jq هي أداة Linux لعرض بيانات JSON



استخدام EQL للعثور على قذائف cmd.exe التي تم إطلاقها من ملف Svchost.exe. بالمناسبة ، jq هي أداة لينكس لعرض بيانات JSON.



هناك طريقة أكثر روعة وقوة للحصول على هذه النتيجة باستخدام المعدل الفرعي. يسمح لك استعلام EQL هذا بالبحث في جميع العمليات مع سلف محدد ، في أي مكان في التسلسل الهرمي. على سبيل المثال ، يمكنك البحث عن التطبيقات التي ، على سبيل المثال ، لديها عملية regsvr32.exe كأحد الأسلاف ويمكنها استغلال ثغرة أمنية معروفة وصفتها هنا .



هناك الكثير من الحديث عن EQL في هذا المنشور الطويل بالفعل ، لذلك أفضل نشر مقال منفصل حول تفاصيل إتقان EQL لاكتشاف الثغرات الأمنية.



الأفكار النهائية حول حلول الكشف عن التهديدات DIY



لقد وعدت بتنزيل مستودع Sysmon بجميع البرامج النصية للكشف عن التهديدات الموضحة في هذه المقالة. تحقق مرة أخرى على GitHub الخاص بي بشكل دوري حيث سأضيف أدوات اكتشاف التهديدات المستندة إلى الرسم البياني بمرور الوقت بالإضافة إلى وثائق إضافية - أكثر من اللازم تغطيتها في مقال واحد.

لقد وصلت إلى هذا المكان ، تهانينا!



جرب البرامج النصية الخاصة بي أو استخدمها كأساس لتطوير أفكارك الخاصة باكتشاف التهديدات. يعد PowerShell مناسبًا للخوارزميات المعقدة. بالنسبة لي ، الذي نشأ على لغة Linux shell ، كانت مفاجأة سارة أن أعمل بلغة برمجة نصية ناضجة. وأنصحك للتحقق من معرض بوويرشيل، مورد رائع آخر لنصوص المعارك الجاهزة: ليس عليك إعادة اختراع العجلة في عالم PowerShell.



هناك طريقة أخرى أكثر أهمية من المقالة بأكملها وهي إدراك أن بائعي الحلول على مستوى المؤسسات لا يستخدمون فقط تقنيات اكتشاف التهديدات الأكثر تعقيدًا من تلك التي يمكن لمطوري تكنولوجيا المعلومات كتابتها في أوقات فراغهم ، ولكن أيضًا قابلية هذه الحلول للتكيف مع مستوى حركة المرور منظمة كبيرة. بالطبع ، يعد استخدام حلول DIY لتحليل خادم غير مستغل أو التحقق الإضافي من منتجات المؤسسة فكرة جيدة. لكن استخبارات التهديدات وتحديدها هي بالفعل مشكلة بيانات ضخمة ، ومن الواضح أنها ليست تحديًا يمكن لـ PowerShell حله.



إذا كنت مهتمًا بفرصة معرفة المزيد حول كيفية تعامل Varonis مع مهمة تحليل واكتشاف التهديدات ، فيمكنك دائمًا طلب عرض توضيحي شخصي .



All Articles