Получение заблокированного сетевого трафика Windows

  • Получение заблокированного сетевого трафика Windows

Получение заблокированного сетевого трафика Windows

  • Нужно определить заблокированный трафик, заблокированный трафик включает в себя входящие и исходящие направления.
  • Два вида блокировки: на основе соединения (connection) и на основе пакета (packet). Отбрасывание пакетов происходит часто, необходимо проанализировать причины отбрасывания, блокировка на основе соединения более соответствует реальной ситуации.
  • Многие нормально обработанные пакеты также будут отброшены, поэтому необходимо различать drop и block поведение, мы в основном сосредоточены на block ситуации.

Создание тестовой среды

WFP в основном работает в usermode, часть в kernalmode, функции представлены в виде драйвера, создание тестовой среды довольно сложное. Рекомендуется использовать другой физический компьютер в качестве тестовой машины, после компиляции на компьютере разработчика, отправить на тестовую машину для удаленной отладки. Из-за ограничений условий, мы также можем напрямую отлаживать локально.

Проблемы компиляции:

Другие проблемы:

Получение событий блокировки через аудит

По умолчанию аудит WFP отключен.

  • Можно включить аудит по категориям с помощью MMC управления групповой политикой, MMC управления локальной безопасностью или команды auditpol.exe.
  • Можно включить аудит по подкатегориям с помощью команды auditpol.exe.
  • Должен использоваться guid для настройки, иначе есть проблемы локализации для разных языковых систем.
  • Аудит использует циклический журнал, 128KB, не нужно беспокоиться о потреблении ресурсов

Категорияhttps://docs.microsoft.com/en-us/windows/win32/secauthz/auditing-constants

Category/Subcategory GUID
Object Access {6997984A-797A-11D9-BED3-505054503030}
Policy Change {6997984D-797A-11D9-BED3-505054503030}

Подкатегории Object Access и соответствующие GUID https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gpac/77878370-0712-47cd-997d-b07053429f6d

Object Access Subcategory Subcategory GUID Inclusion Setting
Filtering Platform Packet Drop {0CCE9225-69AE-11D9-BED3-505054503030} No Auditing
Filtering Platform Connection {0CCE9226-69AE-11D9-BED3-505054503030} No Auditing
Other Object Access Events {0CCE9227-69AE-11D9-BED3-505054503030} No Auditing

Подкатегории Policy Change и соответствующие GUID:

Policy Change Subcategory Subcategory GUID
Audit Policy Change {0CCE922F-69AE-11D9-BED3-505054503030}
Authentication Policy Change {0CCE9230-69AE-11D9-BED3-505054503030}
Authorization Policy Change {0CCE9231-69AE-11D9-BED3-505054503030}
MPSSVC Rule-Level Policy Change {0CCE9232-69AE-11D9-BED3-505054503030}
Filtering Platform Policy Change {0CCE9233-69AE-11D9-BED3-505054503030}
Other Policy Change Events {0CCE9234-69AE-11D9-BED3-505054503030}
# Справочник auditpol: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/auditpol
# Этот раздел в основном сосредоточен на категории 'Object Access'
# Получить доступные для запроса поля
# -v показывает GUID, -r показывает отчет CSV
auditpol /list /category /v
auditpol /list /subcategory:* /v
# Получить настройки аудита для подкатегории
auditpol /get /category:'Object Access' /r | ConvertFrom-Csv| Get-Member
# Запросить GUID
auditpol /get /category:'Object Access' /r | ConvertFrom-Csv| Format-Table Subcategory,'Subcategory GUID','Inclusion Setting'
# Найти подкатегорию
auditpol /list /subcategory:"Object Access","Policy Change" -v
# Резервное копирование
auditpol /backup /file:d:\audit.bak
# Восстановление
auditpol /restore /file:d:\audit.bak
# Изменение политики
# **Policy Change**    | {6997984D-797A-11D9-BED3-505054503030}
auditpol /set /category:"{6997984D-797A-11D9-BED3-505054503030}" /success:disable /failure:disable
# Filtering Platform Policy Change | {0CCE9233-69AE-11D9-BED3-505054503030}
auditpol /set /subcategory:"{0CCE9233-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable

