? ? 本文主要分享一種本地socket通信過程中存在的身份校驗(yàn)缺陷而產(chǎn)生的繞過方法,以此來實(shí)現(xiàn)高權(quán)限執(zhí)行惡意代碼。
? ? 在上個(gè)月中發(fā)現(xiàn)360ROOT工具在ROOT的過程中并不會直接去下載ROOT模塊來提權(quán),而是先看下設(shè)備上有沒有運(yùn)行某一個(gè)特定的后臺服務(wù)端程序,這個(gè)后臺程序就是首次用360ROOT后而安裝的,存放在system目錄下以360s命名的文件露氮。如果檢查到進(jìn)程存在的話,就直接連接后臺服務(wù)端钟沛,發(fā)送運(yùn)行指定程序的指令后畔规,就可以獲取ROOT權(quán)限來做后續(xù)的操作。
? ? 在對360s反匯編分析并提取關(guān)鍵代碼后讹剔,自己寫了一個(gè)客戶端去實(shí)驗(yàn)測試下能不能直接獲取ROOT權(quán)限油讯,發(fā)現(xiàn)并沒有成功详民,分析后了解到服務(wù)端存在校驗(yàn)。下面主要介紹下在通信過程中的一種繞過方法陌兑。
? ? 在本地socket通信過程中沈跨,客戶端連接服務(wù)端的時(shí)候,服務(wù)端可以調(diào)用getsockopt來獲取到連接端的進(jìn)程憑據(jù)信息兔综,比如客戶端的pid饿凛。360ROOT的服務(wù)端就是通過這個(gè)來獲取連接上來的客戶端的pid,然后讀取/proc/pid/exe來獲取程序路徑软驰,然后獲取文件的MD5值涧窒,通過校驗(yàn)MD5的值來判斷客戶端是否合法,如果通過的話就執(zhí)行指定的程序锭亏。
? ? 繞過方式很簡單纠吴,主要就是利用linux系統(tǒng)調(diào)用fork系列函數(shù),具體就是首先在父進(jìn)程中創(chuàng)建socket句柄慧瘤,然后fork戴已,在子進(jìn)程中調(diào)用connect,然后用exec系列函數(shù)運(yùn)行360s程序锅减,然后在父進(jìn)程中執(zhí)行發(fā)送命令的操作糖儡,這樣基本上就繞過成功了,主要實(shí)現(xiàn)過程如下:
? ? 在這里利用的局限性就是運(yùn)行的客戶端程序的uid必須為2000怔匣,因此利用的場景比如握联,在用戶手機(jī)連接電腦后進(jìn)行攻擊或者某些場所的惡意充電器來實(shí)施攻擊。由于在卸載360ROOT工具或者恢復(fù)出廠設(shè)置后此后臺程序并不會被卸載掉每瞒,因此危害還是有的金闽。
? ? 關(guān)于poc以及其他更多內(nèi)容請參考:http://www.reibang.com/p/f5af0736a6de?以及http://www.reibang.com/p/fcc143359b97