如何開始對Android應(yīng)用的逆向分析?
本文是我的關(guān)于如何開始Android逆向系列文章的第一部分。在文末提供了一個(gè)文檔,你可以根據(jù)該文檔說明部署同我一樣的實(shí)驗(yàn)環(huán)境。
在了解android應(yīng)用的逆向之前,你必須對android平臺(tái)及其架構(gòu)和android應(yīng)用程序的構(gòu)建塊(組件)已有了一個(gè)較好的理解。如果你并不了解這些,那么我建議你先參閱以下鏈接,然后再繼續(xù)瀏覽本文。
- Android平臺(tái)架構(gòu)
- Android應(yīng)用程序及其組件
- Android應(yīng)用程序及其架構(gòu)(PPT)
我當(dāng)前的實(shí)驗(yàn)室環(huán)境如下:
- 主機(jī)系統(tǒng)為windows,其中安裝了virtual box 和 genymotion
- virtual box 和 genymotion的設(shè)備都處于橋接模式
- Android 4.4 (kitkat API version 19)
- 在virtual box中,kali linux也同時(shí)運(yùn)行(與genymotion一起)
注:該設(shè)置并非固定,你可以根據(jù)自身需求環(huán)境進(jìn)行調(diào)整。例如,你也可以使用kali linux作為你的主機(jī)系統(tǒng),并在上面安裝genymotion。
在正式開始我們的逆向之旅前,我想先向大家介紹一下名為adb(android debugger bridge)的工具/服務(wù)器。它可以幫助我們連接,獲取數(shù)據(jù)并將指令傳遞給遠(yuǎn)程Android設(shè)備(調(diào)試模式可以通過設(shè)備設(shè)置中的開發(fā)者模式打開)。當(dāng)前情況下,我們將使用genymotion設(shè)備(虛擬設(shè)備)。
對于安卓應(yīng)用的逆向,這里有一個(gè)非常好的可供我們學(xué)習(xí)和練習(xí)的apk - DIVA ( Damn insecure and vulnerable mobile Application )。這是一個(gè)由Payatu的安全分析師開發(fā)的脆弱安卓應(yīng)用。下面我們也將以該應(yīng)用為例:
首先,讓我們來啟動(dòng)genymotion設(shè)備:
- 在Windows/Linux中搜索Genymotion應(yīng)用
- Start genymotion
選中你想要啟動(dòng)的設(shè)備,然后點(diǎn)擊Start按鈕。
如果你以上步驟正確執(zhí)行,則應(yīng)該能看到類似以下的界面:
可以看到Android設(shè)備已經(jīng)啟動(dòng),現(xiàn)在我們來啟動(dòng)虛擬機(jī)中的kali linux。步驟如下:
- 啟動(dòng)virtual box
- 從中啟動(dòng)kali虛擬機(jī)
注:這兩個(gè)虛擬機(jī)處于橋接模式。如果有DHCP服務(wù)器,則需要連接到路由器或網(wǎng)絡(luò)。
現(xiàn)在兩臺(tái)機(jī)器都已啟動(dòng),下面讓我們來檢查下kali和Android設(shè)備之間的連接情況。為此,我們需要獲取Android設(shè)備的IP地址。
- 導(dǎo)航到設(shè)置菜單
- 單擊WiFi選項(xiàng)
- 你會(huì)在網(wǎng)絡(luò)中看到WiredSSID
- 長按“WiredSSID”選項(xiàng)
- 你會(huì)看到如下所示界面
獲取IP后我們回到kali終端,并鍵入以下命令檢查連接情況:
- adb connect 192.168.20.74
如果命令正確執(zhí)行,你將會(huì)看到以下輸出。
現(xiàn)在讓我們通過執(zhí)行以下命令,來驗(yàn)證設(shè)備是否真正連接:
- adb devices
通過確認(rèn)我們得知設(shè)備已連接到IP地址192.168.20.74和5555端口(adb默認(rèn)的連接端口為5555)。
現(xiàn)在,我們就可以在Android設(shè)備上執(zhí)行不同的adb命令了。通過-h選項(xiàng)查看可用參數(shù):
- adb -h
在幫助信息中會(huì)為你列出所有可用的參數(shù)選項(xiàng)。下面是一些在逆向中時(shí)常會(huì)用到的命令:
ADB 調(diào)試
- adb devices – Lists all the connected devices
- adb forward – used for forwarding socket connections
- adb kill-serve
無線
- adb connect – connects to the remote device
- adb usb – connects to the USB attached device
包管理器
- adb install – install a package adb uninstall – uninstall a package adb shell pm list packages – used for displaying lists of packages installed adb shell pm path – used for displaying package path on device adb shell pm clear
文件管理器
- adb pull – used for pulling / downloading a file adb push – used for pushing / uploading a file adb shell ls – used for displaying list of files and directories in the current directory adb shell cd – used for changing the directory adb shell rm- used for removing a file adb shell mkdir – used for creating a directory adb shell touch – used for creating a file adb shell pwd – used for displaying the current path adb shell cp – used for copying a file adb shell mv – used for moving a file
網(wǎng)絡(luò)
- adb shell netstat – used for displaying the statistics for network connection adb shell ping – used for pinging a host / IP adb shell netcfg adb shell ip
Logcat
- adb logcat adb shell dumpsys adb shell dumpstate
截圖
- adb shell screencap adb shell screenrecord
系統(tǒng)
- adb root adb sideload adb shell ps adb shell top adb shell getprop adb shell setprop
在了解adb命令后,下面我們來安裝DIVA(Android應(yīng)用程序)。
注:請將該應(yīng)用下載安裝至你的kali機(jī)器上,因?yàn)樗械腶db命令都將從kali中觸發(fā)。
執(zhí)行以下命令安裝該應(yīng)用:
- adb install diva-beta.apk
現(xiàn)在,我們已經(jīng)完成了diva-beta.apk的安裝。讓我們來驗(yàn)證下該應(yīng)用是否已在我們的設(shè)備中成功安裝。
可以看到應(yīng)用程序已被正確安裝,并可在設(shè)備的菜單中使用。
讓我們通過單擊該應(yīng)用程的圖標(biāo)來啟動(dòng)它。你將看到如下啟動(dòng)界面:
當(dāng)前,DIVA為我們準(zhǔn)備了以下挑戰(zhàn):
不安全的日志記錄 硬編碼問題 – 第1部分 不安全的數(shù)據(jù)存儲(chǔ) – 第1部分 不安全的數(shù)據(jù)存儲(chǔ) – 第2部分 不安全的數(shù)據(jù)存儲(chǔ) – 第3部分 不安全的數(shù)據(jù)存儲(chǔ) – 第4部分 輸入驗(yàn)證問題 – 第1部分 輸入驗(yàn)證問題 – 第2部分 訪問控制問題 – 第1部分 訪問控制問題 – 第2部分 訪問控制問題 – 第3部分 硬編碼問題 – 第2部分 輸入驗(yàn)證問題 – 第3部分
我們將逐一解決上述挑戰(zhàn),讓你了解Android應(yīng)用中的不同漏洞。對于第一項(xiàng)挑戰(zhàn),即不安全日志記錄,我們可以通過adb命令來檢查diva應(yīng)用的日志記錄。命令如下:
- adb logcat
如果命令正確執(zhí)行,你將會(huì)看到如下所示內(nèi)容:
可以看到這里的日志記錄非常的雜亂,因?yàn)樗@示了許多不同的日志記錄數(shù)據(jù)(整個(gè)設(shè)備)。為了讓我們看起來更加清晰,我將使用grep命令。但在此之前,我們需要首先獲取該應(yīng)用程序包的進(jìn)程ID。命令如下:
- adb shell ps | grep diva
如果命令正確執(zhí)行,你將會(huì)看到如下所示內(nèi)容:
adb shell是用于通過adb發(fā)送任何shell指令的命令;ps作為shell指令發(fā)送,ps的輸出提供給grep命令。Grep是一個(gè)非常棒的用于搜索相關(guān)字符串的工具,在本例中我們搜索的字符串為“diva”。
從輸出結(jié)果中我們得知,diva的pid為1654,包名稱為“jakhar.aseem.diva”
現(xiàn)在,讓我們以組合的形式使用logcat和grep命令:
- adb logcat | grep 1654
你將看到與該特定進(jìn)程(即diva)相關(guān)的所有日志。