一、 實驗環境搭建
1. 安裝JDK
2. 安裝Android Studio
3. 模擬器或真機
我的是夜神模擬器和nexus
工具
Apktool
下載地址:https://ibotpeaches.github.io/Apktool/
下載完成直接保存打開,啟動apktool,使用下面命令查看選項幫助
Dex2jar/JD-GUI
Dex2jar和JD-GUI是安卓應用逆向工程中經常用到的兩個工具。Dex2jar能將.dex文件轉換 為.jar文件。JD-GUI則是一個Java反編譯工具,可以將.jar文件還原為原始的Java源代碼
下載地址:http:// sourceforge.net/projects/dex2jar/ http://jd.benow.ca
下載后無需安裝直接可以打開。
Burp suite
下載地址:http://portswigger.net/burp/download.html
手機端設置bp代理,進行APP流量抓取分析。
Drozer
下載地址:https://labs.mwrinfosecurity.com/tools/drozer/
agent
下載地址:https://github.com/mwrlabs/drozer/releases/download/2.3.4/drozer-agent-2.3.4.apk
電腦安裝drozer,安裝完測試
接下來安裝前面下載的agent.apk,安裝到模擬器或者真機上。可以使用adb命令進行安裝.apk文件。
在使用drozer進行評估之前,我們首先要將工作站中的drozer控制台連接到模擬器的代理上。所以我們先要在模擬器上啟動代理,並使用命令進行端口轉發。
端口轉發並啟動連接到手機
Advanced REST Client
谷歌擴展程序,直接從谷歌商店下載
adb基礎
adb是一款對安卓應用進行滲透測試的必備工具,Android SDK默認自帶adb,它位於Android SDK的platform-tools目錄中。
adb基礎命令
adb connect 127.0.0.1:62001 鏈接夜神模擬器
adb devices 查看連接
adb logcat 打印logcat
adb install 安裝,覆蓋安裝是-r
adb uninstall卸載
adb push 推送本地文件至 Android 設備
adb pull 推送Android文件至本地
adb shell mount -o remount rw / 修改系統讀寫權限
adb root 獲得root權限
adb kill-server 重啟
二、 安卓ROOT
1. 什么是root
Android 是基於Linux內核的系統,Linux有兩種用戶系統:一種是普通用戶賬戶,一種是root賬戶。普通用戶賬戶的權限通常比較低,在進行軟件安裝、操作系統設置更改等特權操作之前需要獲得root權限。而root賬戶享有諸如更新應用、安裝軟件、執行命令等權限。root用戶能對整個系統進行更精細化的控制,通過對設備進行完全控制的行為被稱為root。
檢測你是否擁有設備root權限的一個簡單方法是,在adb shell中執行su命令。
在root過的設備上,通常我們的UID等於0,root shell中使用”#”而不是”$”來表示root。
2. 為什么要root設備
由於硬件制造商和運營商的限制,我們不能完全控制安卓設備。通過ROOT設備,我們能夠突破這些限制,從而獲得額外的權限。
root的好處
l 完全控制設備:在默認情況下,普通用戶不能完全訪問設備,但在ROOT之后,用戶可以完全控制安卓設備
l 安裝其他應用:擁有root權限的用戶可以安裝一些具有特殊功能的應用,這些應用被稱為root應用
l 更多的特性和個性化功能:在安卓設備上安裝第三方的recovery和ROM之后,可以獲得更好的特性和個性化功能
root的壞處
ROOT降低設備的安全性:一旦設備被ROOT之后,它的安全性就會降低。
讓設備變磚:設備變磚的意思是,它可能會變得毫無 用處,你需要找到修復的方法。
使保修失效:ROOT過的設備會使保修失效。
3. 鎖定和已解鎖的boot loader
boot loader是設備啟動后先運行的程序。它負責維護和啟動硬件和安卓內核,若沒有它, 設備將無法啟動。
三、 安卓應用的基本構造
1. 安卓應用基礎知識
1.1 安卓應用結構
解壓APK文件的步驟如下。
(1) 把文件擴展名.apk改成.zip。
(2) 在Linux或Mac系統中,使用下面的命令解壓文件:
Unzip filename.zip 在Windows系統中,可以使用7-Zip、WinRAR或者其他類似的工具來解壓文件。
文件或文件夾包含的內容
AndroidManifest.xml:包含應用的大部分配置信息、包名、應用組件、組件安全設置、應 用所需權限,等等。
classes.dex:包含由開發人員編寫的源代碼生成的Dalvik字節碼,以及應用在設備上運行 時所執行的內容。
resources.arsc:包含編譯過的資源。
Res:包含應用所需的原始資源,比如應用圖標等圖片。
Assets:用於存放開發人員感興趣的音樂、視頻、預置的數據庫等文件,這些文件會與應 用綁定。
META-INF:用於存放應用簽名和應用所用到的所有文件的SHA1摘要。
1.2 APK文件存儲位置
/data/app/ 用戶安裝應用的存放位置,全局可讀可復制
/system/app/ 存放系統自帶的應用程序,全局可讀可復制
/data/app-private/ 存放禁止復制的應用,有root權限便可提取。
提取過程:
(1) 找到應用包名;
(2) 找到APK文件在設備上的存儲路徑;
(3) 從設備上拉取APK文件
2. 安卓應用組件
安卓基本組件:activity、service、connect provider、broadcastreceive
2.1 activity
activity為用戶提供了一個可以通過與之交互來完成某些操作的界面。有時,activity會包含多 個fragment。fragment表示activity中的一個行為或用戶界面的一部分。用戶可以在activity中進行 打電話、發短信等操作。
2.2 service
服務可以在后台長時間運行,而且不提供用戶界面。以音樂應用為例,當選好歌曲后,你可 以關閉它的所有界面,它能在后台正常播放歌曲
2.3 內容提供程序
內容提供程序以一個或多個表格的形式為外部應用提供數據。如果應用需要與其他應用共享 數據,內容提供程序就是一種方法,它可以充當應用間的數據共享接口。內容提供程序使用標准 的insert()、query()、update()、delete()等方法來獲取應用數據。所有的內容提供程序 都使用content://開頭的特殊格式的URI。只要知道這個URI並擁有合適的權限,任何應用都可以 從內容提供程序的數據庫中進行數據插入、更新、刪除和查詢等操作。
2.4 廣播接收器
廣播接收器是一個能在設備系統中接收廣播通知的組件。它能接收諸如低電量、啟動完成、 耳機連接等消息。雖然大部分廣播事件都是由系統發起的,但是應用也可以發出廣播。從開發人 員的角度來說,當應用需要針對特定的事件做出反應時,就可以使用廣播接收器。
1. 應用運行時都發生了什么
安卓系統啟動后,Zygote進程也會隨之啟動,它會監聽新應用的啟動請求。當用戶點擊一個 應用時,會通過Zygote啟動該應用。Zygote收到啟動新應用的請求后,會使用fork系統調用來創 建一個自身的副本。這種啟動新應用的方法效率更高,速度更快。新啟動的應用進程會加載運行應用所需的所有代碼。classes.dex文件包含能夠兼容Dalvik虛擬機的所有字 節碼。在使用安卓5.0及以上系統的最新版安卓設備中,默認的運行時環境是ART。在這個新的 運行時環境中,dex2oat工具會把classes.dex文件轉換成OAT文件。
ART---新的安卓運行時
作為一個可選的運行時環境,ART在安卓4.4系統中被首次使用,終端用戶可以從設備的開 發者選項中選擇ART。從安卓5.0(Lollipop)開始,谷歌把ART當作默認的運行時環境。用戶在 設備上安裝應用時,ART可以將應用的字節碼轉換為原生機器碼,這就是提前編譯。在引入ART 之前,Dalvik會在應用運行時將字節碼轉換為原生機器碼,這就是即時編譯。ART的優點是,無 需在每次啟動應用時都將字節碼轉換為機器碼,因為在應用安裝的過程中就已經完成了轉換。這 雖然會導致應用在第一次啟動時稍有延遲,但是從下一次運行開始,應用的性能就會得到大幅度 提升,耗電量也會下降。
2. 理解應用沙盒
一個應用對應一個UID
安卓系統是基於Linux內核的,Linux的用戶分離模式同樣適用於安卓,但又和傳統的Linux 略有不同。
Linux如果以root身份運行兩個不同的進程時,查看UID會發現他們都在同一個UID下運行。但安卓應用卻並非如此,每一個安裝在設備上的應用都會有自己的UID。這使得每個應用及 其資源都被沙盒化了,任何其他的應用都不能訪問。
注:使用了同一簽名的應用(如果兩個應用是由同一個開發人員開發的,就有可 能出現這種情況)可以互相訪問數據。
應用沙盒
每一個應用在/data/data/文件夾中都有各自存儲數據的入口,每一個應用都對其 擁有特定的所有權。
下面的代碼顯示了/data/data/文件夾中的每個應用的數據是如何獨立存儲在各自的沙盒環境 中的。由於受限的用戶無法訪問/data/data/文件夾,所以我們需要一個已經ROOT過的設備或者模 擬器來進行觀察。
(1) 使用adb在ROOT過的設備上獲取一個shell;
(2) 使用cd data/data/命令進入/data/data文件夾;
(3) 輸入ls -l命令
觀察上述輸出結果中的文件權限,你會發現每個應用的目錄都歸它自己所有,其他應用不能 讀寫這些目錄。
是否有方法打破沙盒限制
應用沙盒並不是牢不可破,但是想要在一台配置正常的設備上打破應用沙盒的限制,就必須犧牲Linux內核的安全性。這樣就會用到安卓root技術,讓用戶擁有root權限,能夠滿足用戶對安卓系統的大部分需求。
在使用Linux(以及UNIX)系統的計算機上,root是最高級的用戶,它擁有最高的權限來執 行任何任務。安卓系統默認只有Linux內核和少量的核心應用能夠以root身份運行。但是如果你 ROOT了設備,那么root用戶就會對設備上的所有應用開放。所以,擁有root權限的用戶或者應用 都可以突破沙盒環境的限制,進而修改安卓系統(包括內核)中的其他任意部分,包括應用及其 數據。
_______________________________________________________________________________________________________________________________________________________
內容來源於《Android App安全攻防實踐》,記錄一下自己的學習筆記