Saltar al contenido principal

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:

  1. Mejorar la detección
  2. Probar sus defensas
  3. Comprender las alertas de seguridad
  4. Formar a los equipos SOC

Paso 3.2: Categorías de bypass​

TécnicaDescripciónDetección
Memory PatchingModificar AMSI en memoriaEvent ID 4104, comportamiento sospechoso
ReflectionUsar .NET reflectionScript Block Logging
ObfuscationOcultar el códigoAnálisis comportamental
COM HijackingDesviar la interfaz COMMonitoreo 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 IDLogDescripción
4103PowerShell/OperationalModule logging
4104PowerShell/OperationalScript block logging
1116Microsoft-Windows-Windows DefenderMalware detectado
1117Microsoft-Windows-Windows DefenderAcció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​

  1. Respuestas a las 2 preguntas

  2. Capturas de pantalla:

    • Prueba AMSI (detección)
    • Configuración de seguridad
    • Script de monitoreo ejecutado
  3. Informe (1-2 páginas):

    • Explicación del funcionamiento de AMSI
    • Importancia del logging de PowerShell
    • Recomendaciones para su entorno

Criterios de Evaluación​

CriterioPuntos
Comprensión AMSI25%
Configuración logging30%
Script de detección25%
Informe y análisis20%

Recursos​


Lab desarrollado en el marco del curso Sistemas Operativos - MÓDULO 8