Análisis de Persistencia de Malware con Autoruns
Descripción General
Sysinternals Autoruns extrae datos de cientos de Puntos de Extensibilidad de Autoarranque (ASEP) en Windows, escaneando más de 18 categorías que incluyen claves Run/RunOnce, servicios, tareas programadas, controladores, entradas de Winlogon, proveedores LSA, monitores de impresión, suscripciones WMI y DLL de AppInit. La verificación de firmas digitales filtra entradas firmadas por Microsoft. La función de comparación identifica mecanismos de persistencia recién añadidos mediante diferencias con una línea base. La integración con VirusTotal verifica la reputación de hashes. El análisis offline mediante la bandera -z permite examinar imágenes de discos forenses.
Cuándo Usarlo
- Al investigar incidentes de seguridad que requieren analizar persistencia de malware con Autoruns
- Al construir reglas de detección o consultas de caza de amenazas para este dominio
- Cuando los analistas de SOC necesitan procedimientos estructurados para este tipo de análisis
- Al validar la cobertura de monitoreo de seguridad para técnicas de ataque relacionadas
Prerrequisitos
- Sysinternals Autoruns (GUI) y Autorunsc (CLI)
- Privilegios administrativos en el sistema objetivo
- Python 3.9+ para análisis automatizado
- Clave de API de VirusTotal para verificaciones de reputación
- Exportación de línea base limpia para comparación
Flujo de Trabajo
Paso 1: Escaneo Automatizado de Persistencia
#!/usr/bin/env python3
"""Automatiza el análisis de persistencia basado en Autoruns."""
import subprocess
import csv
import json
import sys
def scan_and_analyze(autorunsc_path="autorunsc64.exe", csv_path="scan.csv"):
cmd = [autorunsc_path, "-a", "*", "-c", "-h", "-s", "-nobanner", "*"]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=600)
with open(csv_path, 'w') as f:
f.write(result.stdout)
return parse_and_flag(csv_path)
def parse_and_flag(csv_path):
suspicious = []
with open(csv_path, 'r', errors='replace') as f:
for row in csv.DictReader(f):
reasons = []
signer = row.get("Signer", "")
if not signer or signer == "(Not verified)":
reasons.append("Binario sin firmar")
if not row.get("Description") and not row.get("Company"):
reasons.append("Metadatos faltantes")
path = row.get("Image Path", "").lower()
for sp in ["\\temp\\", "\\appdata\\local\\temp", "\\users\\public\\"]:
if sp in path:
reasons.append(f"Ruta sospechosa")
launch = row.get("Launch String", "").lower()
for kw in ["powershell", "cmd /c", "wscript", "mshta", "regsvr32"]:
if kw in launch:
reasons.append(f"LOLBin: {kw}")
if reasons:
row["reasons"] = reasons
suspicious.append(row)
return suspicious
if __name__ == "__main__":
if len(sys.argv) > 1:
results = parse_and_flag(sys.argv[1])
print(f"[!] {len(results)} entradas sospechosas")
for r in results:
print(f" {r.get('Entry','')} - {r.get('Image Path','')}")
for reason in r.get('reasons', []):
print(f" - {reason}")
Criterios de Validación
- Todas las categorías ASEP escaneadas y catalogadas
- Entradas sin firmar marcadas para investigación
- Rutas sospechosas y cadenas de lanzamiento de LOLBin resaltadas
- La comparación con línea base identifica nuevos mecanismos de persistencia