Obtenção de Tráfego de Rede Bloqueada no Windows
Categories:
- Obtenção de Tráfego de Rede Bloqueada no Windows
Obtenção de Tráfego de Rede Bloqueada no Windows
- Obtenção de Tráfego de Rede Bloqueada no Windows
- É necessário identificar o tráfego bloqueado, incluindo direções de saída e entrada.
- Existem duas formas de bloqueio, baseadas em conexão (connection) e baseadas em pacotes (packet). O descarte de pacotes é mais frequente e comum, exigindo a análise da razão do descarte. O bloqueio baseado em conexão é mais compatível com cenários de bloqueio realmente importantes.
- Muitos pacotes processados normalmente também são descartados, portanto é necessário distinguir entre descarte (drop) e bloqueio (block). Estamos principalmente interessados em situações de bloqueio.
Criando um Projeto de Teste
O WFP funciona principalmente no modo usuário, com outra parte no modo kernel, exibindo-se na forma de drivers. O método de criar um ambiente de teste é relativamente complexo. Recomenda-se usar outra máquina física como máquina de teste, compilar no computador de desenvolvimento e enviar para depuração remota na máquina de teste. Devido a limitações de condições, também podemos depurar localmente.
- Projeto Exemplo Microsoft WFP
- Focar apenas em: Windows-driver-samples\network\trans\WFPSampler
- Guia do Projeto WFPSampler
Problemas de Compilação:
Outros Problemas:
- O programa driver não pode ser executado
- Como assinar
- Preparando a máquina de teste para implantação
Obtendo Eventos de Bloqueio por Auditoria
Por padrão, a auditoria do WFP está desativada.
- É possível habilitar a auditoria por categoria usando o Editor de Objetos de Política de Grupo, a unidade de gerenciamento MMC de Segurança Local ou o comando auditpol.exe.
- É possível habilitar a auditoria por subcategoria usando o comando auditpol.exe.
- O GUID deve ser usado para configuração, caso contrário, haverá problemas de localização em sistemas de diferentes idiomas.
- A auditoria usa logs circulares de 128KB, sem preocupações com consumo de recursos
Categoriahttps://docs.microsoft.com/en-us/windows/win32/secauthz/auditing-constants
| Categoria/Subcategoria | GUID |
|---|---|
| … | … |
| Object Access | {6997984A-797A-11D9-BED3-505054503030} |
| Policy Change | {6997984D-797A-11D9-BED3-505054503030} |
| … | … |
Subclasses Object Access e seus GUIDs correspondentes https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-gpac/77878370-0712-47cd-997d-b07053429f6d
| Subclasse de Object Access | GUID da Subcategoria | Configuração de Inclusão |
|---|---|---|
| … | … | … |
| 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 |
| … | … | … |
Subclasses Policy Change e seus GUIDs correspondentes:
| Subclasse de Policy Change | GUID da Subcategoria |
|---|---|
| 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} |
# Consulte o manual do auditpol em: https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/auditpol
# Este segmento foca principalmente na categoria 'Object Access'
# Obter campos consultáveis
# -v Mostra GUID, -r mostra relatório CSV
auditpol /list /category /v
auditpol /list /subcategory:* /v
# Obter configurações de auditoria de uma subclasse específica
auditpol /get /category:'Object Access' /r | ConvertFrom-Csv| Get-Member
# Consultar GUID
auditpol /get /category:'Object Access' /r | ConvertFrom-Csv| Format-Table Subcategory,'Subcategory GUID','Inclusion Setting'
# Localizar subcategoria
auditpol /list /subcategory:"Object Access","Policy Change" -v
# Backup
auditpol /backup /file:d:\audit.bak
# Restaurar
auditpol /restore /file:d:\audit.bak
# Modificar Política
# **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
# Ler logs
$Events = Get-WinEvent -LogName 'Security'
foreach ($event in $Events) {
ForEach ($line in $($event.Message -split "`r`n")) {
Write-host $event.RecordId ':' $Line
break
}
}
Descrição dos Eventos:
| ID do Evento | Explicação |
|---|---|
| 5031(F) | O serviço Windows Firewall bloqueou um aplicativo de aceitar conexões de entrada na rede. |
| 5150(-) | O Windows Filtering Platform bloqueou um pacote. |
| 5151(-) | Um filtro mais restritivo do Windows Filtering Platform bloqueou um pacote. |
| 5152(F) | O Windows Filtering Platform bloqueou um pacote. |
| 5153(S) | Um filtro mais restritivo do Windows Filtering Platform bloqueou um pacote. |
| 5154(S) | O Windows Filtering Platform permitiu que um aplicativo ou serviço escutasse em uma porta para conexões de entrada. |
| 5155(F) | O Windows Filtering Platform bloqueou um aplicativo ou serviço de escutar em uma porta para conexões de entrada. |
| 5156(S) | O Windows Filtering Platform permitiu uma conexão. |
| 5157(F) | O Windows Filtering Platform bloqueou uma conexão. |
| 5158(S) | O Windows Filtering Platform permitiu um bind a uma porta local. |
| 5159(F) | O Windows Filtering Platform bloqueou um bind a uma porta local. |
Descrição detalhada dos eventos de interesse:
- Auditoria de Filtragem de Pacotes da Plataforma
-
Esse tipo de evento é muito grande em volume, recomenda-se focar no evento 5157, que registra informações quase idênticas, mas o 5157 registra por conexão, não por pacote.
-
O volume de eventos de falha costuma ser muito alto para esta subcategoria e costuma ser usado para solução de problemas. Se precisar monitorar conexões bloqueadas, é melhor usar “5157(F): O Windows Filtering Platform bloqueou uma conexão”, porque contém quase a mesma informação e gera por conexão, não por pacote.

