SCCM RecentlyUsedApps: evidencia de ejecución en WMI
Leer CCM_RecentlyUsedApps del repositorio WMI: qué programas ejecutó cada usuario, cuándo y cuántas veces, incluidas copias antiguas de OBJECTS.DATA.
En resumen. En los equipos con el cliente de Configuration Manager (SCCM / ConfigMgr), el repositorio WMI contiene CCM_RecentlyUsedApps: un registro por ejecutable y usuario, con la ruta completa, la información de versión del archivo, el último usuario, LastUsedTime y un LaunchCount. Es una evidencia de ejecución que sobrevive al borrado del binario, está en el mismo OBJECTS.DATA que ya recopila para la persistencia WMI, y las copias antiguas de cada registro se pueden recuperar del espacio liberado.
De dónde salen estos datos
El componente de medición de software (software metering) del cliente de ConfigMgr observa los inicios de programas y guarda un resumen en WMI, en el espacio de nombres root\ccm\SoftwareMeteringAgent, clase CCM_RecentlyUsedApps. Configuration Manager lo usa para sus informes de uso de software; para un investigador es un registro por usuario de lo que se ejecutó. Sin cliente de ConfigMgr no hay datos, así que compruébelo primero:
Get-Service CcmExec -ErrorAction SilentlyContinue
Get-CimInstance -Namespace root/ccm/SoftwareMeteringAgent -ClassName CCM_RecentlyUsedApps |
Sort-Object LastUsedTime -Descending |
Select-Object LastUsedTime, LastUserName, FolderPath, ExplorerFileName, LaunchCount, CompanyName
Esta consulta solo muestra los registros activos, a través del propio WMI. Para la investigación, recopile toda la carpeta Repository: no hace falta nada más para SCCM, la clase está en los mismos archivos.
Los campos que importan
| Propiedad | Qué indica |
|---|---|
FolderPath, ExplorerFileName | Desde dónde se ejecutó el ejecutable y su nombre en disco |
LastUserName | La cuenta que lo inició (un registro por usuario) |
LastUsedTime | El inicio más reciente de ese archivo por ese usuario |
LaunchCount | Los inicios que ha contado el cliente |
CompanyName, ProductName, FileDescription, FileVersion, ProductVersion, OriginalFileName | La información de versión del archivo |
FileSize, FilePropertiesHash, SoftwarePropertiesHash | El tamaño y los hashes propios del cliente sobre las propiedades del archivo y del producto |
msiDisplayName, msiPublisher, msiVersion, ProductCode | El producto MSI instalado al que pertenece el archivo, si lo hay |
OriginalFileName y los campos de versión proceden del propio archivo: una herramienta renombrada conserva ahí su nombre original, y una herramienta sin información de versión destaca junto al software firmado de los fabricantes.
Cómo leer bien LastUsedTime
LastUsedTime es una cadena CIM DATETIME: aaaammddHHMMSS.mmmmmm, luego un signo y tres dígitos de desfase respecto a UTC, en minutos. 20260914100914.000000+000 equivale a las 10:09:14 UTC. Un valor terminado en +120 estaría escrito dos horas por delante de UTC, así que su hora UTC es dos horas antes. Convierta con el desfase que trae el valor en lugar de suponer una zona, y guarde la cadena original en sus notas.
Dos límites a tener en cuenta:
- Es el último inicio de ese usuario, no el primero ni cada uno de ellos. El primer inicio suele fecharse mejor con Prefetch o Amcache.
LaunchCountes acumulativo desde que el cliente empezó a seguir el archivo. Un recuento de 1 es una sola ejecución; un recuento de 2 con unLastUsedTimereciente implica al menos una ejecución anterior.
Copias antiguas en OBJECTS.DATA
Cada actualización reescribe el registro. Igual que con las suscripciones WMI eliminadas, la versión anterior no se borra: queda en una página sin mapear o en el slack de una página hasta que WMI reutiliza el espacio. El carving de la cabecera de registro (el hash del nombre de la clase) recupera esas copias con su propio LastUsedTime y su propio LaunchCount. Una copia liberada con un recuento de 1 y una hora anterior, junto a una copia activa con un recuento de 2, también fecha la primera ejecución.
Es el mismo enfoque del CCM_RUA_Finder.py de David Pany (WMI_Forensics); python-cim lee los registros activos a través del índice.
Qué buscar
- Carpetas escribibles por usuarios:
C:\Users\Public\,AppData,Downloads,C:\ProgramData\,C:\Windows\Temp\. El software instalado por un administrador reside enProgram FilesoWindows. - Sin información de versión (
CompanyNamevacío) para un ejecutable fuera de las carpetas habituales. - LaunchCount = 1 en una herramienta: la preparación, la exfiltración o la limpieza a menudo se ejecutan una sola vez.
- Entradas poco comunes: el único programa visto en su carpeta, o visto en un solo equipo del parque.
- Cronología: últimos inicios dentro de la ventana del incidente, o cerca de la creación de una suscripción WMI en el mismo equipo.
Ninguno de estos indicios es una prueba por sí solo. Identifique el archivo (hash desde el disco o las copias de seguridad, fabricante, instalador) antes de concluir.
Un ejemplo comentado
El repositorio de ejemplo de la herramienta (equipo ficticio FIN-WKS-07) contiene m64.exe en C:\ProgramData\Intel\, iniciado por FIN\svc_backup a las 10:09 UTC con un recuento de 2 y sin información de versión, y rclone.exe en C:\Users\Public\, iniciado una vez a las 10:47. Una copia liberada del registro de m64.exe muestra un primer inicio a las 10:02 con un recuento de 1. En las suscripciones WMI del mismo repositorio, un consumidor cuya hora de cabecera de registro es 10:31 ejecuta ese mismo m64.exe unos minutos después de cada arranque. Abra la herramienta, cargue el ejemplo y pase a Evidencia de ejecución (SCCM) para seguirlo con el rango de tiempo.