# **Object Access**    | {6997984A-797A-11D9-BED3-505054503030}
auditpol /get /category:"{6997984A-797A-11D9-BED3-505054503030}"
auditpol /set /category:"{6997984A-797A-11D9-BED3-505054503030}" /success:disable /failure:disable
# Filtering Platform Packet Drop | {0CCE9225-69AE-11D9-BED3-505054503030}
auditpol /set /subcategory:"{0CCE9225-69AE-11D9-BED3-505054503030}" /success:disable /failure:enable
# Filtering Platform Connection  | {0CCE9226-69AE-11D9-BED3-505054503030}
auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:disable /failure:enable
# Чтение журналов
$Events = Get-WinEvent -LogName 'Security'
foreach ($event in $Events) {
    ForEach ($line in $($event.Message -split "`r`n")) {
        Write-host $event.RecordId ':' $Line
        break
    }
}

Описание событий:

Event ID Explanation
5031(F) Служба Windows Firewall заблокировала приложение от приема входящих соединений в сети.
5150(-) Windows Filtering Platform заблокировал пакет.
5151(-) Более строгий фильтр Windows Filtering Platform заблокировал пакет.
5152(F) Windows Filtering Platform заблокировал пакет.
5153(S) Более строгий фильтр Windows Filtering Platform заблокировал пакет.
5154(S) Windows Filtering Platform разрешил приложению или службе прослушивать порт для входящих соединений.
5155(F) Windows Filtering Platform заблокировал приложение или службу от прослушивания порта для входящих соединений.
5156(S) Windows Filtering Platform разрешил соединение.
5157(F) Windows Filtering Platform заблокировал соединение.
5158(S) Windows Filtering Platform разрешил привязку к локальному порту.
5159(F) Windows Filtering Platform заблокировал привязку к локальному порту.

Подробное описание событий, на которые следует обратить внимание:

  • Audit Filtering Platform Packet Drop
    • Такие события генерируются в очень большом объеме, рекомендуется обратить внимание на событие 5157, оно записывает почти ту же информацию, но 5157 записывает на основе соединения, а не на основе пакета.

    • Объем событий отказа для этой подкатегории обычно очень высокий и обычно используется для устранения неполадок. Если вам нужно контролировать заблокированные соединения, лучше использовать «5157(F): Windows Filtering Platform заблокировал соединение», потому что оно содержит почти ту же информацию и генерируется на уровне соединения, а не на уровне пакета. Рекомендуется 5157

    • 5152

    • 5153

  • Audit Filtering Platform Connection
    • Рекомендуется обращать внимание только на события отказа, такие как заблокированные соединения, и по мере необходимости обращать внимание на разрешенные соединения.
    • 5031
      • Если у вас нет никаких правил брандмауэра (разрешения или запрета) в Windows Firewall для конкретных приложений, вы получите это событие из слоя Windows Filtering Platform, потому что по умолчанию этот слой блокирует любые входящие соединения.
    • 5150
    • 5151
    • 5155
    • 5157
    • 5159

Получение информации провайдера

