Windows y su lado antiforense, (Plug and Play Cleanup y setupapi[.]dev)

Hola, secuaces:

El artículo que hoy les presento a ustedes es un trabajo que tenía pendiente de publicar desde hace casi un año... Hoy, por fin, puedo tacharlo de mi lista 'To Do'. Esto son las cosas que tiene ser meramente un curioso en la materia. Que uno sólo puede hacer lo que puede hacer, con los medios que tiene y con el tiempo que del que dispone. Pero no me gusta quedarme con ningún trabajo a medias. Así que he terminado lo que empecé y espero que lo disfruten igual que yo.

Permítanme situarles un poco en los antecedentes de este proyecto, con una breve introducción sobre el cómo surgió el presente trabajo...


Después de la presentación que expuse en el Congreso de Ciberseguridad CONPilar, (el día 28 de abril de 2018), bajo el título "Piénsatelo dos veces antes de meterla", y tras la correspondiente publicación de un muy breve artículo en 'Follow the White Rabbit', (el día 1 de mayo de 2018), Alexis Brignoni tuvo a bien hacerme una observación ese mismo día, mediante un tweet, que me dejó perplejo. En dicho tweet, Alexis menciona que parece ser que a Windows le gusta eliminar entradas de dispositivos USB si no son conectados en 30 días. Acompaña a ese tweet un enlace a un artículo de David Cowen, (publicado el día 19 de abril de 2018), bajo el título "Windows, Now with built in anti forensics!". En dicho artículo, David dice que: "Windows, por sí solo y sin la petición del usuario, está eliminando algunas entradas de dispositivos no utilizados, del Registro, de forma sistemática, impulsado por el programador de tareas". David también hace referencia a la fuente de la noticia pero, desafortunadamente, ya no se encuentra disponible, (http://textlab.io/doc/431305/pdf-version---dpmforensics).

Así pues, me puse manos a la obra y así lo anuncié mediante otro tweet, (el día 4 de mayo de 2018). Levanté algunas máquinas virtuales, instalé varias versiones de Windows e hice las pruebas pertinentes. Terminadas dichas pruebas, se lo hice saber a David mediante otro mensaje, (el día 7 de junio de 2018), porque esa 'nueva' característica de Windows me tenía completamente desconcertado.

Poco tiempo después, (el día 29 de julio de 2018), David publicó un nuevo reto en su Blog, con un interrogante bien claro: "Windows 10 sigue cambiando y con ello su comportamiento. En Windows 8.1 y las primeras versiones de Windows 10 existía la tarea de eliminar los dispositivos plug and play que no se habían conectado durante 30 días. En las versiones más recientes de Windows 10 esto parece estar desactivado. Para este desafío, documente qué versiones de Windows 10 tienen la tarea habilitada y si sobrevive a la actualización."

Yo ya tenía medio trabajo hecho... pero la falta de previsión me llevó por mal camino. No tuve en consideración el espacio de disco duro que es necesario para las actualizaciones y me quedé corto asignando un tamaño de disco adecuado. (Vuelta a empezar con las pruebas).

Pero... no hay mal que por bien no venga, porque Adam Harrison hizo un excelente trabajo publicando una resolución al reto, en su Blog, (el día 30 de julio de 2018), con el artículo "Windows Plug and Play Cleanup".

He creído oportuno exponerles esta breve cronología para que vean ustedes que, a veces, hay grandes trabajos, proyectos e ideas, que surgen de una mera observación, de un pequeño comentario.

Dicho esto,

Según parece, nos encontramos ante una tarea programada que eliminará todos los dispositivos que no hayan estado conectados durante 30 días. ¿Cómo? ¿Una nueva característica anti forense en Windows? Esto, atenta contra mi curiosidad


Plug and Play Cleanup


'Plug and Play Cleanup' es una tarea programada que viene integrada con algunas versiones de Windows 10. Es creada por el propio Sistema y es ejecutada con el usuario System. Esta tarea dice en su descripción, textualmente: "Windows conserva copias de todos los paquetes de controladores de dispositivos instalados antes desde Windows Update y otras fuentes, incluso después de instalar versiones más recientes de los controladores. Esta tarea quitará las versiones anteriores de los controladores que ya no se necesiten. Se conservará la versión más reciente de cada paquete de controladores. También quitará el estado usado por los dispositivos que lleven mucho tiempo sin detectarse en el Sistema."

Para entender cómo funciona la tarea programada, hay que estudiarla. Windows crea para cada tarea programada un fichero que es alojado en la ruta '%systemroot%\system32\Tasks\'. En este caso, el fichero de la tarea se encuentra en:
%systemroot%\System32\Tasks\Microsoft\Windows\Plug and Play\Plug and Play Cleanup

Si es abierto con un visor adecuado puede ser estudiado cómodamente y se pueden ver claramente diversos apartados y campos con distintos valores. 

Lo primero que se puede apreciar es que hace referencia a un fichero que lleva por nombre 'pnpclean.dll', (del que les hablaré un poquito más adelante), que se encuentra en:
%SystemRoot%\system32\pnpclean.dll
Según el sitio de Microsoft, existen dos versiones de tareas: 1.0 y 2.0. La versión de esta tarea se corresponde a la 1.0.

El campo que lleva por nombre 'RunLevel', presenta un valor de 'HighestAvailable' e indica que, conforme al sitio de Microsoft, la tarea va a ser ejecutada con los permisos de usuario más altos disponibles, (usuario System).

El campo que lleva por nombre 'ExecutionTimeLimit', presenta un valor de 'PT1H' e indica que, conforme al sitio de Microsoft, la tarea se ejecutará durante un tiempo máximo de una hora.

El campo que lleva por nombre 'UseUnifiedSchedulingEngine', presenta un valor de 'true' e indica que, conforme al sitio de Microsoft, se utilizará el motor de programación unificada para realizar la tarea.

Dentro del apartado 'MaintenanceSettings' se pueden ver dos campos. El campo 'Period', que presenta un valor de 'P1M', indica que, conforme al sitio de Microsoft, la tarea se ejecutará una vez al mes durante el mantenimiento automático. El campo 'Deadline', que presenta un valor de 'P2M', indica que, conforme al sitio de Microsoft, la tarea se ejecutará una vez cada dos meses durante el mantenimiento automático de emergencia, si no se ha podido completar durante el mantenimiento automático regular.

Si lo desean, pueden ver la documentación oficial de Microsoft existente sobre los ajustes de mantenimiento.

El fichero 'pnpclean.dll', al que hace referencia la tarea, es el responsable de llevar a cabo la eliminación de los dispositivos y controladores 'antiguos' que no son usados, (según el Sistema).


Este fichero se localiza en la ruta:
%SystemRoot%\system32\pnpclean.dll
Este fichero se encarga de buscar dispositivos y controladores que no han sido conectados y usados recientemente y que pueden ser eliminados del Sistema.


Les recuerdo a ustedes que un atacante con privilegios podría ejecutar este fichero para tratar de eliminar algunas evidencias, haciendo uso de:
rundll32.exe pnpclean.dll,RunDLL_PnpClean /DEVICES /DRIVERS /MAXCLEAN


Les puedo garantizar a ustedes que muchos de esos dispositivos que han sido eliminados los uso con frecuencia.

El entorno de pruebas

Para arrojar un poco más de luz sobre este comportamiento, un poco oscuro, de Windows he optado por realizar instalaciones limpias de las siguientes versiones de Windows 10, virtualizadas bajo VirtualBox:
  • Versión 1507, OS build 10240.16384
  • Versión 1607, OS build 14393.0
  • Versión 1709, OS build 16299.15
  • Versión 1803, OS build 17127.1
  • Versión 1803, OS build 17134.1
  • Versión 1803, OS build 17134.112
Después de completar la instalación, he decidido llevar a cabo una serie de pasos comunes a todas las versiones probadas:
  • Comprobar la existencia de la tarea 'Plug and Play Cleanup'
  • Instalar un único dispositivo USB en todas las máquinas, (número de serie 070B59BB1CB2234)
  • Extraer los siguientes ficheros con FTK Imager Lite:
    • Plug and Play Cleanup
    • pnpclean.dll
    • setupapi.dev.log
    • System
  • Actualizar todos los sistemas a la última versión disponible
  • 'Viajar al futuro', cambiando la fecha del Sistema
  • Volver a extraer los mismos ficheros que antes de la actualización
He tenido en cuenta la fecha de creación de los ficheros 'Plug and Play Cleanup' y 'pnpclean.dll', así como la versión de los ficheros '.dll' y he comparado su contenido calculando el valor hash en MD5, usando la herramienta HasMyFiles.

Todos los sistemas han sido actualizados a la OS build 17134.619, a excepción de la OS build 10240, que ha sido actualizada a la 17763.316, (por razones que desconozco).

Pueden consultar ustedes la versión, la fecha de lanzamiento y otra información relativa a las distintas versiones en el sitio oficial de Microsoft.

Las pruebas

OS build 10240.16384

Esta versión presenta la tarea programada.

El fichero 'Plug and Play Cleanup' presenta un valor hash de a637c76f51d93371487db5b64e1333a6.

El fichero 'pnpclean.dll' presenta una fecha de creación de 10/07/2015 8:23:38, una versión de 10.0.10240.16384 y un valor hash de 3b24ac437d7ea0df8bde0d7cfbc5d6ad.

Tras efectuar la actualización,

El fichero 'Plug and Play Cleanup' original ha sido movido a "Windows\System32\Tasks_Migrated\Microsoft\Windows\Plug and Play\" y ocupa su lugar otro fichero con el mismo valor hash de a637c76f51d93371487db5b64e1333a6.

El fichero 'pnpclean.dll' original ya no se encuentra en el Sistema. Ocupa su lugar otro fichero, con una fecha de creación de 15/09/2018 5:07:07, con una versión de 10.0.17763.1 y con un valor hash de 5bc372bd55b3c1506f9ffabda9f11639. También se encuentra otro fichero 'pnpclean.dll' en la ruta "Windows.old\System32\", que presenta una fecha de creación de 30/09/2016 3:13:53, con una versión de 10.0.10240.17146 y un valor hash de c8703a9e0c5ca37439a37a0af3a535e7.


En esta versión, la tarea programada sigue estando habilitada después de la actualización.

OS build 14393.0

Esta versión presenta la tarea programada.

El fichero 'Plug and Play Cleanup' presenta un valor hash de a637c76f51d93371487db5b64e1333a6.

El fichero 'pnpclean.dll' presenta una fecha de creación de 16/07/2016 11:42:16, una versión de 10.0.14393.0 y un valor hash de e8ac0747384c96c23ca5e84ee79492bd.

Tras efectuar la actualización,

El fichero 'Plug and Play Cleanup' original ha sido movido a "Windows\System32\Tasks_Migrated\Microsoft\Plug and Play\" y ocupa su lugar otro fichero con el mismo valor hash de a637c76f51d93371487db5b64e1333a6.

El fichero 'pnpclean.dll' original ya no se encuentra en el Sistema. Ocupa su lugar otro fichero, con una fecha de creación de 11/04/2018 23:34:32, con una versión de 10.0.17134.1 y con un valor hash de 4fa8d3cb0ef46be97cd4314617db94dc. También se encuentra otro fichero 'pnpclean.dll' en la ruta "Windows.old\System32\", que presenta una fecha de creación de 16/07/2016 11:42:16, con una versión de 10.0.14393.0 y un valor hash de e8ac0747384c96c23ca5e84ee79492bd.


En esta versión, la tarea programada sigue estando habilitada después de la actualización.

OS build 16299.15

Esta versión no presenta la tarea programada.

El fichero 'pnpclean.dll' presenta una fecha de creación de 29/09/2018 13:41:56, una versión de 10.0.16299.15 y un valor hash de c2374548a0b171794628a136cf4507da.

Tras efectuar la actualización,

El fichero 'pnpclean.dll' original ya no se encuentra en el Sistema. Ocupa su lugar otro fichero, con una fecha de creación de 11/04/2018 23:34:32, con una versión de 10.0.17134.1 y con un valor hash de 4fa8d3cb0ef46be97cd4314617db94dc. También se encuentra otro fichero 'pnpclean.dll' en la ruta "Windows.old\System32\", que presenta una fecha de creación de 29/09/2017 13:41:56, con una versión de 10.0.16299.15 y un valor hash de c2374548a0b171794628a136cf4507da.


OS build 17127.1

Esta versión no presenta la tarea programada.

El fichero 'pnpclean.dll' presenta una fecha de creación de 18/03/2018 17:29:24, una versión de 10.0.17127.1 y un valor hash de 8eb85239c3e8e7bb8dd070b722e60da.

Tras efectuar la actualización,

El fichero 'pnpclean.dll' original ya no se encuentra en el Sistema. Ocupa su lugar otro fichero, con una fecha de creación de 11/04/2018 23:34:32, con una versión de 10.0.17134.1 y con un valor hash de 4fa8d3cb0ef46be97cd4314617db94dc. También se encuentra otro fichero 'pnpclean.dll' en la ruta "Windows.old\System32\", que presenta una fecha de creación de 18/03/2018 17:29:24, una versión de 10.0.17127.1 y un valor hash de 8eb85239c3e8e7bb8dd070b722e60da.


OS build 17134.1

Esta versión no presenta la tarea programada.

El fichero 'pnpclean.dll' presenta una fecha de creación de 11/04/2018 23:34:32, una versión de 10.0.17137.1 y un valor hash de 4fa8d3cb0ef46be97cd4314617db94dc.

Tras efectuar la actualización,

El fichero 'pnpclean.dll' presenta exactamente las mismas características que antes de la actualización.


OS build 17134.112

Esta versión no presenta la tarea programada.

El fichero 'pnpclean.dll' presenta una fecha de creación de 11/04/2018 23:34:32, una versión de 10.0.17134.1 y un valor hash de 4fa8d3cb0ef46be97cd4314617db94dc.

Tras efectuar la actualización,

El fichero 'pnpclean.dll' presenta exactamente las mismas características que antes de la actualización.



Resultados

A continuación les expongo los resultados que he obtenido en una tabla, dividida en dos partes por cuestiones de tamaño, (y por ende para una mayor comprensión). La primera parte se corresponde la información de antes de la actualización de los sistemas y la segunda parte se corresponde con la información relativa a los sistemas una vez actualizados.



Tal y como pueden apreciar ustedes, en mis pruebas, las versiones que cuentan con la tarea programada son las 1507, (10240), y 1607, (14393). A partir de la versión 1709, inclusive, no se presenta la tarea programada.

Las tareas programadas existentes son idénticas en todos los sistemas que la tienen activada y, además, persisten después de la actualización, puesto que siguen estando presentes.

En una instalación limpia, cada versión del Sistema Operativo cuenta con su propia versión del fichero 'pnpclean.dll', que es modificado cuando se actualiza la versión.

Todos los sistemas, una vez actualizados, (a excepción de la versión 1507 que presenta alguna peculiaridad), presentan la misma versión del fichero 'pnpclean.dll', creado el 11 de abril de 2018.

A partir de la versión 1803, (17134.1), lanzada el 11 de abril de 2018, se presenta la misma versión del fichero 'pnpclean.dll' en todos los sistemas, que no sufren cambios en su actualización.

Un par de pecualiaridades

Durante la ejecución de mis pruebas he podido observar un par de peculiaridades.

He podido leer en algunos artículos que los dispositivos son eliminados cuando no han sido conectados en 30 días, cuando se ejecuta la tarea. Según he podido ver en mis pruebas, esto no es así.

Para entender este funcionamiento debemos entender cuándo entra en funcionamiento. Tal y como he expuesto anteriormente, la tarea 'Plug and Play Cleanup' es ejecutada una vez al mes, durante el mantenimiento automático o una vez cada dos meses, durante el mantenimiento de emergencia, si falla el mantenimiento automático. Por lo tanto, hay que tener en cuenta cómo se produce el mantenimiento automático, que pueden consultar en el sitio oficial de Microsoft. Deben saber ustedes que es el Sistema quien elige cuándo se ejecuta el mantenimiento automático, cuando se encuentra encendido o en reposo y, por defecto, se lleva a cabo de forma diaria, (a las 3 AM), con una duración máxima de una hora.

Cuando la tarea se ejecuta, ésta, siempre llama al fichero 'pnpclean.dll'. El Sistema considera exitosa la ejecución de la tarea aunque se muestre un error en ella. Y si la tarea presenta después de su ejecución el código 0x0 significa, según el sitio de Microsoft, que la tarea ha sido ejecutada satisfactoriamente.

Todas las tareas que programa el propio Sistema Windows presentan una fecha de última ejecución de 30 de noviembre de 1999.

Para realizar las pruebas de ejecución de la tarea he optado por realizar varios 'viajes al futuro', cambiando la fecha del Sistema.

Adelanto la fecha del Sistema, (que se encuentra aislado de la red), hasta el día 28 de marzo para dejarlo inactivo. La tarea se ha ejecutado tras 10 minutos de inactividad, el día 28 de marzo, a las 07.52.11 horas.


Nuevamente, adelanto la fecha del Sistema hasta el día 15 de abril para dejarlo nuevamente inactivo. La tarea es ejecutada ese día, a las 08.05.58 horas.


Realizo un último 'viaje al futuro', adelantando la fecha del Sistema al día 10 de mayo para dejarlo inactivo por última vez, hasta la ejecución de la tarea, que se produce a las 09.06.48 horas.


Todas estas acciones que lleva a cabo esta tarea programada se pueden apreciar en el log 'setupapi.dev.log', que es el encargado de registrar las instalaciones y desinstalaciones de controladores.


(En este caso no se elimina nada porque no hay nada que eliminar).

Con esto se puede deducir que no hace falta que transcurran 30 días desde el último uso de un controlador o de un dispositivo, aunque no puedo, a día de hoy, determinar la frecuencia exacta de su ejecución.

Otra peculiaridad con la que me he encontrado está relacionada con la versión 10240 de Windows que, además de tener la tarea programada 'Plug and Play Cleanup' habilitada y con persistencia después de su actualización, no registra los controladores de dispositivos conectados en su log 'setupapi.dev.log'.

Conecto el dispositivo 070B59BB1CB22334 al Sistema actualizado, de la versión 10240 a la la versión 17763, el día 25 de febrero de 2019, a las 09.52.55.


Y procedo a examinar el log 'setupapi.dev.log', donde no encuentro dicho dispositivo conectado.


Esta versión actualizada de la 10240 no graba los dispositivos USB en ese fichero, aunque sí he encontrado esos valores en el log 'setupapi.upgrade.log', en el apartado correspondiente al de configuración de la migración PnP.


Visto este detalle, opto por hacer una serie de pruebas con la versión 10240 limpia y aislada de la red. Conecto ese mismo dispositivo y vuelvo a estudiar el log 'setupapi.dev.log', con resultado negativo.


Así pues, al menos esta versión de Windows, no graba los dispositivos USB en el log correspondiente.

Conclusiones

Son varias las conclusiones que se me ocurren...

La primera de ellas es que, si ustedes tienen pensado publicar un trabajo pero otra persona se les ha adelantado y ya se encuentra publicado, publíquenlo igualmente porque eso servirá para dos cosas:
  • Reconocer el trabajo de otras personas. (Eso es bueno)
  • Validar pruebas de otras personas. (Eso es bueno)
La colaboración, de forma directa o indirecta, es muy buena para buscar resultados.

Otra conclusión que saco es que, cada vez más, se hace necesario conocer la versión original del sistema instalado porque es posible que nos encontremos con casos en los que no se graban los dispositivos USB que se conectan, (como ocurre con la versión 10240), o con casos en los que estos son eliminados junto a sus controladores, por acción del propio sistema o por acción del usuario.

Si nos encontramos con una carpeta 'Windows.old', se debe estudiar porque es posible que lo que estamos buscando se encuentre ahí, si los controladores y dispositivos han sido conectados antes de una actualización. No hay que olvidar que existen algunas herramientas forenses que basan su funcionamiento la búsqueda de datos de los ficheros afectados por la tarea 'Plug and Play Cleanup'.

Puedo confirmar las pruebas que hizo Adam en su artículo y decir que la última versión que incluía la tarea 'Plug and Play Cleanup' ha sido la 1607, dejando de estar presente en las siguientes versiones. También puedo decir que el fichero encargado de efectuar esa 'limpieza', el fichero 'pnpclean.dll', presenta una estabilidad desde la versión 17134.1, puesto que no varía con las siguientes versiones. 

No podemos descartar que, conforme avanzan y cambian las versiones de Windows, es posible que volvamos a encontrar la tarea 'Plug and Play Cleanup'.

Si les ha gustado este pequeño trabajo, háganmelo saber. (Eso es bueno).

Eso es todo.

Share:
spacer

4 comentarios:

  1. Enhorabuena por tus artículos, son muy didácticos. Había que hacértelo saber ;)

    ResponderEliminar
  2. Thanks for the kind words, and most importantly for doing the valuable job of validating the findings of others!

    ResponderEliminar
    Respuestas
    1. Thanks to you, Adam. I don't usually say anything I don't think. Thank you for shedding light on that Windows feature with an excellent article. (Even though I think you got ahead of me 😜).
      I believe that validating tests is a basic and necessary thing that, unfortunately, is rarely put into practice. It costs nothing to acknowledge what others have done and to validate a result.

      Eliminar