当前位置: 首页 > 科技观察

渗透基础——Exchange版本检测与漏洞检测_0

时间:2023-03-19 18:50:21 科技观察

0x00前言Exchange有很多版本,历史漏洞也有很多。因此,版本检测和漏洞检测需要通过程序来实现。本文将介绍两种通过Python进行版本检测的方法,介绍漏洞检测的实现细节,并开源代码。0x01Introduction本文将介绍以下内容:实现思路实现细节开源代码0x02实现思路1.版本识别(1)获取访问EWS接口的确切版本(Buildnumber),ResponseHeaders中的X-OWA-Version可以获得准确的版本,如下图所示:优点:准确的版本(Buildnumber)可以对应到具体的发布日期。缺点:该方法不通用,一些旧的Exchange版本不支持。(2)获取粗略版本访问OWA界面,在回显内容中可以获取粗略版本,如下图:优点:方法通用。缺点:粗版无法对应准确的发布日期,只能对应一个区间。综上所述,在版本识别方面,先尝试获取精确版本,获取不到再尝试获取粗略版本。获取版本号后,可以到官网查看对应的Exchange版本和发布日期。查询地址为:https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?查看=exchserver-2019。2、漏洞检测Exchange的漏洞详情可访问https://msrc.microsoft.com/update-guide/vulnerability/查看,例如:CVE-2020-0688对应的URL:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-0688。在漏洞检测中,补丁时间可以作为判断依据。如果确定的Exchange版本的发布日期低于某个补丁日期,则确定Exchange存在补丁中描述的漏洞。0x03实现细节1.版本识别访问EWS接口获取版本实现代码:url1="https://"+host+"/ews"req=requests.get(url1,headers=headers,verify=False)if"X-OWA-Version"inreq.headers:version=req.headers["X-OWA-Version"]print(version)访问OWA接口获取version的实现代码:url2="https://"+host+"/owa"req=requests.get(url2,headers=headers,verify=False)pattern_version=re.compile(r"/owa/auth/(.*?)/themes/resources/favicon.ico")version=pattern_version。findall(req.text)[0]print(version)获取到版本号后,需要匹配已知的版本信息。为了提高效率,您可以选择将已知的版本信息存储在一个列表中,元素包括Exchange版本、发布时间和版本号(Buildnumber)。先从官网复制已知的版本信息,然后通过字符串替换的方式将版本信息存入列表中。匹配版本时,需要区分精版和粗版。精确版本可以对应一个唯一的结果,而粗版本需要过滤掉所有可能的结果。Buildnumber格式示例:15.1.2375.24Roughversion格式示例:15.1.2375Roughversion筛选方法:截取Buildnumber字符串,去掉最后一个字符“.”后的数据,与roughversion比较,输出所有Result:代码示例:versionarray=[["ExchangeServer2019CU11Mar22SU","March8,2022","15.2.986.22"],["ExchangeServer2019CU11Jan22SU","January11,2022","15.2.986.15"],["ExchangeServer2019CU11Nov21SU","2021年11月9日","15.2.986.14"],["ExchangeServer2019CU11Oct21SU","2021年10月12日","15.2.986.9"],["ExchangeServer2019CU11","2021年9月28日","15.2.986.5"],["ExchangeServer2019CU10Mar22SU",""2022年3月8日","15.2.922.27"]]version="15.2.986"forvalueinversionarray:ifversioninvalue[2][:value[2].rfind(".")]:print("[+]Version:"+value[2])print("Product:"+value[0])print("Date:"+value[1])2.漏洞检测以补丁时间作为判断依据。也是为了提高效率,已知的漏洞信息存储在列表中,元素包括发布时间和漏洞编号。为了方便时间对比,需要更改时间格式,例如September28,2021改为09/28/2021。代码示例:vularray=[["CVE-2020-0688","02/11/2020"],["CVE-2021-26855+CVE-2021-27065","03/02/2021"],["CVE-2021-28482","04/13/2021"]]date="03/01/2021"对于vularray中的值:if(date.split('/')[2]<=value[1]。split('/')[2])&(date.split('/')[1]<=value[1].split('/')[1])&(date.split('/')[0]