關于APP滲透測試的實踐與思考
一、前言
移動互聯網應用程序(Mobile APP,以下簡稱“APP”或“移動APP”)安全早已成為信息安全領域中廣受關注的熱點話題。作為安全檢測人員,在日常測試工作中經常涉及移動APP的安全檢測,在此結合相關移動APP檢測標準和工作經驗,從滲透測試角度,對移動APP的檢測進行概要性總結說明。
二、目標分析
移動APP的安全問題與傳統桌面軟件有所不同。雖然現代移動操作系統(如Android和iOS)已比較注重安全防護,但如果APP開發人員在開發移動應用程序時不全面仔細地考慮安全性,APP仍可能會存在可被利用的安全漏洞,從而面臨安全威脅。移動APP滲透測試目的就是充分分析和挖掘移動APP和相關系統存在的安全問題,進而幫助其進行修復,提升安全性,保護用戶信息。
從業務上來看,在移動APP架構中,面臨安全威脅的目標 / 路徑主要有三個,它們分別是:移動APP、數據傳輸和服務端。
三、面臨的威脅
1. 客戶端
客戶端(移動APP)主要面臨的威脅包括反編譯、調試、篡改/重打包、輸入記錄、組件安全、注入和Hook、本地敏感數據泄露等。
(1) 反編譯
對一個軟件進行分析可以分為靜態分析和動態分析兩大部分。反編譯是靜態分析的一種基礎手段。高級編程語言源代碼經過編譯變成可執行文件,反編譯就是其逆過程。通過反編譯和逆向,可以在沒有軟件源碼的情況下了解其內部實現細節,進行漏洞挖掘和算法分析等。移動APP測試,常見的測試對象是Android APP和iOS APP,由于應用結構、構建工具鏈等差異,Android APP和iOS APP的逆向分析、反編譯技術方法均不盡相同。常見的反編譯工具有IDA Pro及相關Decompiler插件、Radare2 、Ghidra、JD-GUI、Smali/Baksmali、dex2jar、Hopper等等。
(2) 調試
調試是軟硬件開發人員用于排查軟件錯誤的一種手段,也是安全檢測人員進行動態分析的一種基本方式。從調試對象來看,調試可分為硬件調試和軟件調試。對于移動APP,安全檢測工程師一般只需進行軟件調試。軟件調試又可分為源碼級調試和非源碼級調試。在獲取不到源碼的情況下,一般只能先做非源碼級調試。通過調試,安全檢測工程師可以動態地分析APP內部原理和行為。移動APP檢測中,常見的APP調試工具有IDA Pro、GDB、LLDB、ADB、JDB和Cycript等。
(3) 篡改/重打包
Android和iOS應用在正式發布前需進行數字簽名,在安裝時系統會對APP簽名進行檢查,檢查通過才能成功安裝運行。這可在一定程度上保護APP不被篡改。但由于簽名驗簽機制很多技術都是公開的,被研究的比較透徹,再加上不同平臺的簽名機制對APP限制程度各不相同,對安全性要求比較高的APP如果只依靠系統層面的簽名保護進行防篡改/重打包還遠遠不夠。滲透測試過程中,有時我們為了更好的分析APP,也需要對APP進行修改重打包,然后利用相應平臺的工具進行重新簽名,最后安裝運行。相應的工具有:apktool、apksigner 、signapk、jarsigner和codesign等。
(4) 輸入記錄
當APP在不安全的環境中運行時,存在用戶輸入被記錄風險。一般可能通過軟硬件鍵盤輸入設備事件或屏幕截取等方式來進行記錄。根據對APP不同的安全要求,滲透測試中宜需關注這些風險。
(5) 組件安全
Android組件包括Activity、Broadcast Receiver、Service和Content Provider。若權限配置不當而導致組件暴露,APP就存在可能被其他應用攻擊或劫持風險,進而導致認證被繞過、敏感數據被竊取等。測試過程中,一般可通過對APP進行反編譯,查看AndroidManifest文件或直接掃描查找暴露的組件,分析反編譯的相關組件代碼,查看是否有安全漏洞并進行驗證。
(6) 注入和Hook
注入和Hook都可對目標APP運行時行為進行修改。雖然我們常常將它們放在一起說,但其實它們的實現原理并不相同。注入是指將一段代碼或一個完整的可執行模塊加載到目標程序中,而Hook是指通過劫持程序執行流程來改變程序運行行為。不同平臺的APP運行框架和機制不同,這也導致它們的注入和Hook方式不同,但都會通過系統或框架提供的相關機制和接口進行操作。測試人員可根據需求尋找Hook點,編寫注入或Hook模塊。常用的相關工具有libinject、Xposed、Cydia、fishhook和Frida等。
(7) 本地敏感數據泄露
APP的本地存儲數據或運行日志有可能會泄露敏感或非敏感數據。一般測試人員通過泄露的數據,可以去進一步深入理解APP內部原理。測試人員可查看APP本地數據存儲(特別是會關注APP是否在公共區域存儲了數據)和APP運行日志內容,結合業務場景綜合分析是否存在本地敏感數據泄露風險。常用工具adb、RE、SQLite和ifile等。
2. 數據傳輸
APP與服務端進行的網絡數據傳輸過程中主要面臨的威脅包括數據竊聽、數據篡改和數據重放等。
(1) 數據竊聽
若APP和服務端通信過程中未對傳輸的數據進行機密性保護,數據就有可能會被竊聽。例如,很多APP和服務端之間在不安全的傳輸通道中直接使用的HTTP協議進行通信,若用戶名、口令以及其他重要數據未進行加密,這些數據在網絡傳輸中的各個節點就可能會被竊聽而泄露。測試人員應根據APP業務場景確認APP的敏感數據**、數據傳輸通道和協議,分析是否存在敏感數據泄露風險。對安全性要求比較高的APP,例如金融類APP,還要分析其加密方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。
(2) 數據篡改
若APP和服務端通信過程中未對傳輸的數據進行完整性保護,數據就有可能會被篡改,使APP更易被結合其他安全漏洞發起攻擊。不同的業務場景下,數據篡改帶來的風險高低也不同。測試人員可嘗試對截取到的數據進行篡改后發送,觀察和分析APP或服務端是否可識別出數據被篡改并作出合理反應。對安全性要求比較高的APP,比如金融類APP,還要分析其防篡改方式(如果有)是否安全有效。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。
(3) 數據重放
重放攻擊是指將之前竊聽到的數據原封不動地重新發送給接收方。這種攻擊通常用于身份認證、交易等過程。例如,對HTTP協議,測試人員可重復發送截取到的請求報文,并觀察和分析服務端的反應。常用工具有Wireshark、Burpsuite、Fiddler和Charles等。
3. 服務端
服務端主要面臨的威脅包括不安全的中間件、認證與會話管理、訪問控制、注入、應用層拒絕服務、密碼算法和密鑰管理等。
(1) 不安全的中間件
服務器為提供完整的服務所使用的各個中間件,由于未及時更新或未啟用安全的配置可能引發安全漏洞,導致服務器存在遭受攻擊的風險,如IIS文件名解析漏洞、Weblogic反序列化漏洞、SMB遠程命令執行漏洞等,攻擊者可通過這些漏洞獲取服務器敏感信息、執行惡意命令,甚至獲取服務器管理員權限。
(2) 認證與會話管理
服務器提供的身份認證和會話管理機制存在安全漏洞,如系統關鍵組件或應用使用弱口令,對于高安全級別的系統未采用雙因子認證方式,無防止認證口令或驗證碼暴力破解攻擊的機制,未對SessionID的生成、過期和銷毀進行安全配置等,攻擊者可利用這些漏洞在非授權的情況下登錄系統并執行惡意操作。
(3) 訪問控制
開發者未對用戶登錄系統后的操作進行進一步的訪問權限控制,服務端對從客戶端收到的對數據進行增、刪、改、查詢等操作的請求未進行鑒權處理,導致攻擊者可執行超出自身賬戶權限的操作。
(4) 注入
應用運行時可能需要調用一些向前端寫入內容、查詢數據或執行系統命令的函數,如果用戶能控制這些函數的輸入,而開發者未對輸入的內容進行嚴格的過濾,攻擊者可以在前端提交惡意構造的輸入,進行XSS注入、SQL注入、命令注入等攻擊,從而導致服務器重要數據泄露或執行惡意命令。
(5) 應用層拒絕服務
服務器未對應用的最大連接數或發起請求的IP和頻率進行限制,攻擊者通過并發大量的請求或構造畸形的數據包,如CC攻擊、Slowloris攻擊,造成系統資源耗盡,導致服務器拒絕服務。
(6) 密碼算法和密鑰管理
應用使用已被證明為不安全的密碼算法對重要數據的傳輸和存儲進行加解密,如使用MD5算法對用戶口令進行存儲,使用DES算法對數據進行加密傳輸,可能導致攻擊者獲取密文后短時間內恢復出明文信息;應用使用不安全的方式進行密鑰管理,如將系統使用的密鑰明文編碼在應用代碼中或在服務器配置文件中明文存儲,將導致攻擊者輕易獲取數據加解密密鑰,進而得到加密數據的明文信息。
四、APP滲透測試流程
滲透測試的最終目的是幫助目標APP或系統發現并修復安全漏洞,提升APP或系統安全性。一個優秀的滲透測試工程師或團隊首先要有良好的職業道德,同時也應注意保護自己,其次要有專業的技術知識、規范的測試流程和活躍的思維。下面,我們先介紹一般的APP滲透流程,然后探討下結合APP,對服務端開展滲透測試的一些思路。
1. 準備階段
定義安全測試的范圍,包括確認適用的安全控制點、受測方的測試目標和敏感數據。同時在開展滲透測試前,應拿到被測單位的書面蓋章滲透測試授權。
2. 信息收集
收集包括APP的環境、業務用例和架構等信息。其中:
- 環境信息如APP的業務功能、行業分類、開發或運營組織的基本信息和工作流程等;
- 架構信息包括APP本身(如何訪問數據和資源、是否檢測自身運行在root或模擬環境中等)、APP適用的操作系統及版本、與服務端的通信協議(是否使用安全傳輸協議、是否有其他安全防護措施等)和遠程服務(APP使用哪些遠程服務、這些遠程服務被攻擊是否會影響APP)等。
這些信息大致分為開發或運營組織的信息和APP相關技術信息兩大類,一般前者可由商務人員負責去收集,后者可由技術人員收集。
3. 應用描繪
根據前2個階段收集的資料(亦可通過自動掃描、手動分析APP來進行相應補充),測試人員已較為全面的了解受測APP的環境、業務用例和架構等信息,并基本確定了受測APP的滲透測試入口點、收集存儲的數據和可能潛在的安全漏洞,即可根據這些漏洞風險等級高低,對其進行排序,以便測試人員確定滲透測試的攻擊路徑,并制定相應的測試用例。
4. 漏洞利用和測試工具開發
在此階段,測試人員將嘗試利用前一階段發現的漏洞,對應用程序進行滲透,以驗證發現的漏洞是否真實、有效,同時在漏洞驗證過程中可能涉及測試工具、腳本的開發;該階段在APP滲透測試的整個過程中是非常必要和關鍵的一環。
5. 提交報告
此階段,測試人員將已經驗證后的漏洞形成報告,提交客戶。報告內容至少應包括詳細的漏洞名稱、類型、漏洞風險分析、漏洞利用過程和結果、滲透測試過程中非授權訪問的數據等。
注:不同類型安全檢測除流程上會有差異外,報告內容、形式也會有差別,應根據具體情況具體分析。
五、結合APP滲透服務端
這一章節我們主要列舉通過APP以滲透相關服務端的一些思路。在此,假設測試人員僅被授權對APP和相關服務端進行滲透。通常包含5個較為重要的環節,分別是:信息收集、網站/服務端滲透、APP功能分析、第三方SDK分析、賬號安全和業務安全分析。
1. 信息收集
為達成對服務端的攻擊,首先應對服務端進行“定位”。對服務端定位的常用方法有反編譯APP、抓包分析、APP相關信息搜索、信息匯總分析等,具體如下:
一是反編譯APP。這個過程可能會涉及到對APP進行脫殼等。反編譯后,在反編譯代碼和資源文件中,利用字符串搜索和過濾,搜集所有鏈接等信息。除HTTP/HTTPS鏈接外,還應關注是否有FTP、登錄憑證(比如郵箱賬號,有些APP會發Crash信息等到郵箱)等信息。字符串搜索和過濾可以通過寫腳本,或在自動化工具中對掃描規則進行配置等方式來完成。
二是抓包分析。一般移動APP和服務端通信使用HTTP(S),可使用抓包工具對傳輸數據進行抓包分析。抓包過程中我們可以手動點擊APP中各功能菜單,或利用工具觸發APP各種功能,通過抓包工具過濾或定制系統等方式盡量排除非受測APP的網絡通信數據干擾(有些URL可能是第三方SDK官方地址,非授權滲透測試目標,應予以過濾)。
三是APP相關信息搜索。
- 應通過互聯網廣泛搜索APP相關信息,若能找到其官網,應將其相關的官網、論壇的鏈接都搜集整理出來,若授權許可,亦可將其納入到滲透的目標范圍內。
- 尋找該APP的歷史版本,因為若該APP當前版本的安全加固措施做得比較到位,對其進行逆向分析較為復雜,但在某個時間節點前的歷史版本可能是未加固的。
- 可能會有其他意想不到的發現。
四是信息匯總分析。通過對收集到的信息綜合篩選分析,形成一個信息集,包括但不限于URL、IP、使用的第三方SDK(下面展開說)等信息。
2. 網站/服務端滲透
這一階段,與傳統的Web滲透過程相同,測試人員通過各種嗅探工具對信息集中的URL、IP進行嗅探和漏掃,以期發現可能存在的漏洞等,并通過發現的漏洞(不管0day還是nday),嘗試獲取服務器的權限。因本章節重點是介紹如何結合APP做服務端滲透,所以這部分不詳細展開。
3. APP功能分析
在信息收集階段,測試人員已基本對APP功能有了一些了解,在這一環節,測試人員應實際試用APP,除了試用一些上傳下載、聊天、留言等常用功能外,同時還應關注其相對冷門的功能,因為功能越冷門,開發人員對其的關注就越少,相應的服務端服務存在安全問題的可能性就越大。
4. 第三方SDK做分析
在信息收集環節中我們提到若無授權,測試人員不能隨便對第三方SDK官網開展滲透測試,那為何還要對第三方SDK開展分析呢?原因是很多第三方SDK客戶端和服務端是配套搭建的,有些部署在SDK官方服務端,有些則部署在SDK使用方(也就是APP官方服務端)。許多SDK官方會對其進行詳細的說明,包括功能、部署方式、API等等。對于服務端SDK,測試人員可以將其下載下來(若無法探測到服務端版本號,可根據收集到的APP業務上線日期進行推測,并結合經驗和已搜集到的信息,從下載的SDK挑選重要的SDK),對其進行歷史漏洞搜索(該工作也可在信息收集環節開展)、掃描和分析,也許會發現一些有用的漏洞(0day最好,nday也要試一試,萬一沒補呢?)。
5. 賬號安全和業務安全
最后,我們再談談賬號安全和業務安全。這一環節在APP功能分析過程中也可能會涉及,其與滲透獲取服務器shell權限可能沒太大關系,但其從攻擊者的角度來看卻非常關鍵,因為大部分攻擊者獲取服務器shell權限的目的就是為了獲取APP用戶的數據或資料,當然也有單純為了搞破壞和黑客炫技的情況存在。
在這一環節,測試人員要詳細分析APP的賬號機制和業務邏輯,隨著APP官方與黑產對抗的加深,APP的業務邏輯和身份認證機制可能會做的很復雜。同時如果APP是使用用戶數量大時間、上線時間比較久,存在賬戶安全問題(爆破、信息泄露、越權、綁定/換綁邏輯等等)的可能性相對要低很多;同理,越是成熟的業務,存在安全問題的概率就會越低,所以測試人員可以重點關注被測APP中可能存在的冷門或新上線業務。
隨著移動APP安全攻防對抗逐漸加強,對其及相關服務端開展滲透測試,必然會越來越多的涉及逆向、調試、數據或流量解密等工作(雖然一些邏輯漏洞可通過分析其業務功能、流程發現,但實現漏洞利用一般還需進一步逆向和抓包分析)。滲透測試人員和團隊應善于使用、定制或開發自動化工具輔助檢測以節省時間和人力。
可以想象,一旦攻擊者借助APP拿下了服務端,就可以反過來批量攻擊APP(或用戶),從而形成一個攻擊閉環,且攻擊者能做的事情還遠不止這些!
六、結束語
以上就是筆者關于移動APP滲透測試的總結,希望能幫到大家,但限于知識和技術水平,會有許多不完善甚至不準確之處,還望多多指正。