PersistenceSniper Módulo PowerShell para Cazar Persistencias en Windows
PersistenceSniper Módulo PowerShell para Cazar Persistencias en Windows

PersistenceSniper: Módulo PowerShell para Cazar Persistencias en Windows

PersistenceSniper es un módulo de Powershell que puede ser utilizado por Blue Teams, respondedores de incidentes y administradores de sistemas para cazar persistencias implantadas en máquinas Windows. El script también está disponible en Powershell Gallery. La herramienta está en desarrollo activo con nuevas versiones que salen cada semana, así que asegúrate de usar la versión actualizada.

Por qué PersistenceSniper

¿Por qué existe una herramienta de este tipo? Bueno, para empezar no se encontró una herramienta que busque técnicas de persistencia conocidas, automáticamente, a través de múltiples máquinas, y al mismo tiempo ser capaz de analizar y comparar los resultados rápida y fácilmente. Por supuesto, Autoruns de Sysinternals es una herramienta increíble y definitivamente vale la pena usarla, pero, dado que produce resultados en formatos no estándar y no se puede ejecutar de forma remota a menos que hagas algunas travesuras con su equivalente en la línea de comandos, no parece una buena opción.

Además, algunas de las técnicas de PersistenceSniper no han sido implementadas en Autoruns todavía. De todos modos, si lo que necesitas es una herramienta fácil de usar, basada en una interfaz gráfica de usuario y con un montón de características ya implementadas, Autoruns es el camino a seguir, de lo contrario deja que PersistenceSniper tenga una oportunidad, no la perderá 🙂

Uso de PersistenceSniper

El uso de PersistenceSniper es tan sencillo como iniciar Powershell como administrador y ejecutarlo:

PS C:\> git clone https://github.com/last-byte/PersistenceSniper
PS C:\> Import-Module .\PersistenceSniper\PersistenceSniper\PersistenceSniper.psd1
PS C:\> Find-AllPersistence

Si prefieres quedarte con la versión de Powershell Gallery (que se actualiza automáticamente a través de una acción de Github cada vez que se publica una nueva versión aquí en Github), abre Powershell como Administrador y ejecuta:

PS C:\> Install-Module PersistenceSniper
PS C:\> Import-Module PersistenceSniper
PS C:\> Find-AllPersistence

Si necesitas una explicación detallada de cómo usar la herramienta o qué parámetros están disponibles y cómo funcionan, Find-AllPersistence de PersistenceSniper soporta las características de ayuda de Powershell, por lo que puedes obtener una ayuda detallada y actualizada usando el siguiente comando después de importar el módulo:

Get-Help -Name Find-AllPersistence -Full

Si sólo quieres comprobar una única técnica de persistencia, puedes confiar en el parámetro PersistenceMethod de Find-AllPersistence. Digamos, por ejemplo, que sólo quieres comprobar las persistencias implantadas a través de las claves de registro Run y RunOnce:

PS C:\> Find-AllPersistence -PersistenceMethod RunAndRunOnce

El parámetro PersistenceMethod utiliza la directiva ValidateSet de Powershell, por lo que se puede pasar por ella en lugar de escribir el método de persistencia elegido.

Find-AllPersistence de PersistenceSniper devuelve un array de objetos de tipo PSCustomObject con las siguientes propiedades:

$PersistenceObject = [PSCustomObject]@{
      'ComputerName' = $ComputerName
      'Technique' = $Technique
      'Classification' = $Classification
      'Path' = $Path
      'Value' = $Value
      'Access Gained' = $AccessGained
      'Note' = $Note
      'Reference' = $Reference
      'Signature' = Find-CertificateInfo (Get-ExecutableFromCommandLine $Value)
      'IsBuiltinBinary' = Get-IfBuiltinBinary (Get-ExecutableFromCommandLine $Value)
      'IsLolbin' = Get-IfLolBin (Get-ExecutableFromCommandLine $Value)
} 

Esto permite formatear y filtrar fácilmente la salida. Digamos que sólo quieres ver las persistencias que permitirán al atacante recuperar el acceso como NT AUTHORITY\SYSTEM (también conocido como System):

PS C:\> Find-AllPersistence | Where-Object "Access Gained" -EQ "System"
Filtrar persistencias con PersistenceSniper
Filtrar persistencias con PersistenceSniper

Por supuesto, siendo PersistenceSniper una herramienta basada en Powershell, se pueden realizar algunos trucos interesantes, como pasar su salida a Out-GridView para tener una tabla basada en GUI con la que interactuar.

Mostrar tabla GUI con PersistenceSniper
Mostrar tabla GUI con PersistenceSniper

Interpretación de los Resultados

