Timestomping en Windows (MACB adventures)

Si tenemos control sobre una máquina podemos modificar los atributos de tiempo de cualquier archivo para ocultar nuevos o cambios en los existentes. Por ejemplo, para que archivos que han sido modificados o creados por el atacante no sean visibles para los investigadores forenses o las herramientas de análisis.

Cuando se realizan estos cambios en las marcas de tiempo o timestamps de un archivo (modify, access, create (b), change) estamos haciendo lo que se denomina Timestomping. Seguro que os suena el comando timestomp de meterpreter o algunas herramientas que permiten realizar estas modificaciones fácilmente:


¿Como realizan estos cambios estas herramientas? ¿Realmente un analista forense no será capaz de detectar estas modificaciones? Empecemos por el principio para entenderlo perfectamente.

Lo básico - explorador de archivos

En el mundo forense se utilizan los tiempos MAC que son los metadatos que se registran cuando se modifican los datos (mtime), se accede (atime) o se cambian los metadatos (ctime) de cualquier fichero. Los acrónimos se derivan de Unix pero en sistemas Windows usan el ctime como marca de tiempo de creación (también llamado birth). 

Vamos a trabajar con Windows 10 y un sistema de ficheros NTFS así que echemos un vistazo al explorador de archivos de Windows en el que es posible ver estas tres marcas seleccionando previamente las columnas correspondientes:


Como veis, al crear el fichero las tres marcas M, A, C(B) son iguales:

Ahora si editamos y guardamos el fichero podemos comprobar como se modifican solo los timestamps M y A:

A continuación copiamos el fichero a otro nuevo. En este caso se modifican los timestamps A y C(B) y el M se hereda del original copiado:

Hasta ahí todo correcto, vemos que es el comportamiento esperado que podemos resumir en la siguiente tabla:

¿Y qué pasa con el timestamp de acceso?

El asterisco del NO de la marca A (Accessed) en la tabla es debido a que en Windows 10 por defecto está configurado con el valor 0x80000002 lo que significa que "Último acceso" está habilitado y administrado por el sistema. 

Ésto ultimo significa que las actualizaciones de "Último acceso" están habilitadas cuando el tamaño del volumen del sistema (que generalmente se monta como la unidad "C:") es de 128 GiB o menos (valor NtfsLastAccessUpdatePolicyVolumeSizeThreshold). Si el volumen del sistema es mayor, las actualizaciones de "last access" se deshabilitan.



El motivo de todo esto es evidente... si activamos el registro del acceso a todo archivo el rendimiento disminuye. De hecho, desde Windows Vista lo deshabilitaron por defecto aunque podría habilitarse manualmente (1 o 0). 

Sin embargo, desde Windows 10 "Redstone 4" (actualización de abril de 2018) y "Redstone 5" (actualización de octubre de 2018) se introdujo una nueva semántica y los valores editables en el registro "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\FileSystem" son:

Aquí hay algo curioso. Efectivamente fsutil muestra que DisableLastAccess está a 2 pero que los actualizaciones del último acceso pone que están deshabilitadas. Después de varias pruebas pude comprobar de que debe haber un algún error en la salida del comando, probablemente un error de traducción. Por ejemplo, si lo seteamos a 0 y reiniciamos, aunque diga que el registro está deshabilitado:

realmente no lo está y se comporta como debería, solo con abrir el fichero se modificará el timestamp:

Resuelto el misterio estamos preparados para ampliar aún más la información. ¿Y si te digo que no hay sólo 3 timestamps si no 8 o más? 


MACE/MACB

Como decíamos al principio, en Windows sustituimos el timestamp ctime (metadata change) por el btime (birth change o creation) pero ¿cómo registramos por ejemplo si se renombra el fichero? Efectivamente, seguimos necesitando el timestamp de modificación de metadatos y que no se vea directamente en el explorador de Windows no significa que no exista:

  • Modification ( M )
  • Access ( A )
  • Change ( C ) / $MFT Entry modified (and not Creation)
  • Birth ( B )

o

  • Modification ( M )
  • Access ( A )
  • Created ( C )
  • Entry Modified ( E )

