发布于2022年11月8日3年前 0x00 前言 Exchange版本多,历史漏洞多,需要通过程序实现版本检测和漏洞检测。本文将介绍通过Python进行版本检测的两种方法,并介绍漏洞检测和开源代码的实现细节。 0x01 简介 本文将介绍以下内容: 实现理念 实施细节 开放源代码 0x02 实现思路 1.版本识别 (1)获得精确版本(Build number) 访问EWS接口,具体版本可以通过响应头中的X-OWA-Version获取,如下图所示 优点:确切的版本(内部版本号)可以对应具体的发布日期。 缺点:方法不通用,部分旧版Exchange不支持。 (2)获得粗略版本 访问OWA界面,回显内容时可以得到大致版本,如下图所示 优点:方法通用。 缺点:粗略的版本无法对应确切的发布日期,只能对应一个范围。 综上所述,在版本识别中,首先尽量获取精确版本,如果不能,再尽量获取粗略版本。 获得版本号后,可以去官网查询对应的Exchange版本和发布日期。查询地址是:https://docs . Microsoft . com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019 2.漏洞检测 例如,可以通过访问https://msrc.microsoft.com/update-guide/vulnerability/,来查看Exchange漏洞的详细信息: CVE-2020-0688对应的网址:https://msrc . Microsoft . com/update-guide/vulnerability/CVE-2020-0688 在漏洞检测中,补丁时间可以作为判断依据。如果所识别的交换机版本的发布日期低于补丁日期,则判断该交换机具有补丁中描述的漏洞。 0x03 实现细节 1.版本识别 访问EWS接口,获取版本的实现代码: url1='https://'主机'/ews ' req=requests.get(url1,headers=headers,verify=False) 如果请求标头中有“X-OWA-版本”: Version=req . headers[' X-OWA-版本'] 打印(版本) 访问OWA接口,获取版本的实现代码: url2='https://'主机'/owa ' req=requests.get(url2,headers=headers,verify=False) pattern _ version=re . compile(r '/OWA/auth/(。*?)/themes/resources/favicon . ico’) version=pattern _ version . find all(req . text)[0] 打印(版本) 获得版本号后,需要与已知的版本信息进行匹配。为了提高效率,可以选择将已知的版本信息存储在列表中。这些元素包括Exchange版本、发布时间和内部版本号。 首先从官网复制已知的版本信息,然后通过字符串替换的方式将版本信息存储在列表中。 在版本匹配中,需要区分精确版本和粗略版本,精确版本可以对应唯一的结果,而粗略版本需要筛选出所有可能的结果。 数字格式示例:15.1.2375.24 粗略版本格式示例:15.1.2375 版本的粗略筛选方法: 截取内部版本号字符串,删除最后一个字符“.”后的数据,将数据与粗略版本进行比较,并输出所有结果。 代码示例: versionarray=[ [' Exchange Server 2019 CU11 mar 22 su ',' 2022年3月8日',' 15.2.986.22'], [' Exchange Server 2019 CU11 Jan 22su ',' 2022年1月11日',' 15.2.986.15'], [' Exchange Server 2019 CU11 nov21 su ',' 2021年11月9日',' 15.2.986.14'], [' Exchange Server 2019 CU11 oct 21 su ',' 2021年10月12日',' 15.2.986.9'], ['Exchange Server 2019 CU11 ',' 2021年9月28日',' 15.2.986.5'], [' Exchange Server 2019 CU10 mar 22 su ',' 2022年3月8日',' 15.2.922.27'] ] 版本='15.2.986 ' 对于versionarray中的值: 如果版本在值[2]中[:值[2]。rfind(' . ')]: 打印('[ ]版本: '值[2]) 打印('产品: '值[0]) 打印('日期: '值[1]) 2.漏洞检测 以补丁时间作为判断依据,为了提高效率,将已知漏洞信息存储在列表中,元素包括发布时间和漏洞编号。 为了比较时间,需要改变时间格式,比如2021年9月28日到2021年9月28日。 代码示例: vularray=[ ['CVE-2020-0688 ',' 2020年2月11日'], ['CVE-2021-26855 CVE-2021-27065 ',' 2021年2月3日'], ['CVE-2021-28482 ',' 2021年4月13日'] ] 日期=' 2021年3月1日' 对于vularray中的值: if (date.split('/')[2] value[1]。split('/')[2]): 打印('[ ]'值[0]','值[1]) 否则: if(date . split('/')[2]==value[1]。split('/')[2])(date . split('/')[0]value[1]。split('/')[0]): 打印('[ ]'值[0]','值[1]) 否则: if(date . split('/')[2]==value[1]。split('/')[2])(date . split('/')[0]==value[1]。split('/')[0])(date . split('/')[1]value[1]。split('/')[1]): 打印('[ ]'值[0]','值[1]) 0x04 开源代码 由于代码内容较长,完整的实现代码已经上传到github的以下地址: https://github . com/3g student/Homework-of-Python/blob/master/Exchange _ GetVersion _ match vul . py 数据库的日期是2022年3月21日。 漏洞信息包括以下数字: CVE-2020-0688 CVE 2021-26855 CVE 2021-27065 CVE-2021-28482 CVE 2021-34473 CVE 2021-34523 CVE 2021-31207 CVE 2021-31195 CVE 2021-31196 CVE-2021-31206 CVE-2021-42321 代码可以自动识别准确的版本。如果不能,它可以改为识别粗略版本,并标记所有匹配的漏洞。 0x05 小结 介绍了通过Python进行Exchange版本检测的两种方法,并介绍了实现细节和开源代码,作为很好的学习范例。 留下回复
创建帐户或登录后发表意见