SHA-1 en la Amcache: pivotando del disco al threat intel

La secuencia de bytes individual más valiosa en Amcache.hve es el valor FileId bajo InventoryApplicationFile. Es un SHA-1 del contenido del archivo, con prefijo de cuatro ceros (0000) por razones históricas que ya no importan. Quítale el prefijo y tienes un hash que puedes lanzar a cualquier feed de threat intel del planeta.

Esto es lo que hace a la Amcache distinta de casi cualquier otro artefacto de Windows. El shimcache te da ruta y timestamp. El Prefetch te da un run count y un hash de la ruta. La MFT te da metadatos del archivo en un momento dado. La Amcache te da la huella real del contenido del archivo, computada por Windows mismo, persistida en una hive del Registro que sobrevive al borrado del archivo.

Esa última cláusula es la que cierra casos.

Por qué los hashes sobreviven al borrado y las rutas no#

Cuando Appraiser recorre el filesystem según su programación (Microsoft\Windows\Application Experience\Microsoft Compatibility Appraiser), calcula SHA-1 sobre el contenido del archivo y escribe el resultado en la hive. Ese valor se queda ahí hasta que alguien específicamente borra la subclave. Si el operador suelta loader.exe, lo corre y lo elimina, el archivo desaparece de la MFT tras algunas escrituras, desaparece del journal USN una vez que rota, desaparece de Prefetch la próxima vez que se recorta el caché. La fila de Amcache, con su SHA-1, persiste indefinidamente. He sacado FileIds de hosts donde el binario original se borró seis meses antes.

Hay límites, y deberías conocerlos antes de escribir la frase en tu informe:

  • Si la tarea del Compatibility Appraiser estaba deshabilitada, el binario nunca se hasheó. No hay fila, no hay FileId, no hay pivote.
  • Si el atacante soltó, ejecutó y borró el binario dentro de una sola ventana de escaneo del Appraiser, el archivo nunca se hasheó. Mismo desenlace.
  • Si el atacante borró explícitamente la subclave bajo InventoryApplicationFile, la hive viva no tiene nada. Los logs de transacción (Amcache.hve.LOG1 / Amcache.hve.LOG2) a menudo sí. Cógelos y replay.

El hash es SHA-1, que está criptográficamente roto para ataques de colisión pero perfectamente bien como identificador de contenido para DFIR. Nadie está ingenierizando colisiones chosen-prefix contra tu hive del Registro. Si alguien te dice que el SHA-1 de la Amcache "no es de fiar", está confundiendo dos modelos de amenaza distintos.

El pivote, de principio a fin#

Un flujo real en un host del que sospecho compromiso:

  1. Adquirir la hive y sus logs. Replayear. Parsear.
  2. Volcar cada tupla (FileId, OriginalFileName, LowerCaseLongPath, KeyLastWrite) de InventoryApplicationFile. Ese es el set de trabajo, típicamente unos miles de filas en workstation, decenas de miles en un servidor que lleva mucho funcionando.
  3. Quitar el prefijo 0000 de cada FileId. Los 40 caracteres hex restantes son un SHA-1 normal.
  4. Triagear por ruta. Filtrar primero a directorios escribibles por usuario (\Users\*\AppData\, \ProgramData\ fuera de subdirs de vendor, C:\Windows\Temp\, C:\PerfLogs\, C:\$Recycle.Bin\). Cualquier cosa en C:\Windows\System32\ de un binario Microsoft firmado rara vez es el inicio de una investigación, aunque debas hash-checkear los outliers después.
  5. Enviar los hashes supervivientes por lotes a VirusTotal, tu sandbox interna, MalwareBazaar, la API de reputación de tu vendor de EDR y el feed comercial en el que confíes. Los dos servicios públicos gratuitos que más uso son VirusTotal y MalwareBazaar de abuse.ch; ambos aceptan SHA-1.
  6. Agrupar las respuestas. Conocido-malo entra directo a la lista de IOC. Las rutas desconocidas-pero-sospechosas se traen al frente para detonación en sandbox, si todavía puedes encontrar el binario en un host par o en un backup. Los binarios firmados conocidos-buenos se anotan y se tiran.
  7. Cualquier cosa que dé hit en threat intel se convierte en un barrido por el resto del parque. El FileId es el IOC. Busca el mismo SHA-1 en cualquier otra Amcache que puedas conseguir.

