原文最早發(fā)表于freebuf蹬癌,我是原作者本人,原文鏈接播演。
0×00前言
App安全審計對于安全人員是一項苦逼的工作冀瓦,但對于廠商卻非常重要,因為App屬于客戶端產(chǎn)品写烤,一旦出現(xiàn)漏洞由于更新推送需要時間翼闽、且新版本更新率等原因,導(dǎo)致其不能像服務(wù)端程序那樣很短時間內(nèi)修復(fù)洲炊,對于App的漏洞應(yīng)該盡量控制在發(fā)布之前發(fā)現(xiàn)并解決感局。
目前世面已有的漏洞掃描工具還遠沒有達到替代人工審計的地步,無法解放勞動力暂衡;然而App安全審計經(jīng)常需要安全人員在手機端和pc端來回切換操作询微,造成大量而又毫無意義的重復(fù)勞動,如果沒有積累狂巢、沒有總結(jié)就會讓這項工作變得無味撑毛,而且對審計人員的能力提升非常小。
年底唧领,我寫了個iOS App審計工具藻雌,用于輔助人工審計雌续,這個工具不是漏洞掃描器,旨在簡化或替代安全審計中的各種亂七八糟的繁瑣操作胯杭,將所有的工作合并在一個shell中進行驯杜,免去來回切換shell的過程。也算是幫忙建設(shè)移動端工具鏈了做个。
0x01工具介紹
相對于Android鸽心,iOS上的安全問題要少很多,籠統(tǒng)的可以分為本地和網(wǎng)絡(luò)兩大塊居暖,網(wǎng)絡(luò)端已有burp suite和fiddler等非常好用的工具顽频,因此這個工具主要是針對本地問題。
下面以一個簡化的安全審計步驟來介紹如何使用該工具膝但。
一般來說iOS App安全審計只需要拿到一個ipa包就夠了冲九,能拿到源碼當(dāng)然更好,這時候可能連ipa的bundleID都不知道跟束,甚至都沒簽名莺奸;還有更坑的是告訴你一個應(yīng)用的名字,讓你自己去App Store上下載(嗯冀宴,目前沒遇到要自己付費下載進行安全審計的情形)灭贷。
1.1使用環(huán)境
開發(fā)環(huán)境:Mac OS X with python2.7
測試設(shè)備:iPhone4 with iOS6 & jailbreak;
iPhone5 with iOS8& jailbreak略贮;
iPhone5s with iOS9& jailbreak甚疟;
目前沒在Linux和windows下測試過,因為我太懶了……而且我也不建議在Linux或windows下進行iOS安全研究逃延。最最最重要的是览妖,該工具的部分功能僅支持Mac OS X。
1.2安裝前的一些命令
啟動工具揽祥,命令為pythonmain.py讽膏,啟動之后如圖1。
該工具是建立在ssh連接上的拄丰,通過ssh連接執(zhí)行命令并獲取結(jié)果府树。因此首先必須連接手機設(shè)備,連接命令有兩個:usb和ssh料按。使用usb命令連接必須先使用usb線連接pc和手機奄侠,ssh命令連接只需要知道手機的IP地址就好了,不過我還是強烈建議使用usb連接载矿,網(wǎng)絡(luò)連接有的時候會很卡很卡垄潮。連接命令的使用如圖2。
使用help或help [cmd]命令可查看所有命令,以及命令介紹弯洗、使用說明甫题、使用舉例,如圖3涂召。
如果ipa未簽名,首先使用resign命令對ipa文件進行簽名(當(dāng)然就算這個ipa是已經(jīng)簽名過的敏沉,這個命令也會對其進行重簽名)果正,如圖4。要用自己的證書進行簽名當(dāng)然得有自己的證書盟迟,這里多提一句秋泳,關(guān)于iOS的簽名機制已經(jīng)有文章講的非常透徹了,比如:http://objccn.io/issue-17-2/攒菠。
如果在審計的過程中需要注入一個dylib到ipa文件進行測試迫皱,可以使用命令dlinj,使用方法如圖5辖众。
注入之后肯定是需要重簽名的卓起,不然是安裝不上去的,當(dāng)然凹炸,對于我這種懶人戏阅,我一定會做一個命令把注入和重簽名合并在一起,就是dlini命令啤它,如圖6奕筐。
好的,扯了這么多变骡,終于可以安裝ipa了离赫,安裝命令是iipa,使用示例如圖7塌碌。
當(dāng)然渊胸,對于我這種懶人,我一定會做一個命令把注入誊爹、重簽名和安裝合并在一起蹬刷,就是dlinji命令,如圖8频丘。
1.3獲取應(yīng)用信息
安裝好ipa之后办成,開始獲取應(yīng)用的一些信息,比如bundleID之類的搂漠,命令la可以列舉所有第三方應(yīng)用迂卢,如圖9,從這里應(yīng)該能看出自己手機上哪個是剛安裝的應(yīng)用吧,如果真看不出來而克,那就安裝前后都用la命令對比下吧靶壮。
確定了bundleID,就好比打槍有了靶子员萍,又好比打飛機有了飛機……誒腾降,扯遠了……然后咱就可以分析應(yīng)用的binary文件,如圖10碎绎;獲取應(yīng)用的詳細信息了螃壤,如圖11。
說明:ab命令后面沒有跟bundleID筋帖,是因為工具對bundleID做了緩存,如果某個命令需要bundleID但卻沒有輸入日麸,則會使用上一次使用的bundleID。
1.4真正的審計
一般來說墩划,我建議首先進行網(wǎng)絡(luò)端的各種安全測試,不管是中間人也好嗡综,重放攻擊,xss蛤高,爆接口,驗證碼接口短信轟炸啥的都好戴陡,等網(wǎng)絡(luò)端的所有測試完成之后塞绿,這個應(yīng)用的大部分功能都已經(jīng)使用過一遍恤批,肯定會在本地應(yīng)用目錄生成一堆的文件,這時候再做本地的安全測試比較科學(xué)喜庞。
比如延都,我可以使用las列舉該應(yīng)用的所有存儲文件路徑,如圖12晰房,目前僅發(fā)現(xiàn)db、sqlite3与境、plist文件摔刁。
再比如,我設(shè)置了一個密碼扁位,我想看看應(yīng)用有沒有在本地明文存儲這個密碼趁俊,可以使用gs命令對該應(yīng)用所有存儲文件進行特征字符搜索寺擂,如圖13搜索特征串字符“DTSDKName”泼掠。
圖12發(fā)現(xiàn)了很多的文件,我想查看某個plist文件的內(nèi)容挡逼,或者是在所有plist文件中搜索特征字符串腻豌,如圖14吝梅、15虱疏。
對于db文件做瞪,可以完成類似sqlite3的所有功能右冻,如查看db文件內(nèi)容纱扭、列舉db文件所有表名牍帚、查看單個表的內(nèi)容履羞、搜索特征字符串等; 對于keychain爱榔,一樣也有增刪改查的功能糙及,可以dump keychain所有條目,對單個條目進行編輯等唇聘,限于篇幅柱搜,這里就不截圖了聪蘸,各位看官自己試試就好。
對于設(shè)備可以證書管理控乾,有安裝證書娜遵、列舉所有證書如圖16设拟、刪除證書如圖17、導(dǎo)入證書如圖18镶骗,導(dǎo)出證書如圖如圖19等躲雅。
當(dāng)然啦相寇,對于某些有怪癖的選手……哦钮科,對不起绵脯,是對于某些有特殊愛好的安全從業(yè)人員休里,我還提供了打包下載整個應(yīng)用目錄赃承、打包下載應(yīng)用所有存儲文件的功能瞧剖,如圖20、21做粤。
當(dāng)然怕品,對于我這種懶人巾遭,我一定會……誒恢总,這話好耳熟……我做了一個超級貼心的功能睬愤,就是懶人模式,做一些簡單配置砂豌,就可以一個命令把上面幾乎所有的命令搞定了……如圖22光督、23(在使用該功能之前结借,請先對globals.py的lazy mode區(qū)域進行配置)。
1.5其他貼心功能
比如動態(tài)監(jiān)視pasteboard,如圖24柳畔。
針對只給一個應(yīng)用名薪韩,自己去AppStore下載的這種大坑情形捌锭,我們強勢推出了dump ipa观谦、dump binary的功能宛逗,如圖25、26雷激。
還有啥了屎暇,讓我想想……
嗯根悼,對了,為了不讓大伙用小手去手機上點開一個應(yīng)用剩彬,還可以用命令遠程啟動一個app矿卑,如圖27。
dumpbinary之后轻黑,多半這個binary是fat頭氓鄙,你還可以用nonfat命令處理一哈业舍。
還有好多功能舷暮,比如端口映射、遠程調(diào)試應(yīng)用向臀、文件上傳下載诸狭、class dump君纫、weak class dump蓄髓、獲取應(yīng)用pid舒帮、獲取panic log啥的,有點多肢执,我實在不想寫了译红,因為我太懶了侦厚,各位看官自己去折騰吧……
0×02最重要的事情
現(xiàn)在來說最重要的事情,這個項目已經(jīng)開源了诗宣,開源地址:https://github.com/alibaba/iOSSecAudit
如果各位小伙伴在使用的時候發(fā)現(xiàn)bug怎么辦想诅?
1.自己改改得了(強烈建議)
2.直接在github項目提issue(不推薦)
3.聯(lián)系我的gmail郵箱侧蘸,地址在圖1里面(不推薦)
4.微博艾特我:@ylxz幽林曉筑(推薦粉我鹉梨,但不推薦提bug)
5.艾特我:@Junejuly(推薦粉我存皂,但不推薦提bug)
0×03寫在最后
其實還有很多功能想做,但時間不太夠(這是借口骤菠,其實還是太懶了)疤孕,各位有想到啥好用的功能可以fork之后自己加上去祭阀,或者通過0×02章節(jié)的聯(lián)系方式找我?guī)兔酉式洌矣锌諘由先ィú贿^肯定沒空的)抹凳。
我也知道某些代碼寫的很蠢赢底,不過我就是懶的改,咬我啊粹庞。
你可能會吐槽這些命令太傻X嘁扼,也真是太特么難記了趁啸,這一點我承認哈……所有命令都定義在globals.py文件里面,你可以進去改旅掂,想改成啥就改成啥访娶,就這了崖疤。