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.

Problemas de Compilação:

Outros Problemas:

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. Recomenda 5157

    • 5152

    • 5153

  • 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.
    • 5150
    • 5151
    • 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:

  1. Abra a auditoria da Filtering Platform Connection, auditpol /set /subcategory:"{0CCE9226-69AE-11D9-BED3-505054503030}" /success:enable /failure:enable

  2. Abra o Visualizador de Eventos, crie uma Visualização Personalizada, crie um filtro, focamos temporariamente apenas nos eventos 5155, 5157, 5159. exemplo de filtro

  3. 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

  4. 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 exemplo de disparo de evento de auditoria

  5. Restaure o filtro, .\WFPSampler.exe -clean

  6. 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

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) Arquitetura Básica da Plataforma de Filtragem do Windows

Fluxo de Dados

Fluxo de dados:

  1. Um pacote entra na pilha de rede.
  2. A pilha de rede encontra e chama um shim.
  3. O shim invoca o processo de classificação em uma camada particular.
  4. Durante a classificação, os filtros são correspondidos e a ação resultante é tomada. (Consulte Arbitragem de Filtros.)
  5. Se algum filtro de chamada for correspondido durante o processo de classificação, as chamadas correspondentes são invocadas.
  6. O shim age sobre a decisão final de filtragem (por exemplo, descartar o pacote).