跳转到帖子
  • 游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

    赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

    TheHackerWorld官方

Exchange Web服务(EWS)开发指南


Anonymous

推荐的帖子

0x00 前言

Exchange网站服务(EWS)提供了一个访问交换资源的接口,我在开源代码库没有找到很合适的参考项目,于是对这方面的内容做一个系统性的整理,开源一份EWS的实现代码ewsManage,便于后续的二次开发。

0x01 简介

本文将要介绍以下内容:

使用EWS管理的应用程序接口访问交换资源

使用EWS SOAP XML消息访问交换资源

开源代码新闻管理

新闻管理功能介绍

0x02 简介

官方文档:

https://份文件。微软。com/en-us/exchange/客户端-开发者/exchange-服务器-开发

两种访问交换资源的方法:

使用EWS管理的应用程序接口

使用EWS SOAP XML消息

测试环境:

Exchange Server 2013 SP1

用户:test1@test.com

pwd: test123!

网址:https://test . com/EWS/exchange . asmx

自动发现URL:test1@test.com

0x03 使用EWS Managed API

官方资料:

https://份文件。微软。com/en-us/exchange/client-developer/exchange-web-services/get-started-with-EWS管理的API-client-applications

这里使用EWS托管API 2.0

下载地址:

https://www.microsoft.com/en-us/download/details.aspx?id=35371

安装后从文件夹中找到文件微软交换。WebServices.dll和微软交换。WebServices.xml

注:

如果已经获得这两个文件,不需要安装EwsManagedApi.msi,这两个文件可以在后面的开源工程新闻管理中找到

(1)C Sharp实现

开发环境:VS2015

新建工程,并引用文件:

微软交换。WebServices.dll和微软交换。WebServices.xml

升c调代码示例(列出收件箱所有邮件的标题):

使用系统;

使用微软交换。网络服务。数据

使用系统。网;

命名空间电子邮件_EWS