-
- Auditoria de Conexão da Plataforma de Filtragem
- Recomenda-se focar apenas nos eventos de falha, como conexões bloqueadas, e monitorar conexões permitidas conforme necessário.
- 5031
- Se não houver regras de firewall (Allow ou Deny) no Windows Firewall para aplicativos específicos, você receberá esse evento da camada Windows Filtering Platform, porque por padrão essa camada nega qualquer conexão de entrada.
51505151- 5155
- 5157
- 5159
Obtendo Informações do Provedor
# Obter informações do provedor relacionadas à segurança
Get-WinEvent -ListProvider "*Security*" | Select-Object providername,id
# Microsoft-Windows-Security-Auditing 54849625-5478-4994-a5ba-3e3b0328c30d
# Obter informações de tarefas fornecidas pelo provedor
Get-WinEvent -ListProvider "Microsoft-Windows-Security-Auditing" | Select-Object -ExpandProperty tasks
# SE_ADT_OBJECTACCESS_FIREWALLCONNECTION 12810 Filtering Platform Connection 00000000-0000-0000-0000-000000000000
| Nome do Provedor | 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 |
Construindo Eventos de Bloqueio
É muito importante observar que, ao construir eventos de bloqueio, isso afetará o funcionamento de outros softwares locais!
É possível usar .\WFPSampler.exe -clean para limpar filtros a tempo.
Passos da operação:
-
Abra a auditoria da Filtering Platform Connection,
auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable -
Abra o Visualizador de Eventos, crie uma Visualização Personalizada, crie um filtro, focamos temporariamente apenas nos eventos 5155, 5157, 5159.

-
Construa um filtro, usamos WFPSampler.exe para construir o filtro, bloqueando a escuta da porta 80 local,
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4 -iplp 80 -
Use um servidor http de terceiros (não IIS), aqui usamos nginx, escuta a porta 80 por padrão, clique duas vezes para iniciar, disparando o evento 5155

