Good in study, attitude and health

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

0x00 前言


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

我们知道,通过mimikatz的over pass the hashews的使用当前凭据登录能够实现使用hash登录ews,相关细节可参考《Exchange Web Service(EWS)开发指南》

但缺点是需要获得管理员权限并对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的方法,开源实现脚本,记录思路和开发过程。


LEAVE A REPLY