
Script de enumeración de escalada de privilegios para Windows
Identifique rápidamente vulnerabilidades y problemas de configuración comunes de Windows que no están necesariamente cubiertos por los estándares de seguridad públicos, y recopile información útil para tareas de explotación y post-explotación.
[!IMPORTANT] Un aspecto importante a tener en cuenta al usar esta herramienta es que todas las comprobaciones de control de acceso se realizan en el contexto del usuario actual. Por lo tanto, si se ejecuta con privilegios de administrador, muchas comprobaciones de vulnerabilidades se omiten para evitar generar hallazgos incorrectos.
Descargue el script aquí: PrivescCheck.ps1
[!TIP] El enlace anterior también se puede usar directamente en un terminal de PowerShell con
(New-Object Net.WebClient).DownloadString(...).
¿Existe una forma obvia de escalar privilegios localmente?
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck"
¿Existe información adicional que se pueda aprovechar para post-explotación o para encontrar vulnerabilidades en software de terceros?
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Report PrivescCheck_$($env:COMPUTERNAME) -Format TXT,HTML"
¿Existen problemas de configuración que no estén cubiertos por los estándares de seguridad comunes?
powershell -ep bypass -c ". .\PrivescCheck.ps1; Invoke-PrivescCheck -Extended -Audit -Report PrivescCheck_$($env:COMPUTERNAME) -Format TXT,HTML,CSV,XML"
Invoke-PrivescCheck [-Extended] [-Audit] [-Experimental] [-Report <PREFIX>]
[-Format <FORMAT>[,...]] [-Risky] [-Silent] [-Force]
-Extended
Incluir todas las comprobaciones "extendidas" en el escaneo (ver README).
-Audit
Incluir todas las comprobaciones de "auditoría" en el escaneo.
-Experimental
Incluir todas las comprobaciones "experimentales" en el escaneo. Úselo
solo si sabe lo que está haciendo.
-Report <PREFIX>
Generar al menos un archivo de informe. El nombre del archivo de salida
será "PREFIX.txt" por defecto. La extensión se agrega automáticamente
según el formato del informe (ver "-Format <FORMAT>[,...]").
-Format <FORMAT>[,...]
Especificar el formato de los archivos de informe de salida. Si no se
establece, el valor predeterminado es "TXT". Los formatos admitidos son:
"TXT", "HTML", "CSV" y "XML".
-Risky
Incluir comprobaciones marcadas como "riesgosas", es decir,
comprobaciones que probablemente activen una acción de bloqueo por parte
de una solución de protección de endpoints. Úselo con precaución.
-Silent
Suprimir la salida del terminal. Esto puede ser útil si desea ejecutar
el script como parte de un archivo por lotes, en una tarea programada,
por ejemplo.
-Force
Forzar la ejecución e ignorar advertencias. Normalmente, el script se
detiene si se ejecuta con privilegios de administrador. Use esta opción
para ejecutarlo de todos modos.
-Format TXT)Use la opción -Report <PREFIX> (con -Format TXT) para especificar que desea generar un informe de texto sin formato. La salida es similar a lo que vería en el terminal, excepto que contiene solo caracteres ASCII para una mejor compatibilidad (retro-)con todos los editores de texto.

-Format HTML)Use la opción -Report <PREFIX> con -Format HTML para especificar que desea generar un informe HTML. El archivo de salida se puede abrir en un navegador web. Es más conveniente para visualizar los datos que el informe de texto sin formato. Además, ¡ofrece capacidades de ordenación y filtrado!

