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"

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.

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

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:
- Run Key
- RunOnce Key
- Image File Execution Options
- Natural Language Development Platform 6 DLL Override Path
- AEDebug Keys
- Windows Error Reporting Debugger
- Windows Error Reporting ReflectDebugger
- Command Prompt AutoRun
- Explorer Load
- Winlogon Userinit
- Winlogon Shell
- Windows Terminal startOnUserLogin
- AppCertDlls DLL Injection
- App Paths Hijacking
- ServiceDll Hijacking
- Group Policy Extensions DLLs
- Winlogon MPNotify
- CHM Helper DLL
- Hijacking of hhctrl.ocx
- Startup Folder
- User Init Mpr Logon Script
- AutodialDLL Winsock Injection
- LSA Extensions DLL
- ServerLevelPluginDll DNS Server DLL Hijacking
- LSA Authentication Packages DLL
- LSA Security Packages DLL
- Winlogon Notify Packages DLL
- Explorer Tools Hijacking
- .NET DbgManagedDebugger
- ErrorHandler.cmd Hijacking
- WMI Subscriptions
- Windows Services
- Terminal Services InitialProgram
- Accessibility Tools Backdoor
PersistenceSniper (este enlace se abre en una nueva ventana) por last-byte (este enlace se abre en una nueva ventana)
Powershell module that can be used by Blue Teams, Incident Responders and System Administrators to hunt persistences implanted in Windows machines. Made with ❤️ by @last0x00 and @dottor_morte