?

Sep 04 2016

Linux netfilter OOB root提權漏洞分析

首頁 » 漏洞收集 » Linux netfilter OOB root提權漏洞分析   

Linux netfilter OOB root提權漏洞分析

* 本文原創作者:肥肥草,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載 

著名的ExploitDatabase網站(www.exploit-db.com)最近貼出了一個netfilter模塊的提權POC,作者是Vitaly Nikolenko。OOB!Netfilter!頓感好奇,決定分析一下,現將分析過程和成果分享如下。

0×0 依葫蘆畫瓢提權成功

參照文章的提示,下載Ubuntu16.04并成功安裝,uname -a確認版本號為4.4.0-21-generic。

1.jpg

下載POC,編譯,按照提示關閉SMEP,加載ip_tables.ko,運行decr,等到出現“Done!Nowrun.pwn”后運行pwn,成功獲得root shell。

2.jpg

3.jpg

 

 

0×01 漏洞初識

查看pwn.c的代碼,可以看出POC采用了常見的通過ptmx提權方法:

 

 4.jpg

 

猜測decr中修改了ptmx_fops的release指針,并根據代碼可推斷出修改后該指針的值為0xff814e30b0。然后pwn中調用close(fd)調用ptmx_fops->release函數,從而提權

事實是否如此呢?

通過cat/proc/kallsyms查看ptmx_fops的地址為0xffffffff821de3e0,則release指針所在地址為0xffffffff821de3e0 + 13*8 = 0xffffffff821de448。

通過kgdb進行調試,查看在decr運行之前,0xffffffff821de448的值0xffffffff814e30b0,如下圖所示:

 5.jpg

行decr之后,0xffffffff821de448地址的值,為0x ff814e30b0,如下圖所示:

6.jpg

 

也就是說,decr運行之后,0xffffffff821de448地址的值由0xffffffff814e30b0被修改為0xff814e30b0,而0xff814e30b0地址是應用層地址,是可控的,在pwn代碼中向0xff814e30b0地址寫入了提權ShellCode。

下面的問題就是decr是如何做到的,內核漏洞在哪?

 

0×02 定位修改ptmx_fops關鍵指令

仔細分析decr.c,無非是設置了ipt_replace、ipt_entry等數據結構,然后調用setsockopt函數設置內核,看完之后仍然毫無頭緒,還得從內核著手,看看應用層在調用完setsockopt函數之后內核到底做了那些事。

一種思路是重新編譯內核,這樣可以實現源碼級的內核調試,但是重新編譯之后一些內核參數(如ptmx_fops)地址發生改變,POC可能會運行失敗,這樣不利于定位修改ptmx_fops的漏洞代碼。

所以還是針對Ubuntu16.04原生的內核進行調試,采用源碼分析+動態調試的方法定位修改ptmx_fops的關鍵指令。本次采用的動態調試方法為vmware雙虛擬機kgdb調試方法,具體方法可以通過百度獲得,文中不再復述。        

查看ip_tables.c源碼,首先找到模塊初始化函數ip_tables_init:

7.jpg

 

在ip_tables_init中,調用nf_register_sockopt注冊處理函數,注冊參數如下所示。

8.jpg

 

set函數有兩個,do_ipt_set_ctl和compat_do_ipt_set_ctl,內核會調用哪一個函數呢?

通過kgdb雙虛擬機調試,分別設置兩個函數為斷點,發現當應用層調用setsockopt時,內核調用的是compat_do_ipt_set_ctl,如下圖所示。

9.jpg

 

繼續分析,獲得如下函數執行路徑:

compat_do_ipt_set_ctl--> compat_do_replace --> translate_compat_table --> check_compat_entry_size_and_hooks

POC代碼中提示check_compat_entry_size_and_hooks/check_entry有問題,那么重點分析check_compat_entry_size_and_hooks函數,看是在那一步去修改了ptmx_fops,最好的辦法是動態調試。

經過痛苦的、純體力活的kgdb匯編代碼調試,最終定位到是在compat_release_entry函數中修改了ptmx_fops,并且修改了兩次,進一步跟蹤定位到是該函數中的兩個module_put函數修改了ptmx_fops。

10.jpg