# Получить информацию провайдера, связанную с security
Get-WinEvent -ListProvider "*Security*"  | Select-Object providername,id
# Microsoft-Windows-Security-Auditing                             54849625-5478-4994-a5ba-3e3b0328c30d
# Получить информацию о задачах, предоставляемых провайдером
Get-WinEvent -ListProvider "Microsoft-Windows-Security-Auditing"  | Select-Object -ExpandProperty tasks
# SE_ADT_OBJECTACCESS_FIREWALLCONNECTION       12810 Filtering Platform Connection          00000000-0000-0000-0000-000000000000
ProviderName Id
Security Account Manager 00000000-0000-0000-0000-000000000000
Security 00000000-0000-0000-0000-000000000000
SecurityCenter 00000000-0000-0000-0000-000000000000
Microsoft-Windows-Security-SPP-UX-GenuineCenter-Logging fb829150-cd7d-44c3-af5b-711a3c31cedc
Microsoft-Windows-Security-Mitigations fae10392-f0af-4ac0-b8ff-9f4d920c3cdf
Microsoft-Windows-VerifyHardwareSecurity f3f53c76-b06d-4f15-b412-61164a0d2b73
Microsoft-Windows-SecurityMitigationsBroker ea8cd8a5-78ff-4418-b292-aadc6a7181df
Microsoft-Windows-Security-Adminless ea216962-877b-5b73-f7c5-8aef5375959e
Microsoft-Windows-Security-Vault e6c92fb8-89d7-4d1f-be46-d56e59804783
Microsoft-Windows-Security-Netlogon e5ba83f6-07d0-46b1-8bc7-7e669a1d31dc
Microsoft-Windows-Security-SPP e23b33b0-c8c9-472c-a5f9-f2bdfea0f156
Microsoft-Windows-Windows Firewall With Advanced Security d1bc9aff-2abf-4d71-9146-ecb2a986eb85
Microsoft-Windows-Security-SPP-UX-Notifications c4efc9bb-2570-4821-8923-1bad317d2d4b
Microsoft-Windows-Security-SPP-UX-GC bbbdd6a3-f35e-449b-a471-4d830c8eda1f
Microsoft-Windows-Security-Kerberos 98e6cfcb-ee0a-41e0-a57b-622d4e1b30b1
Microsoft-Windows-Security-ExchangeActiveSyncProvisioning 9249d0d0-f034-402f-a29b-92fa8853d9f3
Microsoft-Windows-NetworkSecurity 7b702970-90bc-4584-8b20-c0799086ee5a
Microsoft-Windows-Security-SPP-UX 6bdadc96-673e-468c-9f5b-f382f95b2832
Microsoft-Windows-Security-Auditing 54849625-5478-4994-a5ba-3e3b0328c30d
Microsoft-Windows-Security-LessPrivilegedAppContainer 45eec9e5-4a1b-5446-7ad8-a4ab1313c437
Microsoft-Windows-Security-UserConsentVerifier 40783728-8921-45d0-b231-919037b4b4fd
Microsoft-Windows-Security-IdentityListener 3c6c422b-019b-4f48-b67b-f79a3fa8b4ed
Microsoft-Windows-Security-EnterpriseData-FileRevocationManager 2cd58181-0bb6-463e-828a-056ff837f966
Microsoft-Windows-Security-Audit-Configuration-Client 08466062-aed4-4834-8b04-cddb414504e5
Microsoft-Windows-Security-IdentityStore 00b7e1df-b469-4c69-9c41-53a6576e3dad

Создание событий блокировки

Необходимо обратить особое внимание на то, что при создании событий блокировки это повлияет на работу других программ на локальной машине! Можно своевременно использовать .\WFPSampler.exe -clean для очистки фильтра.

Шаги операции:

  1. Включить аудит Filtering Platform Connection, auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable

  2. Открыть Event Viewer, создать Custom View, создать фильтр, пока мы сосредоточимся только на трех событиях 5155, 5157, 5159. filter example

  3. Создать фильтр, мы используем WFPSampler.exe для создания фильтра, блокируем прослушивание локального порта 80, .\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4 -iplp 80

  4. Использовать сторонний (не IIS) http сервер, здесь используем nginx, по умолчанию прослушивает порт 80, дважды щелкните для запуска, что приведет к событию 5155 Пример срабатывания аудиторского события

  5. Восстановить фильтр, .\WFPSampler.exe -clean

  6. Восстановить аудиторский переключатель, auditpol /set /category:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:disable /failure:disable

# 5155 заблокировало приложение или службу от прослушивания порта для входящих соединений
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4
# 5157 заблокировало соединение
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_CONNECT_V4
# 5159, заблокировало привязку к локальному порту
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4

# Другое
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4_DISCARD
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_RECV_ACCEPT_V4_DISCARD
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_CONNECT_V4_DISCARD

# Чтобы найти конкретный фильтр Windows Filtering Platform по ID, выполните следующую команду:
netsh wfp show filters
# Чтобы найти конкретный ID слоя Windows Filtering Platform, необходимо выполнить следующую команду:
netsh wfp show state

Мониторинг сетевых событий (NET_EVENT)

  • Сетевые события поддерживают перечисление поиска, поддерживают подписку.
  • Способ перечисления поддерживает настраиваемые условия фильтрации, получение сетевых событий за определенный период времени.
  • Способ подписки может вводить функцию callback для реального времени обратной связи.

Поддерживаемые типы событий:

typedef enum FWPM_NET_EVENT_TYPE_ {
  FWPM_NET_EVENT_TYPE_IKEEXT_MM_FAILURE = 0,
  FWPM_NET_EVENT_TYPE_IKEEXT_QM_FAILURE,
  FWPM_NET_EVENT_TYPE_IKEEXT_EM_FAILURE,
  FWPM_NET_EVENT_TYPE_CLASSIFY_DROP,
  FWPM_NET_EVENT_TYPE_IPSEC_KERNEL_DROP,
  FWPM_NET_EVENT_TYPE_IPSEC_DOSP_DROP,
  FWPM_NET_EVENT_TYPE_CLASSIFY_ALLOW,
  FWPM_NET_EVENT_TYPE_CAPABILITY_DROP,
  FWPM_NET_EVENT_TYPE_CAPABILITY_ALLOW,
  FWPM_NET_EVENT_TYPE_CLASSIFY_DROP_MAC,
  FWPM_NET_EVENT_TYPE_LPM_PACKET_ARRIVAL,
  FWPM_NET_EVENT_TYPE_MAX
} FWPM_NET_EVENT_TYPE;

