Jump to content
  • Entries

    16114
  • Comments

    7952
  • Views

    863108639

Contributors to this blog

  • HireHackking 16114

About this blog

Hacking techniques include penetration testing, network security, reverse cracking, malware analysis, vulnerability exploitation, encryption cracking, social engineering, etc., used to identify and fix security flaws in systems.

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版本探測的兩種方法,介紹實現細節,開源代碼,作為一個很好的學習示例。