Подробный гайд по аудиту SMB-трафика из PCAP через Python и Scapy - Часть 3

Практический гайд по аудиту SMB-трафика из PCAP через Python и Scapy, а также настройке детального аудита файловых шар в Windows Event Log.

2026.09.29                  


Подробный гайд по аудиту SMB-трафика из PCAP через Python и Scapy - Часть 3Подробный гайд по аудиту 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.

Базовая логика:

  1. Настроить коллектор событий:
   winrm quickconfig
   wecutil qc
  1. Создать подписку на события.
  2. Дать компьютерам-источникам права на отправку событий.
  3. Настроить firewall для WinRM.
  4. При возможности использовать 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, может генерировать очень много записей.

Рекомендации:

  1. Не включайте детальный аудит на всех серверах без необходимости.
  2. Для критичных папок используйте точечные SACL.
  3. Увеличьте размер Security-лога.
  4. Настройте архивацию или пересылку в SIEM.
  5. Используйте фильтрацию на этапе сбора, если это поддерживается.
  6. Тестируйте нагрузку до внедрения в продакшен.

3.21. Рекомендации по безопасности SMB

Аудит — это хорошо, но параллельно стоит усилить саму SMB-инфраструктуру.

Проверьте параметры:

Get-SmbServerConfiguration

Рекомендуется:

  1. Отключить SMB1.
  2. Включить поддержку только SMB2/SMB3.
  3. Использовать SMB-подписывание, если это допустимо инфраструктурой.
  4. Использовать SMB-шифрование для чувствительных шар, если поддерживается клиентами.
  5. Ограничить доступ к административным шарам.
  6. Регулярно проверять права на файловых шарах и NTFS.

Примеры:

# Посмотреть конфигурацию
Get-SmbServerConfiguration

# Включить аудит использования SMB1, если он еще не отключен
Set-SmbServerConfiguration -AuditSmb1Access $true -Force

# Требовать подписывание, если применимо
Set-SmbServerConfiguration -RequireSecuritySignature $true -Confirm:$false

Отключение компонента SMB1:

Disable-WindowsOptionalFeature -Online -FeatureName SMB1Protocol -NoRestart

Для серверных ролей проверяйте совместимость с приложениями.


4. Что выбрать на практике

Если есть только сетевой дамп

Используйте:

  1. Scapy-скрипт для первичной статистики.
  2. tshark для извлечения SMB-полей.
  3. 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

Если нужен полноценный аудит файлов

Используйте:

  1. File Share audit.
  2. Detailed File Share audit.
  3. При необходимости File System + SACL.
  4. Сбор 5140/5145/4624/4625.
  5. Экспорт в 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.
  • Включить Logon success/failure.
  • Увеличить размер Security-лога.
  • Собирать события 5140, 5145, 4624, 4625.
  • Для домена настраивать через GPO.
  • Централизованно пересылать события через WEF или SIEM.
  • Проверять статусы доступа, пользователей, IP-адреса и имена файлов.

Информация предоставлена в ознакомительных целях. Применение описанных настроек в системах, должно осуществляться только после согласования с ответственными за информационную безопасность и в соответствии с требованиями ФСТЭК, ФСБ и иных уполномоченных органов.


Статью подготовил: Аверко Денис Сергеевич @Nymexis г. Омск (специалист по ЗИ)

Комментарии

Загрузка...
Если комментарии не загружаются, можете попробовать отключить блокировщик рекламы для этого сайта