Anonymous 发布于2022年11月8日 分享 发布于2022年11月8日 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的证书不可信 这会导致通过工业管理学(工业工程)访问时显示证书不可信,需要点击继续才能正常访问,如下图 程序实现时会产生错误,提示如下: 基础连接已关闭。无法建立安全的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)如下 响应为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,便于后续的二次开发。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子