渗透技巧——Pass the Hash with Exchange Web Service

发布于 2024-12-13 16:46:57 字数 7934 浏览 10 评论 0

0x00 前言

在之前的文章《渗透技巧——Pass the Hash with Remote Desktop Protocol》介绍了使用 hash 登录 RDP 的方法,本文将要继续介绍使用 hash 登录 ews 的方法。

我们知道,通过 mimikatz 的 over pass the hashews 的使用当前凭据登录 能够实现使用 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 文件)

这条命令会导出多个证书文件,如下图

Alt text

为了找到 Exchange 通信数据使用的证书文件,我们可以采用如下方法:

访问 Exchange 登录页面,通过查看证书的有效期找到对应的证书文件,如下图

Alt text

也可以通过命令行实现对证书信息的获取,代码可参考: https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/SSLCertScan.cs

测试如下图

Alt text

(2) 配置 Wireshark

Edit -> Preferences...

Protocols - > TLS

选择 RSA keys list

填入配置信息,如下图

Alt text

(3) 禁用 ECDH 密钥交换算法

参考资料:https://techcommunity.microsoft.com/t5/core-infrastructure-and-security/demystifying-schannel/ba-p/259233

通过注册表关闭 ECDH 的 cmd 命令:

reg add hklm\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\KeyExchangeAlgorithms\ECDH /v Enabled /t REG_DWORD /d 0 /f

关闭之后,通过 SSLCertScan 再次获取证书信息, Key Exchange AlgorithmECDH Ephemeral 变为 RsaKeyX

如下图

Alt text

至此,Exchange Server 配置完成,再次捕获数据,能够获得明文通信数据,如下图

Alt text

2.Exchange Client 捕获明文通信数据的方法

(1) 添加环境变量

变量名 SSLKEYLOGFILE ,值为文件路径

如下图

Alt text

(2) 配置 Wireshark

Edit -> Preferences...

Protocols - > TLS

设置 (Pre)-Master-Secret log filenameC:\test\sslkey.log

如下图

Alt text

至此,Exchange Client 配置完成

打开 Chrome 浏览器,访问 Exchange,使用 Wireshark 能够获得明文数据,如下图

Alt text

0x03 使用 hash 登录 ews 的思路

通过 mimikatz 的 over pass the hashews 的使用当前凭据登录 能够实现使用 hash 登录 ews,我们分别在 Exchange Server 和 Exchange Client 捕获数据,如下图

Alt text

可以看到这里的验证过程使用了 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 的验证

验证明文,如下图

Alt text

验证 hash,如下图

Alt text

我的代码在验证成功后,会接着发送 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.

调整格式实例:https://docs.microsoft.com/en-us/exchange/client-developer/web-service-reference/getfolder-operation 中的 soap 格式如下:

<?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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

文章
评论
24 人气
更多

推荐作者

18058794968

文章 0 评论 0

未名湖

文章 0 评论 0

断舍离

文章 0 评论 0

文章 0 评论 0

cyay10

文章 0 评论 0

qq_RdefO0

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文