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.
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 letras —
a.exe,b.exe,xx.exe. Casi siempre malware, artefactos de build o elhelloworld.exede un desarrollador. Pivotar al directorio original. - Cadenas de apariencia aleatoria —
j2k9f.exe,cfa31b.exe. Alta entropía en el basename suele indicar salida de dropper o stages desempaquetados. - Doble extensión —
invoice.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 equivocado —
svchost.exebajoC:\Users\Public\(vsC:\Windows\System32\) es un movimiento clásico de reubicación de binario firmado. - Espacios al final / trucos unicode —
notepad .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ápidolength(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.bcfy 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:
- Prefetch (
C:\Windows\Prefetch\<NOMBRE>-<HASH>.pf). Si existe un.pfcorrespondiente, tienes un evento de ejecución con marcas de tiempo y contador de lanzamientos. Amcache.hve— misma época que.bcfpero con hash, editor, fecha de instalación. El hermanoamcache-parserhace esto del lado cliente.- 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,.htano son rastreados por el escáner Application Experience. Un.bcflimpio 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.exeomshta.exenormalmente 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.