同時通過打印$rdi(module_put的第一個參數)的值,發現該值為0xffffffff821de10d,如下所示

20.jpg

 

而該值正是decr.c中設置的magicnumber,如下圖所示:

18.jpg

 

再看module_put函數:

 

19.jpg

 

 

其中最關鍵的就是對modue->refcnt減一。

refcnt在structmodule結構中的偏移為0×340,因此&module->refcnt的值為 0xffffffff821de10d + 0×340 = 0xffffffff821de44d, 而ptmx_fops->tty_release的地址為0xffffffff821de448,因此當執行減一操作后,會將0xffffffff821de44d開始的0xff 0xff 0xff逐步減為0,最終ptmx_fops->tty_release的值變為0xff814e30b0。

14.jpg

 

 

到此,總算搞明白了,應用層通過構造特殊的ipt_replace、ipt_entry、xt_entry_match、xt_standard_target結構,將一個值為magic number的地址傳到內核,并讓內核中對該地址的內容執行多次-1操作,從而達到修改ptmx_fops的目的。

0×03 漏洞成因分析

通過上節分析知道,該漏洞可以在內核中修改應用層指定的地址,執行遞減1的修改操作。那么內核代碼中的漏洞到底在哪呢?

繼續分析內核源代碼ip_tables.c,既然問題出在ematch->u.kernel.match->me和t->u.kernel.target->me上,那么轉到與之相關的代碼處,即compat_copy_entry_from_user函數內部的代碼,重點分析以下代碼:15.jpg

 

將xt_ematch_foreach函數展開,如下:

16.jpg

 

entry->elems指向的是緊跟在ipt_entry后的xt_entry_match(見如下示意圖),即entry->elems= entry + sizeof(ipt_entry),而sizeof(ipt_entry) = 112字節。

17.jpg

 

 

由于應用層設置的target_offset為74,導致判斷語句

(pos)< (struct xt_entry_match *)((char *)(entry) + \

(entry)->target_offset); \

返回的結果為false,因此整個循環一次未能執行,也即compat_find_calc_match函數未能執行,本應在compat_find_calc_match函數中設置ematch->u.kernel.match->me的指令也未能執行。

與ematch錯誤處理情況類似,這段代碼中,由于應用層設置的target_offset為74,導致t = compat_ipt_get_target()函數獲取的target是錯誤的,后面盡管通過t->u.kernel.target= target;設置了target,但設置到了錯誤的地址,未改變真正的t->u.kernel.target值。

0×4漏洞總結

綜上所屬,該漏洞是內核netfilter處理setsockopt相關代碼(check_compat_entry_size_and_hooks和check_entry函數)在處理應用層傳下來的數據時審查不嚴格,處理邏輯也存在缺陷,使內核在調用module_put函數時操作了應用層傳下來的地址,導致內核直接對應用層輸入的地址執行減一操作,相當于是內核任意地址寫漏洞

該漏洞要利用內核模塊的module_put函數,而Android系統一般不打開內核模塊動態加載功能,因此本文介紹的漏洞利用方法無法在Android系統上成功執行。

最近爆出和netfilters/getsockopt相關的漏洞不少,如CVE-2016-3134,后期將繼續分析其他漏洞。

歡迎技術交流。本人QQ:16588753,root技術交流群:437812386。

* 本文原創作者:肥肥草

http://www.freebuf.com/vuls/112969.html

 

如果您喜歡本博客,歡迎點擊圖片定訂閱到郵箱填寫您的郵件地址,訂閱我們的精彩內容:

正文部分到此結束

文章標簽: root提權 漏洞分析

版權聲明:若無特殊注明,本文皆為( mOon )原創,轉載請保留文章出處。

也許喜歡: «Linux Kernel 4.4.0-21 (Ubuntu 16.04 x64) - netfilter target_offset OOB Privilege Escalation | “百家”木馬集團第二彈:冒領數字簽名»

你腫么看?

你還可以輸入 250/250 個字

? 微笑 大笑 拽 大哭 親親 流汗 噴血 奸笑 囧 不爽 暈 示愛 害羞 吃驚 驚嘆 愛你 嚇死了 呵呵

評論信息框

這篇文章還沒有收到評論,趕緊來搶沙發吧~

?
?
河北11选5开奖