SeImpersonate y SeAssignPrimaryToken
En Windows, cada proceso tiene un token que contiene información sobre la cuenta que lo está ejecutando. Estos tokens no se consideran recursos seguros, ya que son solo ubicaciones dentro de la memoria que podrían ser atacadas por la fuerza por usuarios que no pueden leer la memoria. Para utilizar el token, se necesita el privilegio SeImpersonate
. Solo se otorga a las cuentas administrativas y, en la mayoría de los casos, se puede eliminar durante el fortalecimiento del sistema. Un ejemplo de uso de este token sería CreateProcessWithTokenW .
Los programas legítimos pueden utilizar el token de otro proceso para escalar del administrador al sistema local, que tiene privilegios adicionales. Los procesos generalmente hacen esto llamando al proceso WinLogon para obtener un token del SISTEMA y luego ejecutándose con ese token colocándolo dentro del espacio del SISTEMA. Los atacantes a menudo abusan de este privilegio en los privilegios "estilo patata", donde una cuenta de servicio puede SeImpersonate
, pero no obtener privilegios completos a nivel de SISTEMA. Básicamente, el ataque Potato engaña a un proceso que se ejecuta como SISTEMA para que se conecte a su proceso, que entrega el token que se utilizará.
Con frecuencia nos encontraremos con este privilegio después de obtener la ejecución remota de código a través de una aplicación que se ejecuta en el contexto de una cuenta de servicio (por ejemplo, al cargar un shell web en una aplicación web ASP.NET, lograr la ejecución remota de código a través de una instalación de Jenkins o al ejecutar comandos a través de consultas MSSQL). Siempre que obtengamos acceso de esta manera, debemos verificar de inmediato este privilegio, ya que su presencia a menudo ofrece una ruta rápida y sencilla a privilegios elevados. Vale la pena leer este artículo para obtener más detalles sobre los ataques de suplantación de tokens.
Ejemplo de SeImpersonate: JuicyPotato
Tomemos el ejemplo siguiente, en el que hemos logrado establecernos en un servidor SQL mediante un usuario SQL privilegiado. Las conexiones de cliente a IIS y SQL Server pueden configurarse para utilizar la autenticación de Windows. El servidor puede necesitar acceder a otros recursos, como recursos compartidos de archivos, como cliente que se conecta. Esto se puede hacer suplantando al usuario en cuyo contexto se establece la conexión del cliente. Para ello, se le concederá a la cuenta de servicio el privilegio Suplantar a un cliente después de la autenticación .
En este escenario, la cuenta de servicio SQL Service se ejecuta en el contexto de la cuenta mssqlserver predeterminada. Imagine que hemos logrado la ejecución de comandos con este usuario usando xp_cmdshell
usando un conjunto de credenciales obtenidas en un archivo logins.sql
o en un archivo compartido usando la herramienta Snaffler.
Conexión con MSSQLClient.py
Usando las credenciales sql_dev:Str0ng_P@ssw0rd!
, primero conectemos a la instancia del servidor SQL y confirmemos nuestros privilegios. Podemos hacer esto usando mssqlclient.py del kit de herramientas Impacket.
Habilitar xp_cmdshell
A continuación, debemos habilitar el procedimiento xp_cmdshell
almacenado para ejecutar comandos del sistema operativo. Podemos hacerlo a través del shell MSSSQL de Impacket escribiendo enable_xp_cmdshell
. Al escribir , help
se muestran algunas otras opciones de comando.
Nota: En realidad no tenemos que escribir RECONFIGURE
, ya que Impacket lo hace por nosotros.
Confirmando acceso
Con este acceso, podemos confirmar que efectivamente estamos ejecutándonos en el contexto de una cuenta de servicio de SQL Server.
Privilegios de la cuenta corriente
A continuación, verifiquemos qué privilegios se le han otorgado a la cuenta de servicio.
El comando whoami /priv
confirma que SeImpersonatePrivilege está en la lista. Este privilegio se puede utilizar para suplantar una cuenta privilegiada como NT AUTHORITY\SYSTEM
. JuicyPotato se puede utilizar para explotar los privilegios SeImpersonate
o SeAssignPrimaryToken
mediante el abuso de DCOM/NTLM.
Aumentar privilegios con JuicyPotato
Para escalar privilegios usando estos derechos, primero descarguemos el binario JuicyPotato.exe
y carguemos el archivo nc.exe
al servidor de destino. A continuación, configuremos un receptor Netcat en el puerto 8443 y ejecutemos el comando -l
donde es el puerto de escucha del servidor COM, -p
es el programa que se debe iniciar (cmd.exe), -a
es el argumento que se pasa a cmd.exe y -t
es la llamada createprocess
. A continuación, le indicamos a la herramienta que pruebe las funciones CreateProcessWithTokenW y CreateProcessAsUser , que necesitan privilegios SeImpersonate
o SeAssignPrimaryToken
respectivamente.
Recibimos una SYSTEM Shell
Esto se completa con éxito y se recibe un shell NT AUTHORITY\SYSTEM
.
PrintSpoofer y RoguePotato
JuicyPotato no funciona en Windows Server 2019 ni en Windows 10 build 1809 en adelante. Sin embargo, PrintSpoofer y RoguePotato se pueden usar para aprovechar los mismos privilegios y obtener NT AUTHORITY\SYSTEM
acceso de nivel. Esta publicación del blog analiza en profundidad la PrintSpoofer
herramienta, que se puede usar para abusar de los privilegios de suplantación de identidad en los hosts de Windows 10 y Server 2019 donde JuicyPotato ya no funciona.
Aumento de privilegios mediante PrintSpoofer
Probemos esto usando la PrintSpoofer
herramienta. Podemos usar la herramienta para generar un proceso SYSTEM en su consola actual e interactuar con ella, generar un proceso SYSTEM en un escritorio (si está conectado localmente o a través de RDP) o capturar un shell inverso, lo que haremos en nuestro ejemplo. Nuevamente, conéctese mssqlclient.py
y use la herramienta con el -c
argumento para ejecutar un comando. Aquí, use nc.exe
para generar un shell inverso (con un receptor Netcat esperando en nuestro cuadro de ataque en el puerto 8443).
SeImpersonate y SeAssignPrimaryToken
Captura de Reverse Shell como SISTEMA
Si todo va según lo previsto, tendremos un shell SYSTEM en nuestro oyente netcat.
SeImpersonate y SeAssignPrimaryToken
La escalada de privilegios mediante el uso de apalancamiento SeImpersonate
es muy común. Es fundamental estar familiarizado con los distintos métodos disponibles según la versión y el nivel del sistema operativo del host de destino.
Caso práctico
Pregunta 1
Aumente los privilegios utilizando uno de los métodos que se muestran en esta sección. Envíe el contenido de la flag en C
:\Users\Administrator\Desktop\SeImpersonate\flag.txt
Vamos a usar JuicyPotato.
Conexión con Impacket
Primero nos conectamos con MSSqlclient:
Habilitar xp_cmdshell
Confirmación
Ver privilegios de la cuenta
Observamos el privilegio SeImpersonatePrivilege
habilitado.
Elevación de privilegios con JuicyPotato
Para escalar privilegios usando estos derechos, primero descarguemos el binario JuicyPotato.exe
y carguemos el archivo nc.exe
al servidor de destino. A continuación, configuremos un receptor Netcat en el puerto 8443 y ejecutemos el comando -l
donde es el puerto de escucha del servidor COM, -p
es el programa que se debe iniciar (cmd.exe), -a
es el argumento que se pasa a cmd.exe y -t
es la llamada createprocess
. A continuación, le indicamos a la herramienta que pruebe las funciones CreateProcessWithTokenW y CreateProcessAsUser , que necesitan privilegios SeImpersonate
o SeAssignPrimaryToken
respectivamente.
Recibimos Shell SYSTEM
Última actualización
¿Te fue útil?