劉春玲 井靖 戚旭衍
(信息工程大學(xué)網(wǎng)絡(luò)空間安全學(xué)院 河南省鄭州市 450000)
近年來,Android 應(yīng)用安全漏洞頻發(fā)[4],存在暴露用戶敏感信息、銀行財(cái)產(chǎn)信息、監(jiān)聽、欺詐用戶輸入等威脅。Janus 漏洞是Android平臺爆出的核彈級漏洞,惡意攻擊者利用該漏洞,可以任意地修改APK 中的代碼,卻不需要對APK 進(jìn)行重新簽名。目前有大量的Android 漏洞原理及修復(fù)的研究[1-3],但鮮有還原入侵過程及惡意入侵對用戶信息竊取情況展示,本文提出一種在Android 系統(tǒng)上利用漏洞實(shí)現(xiàn)隱蔽入侵并進(jìn)行數(shù)據(jù)回傳的方法,從Android 簽名機(jī)制上入手,實(shí)現(xiàn)在不修改原裝APK 驗(yàn)證簽名的情況下,對APK 進(jìn)行修改并植入可持續(xù)存活的后門。通過隱蔽的傳播方式,偽裝成正版升級程序,保持原有功能不變,隱蔽繼承原APK 已經(jīng)擁有的權(quán)限,甚至替換原裝應(yīng)用,實(shí)現(xiàn)后門的不可刪除性。最終實(shí)現(xiàn)在目標(biāo)不知情下,實(shí)現(xiàn)錄音、拍照、讀取文件等數(shù)據(jù)回傳和隱秘竊聽的功能。
Android 系統(tǒng)具有自己一套獨(dú)特的簽名機(jī)制。開發(fā)者在發(fā)行應(yīng)用的時(shí)候,需要先使用自己獨(dú)特的私鑰對應(yīng)用簽名,如果試圖對這個(gè)應(yīng)用的某一個(gè)文件進(jìn)行修改,就會破壞APK 原來的簽名,這時(shí)就必須重新給APK 簽名,否則無法通過Android 的安裝檢測。安卓在4.4 中引入了新的執(zhí)行虛擬機(jī)ART,可以直接運(yùn)行優(yōu)化后的dex 文件。當(dāng)art 虛擬機(jī)解析一個(gè)APK 文件時(shí),先解析頭部的magic 字節(jié)來判斷文件類型,如果是代表dex 文件的字節(jié)頭,就會將該文件加載成dex。如果不是,就會將該文件以包含dex 文件的Zip 文件來解析。ZIP 文件的讀取方式是通過在文件末尾定位central directory,然后通過里面的索引定位到各個(gè)Zip entry,每個(gè)entry 解壓之后都對應(yīng)一個(gè)文件。Janus 漏洞構(gòu)造一個(gè)APK,從其頭部看是一個(gè)Dex 文件,從其尾部看,是一個(gè)APK 文件,Android V1 簽名使用的是傳統(tǒng)JAR 簽名方式,建立在對Zip 文件內(nèi)的所有entry 進(jìn)行校驗(yàn),防止APK 內(nèi)部的entry 被篡改,但是無法校驗(yàn)整個(gè)Zip 文件是否被篡改。因此可以突破Android 簽名的防篡改作用,實(shí)施攻擊。
本文具體的漏洞利用分為3 步:
(1)從設(shè)備上提取目標(biāo)應(yīng)用的APK 文件,并在該提取出來的APK 文件中,添加后門。從修改后的APK 文件中提取出dex 文件。將惡意攻擊DEX 文件放在前,原始APK 文件放在后,直接拼接成新的APK 文件。
(2)修復(fù)新的APK 的ZIP 格式部分和DEX 格式部分中的偏移值和文件長度字段。安卓系統(tǒng)在安裝時(shí)用ZIP 的讀取機(jī)制從末尾開始進(jìn)行文件的讀取,讀取到了原始的APK 內(nèi)容,并且以V1 的方式進(jìn)行校驗(yàn),認(rèn)為這個(gè)文件是正常的,沒有篡改,APK 安裝成功。
(3)修復(fù)后重新修改為APK 文件。為了更加隱蔽的進(jìn)行攻擊,先在原有APK 上添加后門,然后打包編譯后,將其中的classes.dex文件提取出來,再拼接上原始的APK。在運(yùn)行時(shí),Android 的ART虛擬機(jī)從文件頭開始讀取,發(fā)現(xiàn)是一個(gè)DEX 文件,直接執(zhí)行,這樣就可以在原始APK 簽名的情況下,同時(shí)滿足原始APK 所具有的功能,隱蔽地附帶執(zhí)行我們所添加地后門程序,在用戶不知情地情況下,執(zhí)行攻擊文件進(jìn)行入侵。
本文通過手工注入的持續(xù)連接攻擊、利用快傳軟件隱蔽攻擊、基于中間人攻擊的隱蔽攻擊三種方式實(shí)施基于Janus 的連續(xù)隱蔽攻擊。
為實(shí)現(xiàn)隱蔽的在目標(biāo)設(shè)備中植入木馬,本文通過手工分析注入的方式在目標(biāo)APK 中注入后門,在保持原來應(yīng)用功能不變的情況下實(shí)現(xiàn)在后臺隱秘運(yùn)行木馬程序
本文通過修改修改metasploit 框架下的payload 源碼,添加保持持久化連接的功能。主要通過以下兩部分實(shí)現(xiàn):
(1)在Service 銷毀時(shí)自動(dòng)重啟。
(2)添加AlarmManager 使Payload.start( )定時(shí)執(zhí)行。
在ondestory 方法中添加服務(wù)銷毀重啟的指令,可以實(shí)現(xiàn)在用戶將APP 關(guān)閉,導(dǎo)致連接斷開、服務(wù)關(guān)閉時(shí),馬上重新啟動(dòng)服務(wù)并重新建立會話連接。缺陷是服務(wù)不會重新運(yùn)行,會話無法重新連接。解決思路是通過定時(shí)提醒的方法來重復(fù)執(zhí)行service,從而在重啟service 的過程中不斷建立新的會話從而保持連接持續(xù)。
實(shí)驗(yàn)驗(yàn)證無論APP 是否開啟,只要用戶開機(jī)并保持網(wǎng)絡(luò)連接就可以實(shí)現(xiàn)通信會話始終連接。
具體流程先通過Metasploit 框架生成使用tcp 通訊方式的木馬APK,其次使用反編譯工具APKtool 對目標(biāo)文件以及payload.APK文件進(jìn)行反編譯提取木馬APK 中核心的代碼文件,并組合到目標(biāo)APK 中,然后將木馬APK 中核心代碼文件結(jié)合到目標(biāo)APK 反編譯后的smali 源碼文件中。最后在目標(biāo)APK 的啟動(dòng)源碼中注入hook并增加調(diào)動(dòng)木馬相關(guān)服務(wù)的smali 指令,通過AndroidManifest.xml找到相關(guān)的啟動(dòng)指令位置,并同時(shí)在其中增加應(yīng)用程序權(quán)限。最后對反編譯后的APK 源碼文件進(jìn)行重新編譯。即可生成帶后門的APK 文件。
Android 系統(tǒng)會備份安裝在本機(jī)的APK 文件,其中系統(tǒng)APK安裝在/system/APP 目錄下,用戶APP 安裝在/data/APP 目錄下。而快牙之類的快傳軟件正是將這部分備份后的APK 提取出來,然后通過網(wǎng)絡(luò)進(jìn)行傳輸。當(dāng)一臺手機(jī)上已經(jīng)安裝有修改后的APK 時(shí),系統(tǒng)也會將此修改后的APK 完整備份在系統(tǒng)中,當(dāng)使用快牙軟件進(jìn)行手機(jī)間互傳時(shí),就會將修改后帶有后門的APK 傳輸至對方手機(jī)。
中間人攻擊指在內(nèi)網(wǎng)范圍內(nèi),攻擊主機(jī)通過ARP 欺騙的方式,欺騙局域網(wǎng)內(nèi)其余主機(jī),冒充網(wǎng)關(guān),截獲局域網(wǎng)內(nèi)的數(shù)據(jù),從而將其余用戶訪問的下載鏈接地址重定向?yàn)楣糁鳈C(jī)的http 服務(wù)器地址。如果在攻擊主機(jī)的http 服務(wù)器上放置下載APK 的鏈接,當(dāng)用戶訪問指定網(wǎng)頁時(shí)就重定向到用戶的APK 上,從而實(shí)現(xiàn)APK 劫持下載。
用戶下載軟件分成直接下載和間接下載兩種方式,針對兩種不同的下載方式,可以采用不同的劫持手段。通常在手機(jī)端下載APK 時(shí),網(wǎng)站出于安全考慮并不會直接給出直接下載地址,而是采用間接下載的方式,針對這種下載的方式,我們可以通過替換302 Moved Temporarily 數(shù)據(jù)包中的Location 屬性的下載程序地址,從而完成下載劫持。而采用直接下載方式的網(wǎng)站,需要先將200 ok 的響應(yīng)數(shù)據(jù)包,修改成302 Moved Temporarily 數(shù)據(jù)包,并添加location 屬性,同時(shí)定向到目標(biāo)地址,從而實(shí)現(xiàn)劫持。
本文采用v1 簽名機(jī)制的Android 5 和Android 6 為目標(biāo)Android系統(tǒng)測試用例,實(shí)現(xiàn)在不改變v1 簽名的情況下對Android 目標(biāo)手機(jī)的惡意軟件傳播,實(shí)現(xiàn)獲取系統(tǒng)信息、隱蔽拍照、隱蔽錄像、隱蔽錄音、系統(tǒng)截圖、獲取手機(jī)聯(lián)系人、獲取手機(jī)通訊錄、獲取手機(jī)短信、發(fā)送短信等數(shù)據(jù)回傳等隱蔽攻擊。
4.1.1 制作惡意軟件
選用受眾較多的uc 瀏覽器APK 為測試用例,將正版的uc 瀏覽器手動(dòng)注入后門后,使用自動(dòng)化腳本進(jìn)行注入,注入成功后生成目標(biāo)為uc1 的APK。通過getmorepackinfo.jar 分析這兩個(gè)包簽名,可以發(fā)現(xiàn)這兩個(gè)包文件的簽名仍然相同,成功實(shí)現(xiàn)在不修改文件簽名的情況下修改APK。
4.1.2 惡意軟件隱蔽傳播測試
使用小米note 和Oppo R7 測試惡意軟件的快牙傳播(操作系統(tǒng)分別為Android6.0 和Android5.1.1),在小米上安裝原版uc APP,oppo 手機(jī)上安裝注入后門的uc1 APP,然后把oppo 手機(jī)中的uc1 瀏覽器安裝包傳送給小米,小米收到后進(jìn)行升級安裝并顯示安裝成功。
4.1.3 中間人攻擊測試
將APK 放置在https 服務(wù)器上地址即為本機(jī)IP 地址,訪問IP地址時(shí)即可下載APK,修改etter.dns 文件將www.baidu.com 的映射替換成本機(jī)地址,這樣目標(biāo)主機(jī)訪問百度時(shí)就會變成訪問本機(jī)地址,從而能夠彈出下載APK 的提示,然后使用ettercap 軟件進(jìn)行dns 欺騙,設(shè)置目標(biāo)主機(jī)為目標(biāo)1,網(wǎng)關(guān)為目標(biāo)2,開啟dns_spoof 功能進(jìn)行欺騙。
4.1.4 惡意文件替換測試
(1)替換多權(quán)限軟件。大多數(shù)用戶常用的軟件,為了能夠?qū)崿F(xiàn)更多的功能,都會被用戶賦予大量敏感權(quán)限,針對這部分APP的攻擊,替換的APP 會繼承被替換的APP 所擁有的權(quán)限,隱蔽獲取用戶敏感權(quán)限。
(2)替換系統(tǒng)APP。系統(tǒng)APP 在常規(guī)情況下無法修改,但可以更新系統(tǒng)APP,利用Janus 漏洞制作帶后門的系統(tǒng)APP 就可以對系統(tǒng)APP 進(jìn)行更改,從而將后門植入系統(tǒng)APP 中,同時(shí)受到系統(tǒng)的保護(hù),具備無法刪除的特性。
植入用戶系統(tǒng)的APK,在保持原有功能的情況下,可以實(shí)現(xiàn)獲取系統(tǒng)信息、隱蔽拍照、隱蔽錄像、隱蔽錄音、系統(tǒng)截圖、獲取手機(jī)聯(lián)系人、獲取手機(jī)通訊錄、獲取手機(jī)短信、發(fā)送短信等數(shù)據(jù)回傳功能。以上構(gòu)成一整套完整的漏洞利用體系,可以實(shí)現(xiàn)在用戶升級應(yīng)用的時(shí),隱蔽地在目標(biāo)設(shè)備上植入木馬并實(shí)現(xiàn)信息竊取。
針對安卓系統(tǒng)簽名驗(yàn)證機(jī)制和應(yīng)用編譯模式特性造成的Janus漏洞,本文提供了一整套的漏洞利用流程。
首先是針對Janus 漏洞的原理和構(gòu)成條件,將惡意dex 文件和目標(biāo)APK 進(jìn)行結(jié)合,從而在不修改簽名的情況下修改APK 程序。其次利用手工為APK 程序增添后門的方法,在保持原有APK 功能的情況下,注入具有數(shù)據(jù)回傳功能的payload。最后針對measploit框架木馬容易掉線的問題,提出了改善木馬的存活能力的辦法,在應(yīng)用關(guān)閉或服務(wù)關(guān)閉的情況下能夠迅速重啟建立連接。然后通過快傳軟件或者中間人攻擊的手段進(jìn)行傳播,并通過替換高權(quán)限APK,實(shí)現(xiàn)在用戶不知情的情況下繼承原APK 所擁有的敏感權(quán)限,或替換系統(tǒng)APK 享受系統(tǒng)軟件防用戶刪除的特性。最終植入用戶系統(tǒng)的APK,在保持原有功能的情況下,可以實(shí)現(xiàn)獲取系統(tǒng)信息、隱蔽拍照、隱蔽錄像、隱蔽錄音、系統(tǒng)截圖、獲取手機(jī)聯(lián)系人、獲取手機(jī)通訊錄、獲取手機(jī)短信、發(fā)送短信等數(shù)據(jù)回傳功能。以上構(gòu)成一整套完整的漏洞利用體系,可以實(shí)現(xiàn)在用戶升級應(yīng)用的時(shí),隱蔽地在目標(biāo)設(shè)備上植入木馬并實(shí)現(xiàn)信息竊取。