寫在前面的話
微軟在今年一月份發(fā)布的更新,讓公眾對DHCP客戶端中的關(guān)鍵漏洞CVE-2019-0547有了一個新的認(rèn)識。這個漏洞的CVSS評分非常高,而且微軟也沒有立即發(fā)布相關(guān)的可利用性評價,因此用戶也很難決定是否需要立即更新他們的系統(tǒng)。但是某些研究人員認(rèn)為,這個漏洞在不久的將來很可能會被大量網(wǎng)絡(luò)犯罪分子利用。
因此,為了更好地檢測針對DHCP漏洞的攻擊以及相關(guān)的漏洞,并更新我們的產(chǎn)品,我們需要深入了解所有的細(xì)節(jié)。而我們要做的第一件事,就是網(wǎng)絡(luò)偵察。
網(wǎng)絡(luò)偵查
一開始我們打算使用搜索引擎來尋找關(guān)于該漏洞的信息,但并沒有找到太多的細(xì)節(jié),而且大部分內(nèi)容都是來自MSRC網(wǎng)站發(fā)布的安全公告。不過在瀏覽這些安全公告的過程中,我們發(fā)現(xiàn)我們面對的是Window10(版本1803)中客戶端和服務(wù)器端系統(tǒng)的一個內(nèi)存崩潰漏洞,當(dāng)攻擊者向DHCP客戶端發(fā)送專門設(shè)計的響應(yīng)信息時,就會觸發(fā)該漏洞。
我們可以看到,MSRC給出的評分為2,被利用的可能性比較小,這意味著這個漏洞可能無法被利用,或者利用難度大。不過,我們還是想通過自己的分析,看看這個漏洞到底是什么情況。
在這個網(wǎng)站中,我們下載了這個安全更新補(bǔ)丁(.msu文件),將其解壓,然后查找跟客戶端處理DHCP響應(yīng)相關(guān)的文件。但是這很困難,因為這個補(bǔ)丁包里面包含的是當(dāng)月修復(fù)的所有漏洞補(bǔ)丁,而不是針對單個漏洞的補(bǔ)丁。在大量的文件中,我們用過濾器找到了幾個匹配的代碼庫,然后對系統(tǒng)的版本進(jìn)行了比較。其中,dhcpcore.dll庫是最接近的:
實際上,只有DecodeDomainSearchListData這個函數(shù)進(jìn)行了較大的改動,如果你熟悉DHCP協(xié)議的話,你就會知道它其實很少使用函數(shù)。
DecodeDomainSearchListData函數(shù)
DHCP中的域名搜索選項號為0×77(119),它允許服務(wù)器再客戶端上設(shè)置DNS后綴,但不適用于windows設(shè)備,因為之前的Windows系統(tǒng)會忽略這個選項。在必要的時候,可以通過組策略來配置DNS的名稱后綴。不過Windows 10在新版本1803中引入了針對域名搜索選項的處理庫。
DecodeDomainSearchListData的處理過程如下:首先從服務(wù)器端接收信息,然后根據(jù)域名搜索選項的配置來解碼數(shù)據(jù)。針對輸入,它接收封裝好的數(shù)據(jù)數(shù)組,并輸出一個以空字節(jié)結(jié)尾的字符串,這個字符串包含由逗號分隔的域名列表。比如說,該函數(shù)會對下面這個域名后綴進(jìn)行轉(zhuǎn)換:
.eng.Apple.com
.marketing.apple.com
eng.apple.com,marketing.apple.com
DecodeDomainSearchListData會在UpdateDomainSearchOption的處理過程中被調(diào)用,并將返回的結(jié)果列表寫入注冊表鍵的”DhcpDomainSearchList”參數(shù)中:
HKLMSYSTEMCurrentControlSetServicesTcpipParametersInterfaces{INTERFACE_GUID}
然后將主參數(shù)存儲至特定的網(wǎng)絡(luò)接口:
DecodeDomainSearchListData函數(shù)會進(jìn)行兩次數(shù)據(jù)傳遞。第一次,它會執(zhí)行除設(shè)置輸出緩沖區(qū)進(jìn)入點之外的所有操作,即計算保存返回數(shù)據(jù)所需要的內(nèi)存大小。第二次,它會為數(shù)據(jù)分配內(nèi)存,并進(jìn)行數(shù)據(jù)填充。這個函數(shù)大約有250條指令,主要任務(wù)就是處理傳入的字節(jié)流。它還會檢查緩沖區(qū)的大小,如果大小為零,則不會為緩沖區(qū)分配內(nèi)存,并完成執(zhí)行然后返回錯誤信息:
因此,只有當(dāng)目標(biāo)緩沖區(qū)大小為零時,才可以觸發(fā)漏洞。
漏洞利用
首先,我們可以使用重解析點來確保非空輸入數(shù)據(jù)生成并輸出一個空字符串:
設(shè)置一個服務(wù)器來響應(yīng)內(nèi)容請求,并讓未更新的客戶端出現(xiàn)訪問沖突。在每一個步驟中,函數(shù)完成一部分域名解析時,就會將這部分?jǐn)?shù)據(jù)復(fù)制到目標(biāo)緩沖區(qū):
1).eng.
2).eng.apple.
3).eng.apple.com.
接下來,當(dāng)數(shù)據(jù)中出現(xiàn)大小為0的域名時,函數(shù)就會將目標(biāo)緩沖區(qū)中的句號改為逗號:
4).eng.apple.com,
然后繼續(xù)解析:
5).eng.apple.com,marketing.
6).eng.apple.com,marketing.apple.
7).eng.apple.com,marketing.apple.com.
8).eng.apple.com,marketing.apple.com,
輸入數(shù)據(jù)解析完成后,剩下的就是用空字符替換最后的逗號:
9).eng.apple.com,marketing.apple.com
當(dāng)攻擊者發(fā)送如上所述的緩沖區(qū)數(shù)據(jù)時會發(fā)生什么呢?我們可以看到,它包含的列表是有一個空字符串組成的。那么在函數(shù)第一次計算輸出數(shù)據(jù)大小后,由于數(shù)據(jù)并沒有包含非零域名,所以大小為零。在第二次傳遞時,它會給數(shù)據(jù)分配堆內(nèi)存塊,并復(fù)制數(shù)據(jù)。但解析函數(shù)會立即遇到指示域名結(jié)尾的空字符,并將句號改為逗號。
因此,如果想要利用這個漏洞CVE-2019-0726,攻擊者必須要在DHCP客戶端上執(zhí)行遠(yuǎn)程堆噴射,并對堆內(nèi)存分布要有完整控制權(quán)。否則,將數(shù)據(jù)寫入未選中的地址會導(dǎo)致svchost.exe進(jìn)程崩潰。
* 參考來源:ptsecurity,F(xiàn)B小編Alpha_h4ck編譯,轉(zhuǎn)載請注明來自FreeBuf.COM