Подробный гайд по аудиту SMB-трафика из PCAP через Python и Scapy - Часть 3
3.15. Парсинг экспортированных EVTX-файлов через Python
Если вы экспортировали журнал в .evtx, его можно разбирать через python-evtx.
Установка:
pip install python-evtx
Скрипт parse_evtx_smb.py:
#!/usr/bin/env python3
import argparse
import csv
import sys
import xml.etree.ElementTree as ET
from pathlib import Path
try:
from Evtx.Evtx import Evtx
except ImportError:
print("Install python-evtx first: pip install python-evtx", file=sys.stderr)
sys.exit(1)
NS = {
"e": "http://schemas.microsoft.com/win/2004/08/events/event"
}
DEFAULT_IDS = {5140, 5145, 4624, 4625}
CSV_FIELDS = [
"TimeCreated",
"EventID",
"Computer",
"User",
"Domain",
"LogonType",
"IpAddress",
"IpPort",
"ShareName",
"SharePath",
"RelativeTargetName",
"AccessMask",
"AccessList",
"AccessReason",
"Status",
"AuthenticationPackageName",
"LogonProcessName",
]
def parse_event(xml_text, target_ids):
try:
root = ET.fromstring(xml_text)
except ET.ParseError:
return None
event_id_text = root.findtext("e:System/e:EventID", default="0", namespaces=NS)
try:
event_id = int(event_id_text)
except ValueError:
return None
if event_id not in target_ids:
return None
time_created_node = root.find("e:System/e:TimeCreated", NS)
time_created = time_created_node.get("SystemTime") if time_created_node is not None else ""
computer = root.findtext("e:System/e:Computer", default="", namespaces=NS)
data = {}
event_data = root.find("e:EventData", NS)
if event_data is not None:
for item in event_data.findall("e:Data", NS):
name = item.get("Name")
if name:
data[name] = item.text or ""
user = data.get("SubjectUserName") or data.get("TargetUserName") or ""
domain = data.get("SubjectDomainName") or data.get("TargetDomainName") or ""
return {
"TimeCreated": time_created,
"EventID": event_id,
"Computer": computer,
"User": user,
"Domain": domain,
"LogonType": data.get("LogonType", ""),
"IpAddress": data.get("IpAddress", ""),
"IpPort": data.get("IpPort", ""),
"ShareName": data.get("ShareName", ""),
"SharePath": data.get("SharePath", ""),
"RelativeTargetName": data.get("RelativeTargetName", ""),
"AccessMask": data.get("AccessMask", ""),
"AccessList": data.get("AccessList", ""),
"AccessReason": data.get("AccessReason", ""),
"Status": data.get("Status", ""),
"AuthenticationPackageName": data.get("AuthenticationPackageName", ""),
"LogonProcessName": data.get("LogonProcessName", ""),
}
def main():
parser = argparse.ArgumentParser(description="Parse EVTX for SMB audit events.")
parser.add_argument("evtx", help="Path to .evtx file")
parser.add_argument("-o", "--output", default="smb_events_from_evtx.csv")
parser.add_argument("--ids", default="5140,5145,4624,4625", help="Comma-separated Event IDs")
args = parser.parse_args()
target_ids = {int(x.strip()) for x in args.ids.split(",") if x.strip()}
path = Path(args.evtx)
if not path.exists():
print(f"File not found: {path}", file=sys.stderr)
sys.exit(1)
rows = []
with Evtx(str(path)) as log:
for record in log.records():
row = parse_event(record.xml(), target_ids)
if row:
rows.append(row)
with open(args.output, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=CSV_FIELDS)
writer.writeheader()
writer.writerows(rows)
print(f"Wrote {len(rows)} rows to {args.output}")
if __name__ == "__main__":
main()
Запуск:
python parse_evtx_smb.py Security.evtx -o smb_audit.csv
Только конкретные события:
python parse_evtx_smb.py Security.evtx --ids 5145 -o smb_5145.csv
3.16. Экспорт журнала вручную
Можно экспортировать журнал безопасности в .evtx через Event Viewer или через wevtutil.
Пример:
wevtutil epl Security C:\audit\Security_backup.evtx
Для конкретного лога:
wevtutil epl Microsoft-Windows-SMBServer/Operational C:\audit\SMBServer_Operational.evtx
3.17. SMBServer и SMBClient логи
Помимо Security-лога полезны:
Applications and Services Logs
-> Microsoft
-> Windows
-> SMBServer
-> Operational
и:
Applications and Services Logs
-> Microsoft
-> Windows
-> SMBClient
-> Connectivity
-> Operational
Включить через wevtutil:
wevtutil sl Microsoft-Windows-SMBServer/Operational /e:true
wevtutil sl Microsoft-Windows-SMBClient/Operational /e:true
Посмотреть через PowerShell:
Get-WinEvent -LogName Microsoft-Windows-SMBServer/Operational -MaxEvents 50
Get-WinEvent -LogName Microsoft-Windows-SMBClient/Operational -MaxEvents 50
Эти журналы полезны для диагностики проблем с SMB, но основной аудит доступа к файлам все равно лучше строить вокруг Security-событий.
3.18. Пересылка событий на центральный сервер: WEF
Если файловых серверов много, события лучше централизованно собирать через Windows Event Forwarding, WEF.
Базовая логика:
- Настроить коллектор событий:
winrm quickconfig
wecutil qc
- Создать подписку на события.
- Дать компьютерам-источникам права на отправку событий.
- Настроить firewall для WinRM.
- При возможности использовать HTTPS.
Пример минимальной подписки в XML:
<Subscription Name="SMB-Audit" xmlns="http://schemas.microsoft.com/2007/08/WindowsEvents">
<SubscriptionType>SourceInitiated</SubscriptionType>
<Description>Collect SMB file share audit events</Description>
<Enabled>true</Enabled>
<Uri>http://schemas.microsoft.com/wbem/wsman/1/windows/EventLog</Uri>
<ConfigurationMode>Normal</ConfigurationMode>
<Delivery Mode="Push">
<Batching>
<MaxItems>5</MaxItems>
<MaxLatencyTime>10000</MaxLatencyTime>
</Batching>
<PushSettings>
<Heartbeat Interval="3600000"/>
</PushSettings>
</Delivery>
<Query>
<Select Path="Security">
*[System[(EventID=5140 or EventID=5145 or EventID=4624 or EventID=4625)]]
</Select>
</Query>
<ReadExistingEvents>true</ReadExistingEvents>
<TransportName>HTTP</TransportName>
<ContentFormat>RenderedText</ContentFormat>
<Locale Language="en-US"/>
<LogFile>ForwardedEvents</LogFile>
</Subscription>
Создать подписку:
wecutil cs subscription.xml
Для продакшена лучше:
- использовать HTTPS для WinRM;
- ограничивать права на чтение пересланных событий;
- отправлять события в SIEM;
- настроить алерты на критичные события.
3.19. Что искать в событиях
Полезные сценарии обнаружения:
1. Массовый доступ к файлам
- один пользователь за короткое время открывает тысячи файлов;
- много событий 5145 с
ReadData.
2. Доступ к административным шарам
ADMIN$;C$;IPC$.
3. Ошибки доступа
- много событий со статусом
0xC0000022; - попытки перебора путей.
4. Подключения с необычных хостов
- новые
IpAddressдля пользователя; - нестандартное время доступа.
5. Использование SMB1
- желательно выявлять и отключать SMB1;
- SMB1 небезопасен и часто используется в атаках.
6. Изменение шар и прав
- события 5142/5143/5144;
- события 4670 при изменении разрешений.
3.20. Производительность и объем логов
Detailed File Share, особенно событие 5145, может генерировать очень много записей.
Рекомендации:
- Не включайте детальный аудит на всех серверах без необходимости.
- Для критичных папок используйте точечные SACL.
- Увеличьте размер Security-лога.
- Настройте архивацию или пересылку в SIEM.
- Используйте фильтрацию на этапе сбора, если это поддерживается.
- Тестируйте нагрузку до внедрения в продакшен.
3.21. Рекомендации по безопасности SMB
Аудит — это хорошо, но параллельно стоит усилить саму SMB-инфраструктуру.
Проверьте параметры:
Get-SmbServerConfiguration
Рекомендуется:
- Отключить SMB1.
- Включить поддержку только SMB2/SMB3.
- Использовать SMB-подписывание, если это допустимо инфраструктурой.
- Использовать SMB-шифрование для чувствительных шар, если поддерживается клиентами.
- Ограничить доступ к административным шарам.
- Регулярно проверять права на файловых шарах и NTFS.
Примеры:
# Посмотреть конфигурацию
Get-SmbServerConfiguration
# Включить аудит использования SMB1, если он еще не отключен
Set-SmbServerConfiguration -AuditSmb1Access $true -Force
# Требовать подписывание, если применимо
Set-SmbServerConfiguration -RequireSecuritySignature $true -Confirm:$false
Отключение компонента SMB1:
Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart
Для серверных ролей проверяйте совместимость с приложениями.
4. Что выбрать на практике
Если есть только сетевой дамп
Используйте:
- Scapy-скрипт для первичной статистики.
tsharkдля извлечения SMB-полей.pyshark, если нужна автоматизация на Python поверх диссектора Wireshark.
Пример рабочего процесса:
# Статистика TCP-сессий
tshark -r capture.pcap -Y "tcp.port == 445" -z conv,tcp
# SMB2-команды
tshark -r capture.pcap -Y "smb2" -T fields \
-e frame.time_epoch -e ip.src -e ip.dst -e smb2.cmd -e smb2.status
# Попытка извлечь имена файлов из CREATE
tshark -r capture.pcap -Y "smb2.cmd == 5" -T fields \
-e frame.time_epoch -e ip.src -e ip.dst -e smb2.filename
Если нужен полноценный аудит файлов
Используйте:
File Shareaudit.Detailed File Shareaudit.- При необходимости
File System+ SACL. - Сбор 5140/5145/4624/4625.
- Экспорт в CSV/EVTX или пересылку в SIEM.
5. Чек-лист
Для PCAP/Scapy
- Установить
scapy. - Проверить порты 445/139.
- Использовать
TCPSession, если доступна. - Извлекать магические маркеры
0xFF SMB,0xFE SMB,0xFD SMB. - Учитывать шифрование и фрагментацию.
- Для имен файлов предпочитать
tshark/pyshark.
Для Windows SMB-аудита
- Включить
File Share. - Включить
Detailed File Share. - При необходимости включить
File Systemи настроить SACL. - Включить
Logonsuccess/failure. - Увеличить размер Security-лога.
- Собирать события 5140, 5145, 4624, 4625.
- Для домена настраивать через GPO.
- Централизованно пересылать события через WEF или SIEM.
- Проверять статусы доступа, пользователей, IP-адреса и имена файлов.
Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.