Es decir, en NTFS tenemos 4 tipos de timestamps. Estos valores se almacenan en uno de los meta-archivos principales: la $MFT (Maste File Table). Con FTKImager podemos verlo:

Las marcas de tiempo NTFS se almacenan como enteros little-endian sin signo de 64 bits. La resolución de las marcas de tiempo es de 100 nanosegundos a partir del 1 de enero de 1601, y todas están almacenadas en formato UTC.

$STANDARD_INFORMATION versus $FILE_NAME

Los timestamps MACB se almacenan en dos atributos diferentes en $STANDARD_INFORMATION y $FILE_NAME. El primero puede ser modificado por procesos a nivel de usuario, por lo tanto, la mayoría de las herramientas de manipulación de marcas de tiempo solo modifican este valor. $FILE_NAME solo puede ser cambiado por el kernel del sistema.

Otra particularidad es que solo puede existir un $STANDARD_INFORMATION para una entrada pero puede haber varios $FILE_NAME para un archivo ya que hay cuatro espacios de nombres: para nombres de DOS 8.3, nombres de Windows, nombres de POSIX y un espacio de nombres compartido para nombres de archivos compatibles con DOS y Windows. ¿Ahora entiendes porque decía que puede haber 8 timestamps o más?

Hay varias herramientas para mostrarlos, por ejemplo veamoslo con MFTRCRD:

Desatando timestomping

Vamos a empezar con la clásica herramienta TimeStomp.exe, una herramienta desarrollada por James C. Foster y Vincent Liu para manipular los valores MACE en un volumen NTFS. A grandes rasgos usa la función NtSetInformationFile dentro de ntdll.dll y la estructura FILE_BASIC_INFORMATION en FILE_INFORMATION_CLASS. 

En el ejemplo modificaremos todos los timestamps con el parámetro -z:

Parece que funciona, pero si observamos los timestamps en $FILE_NAME comprobaremos que no han sido modificados como los otros:

por lo que el analista forense habría descubierto por tanto el "engaño".

Probemos otra herramienta que clona los timestamps de un archivo a otro, en esta ocasión la utilidad ts de timestomp escrita en C/C++ de jackson5:

Como podéis comprobar solo ha clonado los timestamps de $STANDARD_INFO:

Fijaros como el fichero 'fichero1 - copia.txt' al tener un nombre largo (más de 8 caracteres) tiene un $FILE_NAME adicional para FICHER~1.txt.

La última y más importante herramienta de timestomping que vamos a comentar es SetMACE del noruego Joakim Schicht. Esta herramienta implementó unos trucos bastante interesantes para modificar también los timestamps de $FILE_NAME.

La primera versión (v1005) establecía los timestamps y luego movía el archivo a una carpeta diferente antes de volver a mover el archivo y restablecer los timestamps. Eso cambiaba efectivamente los timestamps de ambos atributos pero se podía encontrar evidencia de dicha actividad en $LogFile. Más adelante, en la siguiente versión (v1006), se agregó soporte para escribir los timestamps de $FILE_NAME directamente en el disco físico y así eliminar la necesidad de mover el archivo. Sin embargo, la posibilidad de escribir los timestamps en el disco físico directamente se bloqueó en nt6.x desde Vista y versiones posteriores, por lo que se necesita un driver en modo kernel que haga uso de SL_FORCE_DIRECT_WRITE:


Aún así, se puede escribir directamente en un disco físico en cualquier volumen NTFS que no sea la unidad del sistema en nt6.x u otras alternaticas como arrancar en WinPE (Windows Preinstallation Environment) y escribir en la unidad del sistema local. Para el ejemplo haremos lo más sencillo, simplemente mover el archivo que queremos modificar a la unidad D:

Como habéis visto ha desmontado automáticamente la unidad para modificar los timestamps. Así que miramos el atributo $FILE_NAME:


y voilà! ya hemos conseguido modificar también esos timestamps. Los analistas forenses nos podrán "pillar" de otras maneras, pero al menos en cuanto a las marcas de MACB/MACE se lo hemos puesto más difícil ;)

Comentarios