-
Restaure o filtro,
.\WFPSampler.exe -clean -
Restaure a auditoria,
auditpol /set /category:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:disable /failure:disable
# 5155 blocked an application or service from listening on a port for incoming connections
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_AUTH_LISTEN_V4
# 5157 blocked a connection
.\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, blocked a bind to a local port
.\WFPSampler.exe -s BASIC_ACTION_BLOCK -l FWPM_LAYER_ALE_RESOURCE_ASSIGNMENT_V4
# Other
.\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
# To find a specific Windows Filtering Platform filter by ID, run the following command:
netsh wfp show filters
# To find a specific Windows Filtering Platform layer ID, you need to execute the following command:
netsh wfp show state
Monitorando Eventos de Rede (NET_EVENT)
- Os eventos de rede suportam busca enumerada e assinatura.
- O método de enumeração suporta condições de filtro personalizadas, obtendo eventos de rede em um determinado período.
- O método de assinatura pode injetar uma função de callback, fornecendo feedback em tempo real.
Tipos de eventos suportados:
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;
Condições de filtro suportadas (FWPM_NET_EVENT_ENUM_TEMPLATE):
| Valor | Significado |
|---|---|
| FWPM_CONDITION_IP_PROTOCOL | O número do protocolo IP, conforme especificado na RFC 1700. |
| FWPM_CONDITION_IP_LOCAL_ADDRESS | O endereço IP local. |
| FWPM_CONDITION_IP_REMOTE_ADDRESS | O endereço IP remoto. |
| FWPM_CONDITION_IP_LOCAL_PORT | O número da porta do protocolo de transporte local. Para ICMP, o tipo de mensagem. |
| FWPM_CONDITION_IP_REMOTE_PORT | O número da porta do protocolo de transporte remoto. Para ICMP, o código da mensagem. |
| FWPM_CONDITION_SCOPE_ID | O identificador de escopo da interface IPv6. Reservado para uso interno. |
| FWPM_CONDITION_ALE_APP_ID | O caminho completo do aplicativo. |
| FWPM_CONDITION_ALE_USER_ID | A identificação do usuário local. |
Chamadas fora do driver só podem obter eventos de queda comuns.
Monitorando Conexões de Rede (NetConnection)
Comparado ao monitoramento de eventos de rede, o monitoramento de conexões requer privilégios mais altos. Forma de callback
O chamador precisa de acesso FWPM_ACTRL_ENUM aos contêineres de objetos de conexão e acesso FWPM_ACTRL_READ aos objetos de conexão. Consulte Controle de Acesso para obter mais informações.
Ainda não foi possível monitorar conexões de rede com sucesso.
Encontrei o mesmo problema, Receiving in/out traffic stats using WFP user-mode API, igual ao fenômeno encontrado na minha pesquisa, a função de assinatura não recebe nenhum relatório, não obtém nenhum evento, sem erros. Alguém sugeriu que apenas eventos de queda podem ser relatados fora do modo kernel, o que não atende à necessidade de obter eventos de bloqueio. Adicionar exemplo de descritor de segurança: https://docs.microsoft.com/en-us/windows/win32/fwp/reserving-ports
Introdução ao Application Layer Enforcement (ALE)
- O ALE inclui uma série de filtros em modo kernel, suportando filtragem com estado.
- Os filtros na camada ALE podem autorizar a criação de conexões, atribuição de portas, gerenciamento de sockets, criação de sockets brutos e recepção em modo promíscuo.
- Os filtros na camada ALE podem ser classificados por conexão ou por socket, enquanto os filtros em outras camadas só podem ser classificados por pacote.
- Consulte ale-layers para filtros ALE
- Consulte filtering-layer-identifiers para mais filtros
Codificação
A maioria das funções WFP pode ser chamada do modo usuário ou do modo kernel. No entanto, as funções do modo usuário retornam valores DWORD que representam códigos de erro Win32, enquanto as funções do modo kernel retornam valores NTSTATUS que representam códigos de status NT. Portanto, os nomes e semânticas das funções são iguais entre o modo usuário e o modo kernel, mas as assinaturas das funções são diferentes. Isso requer cabeçalhos separados específicos para o modo usuário e para o modo kernel. Os nomes dos arquivos de cabeçalho do modo usuário terminam com “u”, e os nomes dos arquivos de cabeçalho do modo kernel terminam com “k”.
Conclusão
A necessidade é apenas saber que o evento ocorreu, não precisa processar o evento imediatamente. Além disso, desenvolver drivers traz riscos maiores. Portanto, decidi usar auditoria de eventos e monitorar a geração de logs para obter eventos de bloqueio. Abra uma nova thread para usar NotifyChangeEventLog para monitorar eventos de registro de logs.
Apêndice
Arquitetura WFP
WFP (Windows Filter Platform) 
Fluxo de Dados
Fluxo de dados:
- Um pacote entra na pilha de rede.
- A pilha de rede encontra e chama um shim.
- O shim invoca o processo de classificação em uma camada particular.
- Durante a classificação, os filtros são correspondidos e a ação resultante é tomada. (Consulte Arbitragem de Filtros.)
- Se algum filtro de chamada for correspondido durante o processo de classificação, as chamadas correspondentes são invocadas.
- O shim age sobre a decisão final de filtragem (por exemplo, descartar o pacote).
Links de Referência
- Tipos de Filtros
- Condições de Filtro Disponíveis em Cada Camada de Filtragem
- Código de Erro
- Código de Erro WFP