Skip to content

Triaje: detectar entradas sospechosas en RecentFileCache

Guía práctica de las heurísticas de ruta, peculiaridades de basename y patrones de unidad que convierten una lista de rutas cacheadas en pistas de investigación.

Publicado el 4 min de lectura

Una vez parseado un RecentFileCache.bcf, tienes una lista de rutas y nada más. Sin marcas de tiempo, sin hashes, sin firmantes. La pregunta de triaje es: ¿cuáles de estas rutas merecen una segunda mirada? Este post recorre las heurísticas que se han ganado el pan en casos reales.

Los cuatro vecindarios de ruta de alta señal

La mayoría de atacantes oportunistas y dirigidos dejan ejecutables en un pequeño conjunto de directorios escribibles. Filtra tu .bcf primero por estos:

Patrón (case-insensitive)Por qué es interesante
\AppData\Local\Temp\Destino por defecto de descomprimidos / descargas de Office — también sitio favorito de loaders y second-stages
\Windows\Temp\Escribible como SYSTEM; común tras escalada de privilegios
\Users\Public\Escribible por todos, usado para compartir herramientas de staging entre cuentas
\ProgramData\Subárbol escribible por todos que algunos instaladores (y malware) abusan
\PerfLogs\Vacío por defecto, extrañamente usado a menudo por red teams
\$Recycle.Bin\Casi nunca legítimo ejecutar algo desde aquí
\Recovery\, \System Volume Information\Deberían ser solo del sistema; entradas aquí merecen investigación

En la vista de tabla del parser, ordenar por Drive y luego Path agrupa visualmente los vecindarios sospechosos.

Peculiaridades de basename

El nombre de archivo (último segmento) de cada ruta lleva su propia señal:

  • Nombres de una o dos letrasa.exe, b.exe, xx.exe. Casi siempre malware, artefactos de build o el helloworld.exe de un desarrollador. Pivotar al directorio original.
  • Cadenas de apariencia aleatoriaj2k9f.exe, cfa31b.exe. Alta entropía en el basename suele indicar salida de dropper o stages desempaquetados.
  • Doble extensióninvoice.pdf.exe, image.jpg.scr. Patrón clásico de payload de phishing. Vale por sí solo.
  • Nombres tipo GUID{f3b3c8d4-...}.exe. O una copia por-sesión de un instalador legítimo, o malware imitándolo.
  • Nombre legítimo en el lugar equivocadosvchost.exe bajo C:\Users\Public\ (vs C:\Windows\System32\) es un movimiento clásico de reubicación de binario firmado.
  • Espacios al final / trucos unicodenotepad .exe, nombres con caracteres right-to-left override (U+202E). El parser los preserva tal cual; una vista hex de la ruta o un rápido length(path) los expone.

Análisis de letra de unidad

El parser expone una columna drive. La mayoría de entradas cacheadas son C:. Cualquier otra cosa merece atención:

  • D:, E:, F: y posteriores — USB, shares montados, ISOs montados. Vectores comunes de staging de malware. Cruzar con shellbags / claves de registro USBSTOR para identificar el dispositivo.
  • Rutas UNC (\\server\share\...) — ejecución desde shares de red. Vale correlacionar con logs de sesión SMB.
  • Sin unidad alguna — rutas que empiezan con un solo nombre (sin C:, sin \\) son inusuales para .bcf y suelen significar que se registró una ruta relativa — lo que en sí es interesante porque el servicio casi siempre normaliza a absoluta.

Pivote nombre de archivo → proceso

Un basename dado apareciendo en .bcf no es prueba de ejecución — solo de que AppCompat lo vio. Una vez tengas una lista corta de candidatos, pivota:

  1. Prefetch (C:\Windows\Prefetch\<NOMBRE>-<HASH>.pf). Si existe un .pf correspondiente, tienes un evento de ejecución con marcas de tiempo y contador de lanzamientos.
  2. Amcache.hve — misma época que .bcf pero con hash, editor, fecha de instalación. El hermano amcache-parser hace esto del lado cliente.
  3. El archivo en disco. Si la ruta aún resuelve, hashéalo y pivota a VirusTotal / tu store interno de IOC. Si la ruta no resuelve, el binario fue borrado — y ese borrado es en sí un evento que puedes buscar en el MFT / $LogFile.

Lo que no hay allí

Igualmente importante: cosas que no deberías esperar en .bcf.

  • Scripts. .ps1, .vbs, .js, .bat, .hta no son rastreados por el escáner Application Experience. Un .bcf limpio no significa una máquina limpia.
  • DLLs cargadas por hosts firmados. RecentFileCache se preocupa por imágenes tipo EXE que cruzan la ruta de código AppCompat del loader. DLLs cargadas por rundll32.exe, regsvr32.exe o mshta.exe normalmente no aparecerán.
  • Cualquier cosa que evite el loader. Inyección reflectiva, process hollowing, PE en memoria — invisibles por diseño para RecentFileCache.

Un filtro pragmático

Un primer pase pragmático, expresado en jq sobre la salida JSON del parser:

jq '.entries[] | select(
  (.path | ascii_downcase | test(
    "\\\\(appdata\\\\local\\\\temp|windows\\\\temp|users\\\\public|programdata|perflogs|\\$recycle\\.bin)\\\\"
  )) or
  ((.filename // "") | test("^[a-z0-9]{1,3}\\.exe$"; "i")) or
  ((.filename // "") | test("\\.(pdf|doc|docx|xls|xlsx|jpg|png)\\.exe$"; "i"))
) | "\(.drive // "?")\t\(.filename // "?")\t\(.path)"' rfc.json

Obtendrás una lista tab-separada lista para pegar en un notebook o alimentar a un bucle hash-and-VT. El siguiente post cubre qué hacer con los candidatos.

Artículos relacionados

El ciclo de vida del BCF depende de una única tarea programada. Entiende cuándo se ejecuta ProgramDataUpdater, cuándo vacía el archivo y cómo detectar un appraiser deshabilitado.
El formato BCF es una cabecera, una lista de rutas UTF-16LE con prefijo de longitud, y se acabó. Aquí está lo que significa cada byte y por qué nada ha cambiado desde 2009.
Un endpoint Win7 marcado por el SOC, 14 rutas en el BCF, tres dignas de una segunda mirada. Una cadena de corroboración realista y cuánto contribuyó realmente el BCF.