راهنمای تحلیل تهدید Sysmon
در آزمایش های مختلف توجیهی من ، وانمود می کنم مدافع تیم آبی هستم و سعی می کنم حمله را انجام دهم. اگر چشمان امنیتی خوبی دارید ، می توانید فعالیتهای غیر معمول را در پرونده های خام جستجو کنید – بگویید یک اسکریپت PowerShell که دارای یک cmdlet DownloadString یا یک اسکریپت VBS است که به عنوان یک پرونده doc Word مخفی شده است – با حرکت در فعالیت های اخیر در Windows Event Viewer. این یک سردرد بزرگ است. خوشبختانه مایکروسافت Sysmon را به ما داده است تا کار تجزیه و تحلیل تهدید را بسیار سریعتر انجام دهیم.
- قسمت اول: مقدمه ای در تجزیه و تحلیل ورود به سیستم Sysmon
- چه چیزی در مورد قابلیت های Sysmon بسیار عالی است؟
- معرفی Get-Sysmonlogs
- Sysmon and Graph Graphics
- قسمت دوم: عمیق تر به سیسمون و تهدید
- کار با Get-Sysmonlogs
- ساختار داده 101: لیست ها و نمودارها
- شکار تهدید با نمودارهای کارگردانی
- قسمت سوم: یافتن نمودارهای غیرمعمول (مثال ساده)
- اندازه گیری نمودار
- یافتن ناهنجاری ها با پیاده روی های تصادفی
- قسمت چهارم: نظریه راه رفتن تصادفی و EQL عملی
- راه رفتن تصادفی از طریق نمودار تهدید داده های رویداد Sysmon
- برگشت به عملی: EQL برای تجزیه و تحلیل تهدید
- بستن افکار در مورد راه حل های تهدید DIY
آیا می خواهید ایده های تهدیدات موجود در سیاهه Sysmon را درک کنید؟ راهنمای ما برای رویدادهای WMI را به عنوان یک ابزار نظارتی بارگیری کنید تا بدانید که چگونه خودی ها می توانند مخفیانه از سایر کارمندان جاسوسی کنند!
یکی از مشکلات مهم در مورد Windows Event این است که اطلاعات مربوط به فرآیند والدین را از دست داده است ، بنابراین سلسله مراتب پردازش نمی تواند باشد. کار کرد در مقابل ، ورودی های Sysmon دارای شناسه فرایند والدین هستند ، به همراه نام فرآیند والدین و خط فرمان. با تشکر از شما مایکروسافت!
در قسمت دوم این پست loooong ، ما از این اطلاعات فرآیند والدین نهایت استفاده را می کنیم تا ساختارهای نقشه برداری پیچیده تری را ایجاد کنیم که به عنوان نمودارهای تهدید شناخته می شوند. در قسمت سوم ، ما به یک الگوریتم ساده خواهیم پرداخت که نمودار تهدید را برای بررسی فعالیت معمول با بررسی "وزن" نمودار بررسی می کند. اگر آن را به قسمت چهارم بسپارید ، پاداش شما روشی محتمل (و قابل درک) برای یافتن تهدیدات است.
در این بخش اول ، بیایید ببینیم که با اطلاعات اولیه Sysmon چه کاری می توانیم انجام دهیم.
قسمت اول : مقدمه ای برای تجزیه و تحلیل ورود به سیستم Sysmon
جواب سردرگمی ورود به سیستم چیست؟ در نهایت ، یک راه حل SIEM به عادی سازی اطلاعات رویداد کمک می کند و تجزیه و تحلیل را نیز قابل توجه تر می کند.
اما لازم نیست حداقل در ابتدا این کار را انجام دهید. اولین قدم برای درک اینکه SIEM چه کاری می تواند انجام دهد ، امتحان کردن ابزار فوق العاده ویندوز رایگان Sysmon است. کار با آن بسیار شگفت آور است. برو مایکروسافت!
قابلیت های Sysmon چیست؟
به طور خلاصه: اطلاعات مربوط به فرآیند مفید که قابل خواندن است (به تصویر زیر مراجعه کنید!)
Sysmon به عنوان درایور و خدمات دستگاه نصب می کند – بیشتر در اینجا – و مزیت اصلی آن است. که از منابع ورود به سیستم چندگانه استفاده می کند ، برخی از اطلاعات را با هم مرتبط می کند و ورودی های حاصل را در یک پوشه در Event Viewer ، که در زیر Microsoft-> Windows-> Sysmon-> عملیاتی قرار دارد ، قرار می دهد. [19659019] در سفرهای مربوط به موهای خودم از طریق سیاهههای مربوط به ویندوز ، مجبور شدم بین ، مثلاً ، پوشه log PowerShell را گزاف گویی کنم ، و سپس دوباره به پوشه Security بازگردم و سپس از طریق Viewers Event جداگانه ، به صورت قهرمانانه سعی در مطابقت با ورودی ها داشته باشم. تجزیه و تحلیل آسان نیست و همانطور که یاد گرفتم ، داشتن یک زن و شوهر آسپیرین مفید است.
Sysmon اولین گام محکم در ارائه اطلاعات مفید یا عملی ، همانطور که فروشندگان دوست دارند بگویند – اطلاعاتی برای کمک به شما خواهد بود ، فراهم می کند. علل اساسی را درک کنید. به عنوان مثال ، من از راه دور یک جلسه wmiexec مخفی راه اندازی کردم که یک حرکت جانبی هوشمندانه را شبیه سازی می کند. در زیر می توانید آنچه را که در گزارش وقایع ویندوز یافتم ، مشاهده کنید:

