CrowdStrike Bypass Research

Analise detalhada das protecoes do Falcon e pesquisa de tecnicas de bypass

← Voltar ao inicio

Por que o CrowdStrike Bloqueia Print Monitors

O CrowdStrike tem protecao multi-camada especifica para o Print Spooler (pos-PrintNightmare):

1
Kernel Callback

PsSetLoadImageNotifyRoutine — CSAgent.sys intercepta TODA LoadLibrary ANTES da DllMain executar

2
Processo Monitorado

spoolsv.exe esta na lista interna de processos sensiveis que recebem escrutinio extra

3
Checagens na Interceptacao
  • DLL assinada? → NAO ❌
  • Hash conhecido/confiavel? → NAO ❌
  • Tamanho normal para print monitor? → NAO (23KB, normal e 50-200KB) ❌
  • Version info presente? → NAO ❌
4
Resultado

LoadLibrary retorna NULL silenciosamente. Spooler ignora monitors que falham no load — nao crasha, nao tem log.

O que Triggera o CrowdStrike na Nossa DLL

FatorNossa DLLDLL Legitima
AssinaturaNenhumaAssinada por CA confiavel
Tamanho23KB (suspeitosamente pequeno)50-200KB
Version InfoAusenteCompanyName, FileDescription, etc.
Nometeste.dll (obvio)APMon.dll, DDPort.dll, USBMon.dll
IATLoadLibraryW, _stricmp (red flags)Imports minimos ou dinamicos
Stringsprintf("[!] Failed...")Sem strings de debug

Opcoes de Bypass

1. Fazer a DLL Parecer Legitima

Probabilidade: Alta Esforco: Medio

Nao tenta bypassar a deteccao — faz a DLL passar no check:

a) Assinar com certificado real (nao self-signed)

b) Adicionar VERSIONINFO resource

VS_VERSION_INFO VERSIONINFO
FILEVERSION 10,0,17763,1
BEGIN
    BLOCK "StringFileInfo"
    BEGIN
        VALUE "CompanyName", "Microsoft Corporation"
        VALUE "FileDescription", "Enhanced Port Monitor"
        VALUE "FileVersion", "10.0.17763.1"
        VALUE "OriginalFilename", "ePrtMon.dll"
    END
END

c) Outras modificacoes

2. Phantom DLL Hijacking

Probabilidade: Alta Esforco: Medio

Evita o caminho monitorado. Encontra DLL que servico SYSTEM tenta carregar mas NAO existe:

  1. Rodar Process Monitor no mesmo SO
  2. Filtrar: processo SYSTEM + "NAME NOT FOUND" + .dll
  3. Colocar nossa DLL nesse path
  4. Servico carrega automaticamente no boot
Vantagem: CS nao tem regra especifica para esse servico (nao e spoolsv.exe)
Exemplos classicos: WptsExtensions.dll (Task Scheduler), phoneinfo.dll, fveapi.dll

3. COM Object Hijacking

Probabilidade: Media-Alta Esforco: Medio

Encontrar CLSID orfao (DLL registrada que nao existe mais) carregado por servico SYSTEM:

Get-ChildItem "HKLM:\SOFTWARE\Classes\CLSID" -Recurse |
    Get-ItemProperty -Name "(Default)" -ErrorAction SilentlyContinue |
    Where-Object { $_."(Default)" -match "\.dll$" -and -not (Test-Path $_."(Default)") }

CS monitora CLSIDs conhecidos mas nao consegue cobrir todos (milhares existem).

4. DLL Search Order Hijacking

Probabilidade: Media Esforco: Baixo

Similar ao Phantom DLL mas usando a ordem de busca do Windows (DLL no diretorio do app antes do System32).

5. Two-Stage (persistencia legitima + manual mapping)

Probabilidade: Media Esforco: Alto

Alternativas de Persistencia vs CrowdStrike

MecanismoCS Bloqueia?Motivo
Print MonitorSIMspoolsv.exe e processo monitorado
Print ProcessorSIMMesmo LoadLibrary em spoolsv.exe
Authentication Package (LSA)SIMlsass.exe e MAIS monitorado
Password Filter DLLSIMCarrega em lsass.exe
WMI Event SubscriptionDETECTAAlerta visivel, pode nao prevenir
Scheduled Task (SYSTEM)DETECTACria alerta mas pode executar
COM HijackPARCIALMonitora CLSIDs conhecidos, nao todos
Phantom DLL HijackPROVAVELMENTE NAONao e TTP monitorado especificamente
Service DLL (svchost)DETECTADetecta criacao de servico

Sobre Code Signing

Tipo de CertificadoCS Permite?
Cert valido de CA confiavel (DigiCert, Sectigo)Alta probabilidade
Cert expirado com timestamp RFC 3161Boa probabilidade
Self-signedQuase igual a unsigned
Sem assinaturaBloqueado

Verificar Certificado

signtool verify /pa /v teste.dll
# Se retornar "chain to trusted root" → pode funcionar
# Se retornar "could not be built to trusted root" → nao vai funcionar

Plano de Acao Recomendado

Tentativa 1 — Melhorar DLL (rapido)

  1. Adicionar VERSIONINFO resource
  2. Renomear para ePrtMon.dll
  3. Aumentar tamanho para ~100KB
  4. Remover printf strings
  5. Assinar com cert.p12
  6. Testar em ambiente com CS

Tentativa 2 — Phantom DLL (paralelo)

  1. Rodar procmon no ambiente alvo
  2. Capturar DLLs "NAME NOT FOUND" de servicos SYSTEM
  3. Identificar candidata
  4. Adaptar exports da nossa DLL
  5. Testar