Lab 8.2: AMSI y Detección PowerShell
Objetivos de Aprendizaje
Al final de este laboratorio, usted será capaz de:
- Comprender el funcionamiento de AMSI (Antimalware Scan Interface)
- Identificar cómo se detectan los scripts maliciosos
- Conocer las técnicas de evasión (con fines defensivos)
- Implementar una detección eficaz
Duración Estimada
45 minutos
Prerrequisitos
- VM Windows 10/11
- Windows Defender activo
- PowerShell 5.1+
- Derechos de administrador
Contexto Profesional
AMSI es una interfaz crítica para:
- La detección de scripts maliciosos
- La protección contra malware fileless
- La integración de antivirus con PowerShell
- La seguridad de entornos empresariales
ADVERTENCIA
Este laboratorio explica conceptos con fines defensivos.
- Las técnicas de bypass se presentan para comprender las amenazas
- NO utilice estas técnicas de manera maliciosa
- Ejecute únicamente en VMs de prueba aisladas
Parte 1: Comprender AMSI
Paso 1.1: ¿Qué es AMSI?
AMSI (Antimalware Scan Interface) es una interfaz de Windows que permite a los antivirus inspeccionar el contenido de los scripts antes de su ejecución.
Flujo de ejecución:
Script PowerShell --> AMSI --> Antivirus --> Permitir/Bloquear
Aplicaciones que soportan AMSI:
- PowerShell
- Windows Script Host (wscript, cscript)
- JavaScript
- VBScript
- Macros VBA de Office
- .NET assemblies
Paso 1.2: Verificar que AMSI está activo
# AMSI está activo si Windows Defender está activo
Get-MpComputerStatus | Select-Object AMServiceEnabled, AntivirusEnabled, RealTimeProtectionEnabled
Paso 1.3: Probar AMSI
Windows Defender detecta la cadena de prueba estándar de AMSI:
# ESTE comando DEBERÍA ser bloqueado por AMSI
# Contiene la cadena de prueba oficial
# Pruebe esto (será bloqueado):
"AM" + "SI" + "Test"
Nota: La simple mención de ciertos términos activa AMSI.
Pregunta 1: ¿Se detectó la prueba de AMSI?
Parte 2: Cómo AMSI Detecta las Amenazas
Paso 2.1: Detección por firma
AMSI escanea patrones conocidos:
# Ejemplos de patrones detectados (no ejecutar):
# - "Invoke-Mimikatz"
# - "Invoke-Empire"
# - Algunos comandos codificados en Base64
# - Patrones de shellcode
Paso 2.2: Scripts codificados
Los atacantes suelen utilizar codificación Base64:
# Comando simple
$cmd = "whoami"
# Codificado en 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"
AMSI analiza el contenido DESPUÉS de la decodificación, por lo que solo codificar no es suficiente.
Paso 2.3: Observar AMSI en acción
# Este script muestra cómo AMSI intercepta los comandos
# Ejecución con logging
# Activar el logging de PowerShell (requiere 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 (Conocimiento Defensivo)
Paso 3.1: ¿Por qué conocer los bypass?
Como defensor, usted debe conocer las técnicas de los atacantes para:
- Mejorar la detección
- Probar sus defensas
- Comprender las alertas de seguridad
- Formar a los equipos SOC
Paso 3.2: Categorías de bypass
| Técnica | Descripción | Detección |
|---|---|---|
| Memory Patching | Modificar AMSI en memoria | Event ID 4104, comportamiento sospechoso |
| Reflection | Usar .NET reflection | Script Block Logging |
| Obfuscation | Ocultar el código | Análisis comportamental |
| COM Hijacking | Desviar la interfaz COM | Monitoreo de registro |
Paso 3.3: Detección de intentos de bypass
# Script de detección de intentos de bypass AMSI
# Busca en los logs de PowerShell
Write-Host "=== DETECCIÓN BYPASS AMSI ===" -ForegroundColor Cyan
# Buscar términos sospechosos en los 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] Actividad sospechosa detectada:" -ForegroundColor Red
$suspicious | Format-Table -AutoSize
} else {
Write-Host "`n[OK] No se detectaron intentos de bypass" -ForegroundColor Green
}
Pregunta 2: ¿Se detectaron intentos de bypass?
Parte 4: Reforzar la Protección
Paso 4.1: Activar Script Block Logging
# Configurar el logging completo (requiere admin)
# Crear las claves si es necesario
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
# Activar el 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 activo" -ForegroundColor Green
Paso 4.2: Activar Module Logging
# Activar el 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
# Registrar todos los 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 activo" -ForegroundColor Green
Paso 4.3: Configurar Constrained Language Mode
# Verificar el modo de lenguaje actual
$ExecutionContext.SessionState.LanguageMode
# Para forzar el modo restringido (vía GPO o):
# [Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '4', 'Machine')
# Requiere reinicio
# Nota: El modo restringido limita las funcionalidades de PowerShell
# usar con precaución en producción
Paso 4.4: Verificar la configuración
# Script de verificación de la configuración de seguridad de PowerShell
Write-Host "=== CONFIGURACIÓN SEGURIDAD 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 actual: $($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 " Estado: Activo" -ForegroundColor Green
} else {
Write-Host " Estado: Inactivo" -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 " Estado: Activo" -ForegroundColor Green
} else {
Write-Host " Estado: Inactivo" -ForegroundColor Red
}
Parte 5: Monitoreo y Alertas
Paso 5.1: Eventos clave a monitorear
| Event ID | Log | Descripción |
|---|---|---|
| 4103 | PowerShell/Operational | Module logging |
| 4104 | PowerShell/Operational | Script block logging |
| 1116 | Microsoft-Windows-Windows Defender | Malware detectado |
| 1117 | Microsoft-Windows-Windows Defender | Acción sobre malware |
Paso 5.2: Script de monitoreo
# Monitoreo de eventos sospechosos de PowerShell
Write-Host "=== MONITOREO 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álisis de los ú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] Contenido sospechoso detectado:" -ForegroundColor Red
$alerts | Format-Table -AutoSize
} else {
Write-Host "`n[OK] No se detectó actividad sospechosa" -ForegroundColor Green
}
Entregables
-
Respuestas a las 2 preguntas
-
Capturas de pantalla:
- Prueba AMSI (detección)
- Configuración de seguridad
- Script de monitoreo ejecutado
-
Informe (1-2 páginas):
- Explicación del funcionamiento de AMSI
- Importancia del logging de PowerShell
- Recomendaciones para su entorno
Criterios de Evaluación
| Criterio | Puntos |
|---|---|
| Comprensión AMSI | 25% |
| Configuración logging | 30% |
| Script de detección | 25% |
| Informe y análisis | 20% |
Recursos
Lab desarrollado en el marco del curso Sistemas Operativos - MÓDULO 8