Поддерживаемые условия фильтрации (FWPM_NET_EVENT_ENUM_TEMPLATE):

Value Meaning
FWPM_CONDITION_IP_PROTOCOL Номер IP протокола, как указано в RFC 1700.
FWPM_CONDITION_IP_LOCAL_ADDRESS Локальный IP адрес.
FWPM_CONDITION_IP_REMOTE_ADDRESS Удаленный IP адрес.
FWPM_CONDITION_IP_LOCAL_PORT Локальный номер порта транспортного протокола. Для ICMP тип сообщения.
FWPM_CONDITION_IP_REMOTE_PORT Удаленный номер порта транспортного протокола. Для ICMP код сообщения.
FWPM_CONDITION_SCOPE_ID Идентификатор области интерфейса IPv6. Зарезервировано для внутреннего использования.
FWPM_CONDITION_ALE_APP_ID Полный путь приложения.
FWPM_CONDITION_ALE_USER_ID Идентификация локального пользователя.

Неводные вызовы могут получить только обычные события drop.

Мониторинг сетевых соединений (NetConnection)

По сравнению с мониторингом сетевых событий, мониторинг соединений требует более высоких прав доступа. Способ callback

Вызывающему необходимо иметь доступ FWPM_ACTRL_ENUM к контейнерам объектов соединения и доступ FWPM_ACTRL_READ к объектам соединения. См. Access Control для получения дополнительной информации.

Пока не удалось успешно контролировать сетевые соединения.

Нашел ту же проблему, Receiving in/out traffic stats using WFP user-mode API, и явление, которое я столкнулся в своем исследовании, одинаково, функция подписки не получает никаких сообщений, не получает никаких событий, нет ошибок. Кто-то указал, что в нережиме ядра можно получить только отчеты о событиях drop, что не удовлетворяет потребности в получении событий блокировки.

Пример добавления security descriptor: https://docs.microsoft.com/en-us/windows/win32/fwp/reserving-ports

Приложение уровня контроля (ALE) обзор

  • ALE включает в себя ряд фильтров в режиме ядра, поддерживающих состояние фильтрации.
  • Фильтры на уровне ALE могут авторизовать создание соединений, распределение портов, управление сокетами, создание raw сокетов и прием в режиме promiscuous.
  • Фильтры на уровне ALE классифицируются на основе соединения (connection) или на основе сокета (socket), фильтры на других уровнях могут классифицироваться только на основе пакета (packet).
  • Ссылки на фильтры ALE ale-layers

Кодирование

Большинство функций WFP могут быть вызваны из пользовательского режима или режима ядра. Однако функции пользовательского режима возвращают значения DWORD, представляющие коды ошибок Win32, а функции режима ядра возвращают значения NTSTATUS, представляющие коды состояния NT. Следовательно, имена и семантика функций одинаковы в пользовательском режиме и режиме ядра, но сигнатуры функций различаются. Это требует отдельных заголовков для пользовательского режима и режима ядра. Имена заголовочных файлов пользовательского режима заканчиваются на “u”, имена заголовочных файлов режима ядра заканчиваются на “k”.

Выводы

Требуется только знать о возникновении событий, нет необходимости немедленно обрабатывать события, кроме того, разработка драйвера приведет к большему риску, поэтому было решено использовать аудит событий, мониторинг журналов для генерации событий для получения событий блокировки.
Откройте новый поток для использования NotifyChangeEventLog для мониторинга событий журнала.

Приложение

Архитектура WFP

WFP (Windows Filter Platform) Основная архитектура Windows Filtering Platform

Поток данных

Поток данных:

  1. Пакет поступает в сетевой стек.
  2. Сетевой стек находит и вызывает шим.
  3. Шим вызывает процесс классификации на определенном уровне.
  4. Во время классификации фильтры сопоставляются и принимается результирующее действие. (См. Фильтрация арбитража.)
  5. Если во время процесса классификации совпадают какие-либо фильтры callout, вызываются соответствующие callout.
  6. Шим действует на окончательное решение фильтрации (например, отбрасывает пакет).

Ссылки