作者:
cssembly
·
2015/01/05 9:03
0x00 背景
這是發表在Project Zero中的一篇文章,講述了CVE-2014-9295 ntpd漏洞的發掘與利用
原文連結如下:http://googleprojectzero.blogspot.com/2015/01/finding-and-exploiting-ntpd.html
作者Stephen Röttger, Time Lord。
前言:Stephen的這篇文章是Project Zero的第一篇客座文章。我們將不時的推出頂級安全研究的客座文章。這篇文章裡,這些漏洞的遠端利用性質以及導致遠端程式碼執行的錯誤鏈和特性讓我們印象深刻。你可能已經看到最近的ntpd漏洞披露,這篇文章由發現這一漏洞的研究者來講述這一故事。 Chris Evans
0x01 簡介
幾個月前,我決定開始做fuzzing。我選擇了網路時間協議(Network Time Protocol,NTP)的參考實現ntpd作為我的第一個目標,因為我有NTP的一些背景知識,同時這一協議似乎很簡單,可以很好用來學習fuzzing。此外,ntpd可用於許多平臺,已經被廣泛使用, 是OS X預設安裝的一部分。
當檢視原始碼以更好的瞭解該協議時,我注意到它的處理比我預想的要複雜得多。除了時間同步資料包,ntpd支援對稱和非對稱(Autokey)認證和用於查詢守護程式統計資料或進行配置更改的私有控制模式包(如果我沒有記錯,這是ntpdc和ntpq協議中分別講到的)。我很快就在處理Autokey協議訊息的程式碼中找到了一個bug,因此決定深入挖掘,並對其他部分進行人工程式碼審查。最終找到了CVE-2014-9295的漏洞並寫了我的第一個OS X漏洞利用,下面我將對其進行詳細的描述。
長話短說,在常規配置下,本地網路上的攻擊者透過偽造::1源的IPv6資料包就能觸發一個全域性的緩衝區溢位。如果你的ntpd還沒有打補丁,那麼在你的配置檔案中為每一個限制行(restrict line)新增nomodify 或noquery,即使它是localhost。
這就足夠了,讓我們跳到細節
0x02 漏洞
最嚴重的是一個緩衝區溢位漏洞,它存在於處理控制資料包的程式碼中,在OS X Mavericks上可以成功利用。如果控制模式的響應資料超過了用於儲存它們的緩衝區的大小,將會被拆分,它的實現程式碼如下:
#!c
static void
ctl_putdata(
const char *dp,
unsigned int dlen,
int bin /* set to 1 when data is binary */
)
{
//[...]
/*
* Save room for trailing junk
*/
if (dlen + overhead + datapt > dataend) {
/*
* Not enough room in this one, flush it out.
*/
ctl_flushpkt(CTL_MORE);
}
memmove((char *)datapt, dp, (unsigned)dlen);
datapt += dlen;
datalinelen += dlen;
}
正如你所看到的,如果剩餘緩衝區空間不能容納要寫入的資料,