برای یک متخصص IT ، با دانش هک کردن ، این خط فرمان خاص باید برخی ظن ها را ایجاد کند. استفاده از cmd.exe برای اجرای دستور دیگری در حالی که تغییر مسیر خروجی را به پرونده ای عجیب و غریب منتقل می کند ، برخی از نرم افزار های دستور و کنترل (C2) است: این راهی برای ایجاد یک شبه پوسته با استفاده از خدمات WMI است.
بیایید نگاهی معادل ورودی Sysmon بیاندازیم ، و به ثروت اطلاعات اضافی موجود در یک ورود به سیستم توجه کنیم:

نه تنها می توانیم خط فرمان واقعی را ببینیم ، بلکه نام پرونده و مسیر اجرایی را نیز می دانیم ، آنچه ویندوز در مورد آن می داند ("پردازنده فرمان Windows") ، شناسه فرآیند پدر و مادر ، خط فرمان پدر و مادر که پوسته cmd ویندوز را راه اندازی کرد ، و نام پرونده واقعی در مراحل اولیه والدین است. بالاخره همه ما این را داریم.
از روی پرونده Sysmon ، می توانیم با اطمینان خاطر نتیجه بگیریم که خط فرمان عجیب و غریب که در پرونده های خام موجود است چیزی نیست که توسط یک کارمند انجام کار عادی ساخته شود. در عوض ، این فرآیند مانند C2 ایجاد شده است – wmiexec که در بالا به آن اشاره کردم – تولید شده و توسط فرآیند خدمات WMI (WmiPrvSe) مستقیماً تولید می شود. اکنون ما اسلحه سیگاری در اختیار داریم که یک مهاجم یا خودی از راه دور در تلاش است سیستم IT سازمانی را بررسی کند.
معرفی Get-Sysmonlogs
شگفت آور است که Sysmon تمام این اطلاعات گزارش را در یک مکان قرار می دهد. حتی اگر ما بتوانیم به وسیله برنامه cmdlet PowerShell به همه زمینه های فردی موجود در ورود به سیستم دسترسی پیدا کنیم ، فوق العاده تر نخواهد بود؟ سپس می توانیم اسکریپت PowerShell کمی بنویسیم تا روند یافتن تهدیدهای احتمالی را خودکار کنیم!
من تنها کسی نیستم که این ایده را داشتم. و خوشبختانه برخی از پست ها در انجمن ها و پروژه های Github وجود دارد که نحوه استفاده از PowerShell برای تجزیه سیاهههای مربوط به Sysmon را توضیح می دهد. با این حال ، من می خواستم از نوشتن خط جداگانه اسکریپت تجزیه و تحلیل PS برای هر فیلد Sysmon اجتناب کنم در عوض ، من رویکرد شخص تنبلی را برای تجزیه کردن ورودی های Sysmon استفاده کردم و فکر می کنم باهوش دیگری پیش آمد.
اولین نکته مهم این است که cmdlet مناسب Get-WinEvent می تواند پرونده های Sysmon را بخواند و نتایج را در یک متغیر PS قرار دهد ، مانند زیر:
$ Events = Get-WinEvent -LogName "Microsoft-Windows-Sysmon / Operative" | $ {$ _. id -eq 1-or $ _. id -eq 11}
اگر این کار را در خانه امتحان می کنید ، با نمایش محتویات اولین عنصر آرایه رویدادهای $ ، رویدادهای $ [0] .Message ، شما متوجه می شوید که این مجموعه ای از رشته های متن یک سطحی است که به دنبال یک قالب بسیار ساده است: نام فیلد Sysmon ، یک روده بزرگ و سپس مقدار آن.

آیا شما فکر می کنید من چه فکر می کنم؟ با کمی تلاش بیشتر ما می توانیم این امر را به یک رشته با فرمت JSON تبدیل کنیم و سپس رشته را مستقیماً با استفاده از cmdlet قدرتمند ConvertFrom-Json به یک شی PS تبدیل کنیم.
من PowerScript واقعی را نشان می دهم – بسیار ساده است. این در بخش بعدی در حال حاضر ، اجازه دهید نگاهی به آنچه cmdlet جدید من با نام get-sysmonlogs و که من به عنوان یک ماژول PS نصب کردم ، بپردازیم.
به جای اینکه بخواهیم با استفاده از رابط Clunky Event Viewer ، به سیاهههای Sysmon شیرجه بزنیم. به زحمت فعالیت های نادرست را از یک جلسه PowerShell جستجو کنید و از PS که در آن cmdlet (با نام مستعار؟) استفاده شده است استفاده کنید تا نتایج را باریک کنید:

