Jump to content

0x00 前言Exchange的版本眾多,歷史漏洞數量也很多,因此需要通過程序實現版本探測和漏洞檢測。本文將要介紹通過Python進行版本探測的兩種方法,介紹漏洞檢測的實現細節,開源代碼。

0x01 簡介本文將要介紹以下內容:

實現思路

實現細節

開源代碼

0x02 實現思路1.版本識別(1)獲得精確版本(Build number)

訪問EWS接口,在Response Headers中的X-OWA-Version可以獲得精確版本,如下圖

ea77e433c222dd8aef0fb7320a17475.png

優點:精確版本(Build number)能夠對應到具體的發布日期

缺點:方法不通用,部分舊的Exchange版本不支持

(2)獲得粗略版本

訪問OWA接口,在回顯內容可以獲得粗略版本,如下圖

3d3ce0a46278a1679069a3fe924054e.png

優點:方法通用

缺點:粗略版本無法對應到準確的發布日期,只能對應到一個區間

綜上,在版本識別上,首先嘗試獲得精確版本,如果無法獲得,再嘗試獲得粗略版本

獲得版本號後,可以去官網查詢對應的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版本探測的兩種方法,介紹實現細節,開源代碼,作為一個很好的學習示例。

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...