El paso 7 es el que más gente infravalora. La Amcache es por-host, pero los FileIds son universales. Si e3b0c44... apareció en el host paciente cero, aparecerá donde el operador lo soltó después, y la Amcache a menudo lo atrapa aun cuando el binario ya no esté presente. Recolección masiva de Amcache por toda la empresa (target de recolección de KAPE, hunt de Velociraptor, capacidad de file-collection de tu EDR favorito) seguido de búsqueda por SHA-1 es un flujo que escala.

Los falsos positivos que te van a malgastar el día#

El tooling ofensivo commodity contamina los pivotes basados en hash. Dos patrones concretos a reconocer:

El primero es infraestructura compartida entre red teams. PsExec es el ejemplo canónico: los SHA-1s de psexec.exe y psexesvc.exe se iluminan en VirusTotal porque cada vendor de detección los ha etiquetado como "hacktool", "remote admin tool" o similar, pero también son binarios firmados de Sysinternals usados por la mitad de los departamentos de IT del mundo. El hash es malware-adyacente real, pero el contexto del host decide si importa. Misma historia con procdump.exe, nircmd.exe, 7za.exe y la mayoría del catálogo LOLBAS / GTFOBins.

El segundo son loaders compartidos. Los stagers de beacon por defecto de Cobalt Strike, los implantes Sliver sin recompilación y los runners de shellcode de Metasploit se reutilizan en miles de engagements. Un hit en un hash de beacon Cobalt Strike default-config significa "alguien desplegó un C2 de estantería", no "te enfrentas al mismo actor del informe de FireEye". Cuidado con la atribución solo desde un hash.

El flujo defensivo es tratar cada hit de threat intel sobre una herramienta commodity como bandera amarilla, no roja. Mira el LowerCaseLongPath. Un PsExec firmado en C:\Program Files\Sysinternals\ es distinto de un PsExec renombrado llamado chrome_helper.exe en \AppData\Local\Temp\. El hash es el mismo; el contexto lo es todo.

Los campos controlados por el atacante no son el hash#

LinkDate es el IMAGE_FILE_HEADER.TimeDateStamp del cabecero PE. Es lo que sea que el compilador estampó, que es lo que sea que el atacante le dijo al compilador. Puesto a 1970-01-01 en la mitad del malware commodity, puesto a un 2019 plausible en samples mejores, puesto a coincidir con un binario de Microsoft en los pulidos. No construyas timelines sobre él.

OriginalFileName y ProductName vienen del recurso de versión del PE. También controlables por el atacante. Menos manipulados que LinkDate, porque tocar los recursos de versión puede romper firma de código y romper lógica de instalador, pero he visto OriginalFileName = svchost.exe en droppers de Mimikatz en claro más de una vez.

FileId lo calcula el sistema operativo tras aterrizar el archivo en disco. El atacante no puede influirlo sin reingeniar el binario, momento en el cual el archivo nuevo es un archivo distinto con un hash distinto, que es exactamente lo que quieres para rastreo.

Size es filesystem-veraz. Mismatches entre Size y lo que una copia conocida-buena del supuestamente-mismo binario debería ser es una forma barata de flaggear archivos del sistema parcheados o trojanizados.

Pivotar por hash a escala, brevemente#

Si lo haces a miles de hosts:

  • Recolecta hives Amcache vía Velociraptor (Windows.Forensics.Amcache), KAPE (target Amcache) o la file-collection de tu EDR. Las tres gestionan correctamente el lock del archivo. No uses xcopy contra una hive viva.
  • Normaliza a una sola columna de hash. A veces los parsers preservan el prefijo 0000, a veces lo quitan. Elige una forma y aplícala.
  • Submit masivo al endpoint /files/{hash} v3 de VirusTotal, respetando rate limits. Cachea respuestas. Un SHA-1 que has visto esta semana no necesita reconsultarse.
  • Mantén una allowlist interna de hashes firmados-Microsoft que ya hayas triagado. La Amcache devuelve los mismos binarios del SO en cada host; no quieres mirar cmd.exe diez mil veces.
  • Cruza los hits contra Prefetch, Sysmon EventID 1 (ProcessCreate, incluye el hash del binario) y telemetría de EDR. La Amcache dice que el archivo estaba ahí. Los otros artefactos dicen qué hizo.

El parser de este sitio está construido en torno a este flujo. Suelta la hive, obtén una tabla de SHA-1s y rutas, copy-paste a la búsqueda en lote de VirusTotal. Sin subida, lo que importa cuando la hive viene de un entorno regulado que no quiere que los hashes salgan del perímetro.

Lecturas adicionales#

Artículos relacionados

Volver a todos los artículos