شگفت انگیز! من ابزاری ایجاد کرده ام که به شما امکان می دهد گزارش Sysmon را مثل یک پایگاه داده پرس و جو کنید. کسانی از شما که پست مختصر من را در EQL به یاد می آورید می دانند که این دقیقاً همان کاری است که این نرم افزار جالب انجام می دهد ، هرچند ، رسماً از طریق یک رابط SQL مانند واقعی. بله ، EQL مرتب است و بعداً آنرا بررسی خواهیم کرد.
تجزیه و تحلیل سیستم و نمودار
بگذارید بنشینیم و از آنچه انجام داده ایم قدردانی کنیم. اکنون ما به طور موثری یک پایگاه داده از اطلاعات رویداد Windows را از طریق PowerShell در دسترس داریم. همانطور که در بالا اشاره کردم ، پیوندها یا پیوندهایی بین این مدخل ها – از طریق ParentProcessId – وجود دارد ، بنابراین می توان سلسله مراتب فرآیندی را ضبط کرد.
اگر سری های ما را در بدافزارهای فیلترشکن دنبال کرده اید ، می دانید که هکرها دوست دارند. ایجاد حملات چند مرحله ای گیج کننده با هر فرآیند انجام یک بخش کوچک از حمله و سپس مرحله بعدی تخم ریزی. کشف این پرونده ها به راحتی امکان پذیر نیست.
اما با cmdlet Get-Sysmonlogs من و یک ساختار داده اضافی که بعداً به آن خواهیم رسید – یک نمودار به طور طبیعی – ما یک روش عملی برای تشخیص تهدیدات داریم. ما فقط نیاز به جستجوهای صحیح در بین گره ها داریم. دفعه دیگر توضیح خواهم داد که چگونه این کار را انجام دهم.
مانند همیشه در مورد پروژه های وبلاگ DIY ، نکته بسیار مهم این است که با انجام برخی از جزئیات تجزیه و تحلیل تهدید در مقیاس کوچکتر ، شما درک می کنیم که چقدر دشوار است که تشخیص تهدیدات در سطح سازمانی را انجام دهیم.
ما شروع خواهیم کرد به درک پیچیدگی های جالب توجه در قسمت دوم ، هنگامی که شروع به بافتن حوادث سیسمون در ساختارهای پیچیده تر خواهیم کرد.
قسمت دوم: استفاده از داده های رویداد Sysmon برای شناسایی تهدید
Leveraging Get-Sysmonlogs
حالا اجازه دهید نگاهی دقیق تر به cmdlet شگفت انگیز من که از وقایع Sysmon ترجمه شده است به اشیاء PowerShell می اندازیم. من تا حدودی افتخار می کنم که نیازی به خط دستی برای هر یک از زمینه ها نبودم. و این آشکار عالی است:
$ Events = Get-WinEvent -LogName "Microsoft-Windows-Sysmon / Operative" | که در آن _ $ _. id -eq 1 foreach ($ رویداد در $ رویداد) { $ ev = $ event.Message - بخش "` r`n " $ jsons = "{" foreach (خط $ در $ ev) { $ line = $ line-replace "\"، "\" ` -replace " {" ، "" " -replace "}" ، "" " -replace '"'،" "" " -برای "` n "،" " $ line = $ line -replace '( s * [ws] +): s * (. *)'، '"$ 1": "$ 2"،' $ jsons = $ jsons + $ line $ jsons = $ jsons + '"blah": "blah"' ConvertFrom-Json -InputObject $ jsons } }
اکنون کل شیبانگ در Github است ، و می توانید آن را به عنوان یک ماژول sysmon برای پروژه خود بارگیری و وارد کنید. تنها برنده بودن شامل از بین بردن چند شخصیت ناخوشایند – براکت ها ، بازگرداندن خط ها ، نقل قول های خط ، برای نقل دوستانه تر شدن Json است.
بگذارید بیشتر با Sysmonlogs دریافت کنیم. بنابراین … یک سیگنال کلاسیک از یک مزاحم در حال چرخش در اطراف سیستم ، استفاده از دستور "whoami" است – که اغلب توسط "نام میزبان" دنبال می شود. یک هکر (یا شاید خودی) که اعتبار شخص دیگری را بدست آورده است می خواهد اطمینان حاصل کند که جعل هویت آنها کار می کند ، بنابراین وقتی در سرور قربانی قرار می گیرند ، دستورات فوق را تایپ می کنید. برای بقیه ما ، whoami و نام میزبان کلماتی نیستند که بخواهیم وارد جلسات پوسته خود شویم – اگر حتی از پوسته استفاده کنیم.
با استفاده از cmdlet شسته و رفته من که به تمام ورودی های Sysmon دسترسی پیدا می کند ، می توانیم به راحتی پخته شویم خط لوله ای که نام فرآیند را فیلتر می کند (همانطور که در قسمت اول انجام دادیم). و ما می توانیم کمی گرانتر از Sysmon به دست آوریم ، و به خط فرمان والدین نگاه کنیم.
معمولاً ، وقتی هکرها وارد می شوند و دسترسی به پوسته دارند ، غالباً با میراث cmd میراث – این همان چیزی است که به هر حال ، هنگام هک کردن با psexec یا smbexec اتفاق می افتد. با استفاده از get-Symonlogs ، می توانیم شکار کنیم که فرآیندهای whoami توسط این پوسته های خزنده ایجاد شده است – شواهد خوبی که نشان دهنده یک تهدید است.

ساختار داده ها 101: لیست ها و نمودارها
نه تنها ورودی های سیاهههای مربوط به Sysmon ، خط فرمان والدین را به ما می دهند ، بلکه شناسه فرایند والدین را نیز به دست می آورند! [19659019] شما احتمالاً یک قدم جلوتر هستید ، اما بگذارید این را بیان کنم: ما اکنون می توانیم فرآیندها را با هم به سلسله مراتب وصل کنیم و به جرات می گویم ، شبکه ها را وصل کنیم. با استفاده از دانش پایه Comp Sci 101 ، برخی از ساختارهای داده طبیعی وجود دارد که ما برای گرفتن این اطلاعات استفاده می کنیم. لیست ها و نمودارهای پیوند شده بلافاصله به ذهن خطور می کنند.
در ابتدا ، من فکر کردم که باید نسخه من از "ساختار داده ها برای شاعران و سرآشپزهای سوس" را غبارآوری کنم ، اما Intertoobz به نجات من رسید. من به مجموعه شگفت انگیز الگوریتم های اصلی داگ فینک روی Gihub ، که در PowerShell نوشته شده است ، افتادم. با تشکر ، داگ
پس از گذشت زمان از منحنی یادگیری جزئی ، من توانستم از الگوریتم های ساختار داده های او برای شروع به سازماندهی داده های رویداد Sysmon استفاده کنم. من ساختار داده های لیست و نمودار را ساختم ، و سپس با استفاده از API ، یک تابع PowerShell را برای جستجوی یک دستور و لیست سلسله مراتب فرآیند نوشتم. باحال.
من آنرا راه-تهدید نامیدم. این یک جستجوی عمیق در سلسله مراتب فرآیند را انجام می دهد و نام برنامه ها و خطوط فرمان مربوط به برنامه ریشه داده شده توسط یک پارامتر را لیست می کند. برای اولین تست من ، "whoami.exe" را جستجو کردم. به همین ترتیب …

اگر در قطعه خروجی بالاتر از این نکته توجه داشتید که ویامی که مربوط به فرآیند شناسه 2542 است توسط پوسته cmd میراث تخریب شده است ، که به نوبه خود توسط آن اجرا شد. نامی عجیب اجرا شده در فهرست ویندوز.
Hmmm. اگر با مکانیک یک رمزعبور از راه دور – که در اینجا پوشیده است – آشنا هستید ، باید آژیرها خاموش شوند. من به شما راز می پردازم: بخشی از هکرها را بازی می کنم ، من قبلاً این ویامی را از طریق یک سرور از راه دور لینوکس با استفاده از اسکریپت های پایتون Impacket راه اندازی کردم.
بنابراین نکته این است که با سیسمون غنی از مواد مغذی و برخی دیگر PowerShell ، می توانید ابزارهای شکار تهدید عملی را مانند آنچه که من فقط با برنامه show-تهدید انجام دادم ، آماده کنید.
شکار تهدید Sysmon با نمودارهای کارگردانی
اکنون زمان آن رسیده که کمی برنده شوید. با تمام این اطلاعات ردیابی اطلاعات به دست آمده از Sysmon ، می توانم اتصالات را به روشی کلی تر بررسی کنم. من می خواهم به عنوان گره هایی در یک نمودار به برنامه هایی که راه اندازی می شوند فکر کنم – PowerShell.exe ، Explorer.exe ، و غیره – و سپس اتصالات را به هر برنامه تبدیل شده راه اندازی کنم. در واقع ، من در حال ایجاد یک نقشه راه هستم که نشان می دهد چگونه همه برنامه ها با یکدیگر ارتباط برقرار می کنند (به جای ایجاد گره های جداگانه برای به عنوان مثال ).
از نظر فنی ، من در مورد کارگردانی نمودار جایی که جاده ، به اصطلاح ، از یک برنامه به والدین خود یک طرفه است.
در این مرحله ، احتمالاً منطقی است که به یک گرافیکی از آنچه در موردش صحبت می کنم ، نگاه کنیم. خوشبختانه ، یک ابزار تجسم گرافیکی PowerShell به طرز شگفت انگیزی معروف به GraphViz وجود دارد که دارای بسته های آسان قابل رها از طریق PSQuickGraph است. بنابراین با این کد کمی …
# بیایید آنرا نمودار کنیم !!! $ gv = نمودار جدید -Type BiDirectionalGraph # PSQuickGraph foreach ($ e به $ g.getAllEdges ()) {$ g از توابع داگ فینک $ در مقابل = $ e.startvertex $ ve = $ e.endvertex PSQuickGraph Add-Edge -From $ vs.value.Key-to $ ve.value.Key -Graph $ gv | Out-Null } Show-GraphLayout - Graph $ gv
… ما می توانیم روابط پیچیده بین برنامه ها را از طریق رابط GraphViz تجسم کنیم:

این کجا منجر می شود؟ یک روش نمودار برای شناسایی تهدیدها وجود دارد! به جای جستجوی امضاهای متن خاص ، همانطور که در بالا با cmdlet-show-تهدید نشان دادم ، می توانیم بیابیم بی نظمی را در یک نمودار پیدا کنیم.
ایده این است که شما کار کنید محله های عادی چیست. یا نمودارهای فرعی – معمولاً در یک تجسم درهم پیچیده به نظر می رسند – و سپس سعی کنید آنچه را که به نظر می رسد گره های کمتری وصل شده اند ، نشان دهید. در واقع ، چشمان شما در انجام این کار بسیار خوب است. خوشبختانه ، برخی از الگوریتم های ساده نیز وجود دارند که می توانند محلات را کشف کرده و مزاحمان را پیدا کنند.
مزیت شکارچیان تهدید با این رویکرد این است که هکرها می توانند تکنیک های خود را تغییر داده و حملات خود را دچار مشکل کنند ، اما آنها به راحتی نمی توانند الگوهای نمودار خود را پنهان کنند.
هفته آینده این مکان را برای ادامه این بحث بررسی کنید. اگر خیلی انگیزه دارید ، می توانید در مورد تهدیدهای سایبری ناهنجاری های گرافیکی جستجو کنید تا درک کنید که چگونه محققان با این موضوع ژنتیکی برخورد می کنند.
و روزی روزگاری ، شما واقعاً پستی را در مورد استفاده از یک تکنیک برای شما نوشت. محلات خود را در یک شبکه اجتماعی در ارتباط با… یک قهرمان مشهور جنگ انقلابی قرار دهید.
قسمت سوم: یافتن زیر نمودارهای غیرمعمول با داده های Sysmon Event (مثال ساده)
قبل از اینکه به نمونه ای از کشف زیرگرافی های غیر طبیعی بپردازیم. اگر یک تهدید احتمالی را نشان می دهد – اگر این مسئله نفسی در شما ایجاد نکند ، هیچ کاری نخواهد شد! – بیایید به عقب برگردیم و نفس بکشیم.
در اینجا هشداری است که من می خواهم بگویم: این پست وبلاگ به همراه کد Github نمی تواند یک راه حل کلاس تجاری جایگزین کند. این می تواند به شما در یافتن تهدیدات در شرایط کوچکتر کمک کند ، اما هدف شریف من این است که به کارمندان امنیت فناوری اطلاعات کمک کنم تا راه حل های تهدید در دنیای واقعی را درک و درک کنند. و روش انجام این کار با ایجاد یکی از خود (با کمک من) است.
آزمایش های انجام شده در خانه به شما کمک می کند درک کنید که مقیاس یک نرم افزار تشخیص تهدید DIY دشوار است. شما باید با مجموعه داده های بزرگ و تمام موارد لازم کار کنید: تمیز کردن آن (که کار ساده ای نیست) ، کارایی پردازش آن (یافتن ساختار داده های مناسب ، الگوریتم ها ، و غیره) ، و سپس نتایج کم با نرخ های مثبت کاذب بنابراین شما مجبور نخواهید شد که همکار خود را با استفاده از مشکلات به سمت شما بیاورند.
با توجه به این نکته ، ممکن است بخواهید راه حل تشخیص تهدید خود را در نظر بگیرید … اما بعد از اتمام خواندن این سریال و آزمایش های خود را انجام دهید.
وزن گیری نمودار
یکی از راه های ساده برای ساختن یک راه حل تشخیص تهدید که کاملاً به بدافزار وابسته نیست امضاها استفاده از نمودار تهدید است که در قسمت قبلی معرفی کردم.
این گرافیکی است که گره های فرآیند را بر اساس گزارش رویداد Sysmon متصل می کند. به یاد داشته باشید: من هر رویداد فرآیند شروع (شناسه رویداد Sysmon 1) را در یک گره جداگانه نقشه برداری نکردم. در عوض ، من یک نمودار انتزاعی تر ایجاد کردم که نشان می دهد ، گره PowerShell با هر برنامه ای که توسط هر کاربر راه اندازی شده است ، یک ارتباط واحد دارد – یکی برای Excel ، مرورگر اینترنت اکسپلورر ، و غیره.

با این حال ، شما می خواهید که فرکانس این وقایع روند را پیگیری کنید. بنابراین اگر PowerShell فقط یک بار "whoami.exe" را راه اندازی کرده بود و ویرایشگر میراث ویندوز "notepad.exe" ده بار ، لبه را در نمودار از گره PowerShell به هر یک از گره های فوق می داد. "وزن" یک و ده را اختصاص داد.
در بسیاری از الگوریتم های تشخیص ناهنجاری گراف ساده ، این وزن به معیاری تبدیل می شود که برای مقایسه مناطقی از نمودار تهدید استفاده می شود. بینش اصلی این است که یک نمودار فرعی که وزن متوسط کمتری نسبت به میانگین نمودار کلی دارد ، مشکوک است.
درست است؟ از آنجا که کمتر سفر کرده است ، منطقه ای غیرمعمول است. و سپس هنگام بررسی یک تهدید احتمالی ، اگر فعالیت کاربر راه خود را به سمت قسمت کمتری از زیر نمودار پیدا کند ، وقت آن است که سطح هشدار را به رنگ زرد بالا ببرید.
رویکردی که من توصیف می کنم و اسکریپت های PowerShell هستم. معرفی زیر به معنای راه حل عملی برای یک سیستم بزرگ نیست. اما برای یک سرور منفرد ، می تواند کارآمد باشد یا حداقل آن را تأیید مستقل از ابزارهای کلاس تجاری است که استفاده می کنید.
آیا اخیراً ذکر کرده ام که الگوریتم های ساختار داده Doug Finke در PowerShell قدرتمند و خوشمزه هستند؟ من نمی توانستم بدون کار او پروژه ناهنجاری نمودار خود را انجام دهم. دوباره متشکرم ، داگ.
با کتابخانه PowerShell از توابع شگفت انگیز گراف ، می توانم به راحتی وزن چند تهدید مبتنی بر Sysmon را با تنها چند خط کد PS بردارم و همچنین می توانم وزن متوسط را بدست آورم. ] برای یک گره برای کل نمودار. در حالی که کد از نمودار عبور می کند ، وزن تمام لبه های حاصل از آن را به هر گره اختصاص می دهد ، مانند این:
$ AW = 0 # وزن میانگین $ GW = 0 # وزن کل $ mset = [System.Collections.ArrayList] @ () مجموعه زیرنویس های # مستر # با جمع کردن فرکانس ها یا وزن لبه ها ، وزن کل را محاسبه کنید foreach ($ e به $ g.getAllEdges ()) { $ GW = $ GW + $ e.weight } نوشتن میزبان "وزن نمودار:" $ GW $ AW = $ GW / $ g.vertices.count میزبان نوشتن "وزن متوسط در هر راس:" AW AW وزن # لبه ها را به سمت vertice تنظیم کنید برای ($ i = 0؛ $ i -lt $ g.vertices.count؛ $ i ++) { $ w = 0 $ v = $ g.vertices [$i] foreach ($ e در $ v.getEdges ()) { if ($ e -eq $ null) {ادامه دهید $ w = $ w + $ e.weight } $ v.value.Weight = $ w }
کد فوق حسابداری مورد نیاز ما را انجام می دهد. شما می توانید به هر گره فکر کنید که تعداد دفعات بازدید از آن بر اساس لبه های بیرون آمده از آن است.
سخت ترین قسمت از اسکریپت PowerShell نمودار – ناهنجاری من – که به زودی ارسال خواهم کرد – یافتن مناطقی از نمودار است که کمتر مورد توجه قرار می گیرند و سپس بزرگترین نمودار فرعی را که حاوی است ، پیدا کنید. برای این کار ممکن است مجبور شوید کتابهای قدیمی علوم رایانه خود را خاموش کنید. اما کدگذاری آن چندان دشوار نیست!
من از یک جستجوی کلاسیک نفس اول-جستجوی نمودار خود استفاده کردم ، از هر گره بازدید کردم و سپس آن را با گره های همسایه امتداد دادم تا اینکه زیر نمودار براساس متوسط وزن آستانه مشخصی برسد. یک گره مانند این…
تابع ext-subgraph ($ v ، $ t) { $ vertexQueue = صف جدید شی #initialize $ vertexQueue.enqueue ($ v) $ h = $ v.value.Weight $ s = @ () #subgraph $ s + = $ v $ ext = $ false در حالی که (! $ vertexQueue.isE خالی ()) {#bfs $ currentVertex = $ vertexQueue.dequeue () $ es = $ currentVertex.getEdges () foreach ($ e در $ es) { $ ev = $ e.endVertex اگر ((($ h + $ ev.value.Weight) / ($ s.count + 1) -lt $ th) { # زیر نمودار را اضافه کنید $ s + = $ ev $ h = $ h + $ ev.value.weight # آن را بالا ببرید $ vertexQueue.enqueue ($ EV) } } } if $ s.count -ge 2) {$ global: mset.Add ($ s) | Out-Null b #big کافی برای خراب کردن }
یک یادداشت کوچک برای DIYers: برای ساختن آرایه ای از آرایه ها از نوع آرایه لیست PS ، خود را از سرپیچ های زیادی صرفه جویی خواهید کرد.
بسیاری از الگوریتم های ناهنجاری گرافیکی در طبیعت وجود دارد. موردی که من استفاده کردم مبتنی بر چیزی به نام GraphBAD است که من در Intertoobz پیدا کردم – و به محض اینکه دوباره آن را پیدا کردم به آن اشاره ای خواهم کرد.
به طور کلی ، یک مشکل اصلی در تشخیص تهدید عملی یافتن است. مجموعه داده های پایه خوب. به عنوان یک وبلاگ نویس تمام وقت و یک ردیاب تهدید نیمه وقت ، نمی توانم یک گزارش سیسمون به اندازه کافی جالب که حاوی تعداد زیادی برنامه است ، ایجاد کنم. تولید زیر نمودارهای غیر عادی کمی دشوار بود از آنجا که من به اندازه کافی گسترده ای در وزن ندارم. به هر حال ، احتمالاً با استفاده از یک سرور دنیای واقعی ، یک مجموعه داده بهتر خواهید داشت و مانند پرونده من ، AWS ویندوز گاهی اوقات مورد استفاده قرار نمی گیرد.
اسکریپت PS- نمودار گراف-ناهنجاری که من نوشتم ، از زیر نمودارهای غیر عادی احتمالی استفاده می کند. وزن متوسط متوسط و من چند محله جالب را بدست آوردم (در زیر).

همانطور که اشاره کردم ، الگوریتم های ناهنجاری گرافیکی دیگری نیز وجود دارند که از معیارهای مختلفی نسبت به وزن خام استفاده می کنند و همچنین دارای ارزش هستند. کاوش یکی از آنها به خوشه های گره های مشابه و اتصالات لکه ای و یا پل بین محله های مختلف نگاه می کند. در نتیجه ناهنجاری کاربران یا فرایندهایی هستند که محلات را با خصوصیات مختلف پیوند می دهند.
اگر nerd در شما قوی است ، SCAN (الگوریتم خوشه بندی ساختاری برای شبکه ها) را بررسی کنید که من آنچه در بالا توضیح می دهم انجام می دهد. با الگوریتم های PowerShell داگ فینک ، حتی می توانید آن را پیاده سازی کنید. و من به زودی این پروژه را به آن اختصاص خواهم داد و به زودی در مخزن Github خواهم فرستاد.
یافتن ناهنجاری های با تصادفات تصادفی
اجازه دهید این بخش را با یک روش دیگر به پایان برساند تا ناهنجاری ها را در نمودار تهدید بیابیم. من در انتهای آخرین بخش به این مفهوم مراجعه کردم. برای من ، شهودی تر است و از پایه ریاضی محکم تری برخوردار است. و طرفداران نمایش تلویزیونی numb3rs قدیمی بلافاصله مفهوم زنجیره های مارکوف را می شناسند.
برای بقیه ما ، می توانیم از این طریق به عنوان یک "پیاده روی تصادفی" فکر کنیم. در هر گره ، تاسها را پرتاب می کنیم و بر اساس وزن آن ، لبه ای را انتخاب می کنیم: لبه های دارای وزنه بالاتر شانس بیشتری برای عبور دارند. شما باید نمودارها را به دو قسمت تقسیم کنید – به نام دو بخشی در میان گراف شناسان – با کاربران در یک بخش و برنامه های کاربردی در بخش دوم.
شما در پایان رتبه بندی تمام گره های برنامه را که می توانید از کاربر با رسیدن به یک گره خاص چقدر احتمال دارد. در تجزیه و تحلیل یک تهدید ، شما به برنامه های کاربردی راه اندازی شده نگاه می کنید و اگر برخی از آنها طبق تحلیلی که دارند احتمال خیلی کم برای دستیابی به آنها وجود دارد ، ممکن است یک تهدید واقعی را کشف کرده باشید!
اگر ارتباطی را بین آنچه من ایجاد می کنید ، نکات اضافی قرار دهید. فقط توضیح داده شده و الگوریتم PageRank گوگل. من این مورد را با جزئیات بیشتر در بخش بعدی شرح خواهم داد ، اما اگر کنجکاو هستید می توانید با راه اندازی مجدد پیاده روی تصادفی را جستجو کنید.
قسمت چهارم: Random Walk Theory and Practical EQL
بیایید به عقب برگردیم و آنچه را که ما می خواهیم با log Sysmon به دست آوریم ، که یک منبع باورنکردنی برای شناسایی تهدیدات و انجام آزمایش پزشکی قانونی پس از حادثه است ، مرور کنید.
در قسمت های I و II بالا ، من نشان دادم چگونه می توان اطلاعات اساسی فرآیند را تجزیه و بیرون کشید. از داده های Sysmon تا کنون خیلی خوب. اما اگر ما به فرآیند والدین و روابط فرآیند کودک به عنوان پیوند در یک نمودار فکر کنیم ، اطلاعات بیشتری وجود دارد که در سیاهه ورود به سیستم قرار گرفته است.
با بازسازی داده های ورود به سیستم Sysmon به عنوان یک نمودار ، ما یک مورد زمینه بیشتر ، و این به ما امکان می دهد فراتر از جستجوی امضای بدافزار خاص برویم. یک روش این است که سعی کنیم ساختارهای غیرمعمول یا غیر طبیعی را در نمودار تشخیص دهیم.
در قسمت سوم ، ما به یک الگوریتم ساده می پردازیم که به اتصالات لبه به عنوان نوعی وزن نگاه می کند. بخش هایی از نمودار که نسبت به میانگین نمودار کمتر "وزن" دارند (از نظر لبه ها) ممکن است به تهدیدات احتمالی اشاره داشته باشند. الگوریتم دیگر ، محله های نمودار را مبتنی بر اینکه آیا آنها با همسایگان "مشابه" مشترک هستند ، خوشه بندی می کند. بعد از اتمام صحیح کردن آنها ، PowerShell را برای هر دو الگوریتم در حساب Github خود ارسال خواهم کرد.
مزیت این روش ها این است که آنها از وابستگی به خطوط فرمان یا خاص یا نامهای پردازش خودداری می کنند ، که [مهاجمینهمیشهدرحالتغییروتحریکهستند
سرانجام ، روش دیگری وجود دارد که من در انتهای آخرین بخش ذکر کردم که برای یافتن تهدیدات متکی به تصادفی است! بیایید عمیق تر به آن شیرجه بزنیم.
راه رفتن تصادفی از طریق نمودار تهدید داده های Sysmon Event
به جای تجزیه و تحلیل ساختار نمودار ، می توانیم به جای آنکه اتصالات را به عنوان نوعی مسیر یا نقشه راه با هر گره برنامه به عنوان توقف مشاهده کنیم. در طول مسیر. ما می توانیم از Sysmon log فراوانی که هر برنامه از والدین خود راه اندازی می شود ، مشتق شویم.
اگر اسکریپت نمودار تهدید من را در Github بررسی کنید ، خواهید دید که این فرکانس در هر یک ذخیره می شود. با استفاده از الگوریتم های شگفت انگیز نمودار PowerShell داگ فینک.

این یک قدم کوتاه است تا بتوانید اطلاعات را به کار بگیرید. احتمال ، مثلاً ، PowerShell ، راهاندازی taskmgr.exe ، آنالایزر فرآیند ویندوز یا nodepad.exe یا hostname.exe.
من کجا با این کار می روم؟
خلاصه: می توانم ایجاد کنم ، ahem ماتریس انتقال احتمال محبوب پیروان آقای مارکوف است و در مدل سازی سیستم ها بسیار مورد استفاده قرار می گیرد. در واقع ، چرخش تاس ، پرش به گره برنامه بعدی در نمودار ، و تکرار – یک قدم زدن تصادفی از طریق نمودار. در نهایت ، این روش ریاضی y بر اساس احتمال ورود به آنجا از نقطه شروع ، هر گره را در نمودار قرار می دهد. شما می توانید یاد بگیرید که ، به عنوان مثال ، راه اندازی صفحه گسترده از ویندوز File Explorer بسیار رایج است ، اما یک موتور میزبان ویندوز اسکریپت ممکن است از نظر تئوری بسیار غیر معمول باشد و بنابراین احتمالاً نشانه ای از تهدید است.
این روش معروف به Random Walk With Restart (RWWR) است و نوعی تغییر در الگوریتم افسانه ای Google PageRank گوگل است.
بیایید بخشی از اسکریپتی را که برای محاسبه این رتبه ها نوشتم ، نگاهی بیندازیم:
#lets ساخت یک ردیف $ row = @ (0) * $ g.vertices.count $ w = 0 foreach ($ e در $ start.getEdges ()) al # محاسبه فرکانس کل $ w + = $ e.weight } if ($ w -eq 0) {# وصل کنید $ row [$ix] = 1 } دیگری {# ما احتمالات را اختصاص می دهیم # اکنون احتمال انتقال را ایجاد کنید foreach ($ e در $ start.getEdges ()) { $ ev = $ e.endVertex $ p = $ e.weight $ jx = v-index $ ev.value.Key $ row [$jx] = $ p / $ w # تقسیم بر کل } } $ P [$ix] = $ row #yay! یک ردیف به ماتریس انتقال اضافه شد
برای هر گره ، تعداد فرکانس کل را برای همسایگان کار می کنم و سپس احتمال استفاده از هر انتقال را با استفاده از کل به عنوان نرم کننده تعیین می کنم. بنابراین اگر PowerShell.exe 20 بازدید از همسایگان خود داشته باشد ، اما nc.exe فقط یک بار از گره PowerShell بازدید شده است ، پس احتمال انتقال 1/20 یا 0.05 است. حس می کند ، درست است؟
قسمت دشوار در حال انجام محاسبه ماتریسی است که RWWR را پیاده سازی می کند اما اگر یک کلاس مدل سازی احتمال را داشته باشید بسیار استاندارد است. یک مرور کلی وجود دارد که من در این پست روشنگری در Medium انجام می دهم.
فیلم نامه من ، که من آنرا تصادفی می نامم ، رتبه بندی می کند و سپس پایین ترین 10 را در لیست چاپ می کند. این راهی برای برجسته کردن بعید ترین برنامه هایی است که هنگام شروع از یک گره خاص در نمودار تهدید برجسته می شود. من از PowerShell به عنوان مبدأ خود استفاده کردم ، و می توانید نتایج زیر را مشاهده کنید:

RWWR به عنوان یک موضوع عملی و یک هشدار ، یک مشکل بزرگ داده در یک سیستم دنیای واقعی است. و حتی با ورود به سیستم Sysmon نوجوان من ، در انجام محاسبات تاخیر قابل توجهی وجود داشته است – تعداد زیادی ضرب از نقطه شناور!
Language Query Event (EQL) برای تجزیه و تحلیل تهدید
راه حلی که روشهای پیشرفته تری برای کشف تهدیدات ایجاد کند ، مانند آنچه در بالا پیشنهاد کردم ، چیزی فراتر از آنچه شما یا من به تنهایی ممکن است انجام دهیم نیست. و مطمئناً بسیار دقیق تر!
برای کسانی که می خواهند انگشتان خود را در آب های تشخیص تهدید فرو کنند ، اما نمی خواهند با اسکریپت های من کار کنند – من می دانم! – Language Query Event یا EQL وجود دارد. It’s an open-source project that lets you apply a query language to the Sysmon log, which you can learn more about in this stunningly comprehensive post.
EQL is great for forensic work, but it can be be used as a threat detection tool as well — assuming you have a somewhat recent copy of the Sysmon log.
The EQL gang provides an event scraper that converts the log into JSON so it’s digestible. You can look at the copy I forked off in my Github account. Unlike my static show-threat-path PS script, EQL let’s you try on-the-fly searches.
Let’s say I was interested in all cmd.exe shells that were launched from svchhost.exe, which can be a sign of an attacker using psexec.exe or smb.exe. It would look like this:

There’s a cooler and more powerful way to accomplish the above that uses the “descendant of” qualifier. This EQL statement allows you to search for all processes that have a specific ancestor anywhere in the hierarchy. For example, you might be interested in apps that have, say, regsvr32.exe as an ancestor and could have exploited a well-known vulnerability that I covered here.
There’s way too much to cover with EQL in this already long post, so I will publish more details on EQL threat hunting prowess in another post.
Closing Thoughts on DIY Threat Solutions
I promise to load the Sysmon repository with all the threat detection scripts I mentioned in this post. Periodically check back at my Github repository because I’ll be also be adding more PS graph-based threat detection utilities and some additional documents — too much to cover in this post.
If you’ve gotten this far, congratulations!
Try my scripts, or use them as a basis for developing your own threat ideas. PowerShell is up to the task of implementing sophisticated algorithms! As someone who grew up on Linux shell languages, it’s been a surprise, in a good way to work with this grown-up scripting language. And get to know the PowerShell Gallery, another great resource for battle-ready scripts: you don’t have to re-invent code in the PowerShell world.
The more important takeaway from all this is that enterprise-level vendor solutions not only have implemented more advanced threat ideas than an IT developer could ever build in his spare time, but they’re designed to handle enterprise-level traffic. Sure, using DIY solutions for analyzing underutilized servers or as additional validation for vendors’ software is a fine idea. But threat analysis and detection is indeed a big data problemand obviously not a task that PowerShell was meant to handle.
If you’re interested in learning more about how Varonis does threat analysis and detection, ask for a demo today!