0x00 前言Exchange的版本眾多,歷史漏洞數量也很多,因此需要通過程序實現版本探測和漏洞檢測。本文將要介紹通過Python進行版本探測的兩種方法,介紹漏洞檢測的實現細節,開源代碼。
0x01 簡介本文將要介紹以下內容:
實現思路
實現細節
開源代碼
0x02 實現思路1.版本識別(1)獲得精確版本(Build number)
訪問EWS接口,在Response Headers中的X-OWA-Version可以獲得精確版本,如下圖
優點:精確版本(Build number)能夠對應到具體的發布日期
缺點:方法不通用,部分舊的Exchange版本不支持
(2)獲得粗略版本
訪問OWA接口,在回顯內容可以獲得粗略版本,如下圖
優點:方法通用
缺點:粗略版本無法對應到準確的發布日期,只能對應到一個區間
綜上,在版本識別上,首先嘗試獲得精確版本,如果無法獲得,再嘗試獲得粗略版本
獲得版本號後,可以去官網查詢對應的Exchange版本和發布日期,查詢地址:https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019
2.漏洞檢測Exchange的漏洞詳情可通過訪問https://msrc.microsoft.com/update-guide/vulnerability/CVE 查看,例如:
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接口獲得版本的實現代碼:
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版本,發佈時間和版本號(Build number)
首先從官網複製已知的版本信息,再通過字符串替換的方式將版本信息存儲在列表中
在版本匹配時,需要區別精確版本和粗略版本,精確版本可以對應唯一的結果,而粗略版本需要篩選出所有可能的結果
Build number格式示例:15.1.2375.24
粗略版本格式示例:15.1.2375
粗略版本的篩選方法:
對Build number字符串進行截取,去除最後一個字符”.”後面的數據,同粗略版本進行數據對比,輸出所有結果
代碼示例:
versionarray=[
['ExchangeServer2019CU11Mar22SU','March8,2022','15.2.986.22'],
['ExchangeServer2019CU11Jan22SU','January11,2022','15.2.986.15'],
['ExchangeServer2019CU11Nov21SU','November9,2021','15.2.986.14'],
['ExchangeServer2019CU11Oct21SU','October12,2021','15.2.986.9'],
['ExchangeServer2019CU11','September28,2021','15.2.986.5'],
['ExchangeServer2019CU10Mar22SU',''March8,2022','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.漏洞檢測將補丁時間作為判定依據,同樣為了提高效率,將已知的漏洞信息存儲的列表中,元素包括發佈時間和漏洞編號
為了便於比較時間,需要改變時間格式,例如將September 28, 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'
forvalueinvularray:
if(date.split('/')[2]=value[1].split('/')[2])(date.split('/')[1]=value[1].split('/')[1])(date.split('/')[0]value[1].split('/')[0]):
print('[+]'+value[0]+','+value[1])0x04 開源代碼由於代碼內容較長,完整的實現代碼已上傳至github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetVersion_MatchVul.py
版本數據庫的日期為03/21/2022
漏洞信息包括以下編號:
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版本探測的兩種方法,介紹實現細節,開源代碼,作為一個很好的學習示例。
Recommended Comments