-Format CSV) y XML (-Format XML)Use la opción -Report <PREFIX> con -Format CSV o -Format XML para especificar que desea generar un informe CSV o XML. El archivo de salida está destinado a facilitar el análisis de los resultados por herramientas de informes automatizadas.
[!NOTE] Aunque el formato de salida no está documentado (aún), puede descubrirlo fácilmente analizando la estructura de un archivo ya generado. Puede usar el valor
Idde cada comprobación para identificarlas de forma única.
Las comprobaciones de tipo Base siempre se ejecutarán, a menos que el script se ejecute como administrador. Están destinadas principalmente a identificar vulnerabilidades de escalada de privilegios u otros problemas importantes.
-Extended)Las comprobaciones de tipo Extended solo se pueden ejecutar si la opción -Extended se especifica en la línea de comandos. Están destinadas principalmente a proporcionar información adicional que podría ser útil para el desarrollo de exploits o la post-explotación.
-Audit)Las comprobaciones de tipo Audit solo se pueden ejecutar si la opción -Audit se especifica en la línea de comandos. Están destinadas principalmente a proporcionar información relevante en el contexto de una auditoría de configuración.
Por defecto, la política de ejecución de PowerShell está establecida en Restricted en los clientes y RemoteSigned en los servidores, cuando se inicia un nuevo proceso de powershell.exe. Estas políticas bloquean la ejecución de scripts (sin firmar), pero se pueden anular dentro del ámbito actual de la siguiente manera.
Set-ExecutionPolicy Bypass -Scope Process -Force
. .\PrivescCheck.ps1
Sin embargo, este truco no funciona cuando la política de ejecución se aplica a través de una GPO. En este caso, después de iniciar una nueva sesión de PowerShell, puede cargar el script de la siguiente manera.
Get-Content .\PrivescCheck.ps1 | Out-String | Invoke-Expression
Una forma común de eludir el Modo de Lenguaje Restringido consiste en usar PSv2, ya que no implementa esta protección. Por lo tanto, una parte significativa del esfuerzo de desarrollo se dedica a mantener esta retro-compatibilidad.
[!NOTE] Aunque PowerShell versión 2
todavía está habilitado por defecto en las versiones recientes de Windows(Eliminación de PowerShell 2.0 de Windows), no puede ejecutarse sin el framework .Net versión 2.0, que requiere una instalación manual.
Si ejecuta este script dentro de una sesión de Meterpreter, es probable que obtenga un error de "timeout". Esto se debe a que Metasploit usa un valor de tiempo de espera predeterminado de 15 segundos, que no es suficiente para que una ejecución típica del script se complete.
meterpreter > load powershell
Loading extension powershell...Success.
meterpreter > powershell_import /local/path/to/PrivescCheck.ps1
[+] File successfully imported. No result was returned.
meterpreter > powershell_execute "Invoke-PrivescCheck"
[-] Error running command powershell_execute: Rex::TimeoutError Operation timed out.
Es posible establecer un tiempo de espera diferente gracias a la opción -t del comando sessions (documentación). En el siguiente ejemplo, se establece un tiempo de espera de 2 minutos para la sesión con ID 1, pero es posible que desee establecer un valor aún mayor.
msf6 exploit(multi/handler) > sessions -t 120 -i 1
[*] Starting interaction with 1...
meterpreter > powershell_execute "Invoke-PrivescCheck"
Algunas de las comprobaciones dependen de datos en línea (p. ej., base de datos de drivers LOL), pero el script está diseñado para funcionar sin conexión. Para resolver este problema, los datos están integrados en el script y, por lo tanto, deben actualizarse regularmente. Este proceso está totalmente automatizado en la versión oficial, pero si desea compilar el script localmente, puede hacerlo manualmente de forma opcional.
powershell -ep bypass ". .\build\Build.ps1; Update-LolDriverFile"
Compilar el script es tan simple como ejecutar el comando a continuación. El archivo de salida se guardará en la carpeta .\dist\.
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck"
El script de compilación usa un generador de números pseudoaleatorios con una semilla generada aleatoriamente para elegir un nombre de variable para cada módulo. Si desea generar resultados reproducibles entre compilaciones, puede optar por reutilizar la semilla generada previamente usando la opción -NoNewSeed.
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck -NoNewSeed"
El script de compilación usa cifrado AES con una clave generada aleatoriamente para ofuscar el contenido de cada módulo. Si desea generar resultados reproducibles entre compilaciones, puede optar por reutilizar la clave generada previamente usando la opción -NoNewKey.
powershell -ep bypass ". .\build\Build.ps1; Invoke-Build -Name PrivescCheck -NoNewKey"