渗透技巧——Pass the Hash with Exchange Web Service
0x00 前言
在之前的文章《渗透技巧——Pass the Hash with Remote Desktop Protocol》介绍了使用 hash 登录 RDP 的方法,本文将要继续介绍使用 hash 登录 ews 的方法。
我们知道,通过 mimikatz 的 over pass the hash
和 ews 的使用当前凭据登录
能够实现使用 hash 登录 ews,相关细节可参考 《Exchange Web Service(EWS) 开发指南》 %E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97)
但缺点是需要获得管理员权限并对 lsass 进程进行操作,无法同时对多个用户验证。
所以本文将要介绍更为通用的方法,开源实现脚本,记录思路和开发过程。
0x01 简介
本文将要介绍以下内容:
- 解密 Exchange 的通信数据
- 使用 hash 登录 ews 的思路
- 开源代码
0x02 解密 Exchange 的通信数据
Exchange 默认使用 TLS 协议对数据进行加密,我们通过 Wireshark 抓包的方式只能获得加密后的内容,需要进行解密
这里分别介绍 Exchange Server 和 Exchange Client 捕获明文通信数据的方法
1.Exchange Server 捕获明文通信数据的方法
(1) 在 Exchange Server 上导出证书文件
使用 mimikatz,命令如下:
mimikatz.exe crypto::capi "crypto::certificates /systemstore:local_machine /store:my /export"
注:如果不使用命令 crypto::capi
,无法导出带有私钥的证书文件(pfx 文件)
这条命令会导出多个证书文件,如下图
为了找到 Exchange 通信数据使用的证书文件,我们可以采用如下方法:
访问 Exchange 登录页面,通过查看证书的有效期找到对应的证书文件,如下图
也可以通过命令行实现对证书信息的获取,代码可参考: https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SSLCertScan.cs
测试如下图
(2) 配置 Wireshark
Edit
-> Preferences...
Protocols
- > TLS
选择 RSA keys list
填入配置信息,如下图
(3) 禁用 ECDH 密钥交换算法
通过注册表关闭 ECDH 的 cmd 命令:
reg add hklm\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\ECDH /v Enabled /t REG_DWORD /d 0 /f
关闭之后,通过 SSLCertScan 再次获取证书信息, Key Exchange Algorithm
由 ECDH Ephemeral
变为 RsaKeyX
如下图
至此,Exchange Server 配置完成,再次捕获数据,能够获得明文通信数据,如下图
2.Exchange Client 捕获明文通信数据的方法
(1) 添加环境变量
变量名 SSLKEYLOGFILE
,值为文件路径
如下图
(2) 配置 Wireshark
Edit
-> Preferences...
Protocols
- > TLS
设置 (Pre)-Master-Secret log filename
为 C:\test\sslkey.log
如下图
至此,Exchange Client 配置完成
打开 Chrome 浏览器,访问 Exchange,使用 Wireshark 能够获得明文数据,如下图
0x03 使用 hash 登录 ews 的思路
通过 mimikatz 的 over pass the hash
和 ews 的使用当前凭据登录
能够实现使用 hash 登录 ews,我们分别在 Exchange Server 和 Exchange Client 捕获数据,如下图
可以看到这里的验证过程使用了 NTLM Over HTTP Protocol
NTLM Over HTTP Protocol 的细节可参考之前的文章 《渗透技巧——通过 HTTP 协议获得 Net-NTLM hash》
认证流程:
1.客户端向服务器发送一个 GET 请求,请求获得网页内容 2.服务器由于开启了 NTLM 认证,所以返回 401,提示需要 NTLM 认证 3.客户端发起 NTLM 认证,向服务器发送协商消息 4.服务器收到消息后,生成一个 16 位的随机数(这个随机数被称为 Challenge),明文发送回客户端 5.客户端接收到 Challenge 后,使用输入的密码 hash 对 Challenge 加密,生成 response,将 response 发送给服务器 6.服务器接收客户端加密后的 response,经过同样的运算,比较结果,若匹配,提供后续服务,否则,认证失败
对于步骤 5:"使用输入的密码 hash 对 Challenge 加密"
如果我们直接传入 hash,对 Challenge 加密,也能实现相同的功能
至此,我们得出了使用 hash 登录 ews 的实现思路:
模拟 NTLM Over HTTP Protocol,直接传入 hash,对 Challenge 加密,生成 response,将 response 发送给服务器
0x04 程序实现
这里选用 Python 实现,优点是可直接调用 Impacket 实现 NTLM Over HTTP Protocol
参考代码:https://github.com/dirkjanm/PrivExchange/blob/master/privexchange.py
脚本运行前需要安装 Impacket
安装方法: pip install Impacket
我的实现代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Python/blob/master/checkEWS.py
代码分别支持对明文和 ntlm hash 的验证
验证明文,如下图
验证 hash,如下图
我的代码在验证成功后,会接着发送 soap 命令获得收件箱的信息
关于 soap 命令的格式可参考:https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/ews-operations-in-exchange
需要注意的是资料中的 soap 命令需要调整格式,否则报错返回 500
,提示 An internal server error occurred. The operation failed.
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
<soap:Body>
<GetFolder xmlns="https://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types">
<FolderShape>
<t:BaseShape>Default</t:BaseShape>
</FolderShape>
<FolderIds>
<t:DistinguishedFolderId Id="inbox"/>
</FolderIds>
</GetFolder>
</soap:Body>
</soap:Envelope>
调整格式后的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<m:GetFolder>
<m:FolderShape>
<t:BaseShape>Default</t:BaseShape>
</m:FolderShape>
<m:FolderIds>
<t:DistinguishedFolderId Id="inbox"/>
</m:FolderIds>
</m:GetFolder>
</soap:Body>
</soap:Envelope>
0x05 小结
本文介绍了使用 Wireshark 解密 Exchange 通信数据的方法,介绍使用 hash 登录 ews 的方法,开源实现脚本,记录思路和开发过程。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论