Lab 8.2: AMSI e Detecção PowerShell
Objetivos de Aprendizagem
Ao final deste laboratório, você será capaz de:
- Compreender o funcionamento do AMSI (Antimalware Scan Interface)
- Identificar como scripts maliciosos são detectados
- Conhecer técnicas de bypass (para fins defensivos)
- Implementar uma detecção eficaz
Duração Estimada
45 minutos
Pré-requisitos
- VM Windows 10/11
- Windows Defender ativo
- PowerShell 5.1+
- Direitos de administrador
Contexto Profissional
AMSI é uma interface crítica para:
- Detecção de scripts maliciosos
- Proteção contra malwares fileless
- Integração dos antivírus com PowerShell
- Segurança de ambientes corporativos
AVISO
Este lab explica conceitos para fins defensivos.
- As técnicas de bypass são apresentadas para entender as ameaças
- NÃO utilize essas técnicas de forma maliciosa
- Execute apenas em VMs de teste isoladas
Parte 1: Compreendendo o AMSI
Etapa 1.1: O que é o AMSI?
AMSI (Antimalware Scan Interface) é uma interface do Windows que permite aos antivírus inspecionar o conteúdo de scripts antes da execução.
Fluxo de execução:
Script PowerShell --> AMSI --> Antivirus --> Permitir/Bloquear
Aplicações que suportam AMSI:
- PowerShell
- Windows Script Host (wscript, cscript)
- JavaScript
- VBScript
- Macros VBA do Office
- Assemblies .NET
Etapa 1.2: Verificar se o AMSI está ativo
# AMSI está ativo se o Windows Defender estiver ativo
Get-MpComputerStatus | Select-Object AMServiceEnabled, AntivirusEnabled, RealTimeProtectionEnabled
Etapa 1.3: Testar o AMSI
O Windows Defender detecta a cadeia de teste padrão do AMSI:
# ESTE comando DEVE ser bloqueado pelo AMSI
# Ele contém a cadeia de teste oficial
# Tente isto (será bloqueado):
"AM" + "SI" + "Test"
Nota: A simples menção de certos termos aciona o AMSI.
Pergunta 1: O teste do AMSI foi detectado?
Parte 2: Como o AMSI Detecta Ameaças
Etapa 2.1: Detecção por assinatura
O AMSI escaneia padrões conhecidos:
# Exemplos de padrões detectados (não executar):
# - "Invoke-Mimikatz"
# - "Invoke-Empire"
# - Alguns comandos codificados em Base64
# - Padrões de shellcode
Etapa 2.2: Scripts codificados
Atacantes frequentemente utilizam codificação Base64:
# Comando simples
$cmd = "whoami"
# Codificado em Base64
$bytes = [System.Text.Encoding]::Unicode.GetBytes($cmd)
$encoded = [Convert]::ToBase64String($bytes)
Write-Host "Comando codificado: $encoded"
# Decodificar
$decoded = [System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($encoded))
Write-Host "Decodificado: $decoded"
O AMSI analisa o conteúdo APÓS a decodificação, então apenas codificar não é suficiente.
Etapa 2.3: Observar o AMSI em ação
# Este script mostra como o AMSI intercepta comandos
# Execução com logging
# Ativar o logging do PowerShell (necessita admin)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name "EnableScriptBlockLogging" -Value 1 -ErrorAction SilentlyContinue
# Verificar
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -ErrorAction SilentlyContinue
Parte 3: Técnicas de Bypass (Conhecimento Defensivo)
Etapa 3.1: Por que conhecer os bypass?
Como defensor, você deve conhecer as técnicas dos atacantes para:
- Melhorar a detecção
- Testar suas defesas
- Compreender alertas de segurança
- Treinar equipes de SOC
Etapa 3.2: Categorias de bypass
| Técnica | Descrição | Detecção |
|---|---|---|
| Memory Patching | Modificar o AMSI na memória | Event ID 4104, comportamento suspeito |
| Reflection | Usar .NET reflection | Script Block Logging |
| Obfuscation | Ofuscar o código | Análise comportamental |
| COM Hijacking | Desviar a interface COM | Monitoramento de registro |
Etapa 3.3: Detecção de tentativas de bypass
# Script de detecção de tentativas de bypass do AMSI
# Busca nos logs do PowerShell
Write-Host "=== DETECÇÃO BYPASS AMSI ===" -ForegroundColor Cyan
# Procurar termos suspeitos nos logs
$suspectTerms = @(
"amsi",
"AmsiInitFailed",
"AmsiContext",
"amsiSession",
"SetValue.*amsi"
)
$events = Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -MaxEvents 100 -ErrorAction SilentlyContinue
$suspicious = @()
foreach ($event in $events) {
foreach ($term in $suspectTerms) {
if ($event.Message -match $term) {
$suspicious += [PSCustomObject]@{
Time = $event.TimeCreated
EventId = $event.Id
Match = $term
Message = $event.Message.Substring(0, [Math]::Min(200, $event.Message.Length))
}
}
}
}
if ($suspicious.Count -gt 0) {
Write-Host "`n[ALERTA] Atividade suspeita detectada:" -ForegroundColor Red
$suspicious | Format-Table -AutoSize
} else {
Write-Host "`n[OK] Nenhuma tentativa de bypass detectada" -ForegroundColor Green
}
Pergunta 2: Foram detectadas tentativas de bypass?
Parte 4: Reforçando a Proteção
Etapa 4.1: Ativar o Script Block Logging
# Configurar o logging completo (necessita admin)
# Criar as chaves se necessário
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell" -Force -ErrorAction SilentlyContinue | Out-Null
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Force -ErrorAction SilentlyContinue | Out-Null
# Ativar o logging
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" `
-Name "EnableScriptBlockLogging" -Value 1 -Type DWord
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" `
-Name "EnableScriptBlockInvocationLogging" -Value 1 -Type DWord
Write-Host "Script Block Logging ativado" -ForegroundColor Green
Etapa 4.2: Ativar o Module Logging
# Ativar o module logging
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" -Force -ErrorAction SilentlyContinue | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" `
-Name "EnableModuleLogging" -Value 1 -Type DWord
# Logar todos os módulos
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames" -Force -ErrorAction SilentlyContinue | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames" `
-Name "*" -Value "*" -Type String
Write-Host "Module Logging ativado" -ForegroundColor Green
Etapa 4.3: Configurar o Constrained Language Mode
# Verificar o modo de linguagem atual
$ExecutionContext.SessionState.LanguageMode
# Para forçar o modo restrito (via GPO ou):
# [Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '4', 'Machine')
# Necessita reinicialização
# Nota: O modo restrito limita as funcionalidades do PowerShell
# usar com cautela em produção
Etapa 4.4: Verificar a configuração
# Script de verificação da configuração de segurança do PowerShell
Write-Host "=== CONFIGURAÇÃO DE SEGURANÇA POWERSHELL ===" -ForegroundColor Cyan
# AMSI
Write-Host "`n[AMSI]" -ForegroundColor Yellow
$defender = Get-MpComputerStatus -ErrorAction SilentlyContinue
if ($defender) {
Write-Host " AMSI Service: $($defender.AMServiceEnabled)"
Write-Host " Real-Time Protection: $($defender.RealTimeProtectionEnabled)"
}
# Language Mode
Write-Host "`n[Language Mode]" -ForegroundColor Yellow
Write-Host " Modo atual: $($ExecutionContext.SessionState.LanguageMode)"
# Execution Policy
Write-Host "`n[Execution Policy]" -ForegroundColor Yellow
Get-ExecutionPolicy -List | Format-Table
# Script Block Logging
Write-Host "[Script Block Logging]" -ForegroundColor Yellow
$sbl = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -ErrorAction SilentlyContinue
if ($sbl.EnableScriptBlockLogging -eq 1) {
Write-Host " Status: Ativo" -ForegroundColor Green
} else {
Write-Host " Status: Inativo" -ForegroundColor Red
}
# Module Logging
Write-Host "`n[Module Logging]" -ForegroundColor Yellow
$ml = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" -ErrorAction SilentlyContinue
if ($ml.EnableModuleLogging -eq 1) {
Write-Host " Status: Ativo" -ForegroundColor Green
} else {
Write-Host " Status: Inativo" -ForegroundColor Red
}
Parte 5: Monitoramento e Alertas
Etapa 5.1: Eventos chave para monitorar
| Event ID | Log | Descrição |
|---|---|---|
| 4103 | PowerShell/Operational | Module logging |
| 4104 | PowerShell/Operational | Script block logging |
| 1116 | Microsoft-Windows-Windows Defender | Malware detectado |
| 1117 | Microsoft-Windows-Windows Defender | Ação sobre malware |
Etapa 5.2: Script de monitoramento
# Monitoramento de eventos PowerShell suspeitos
Write-Host "=== MONITORAMENTO POWERSHELL ===" -ForegroundColor Cyan
$suspectKeywords = @(
"bypass",
"encoded",
"downloadstring",
"invoke-expression",
"iex",
"reflection",
"assembly",
"shellcode",
"mimikatz"
)
# Script Block Logs (4104)
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-PowerShell/Operational'
ID = 4104
} -MaxEvents 50 -ErrorAction SilentlyContinue
Write-Host "`nAnálise dos últimos 50 Script Block Logs..." -ForegroundColor Yellow
$alerts = @()
foreach ($event in $events) {
foreach ($keyword in $suspectKeywords) {
if ($event.Message -match $keyword) {
$alerts += [PSCustomObject]@{
Time = $event.TimeCreated
Keyword = $keyword
Preview = $event.Message.Substring(0, [Math]::Min(100, $event.Message.Length))
}
break
}
}
}
if ($alerts.Count -gt 0) {
Write-Host "`n[ALERTAS] Conteúdo suspeito detectado:" -ForegroundColor Red
$alerts | Format-Table -AutoSize
} else {
Write-Host "`n[OK] Nenhuma atividade suspeita detectada" -ForegroundColor Green
}
Entregáveis
-
Respostas às 2 perguntas
-
Capturas de tela:
- Teste AMSI (detecção)
- Configuração de segurança
- Script de monitoramento executado
-
Relatório (1-2 páginas):
- Explicação do funcionamento do AMSI
- Importância do logging do PowerShell
- Recomendações para seu ambiente
Critérios de Avaliação
| Critério | Pontos |
|---|---|
| Compreensão AMSI | 25% |
| Configuração logging | 30% |
| Script de detecção | 25% |
| Relatório e análise | 20% |
Recursos
Lab desenvolvido no âmbito do curso Sistemas Operacionais - MÓDULO 8