{

班级计划

{

静态void Main(string[] args)

{

ServicePointManager .ServerCertificateValidationCallback=(sender,certificate,chain,sslPolicyErrors)={ return true;};

ExchangeService service=new ExchangeService(exchange版本1 .交易所2013 _ SP1);

服务凭证=新的WebCredentials('test1 ',' test123!');

服务AutodiscoverUrl(' test1 @ test。com’);

ItemView view=new ItemView(int .最大值);

查找项目结果查找结果=服务.FindItems(WellKnownFolderName .收件箱,查看);

foreach(查找结果中的项目项。项目)

{

如果(项。主题!=空)

{

控制台WriteLine(项目。主题);

}

其他

{

控制台WriteLine('没有标题\ r \ n ');

}

}

}

}

}

(2)Powershell实现

Powershell代码示例(列出收件箱所有邮件的标题):

添加类型@ '

使用系统。网;

使用系统安全。密码学。x509证书;

公共类TrustAllCertsPolicy:icecertificatepolicy {

public bool CheckValidationResult(

服务点srvPoint,x509证书证书,

网络请求请求,内部证书问题){

返回真实的

}

}

@

【系统*证书策略=New-Object TrustAllCertsPolicy

"导入模块名称" C:\test\Microsoft .Exchange.WebServices.dll的

$凭据=新对象微软.交换。网络服务。数据。web凭据(' test1 ',' test123!')

$ exch service=New-Object Microsoft .交换。网络服务。数据。exchangeservice

$exchService .凭据=$凭据

$exchService .auto discoverurl("test1 @ test。com”)

$exchService

$inbox=[Microsoft .交换。网络服务。数据。文件夹]:Bind(exch服务,[微软交换。网络服务。数据。知名文件夹名]:收件箱)

$inbox|gm

$ms=$inbox .查找项目(10)

foreach(百万美元/毫秒)

{

百万美元。负载()

百万美元。主题

}

注:

Powershell同样需要微软交换。WebServices.dll

在程序开发中需要注意的细节如下:

1.Exchange Server的证书不可信

这会导致通过工业管理学(工业工程)访问时显示证书不可信,需要点击继续才能正常访问,如下图

3-1.png

程序实现时会产生错误,提示如下:

基础连接已关闭。无法建立安全的SSL/TLS连接

可以通过添加证书信任策略避免这个问题:

使用系统。网;

ServicePointManager .ServerCertificateValidationCallback=(sender,certificate,chain,sslPolicyErrors)={ return true;};

2.Autodiscover自动发现服务

用来简化用户配置过程,具体到程序实现上对应ExchangeService .自动发现全球资源定位器(Uniform Resource Locator)

参考地址:

https://msdn。微软。com/en-us/library/office/DD 634273(v=exchg。80)。aspx

输入邮箱地址,自动解析出交换服务器全球资源定位器(Uniform Resource Locator)

用法举例:

ExchangeService service=new ExchangeService(exchange版本1 .交易所2013 _ SP1);

服务AutodiscoverUrl(' test1 @ test。com ',RedirectionUrlValidationCallback);

等价于

ExchangeService service=new ExchangeService(exchange版本1 .交易所2013 _ SP1);

服务. Url=新Uri(' https://测试。EWS交易所。asmx’);

注:

实际使用时,如果交换服务器关闭自动发现自动发现服务,可以选择指定全球资源定位器(统一资源定位器)

3..NET Framework 4 and .NET Framework 3.5

。网框架四为推荐开发环境

Win7系统默认为NET Framework 3.5,不支持100 .净框架四

为了支持Win7,将工程指定为NET Framework 3.5,不影响EWS管理的应用程序接口的使用

4.明文读取邮件的body属性

读取邮件的身体属性时(也就是获得邮件的内容),默认输出格式为htlm

想要获得邮件的内容,需要将输出格式改为文本

解决方法:

https://堆栈溢出。EWS-body-plain-text

5.搜索自定义文件夹时,指定深度搜索(遍历所有文件夹,包括更深的目录)

FindFoldersResults查找结果=null

文件夹视图视图=新文件夹视图(int .最大值){ Traversal=folderttraversal .deep };

6.编译后仍需要依赖文件

编译后的程序在执行时,仍需要依赖文件微软交换。WebServices.dll(在同级目录)

0x04 使用EWS SOAP XML message

官方资料:

https://份文件。微软。com/en-us/exchange/client-developer/exchange-web-services/get-started-with-EWS-客户端-应用程序

EWS请求和响应使用简单对象访问协议协议

肥皂消息格式:

对应EWS的结构:

信封元素(必须),作为肥皂消息的标志

页眉元素(可选),可用来指定ExchangeServer的版本

身体元素(必须),包含所有的调用和响应信息

故障元素(可选),包含错误消息

升c调代码示例(发送邮件):

使用系统;

使用系统。网;

使用系统。木卫一;

使用系统。文本;

命名空间电子邮件_EWS

{

班级计划

{

静态void Main(string[] args)

{

字符串user=' test1

String password='test123!';

String readPath=' '

ServicePointManager .ServerCertificateValidationCallback=(sender,certificate,chain,sslPolicyErrors)={ return true;};

StreamReader发送数据=新的StreamReader(' EWS。XML),编码。默认);

字节[]发送数据字节=编码10 . UTF8。GetBytes(sendData .ReadToEnd());

发送数据. close();

尝试

{

HttpWebRequest请求=(HttpWebRequest)WebRequest .创建(' https://测试。EWS交易所。asmx’);

请求. method=" POST

请求. content type=' text/XML ';

请求ContentLength=sendDataByte .长度;

请求AllowAutoRedirect=false

请求凭证=新网络凭证(用户,密码);

流请求流=请求GetRequestStream();

请求流Write(sendDataByte,0,sendDataByte .长度);

请求流. close();

HttpWebResponse响应=(HttpWebResponse)请求GetResponse();

如果(回应StatusCode!=HttpStatusCode .好的)

{

抛出新的web异常(响应状态描述);

}

流接收流=响应GetResponseStream();

StreamReader读取流=新的StreamReader(接收流,编码. UTF8);

String receiveString=readStream .ReadToEnd();

回应。close();

readStream。close();

StreamWriter receive data=new StreamWriter(' out . XML ');

接收数据。write(receive string);

接收数据。close();

}

catch (WebException e)

{

控制台。WriteLine('[!]{0} ',e . Message);

环境。退出(0);

}

控制台。WriteLine('[]完成');

}

}

}

读取代码文件ems.xml的内容并发送它,将结果保存为out.xml

ems.xml的内容是发送邮件:

?xml版本='1.0 '编码='utf-8 '?

这是主体,这是身体

test1@test.com

返回的内容(out.xml)如下

3-2.png

响应为NoError,这意味着操作成功。

注:

上面的代码不需要依赖文件Microsoft.Exchange.WebServices.dll。

当然,如果您需要使用Autodiscover自动发现服务,您仍然需要依靠文件Microsoft.Exchange.WebServices.dll。

0x05 开源实现代码ewsManage

我把以上两种方法整合到一个项目中,增加了更多实用的功能,代码下载地址:

https://github.com/3gstudent/ewsManage

目前,支持以下功能:

支持EWS托管API和EWS SOAP

支持使用用户名密码或当前凭证登录邮箱。

你支持忽略不可信证书吗?

列出指定位置的邮件,包括附件中的文件名和邮件内容。

(判断邮件内容的长度。如果超过100个字符,将只显示前100个字符)

列出指定位置的未读邮件,包括附件中的文件名和邮件内容。

(判断邮件内容的长度。如果超过100个字符,将只显示前100个字符)

列出指定位置的自定义文件夹(遍历所有子文件夹)

查看自定义文件下的所有邮件。

查看自定义文件下的未读邮件

将所有邮件保存在指定位置(以eml格式)

将附件保存在指定的邮件中(指定ID)

向指定邮件(指定ID)添加附件

删除指定邮件的附件(指定ID)

删除指定邮件的所有附件。

使用指定的关键字(常用位置、搜索标题名称、附件名称和邮件正文)搜索邮件

删除指定的消息(指定ID)

查看消息的具体内容(指定ID)

发送邮件(使用EWS SOAP)

通过EWS SOAP读取xml文件并发送命令

支持查询和操作的位置:

收件箱(收件箱)

草稿(草稿)

SentItems(已发送项目)

删除的项目(已删除的项目)

发件箱(发件箱)

垃圾邮件

使用示例:

(1)

ewsManage.exe-CerValidation Yes-exchange version exchange 2013 _ SP1-u test1-p test 123!-EWS path https://test.com/ews/Exchange.asmx模式ListUnreadMail-文件夹收件箱

使用证书验证,使用URL登录,查看收件箱中所有未读邮件,并输出以下邮件信息:

科目

has附件

ItemId

创建日期时间

接收日期时间

日期时间发送

显示抄送:

显示到

InReplyTo:

大小

MessageBody(如果大于100个字符,将只显示前100个字符)

(2)

ewsManage.exe-证书验证否-exchange version exchange 2013 _ SP1-使用默认凭据-自动发现URL test1@test.com-模式列表邮件-文件夹发送项

忽略证书验证,使用当前凭证自动登录,调用Autodiscover自动发现服务,查看已发送邮件的所有信息。输出信息类别与(1)相同。

注:

可以配合mimikatz的bypass-the-hash通过hash登录Exchange。

(3)

ewsManage.exe-CerValidation No-exchange version exchange 2013 _ SP1-u test1-p test 123!-EWS path https://test.com/ews/Exchange.asmx模式列表文件夹-文件夹收件箱

忽略证书验证,使用URL登录,查看收件箱中所有自定义文件夹的信息,输出以下信息:

显示名称

身份

总计(此自定义文件夹中的邮件数)

(4)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式listmailofolder-Id aamaadflmhjmdm 2 ltgxztutngrmzc 05 zdqyltmzndflmzbmz wy 1 nwa zaaaaaar 9 uok 286 vt 6 jugubqgmaqbhzr 2 o 8 knmtcffgwly 076 aaaaadfqaaa=

查看指定自定义文件夹(通过身份筛选)中的所有邮件,输出的信息类别同(1)

(5)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式导出邮件文件夹收件箱

将收件箱的所有邮件保存为eml文件

(6)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式保存附件-Id aamzadflmjrjmzm 3 ltgxztuzzzngrmzc 25 zdqyltmandlmzbwz wy 1 nwb gaaaaaa A8 uok 236 vt 6 junujbqgmbwbhzr 1 o 8 knmtrjfgwly 0 a 56 aaaaaaaekaabhzr 1 o 8 knmtrjfgwly 0 a 56 aaajfgzly 2 a 75 aaabxfaaaa=

保存指定邮件(通过身份筛选)中的附件,输出路径为当前路径

(7)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx-Mode EWS路径添加附件-Id aamzadflmjrjmzm 3 ltgxztuzngrmzc 25 zdqyltmandfmzbwzwz wy 1 nwb gaaaaaa A8 uok 236 vt 6 junujbqgmbwbhzr 1 o 8 knmtrjfgwly 0 a 56 aaaaaekaabhzr 1 o 8 knmtrjfgwly 0 aamtrjfgzly 2 a 75 aaabxfaaa=-附件文件1 .文本文件(textfile)

向指定邮件(通过身份筛选)添加附件,附件名称为1.txt

(8)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx-Mode EWS路径删除附件-Id aamzadflmjrjmzm 3 ltgxztuzngrmzc 25 zdqyltmandfmzbwzwz wy 1 nwb gaaaaaa A8 uok 236 vt 6 junujbqgmbwbhzr 1 o 8 knmtrjfgwly 0 a 56 aaaaekaaabhzr 1 o 8 knmtrjfgwly 0 aamtrjfgzly 2 a 75 aaabxfaaa=-附件文件1。文本文件(textfile)

删除指定邮件(通过身份筛选)中的某个附件,附件名称为1.txt

(9)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式ClearAllAttachment-Id aamzadflmjrjmzm 3 ltgxztuzzzngrmzc 25 zdqyltmandlzbwzwy 1 nwb gaaaaaaaa A8 uok 236 vt 6 hjunujbqgmbwbhzr 1 o 8 knmtrjfgwly 0 a 56 aaaaaaaaaaaaaaaakaabhzr 1 o 8 knmtrjfgzly 275 aaaaabxfaa=

删除指定邮件(通过身份筛选)中的所有附件

(10)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式搜索邮件-字符串虚拟专网

搜索带有指定关键词为虚拟专网的邮件

文件夹位置:

收件箱(收件箱)

草稿(草稿)

已发送邮件(感谢信)

已删除邮件(删除项目)

发件箱(发件箱)

垃圾邮件(垃圾邮件)

邮件位置:

标题名(主题)

附件名称(附件名称)

邮件正文(正文)

(11)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx-Mode EWS路径删除邮件-Id aamzadflmjrjmzm 3 ltgxztuzngrmzc 25 zdqyltmandlmzbwz wy 1 nwb gaaaaaa A8 uok 236 vt 6 junujbqgmbwbhzr 1 o 8 knmtrjfgwly 0 a 56 aaaaaekaabhzr 1 o 8 knmtrjfgwly 0 a 56 aaajfgzly 2 a 75 aaabxfaaaa=

完全删除指定邮件(通过身份筛选)

(12)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式查看邮件-Id aamzadflmjrjmzm 3 ltgxtuzngrmzc 25 zdqyltmandfmzbwzwz wy 1 nwb gaaaaaaaa A8 uok 236 vt 6 junujbqgmbwbhzr 1 o 8 knmtrjfgwly 0 a 56 aaaaaaaekaabhzr 1 o 8 knmtrjfgwly 0 a 56 aaajfgzly 2 a 75 aaabxfaaaa=

查看某个邮件的具体内容(指定ID),包括完整的正文内容

(13)

ewsManage.exe-CerValidation无交换版本exchange 2013 _ SP1-u test1-p test 123!-https://test.com/ews/Exchange.asmx EWS路模式ReadXML -Path ews.xml

读取ews.xml文件中的命令,通过EWS肥皂发送

0x06 小结

本文介绍了两种访问交换资源的方法,开源工程ewsManage,便于后续的二次开发。

留下回复

链接帖子
意见的链接
分享到其他网站

黑客攻防讨论组

黑客攻防讨论组

    You don't have permission to chat.
    • 最近浏览   0位会员

      • 没有会员查看此页面。
    ×
    ×
    • 创建新的...