Como ya se ha introducido, Find-AllPersistence produce un array de objetos personalizados Powershell. Cada objeto tiene las siguientes propiedades, que pueden utilizarse para filtrar, ordenar y comprender mejor las diferentes técnicas que busca la función:

  • ComputerName: esto es bastante sencillo. Si ejecutas Find-AllPersistence sin el parámetro -ComputerName, PersistenceSniper se ejecutará sólo en la máquina local. De lo contrario, se ejecutará en la(s) computadora(s) remota(s) que especifiques;
  • Technique: este es el nombre de la técnica en sí, como se conoce comúnmente en la comunidad;
  • Classification: esta propiedad puede utilizarse para identificar rápidamente las técnicas en función de su número de técnica y subtécnica MITRE ATT&CK. Para aquellas técnicas que no tienen una clasificación MITRE ATT&CK, se utilizan otras clasificaciones, siendo la más común la de Hexacorn ya que muchas técnicas fueron descubiertas por él. Cuando no se puede identificar de forma fiable el origen de una técnica, se utiliza la clasificación “Número de técnica no catalogada”;
  • Path: es la ruta, en el sistema de archivos o en el registro, en la que se ha implantado la técnica;
  • Value: este es el valor de la propiedad del registro que las técnicas utilizan, o el nombre del ejecutable/biblioteca utilizado, en caso de que sea una técnica que depende de plantar algo en el sistema de archivos;
  • Access Gained: es el tipo de acceso que la técnica concede al atacante. Si se trata de una clave Run bajo HKCU, por ejemplo, el acceso obtenido será a nivel de usuario, mientras que si está bajo HKLM será a nivel de sistema;
  • Note: esta es una explicación rápida de la técnica, para que se pueda comprender fácilmente su funcionamiento;
  • Reference: este es un enlace a una explicación más profunda de la técnica, por si el analista necesita estudiarla más;
  • Signature: esta propiedad informa sobre la firma del binario asociado a la técnica de persistencia encontrada;
  • IsBuiltinBinary: esta propiedad booleana informa si el binario asociado a la técnica de persistencia encontrada se encuentra normalmente en el Sistema Operativo y se considera incorporado;
  • IsLolbin: esta propiedad booleana se establece como True si el binario asociado a la técnica de persistencia encontrada es un LOLBin.

Cómo Lidiar con los Falsos Positivos

Admitámoslo, la búsqueda de técnicas de persistencia también conlleva tener que lidiar con muchos falsos positivos. Esto ocurre porque, mientras que algunas técnicas casi nunca se utilizan de forma legítima, muchas sí lo hacen por parte de software legítimo que necesita ejecutarse de forma automática al arrancar el sistema o al iniciar la sesión del usuario.

Esto supone un reto, que en muchos entornos puede abordarse creando un archivo CSV que contenga los falsos positivos conocidos. Si tu organización despliega sistemas usando algo como una imagen dorada, puedes ejecutar PersistenceSniper en un sistema que acabas de crear, obtener un CSV de los resultados y usarlo para filtrar los resultados en otras máquinas. Este enfoque tiene los siguientes beneficios:

  • No tener que gestionar una lista blanca de persistencias que puede ser tediosa y propensa a errores;
  • Adaptar los falsos positivos a las organizaciones, y sus unidades organizativas, que utilizan la herramienta;
  • Dificultar a los atacantes que quieran mezclar falsos positivos al no revelarlos públicamente en el código de la herramienta.

Find-AllPersistence viene con parámetros que permiten la salida directa de los hallazgos a un archivo CSV, a la vez que es capaz de tomar un archivo CSV como entrada y diferenciar los resultados.

PS C:\> Find-AllPersistence -DiffCSV false_positives.csv
Uso de PersistenceSniper con el parámetro DiffCSV
Uso de PersistenceSniper con el parámetro DiffCSV

Buscando persistencias tomando instantáneas incrementales

Una forma interesante de utilizar PersistenceSniper es utilizarlo de forma incremental: puedes configurar una tarea programada que se ejecute cada X horas, toma la salida de la iteración anterior a través del parámetro -DiffCSV y envía los resultados a un nuevo CSV. Al hacer un seguimiento de los cambios incrementales, deberías ser capaz de detectar dentro de un marco de tiempo razonablemente pequeño nuevas persistencias implantadas en la máquina que estás monitorizando.

Técnicas de Persistencia Aplicadas hasta Ahora

El tema de la persistencia, especialmente en máquinas Windows, es uno de los que ven nuevos descubrimientos básicamente cada dos semanas. Dada la gran cantidad de técnicas de persistencia encontradas hasta ahora por los investigadores, todavía estoy en proceso de implementarlas. Hasta ahora se han implementado con éxito las siguientes 34 técnicas:

https://github.com/last-byte/PersistenceSniper

Mi Carro Close (×)

Tu carrito está vacío
Ver tienda