滲透基礎(chǔ)—Exchange版本探測(cè)和漏洞檢測(cè)
0x00 前言
Exchange的版本眾多,歷史漏洞數(shù)量也很多,因此需要通過(guò)程序?qū)崿F(xiàn)版本探測(cè)和漏洞檢測(cè)。本文將要介紹通過(guò)Python進(jìn)行版本探測(cè)的兩種方法,介紹漏洞檢測(cè)的實(shí)現(xiàn)細(xì)節(jié),開(kāi)源代碼。
0x01 簡(jiǎn)介
本文將要介紹以下內(nèi)容:
- 實(shí)現(xiàn)思路
- 實(shí)現(xiàn)細(xì)節(jié)
- 開(kāi)源代碼
0x02 實(shí)現(xiàn)思路
1.版本識(shí)別
(1)獲得精確版本(Build number)
訪問(wèn)EWS接口,在Response Headers中的X-OWA-Version可以獲得精確版本,如下圖:
優(yōu)點(diǎn):精確版本(Build number)能夠?qū)?yīng)到具體的發(fā)布日期。
缺點(diǎn):方法不通用,部分舊的Exchange版本不支持。
(2)獲得粗略版本
訪問(wèn)OWA接口,在回顯內(nèi)容可以獲得粗略版本,如下圖:
優(yōu)點(diǎn):方法通用。
缺點(diǎn):粗略版本無(wú)法對(duì)應(yīng)到準(zhǔn)確的發(fā)布日期,只能對(duì)應(yīng)到一個(gè)區(qū)間。
綜上,在版本識(shí)別上,首先嘗試獲得精確版本,如果無(wú)法獲得,再?lài)L試獲得粗略版本。
獲得版本號(hào)后,可以去官網(wǎng)查詢(xún)對(duì)應(yīng)的Exchange版本和發(fā)布日期,查詢(xún)地址:https://docs.microsoft.com/en-us/exchange/new-features/build-numbers-and-release-dates?view=exchserver-2019。
2.漏洞檢測(cè)
Exchange的漏洞詳情可通過(guò)訪問(wèn)https://msrc.microsoft.com/update-guide/vulnerability/< CVE >查看,例如:
CVE-2020-0688對(duì)應(yīng)的URL:https://msrc.microsoft.com/update-guide/vulnerability/CVE-2020-0688。
在漏洞檢測(cè)上,可以將補(bǔ)丁時(shí)間作為判定依據(jù),如果識(shí)別到的Exchange版本發(fā)布日期低于某個(gè)補(bǔ)丁日期,那么判定該Exchange存在該補(bǔ)丁中描述的漏洞。
0x03 實(shí)現(xiàn)細(xì)節(jié)
1.版本識(shí)別
訪問(wèn)EWS接口獲得版本的實(shí)現(xiàn)代碼:
url1 = "https://" + host + "/ews"
req = requests.get(url1, headers = headers, verify=False)
if "X-OWA-Version" in req.headers:
version = req.headers["X-OWA-Version"]
print(version)
訪問(wèn)OWA接口獲得版本的實(shí)現(xiàn)代碼:
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)
獲得版本號(hào)后,需要同已知的版本信息作匹配。為了提高效率,可以選擇將已知的版本信息存儲(chǔ)在列表中,元素包括Exchange版本,發(fā)布時(shí)間和版本號(hào)(Build number)。
首先從官網(wǎng)復(fù)制已知的版本信息,再通過(guò)字符串替換的方式將版本信息存儲(chǔ)在列表中。
在版本匹配時(shí),需要區(qū)別精確版本和粗略版本,精確版本可以對(duì)應(yīng)唯一的結(jié)果,而粗略版本需要篩選出所有可能的結(jié)果。
Build number格式示例:15.1.2375.24
粗略版本格式示例:15.1.2375
粗略版本的篩選方法:
對(duì)Build number字符串進(jìn)行截取,去除最后一個(gè)字符”.”后面的數(shù)據(jù),同粗略版本進(jìn)行數(shù)據(jù)對(duì)比,輸出所有結(jié)果:
代碼示例:
versionarray = [
["Exchange Server 2019 CU11 Mar22SU", "March 8, 2022", "15.2.986.22"],
["Exchange Server 2019 CU11 Jan22SU", "January 11, 2022", "15.2.986.15"],
["Exchange Server 2019 CU11 Nov21SU", "November 9, 2021", "15.2.986.14"],
["Exchange Server 2019 CU11 Oct21SU", "October 12, 2021", "15.2.986.9"],
["Exchange Server 2019 CU11", "September 28, 2021", "15.2.986.5"],
["Exchange Server 2019 CU10 Mar22SU", ""March 8, 2022", "15.2.922.27"]
]
version="15.2.986"
for value in versionarray:
if version in value[2][:value[2].rfind(".")]:
print("[+] Version: " + value[2])
print(" Product: " + value[0])
print(" Date: " + value[1])
2.漏洞檢測(cè)
將補(bǔ)丁時(shí)間作為判定依據(jù),同樣為了提高效率,將已知的漏洞信息存儲(chǔ)的列表中,元素包括發(fā)布時(shí)間和漏洞編號(hào)。
為了便于比較時(shí)間,需要改變時(shí)間格式,例如將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"
for value in vularray:
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 開(kāi)源代碼
由于代碼內(nèi)容較長(zhǎng),完整的實(shí)現(xiàn)代碼已上傳至github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetVersion_MatchVul.py
版本數(shù)據(jù)庫(kù)的日期為03/21/2022。
漏洞信息包括以下編號(hào):
- 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
代碼能夠自動(dòng)識(shí)別出精確版本,如果無(wú)法識(shí)別,改為識(shí)別粗略版本,標(biāo)記出所有匹配的漏洞。
0x05 小結(jié)
本文介紹了通過(guò)Python進(jìn)行Exchange版本探測(cè)的兩種方法,介紹實(shí)現(xiàn)細(xì)節(jié),開(kāi)源代碼,作為一個(gè)很好的學(xué)習(xí)示例。