Як Sysmon Логує DNS Запити
Вступ
Sysmon подія 22 (DNSEvent) сповіщає про новий DNS запит який зробила ваша система, що може бути корисним для виявлення C2 чи підвантаження малварі. Проте, не кожен запит логується, і в цьому пості спробуємо розібратись в причинах.
Як Це Працює
Перед початком тестування переконайтесь що у вас Windows 8.1+, поточна конфігурація Sysmon логує подію 22, а також не робить виключення на домени зі зразків нижче. Далі, спробуйте запустити дві команди - ping google.com
, та nslookup google.com
. Обидві команди зроблять DNS запит, проте сисмон створить лише одну подію на ping, як на скріншоті нижче:
На відміну від ping та більшості інших віндових утиліт, nslookup не використовує системних DLL, а імплементує власний DNS клієнт. Сисмон натомість, відстежує запити не на рівні мережі, а просто моніторить звернення до певних функцій. Детальніше про це тут. Тобто, поки програма має вбудований DNS клієнт та користується виключно ним - запити від неї невидимі для сисмону. А якщо це вийшло у nslookup, тоді вийде і у зловмисників. До прикладу, Python код нижче імплементує власний DNS клієнт, і запити від нього не залогуються:
# pip install dnspython urllib3
# https://stackoverflow.com/questions/22609385/python-requests-library-define-specific-dns
import dns.resolver
from urllib3 import request
from urllib3.util import connection
RESOLVER = "1.1.1.1"
DOMAIN = "google.com"
_orig_create_connection = connection.create_connection
def patched_create_connection(address, *args, **kwargs):
host, port = address
dnsresolver = dns.resolver.Resolver()
dnsresolver.nameservers = [RESOLVER]
hostname = dnsresolver.resolve(host)[0].to_text()
return _orig_create_connection((hostname, port), *args, **kwargs)
connection.create_connection = patched_create_connection
resp = request("GET", f"https://{DOMAIN}")
print(f"Connected to {DOMAIN} [{resp.status}]: {resp.data[:50]}")
Спостереження
Такою особливістю логування іноді користуються зловмисники, і деякі режими роботи Cobalt Strike, Sliver, чи інших С2 не залишать після себе жодної події 22. Однак, важливо зауважити що власні DNS клієнти це рідкість - як для легітимних програм, так і для малварі. З моїх тестів, запити від наступних процесів стабільно логуються подією 22:
- Certutil та Curl
- PowerShell IWR/DownloadFile/Інші
- Bitsadmin (Image буде svchost.exe)
- Metasploit Meterpreter
- Sliver mTLS Beacon
У Підсумку
Подія DNSEvent все ще повністю актуальна для виявлення загроз і дуже корисна для збору додаткового контексту про атаку. Проте, важливо також розуміти обмеження DNSEvent та перекривати сліпі зони подією 15, логами DNS серверу, чи іншими джерелами даних. Наостанок, декілька цікавих фактів:
1. Запити що походять від браузерів не логуються. Сучасні браузери мають свої DNS клієнти, DNS over HTTP, а також ще з десяток факторів що запобігають логуванню.
2. Вхідні запити на DNS сервер (dns.exe) також не логуються. Тобто якщо ви поставите Sysmon на домен контролер чи виділений DNS сервер - запитів з усієї мережі ви не побачите.
3. А ось якщо домен записаний в C:\Windows\System32\drivers\etc\hosts
- звернення до нього також залогуються подією 22. Для мене це було несподіванкою, адже \etc\hosts не використовує DNS взагалі.
4. На моїй Windows 11 дефендер блокує будь-які завантаження через certutil, навіть з внутрішніх айпі чи локалхоста :)