发布于2022年11月8日2年前 0x00 前言 在之前的文章《Exchange Web Service(EWS)开发指南4——Auto Downloader》 和《Exchange Web Service(EWS)开发指南5——exchangelib》 介绍了两种利用混杂访问交换资源的方法,各有特点。 前者采用了较为底层的通信协议,在功能实现上相对繁琐,但是有助于理解通信协议原理和漏洞利用。后者借助第三方库exchangelib,开发便捷,但是不太适用于漏洞利用。 站在漏洞利用的角度,如果仅使用封装NTLM认证的第三方包,既不影响漏洞利用,又能兼顾效率。 所以本文选取了第三方包请求_ntlm,以自动化下载邮件和提取附件为例,开源代码,介绍用法。 0x01 简介 本文将要介绍以下内容: 请求_ntlm用法 开发细节 开源代码 0x02 requests_ntlm用法 说明文档: https://github.com/requests/requests-ntlm 1.两种登录方法 我在低于1.0.0版本的requests_ntlm.py找到了使用混杂登录的方法,代码位置: https://github。NTLM/blob/v 0。3 .0/NTLM请求/NTLM请求。py # L16 这里可以找到使用混杂登录的参数格式为ABC dabcd ABC dabcd:ABC dabcd ABC dabcd 两种登录交换的示例代码如下: (1)明文登录 目标='192.168.1.1 ' 用户名='[email protected] 密码='密码1 ' RES=请求。邮政(' https://'目标'/EWS/交易所。asmx ',data=POST_BODY,headers=headers,verify=False,auth=HttpNtlmAuth(用户名,密码)) 打印(资源状态代码) 打印(研究文本) (2)Hash登录 目标='192.168.1.1 ' 用户名='[email protected] hash=' 0000000000000000000000000:5835048 ce 94 ad 0564 e29a 924 a 03510 ef ' RES=请求。邮政(' https://'目标'/EWS/交易所。asmx ',data=POST_BODY,headers=headers,verify=False,auth=HttpNtlmAuth(用户名,哈希)) 打印(资源状态代码) 打印(研究文本) 2.Session机制 请求_ntlm支持会议机制,能够减少身份验证的次数,缩短通信数据包,效率更高 0x03 开发细节 1.使用requests_ntlm重新实现ewsManage_Downloader.py 在原有脚本EWS经理_下载器。巴拉圭的基础上,只需做以下替换即可 (1) 原代码: status,responsetext=ntlm_auth_login(主机,端口,模式,域,用户,数据,POST_BODY) 替换为: RES=请求。邮政(' https://'主机'/EWS/交易所。asmx ',data=POST_BODY,headers=headers,verify=False,auth=HttpNtlmAuth(user,data)) (2) 原代码: 状态 替换为: 资源状态_代码 (3) 原代码: 如果响应文本中的res.status_code=='200 '和NoError ': 替换为: 如果资源状态代码==200并且资源文本中有“无错误”: (4) 原代码: 主机、端口、模式、域、用户、数据 替换为: 主机、模式、用户、数据 (5) 原代码: 响应文本 替换为: 资源文本 (6) 原代码: sys.argv[1],int(sys.argv[2]),sys.argv[3],sys.argv[4],sys.argv[5],sys.argv[6] 替换为: sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4] (7) 原代码: path1 '\\' sys.argv[5] 替换为: path1 '\\' sys.argv[3] 最后再去除一些多余的代码即可 完整的代码已上传至github,地址如下: https://github。com/3g学生Python作业/blob/master/EWS经理_请求_ NTLM _下载器。py。巴拉圭 2.使用Session机制重新实现ewsManage_Downloader.py 通过会议机制能够减少身份验证的次数,缩短通信数据包,效率更高 所以在这里使用会议机制重新实现EWS经理_下载器。巴拉圭 换用会议机制的方法示例: 原代码: 目标='192.168.1.1 ' 用户名='[email protected] 密码='密码1 ' RES=请求。邮政(' https://'目标'/EWS/交易所。asmx ',data=POST_BODY,headers=headers,verify=False,auth=HttpNtlmAuth(用户名,密码)) 打印(资源状态代码) 打印(研究文本) RES=请求。邮政(' https://'目标'/EWS/交易所。asmx ',data=POST_BODY2,headers=headers,verify=False,auth=HttpNtlmAuth(用户名,密码)) 打印(资源状态代码) 打印(研究文本) 新代码: 目标='192.168.1.1 ' 用户名='[email protected] 密码='密码1 ' 会话=请求。会话() session.auth=HttpNtlmAuth(用户名,密码) RES=会话。邮政(' https://'目标'/EWS/交易所。asmx ',data=POST_BODY,headers=headers,verify=False) 打印(资源状态代码) 打印(研究文本) RES=会话。邮政(' https://'目标'/EWS/交易所。asmx ',data=POST_BODY2,headers=headers,verify=False) 打印(资源状态代码) 打印(研究文本) 完整的代码已上传至github,地址如下: https://github。com/3g student/Homework-of-Python/blob/master/EWS经理_请求_ NTLM _会话_下载器。巴拉圭 0x04 小结 在Exchange网站服务(EWS)开发上,使用第三方包请求_ntlm,封装了NTLM认证过程,不仅可以提高开发效率,同时不影响漏洞利用代码的编写,更可以借助会议机制减少认证过程的通信数据,十分推荐。 留下回复
创建帐户或登录后发表意见