Pular para o conteúdo principal

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:

  1. Melhorar a detecção
  2. Testar suas defesas
  3. Compreender alertas de segurança
  4. Treinar equipes de SOC

Etapa 3.2: Categorias de bypass​

TécnicaDescriçãoDetecção
Memory PatchingModificar o AMSI na memóriaEvent ID 4104, comportamento suspeito
ReflectionUsar .NET reflectionScript Block Logging
ObfuscationOfuscar o códigoAnálise comportamental
COM HijackingDesviar a interface COMMonitoramento 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 IDLogDescrição
4103PowerShell/OperationalModule logging
4104PowerShell/OperationalScript block logging
1116Microsoft-Windows-Windows DefenderMalware detectado
1117Microsoft-Windows-Windows DefenderAçã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​

  1. Respostas às 2 perguntas

  2. Capturas de tela:

    • Teste AMSI (detecção)
    • Configuração de segurança
    • Script de monitoramento executado
  3. 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érioPontos
Compreensão AMSI25%
Configuração logging30%
Script de detecção25%
Relatório e análise20%

Recursos​


Lab desenvolvido no âmbito do curso Sistemas Operacionais - MÓDULO 8