第五章 Android 取證
作者:Aditya Gupta
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
5.1 取證類型
取證是使用不同的手動和自動方法從設(shè)備中提取和分析數(shù)據(jù)。它可以大致分為兩類:
- 邏輯采集:這是的一種取證方法,其中取證員與設(shè)備交互并從文件系統(tǒng)提取數(shù)據(jù)。該數(shù)據(jù)可以是任何內(nèi)容,諸如應(yīng)用特定數(shù)據(jù),聯(lián)系人,通話記錄,消息,web 瀏覽器歷史,社交網(wǎng)絡(luò)用戶信息和財務(wù)信息。邏輯采集的優(yōu)點是,在大多數(shù)情況下比物理采集更容易獲取邏輯信息。然而,在一些情況下,該方法的一個限制是,在這種情況下的證據(jù)(智能手機(jī)及其數(shù)據(jù))具有被篡改的高風(fēng)險。
- 物理采集:這意味著對整個物理存儲介質(zhì)進(jìn)行逐位拷貝。我們還可以在執(zhí)行物理采集時定位不同的單個分區(qū)。與邏輯采集相比,這種方法慢得多,但更可靠和可信賴。此外,為了在智能手機(jī)上執(zhí)行物理采集,檢查者需要熟悉不同類型的文件系統(tǒng),例如 Yet Another Flash File System 2(YAFFS2),ext3,ext4,rfs 等。
5.2 文件系統(tǒng)
在我們深入取證以及從設(shè)備提取數(shù)據(jù)之前,我們應(yīng)該清楚地了解文件系統(tǒng)類型和它們之間的差異。正如我們前面討論的,在 Android 中進(jìn)行物理采集有點棘手,一個主要原因是文件系統(tǒng)不同。
Android 文件系統(tǒng)的主分區(qū)通常被分區(qū)為 YAFFS2。在 Android 中使用 YAFFS2 的原因是,它為設(shè)備提供了優(yōu)勢,這包括更高的效率和性能,以及更低的占用空間。幾年前,當(dāng) Android 剛剛推出時,取證是平臺上的一個大問題,因為幾乎沒有支持 YAFFS2 文件系統(tǒng)格式的取證工具。
SD 卡是 FAT32 類型,是正常系統(tǒng)用戶中的共享格式。因此,為了獲取 SD 卡的映像,可以使用任何常規(guī)的數(shù)據(jù)采集取證工具。
制作副本或創(chuàng)建現(xiàn)有數(shù)據(jù)系統(tǒng)映像的最有名的工具之一是 dd,它從原始來源到系統(tǒng)進(jìn)行逐塊復(fù)制。然而,由于該工具的一些缺點,例如缺少內(nèi)存塊以及跳過壞塊,會導(dǎo)致數(shù)據(jù)損壞,因此不推薦在取證調(diào)查期間使用。在接下來的章節(jié)中,我們將深入介紹 Android 文件系統(tǒng),并將研究如何以最有效的方式從文件系統(tǒng)中提取數(shù)據(jù)。
Android 文件系統(tǒng)分區(qū)
正如我們在前面的章節(jié)中討論的,Android 基于 Linux 內(nèi)核,并從 Linux 本身派生其大部分功能和屬性。 在 Android 中,文件系統(tǒng)被劃分為不同的分區(qū),每個分區(qū)都具有重要意義。
為了在 Android 設(shè)備上查看分區(qū),我們可以使用adb shell然后查看proc下的mtd文件,如下面的命令所示。 在一些不存在mtd文件的設(shè)備中,在proc下有另一個名為partitions的文件,如下面的命令所示:
adb shell
cat /proc/mtd
以下是在設(shè)備上執(zhí)行上述命令來列出所有分區(qū)后的輸出的屏幕截圖。

正如我們在上面截圖中看到的,存在各種文件系統(tǒng)分區(qū)及其各自的大小。 在大多數(shù) Android 設(shè)備上,我們通常會看到一些數(shù)據(jù)分區(qū),如system,userdata,cache,recovery,boot,pds,kpanic和misc,它們安裝在dev列指定的不同位置。 為了看到不同的分區(qū)和類型,我們可以在adb shell中鍵入mount。
正如我們在下面的截圖中可以看到的,通過執(zhí)行mount命令列表,所有不同的分區(qū)及其位置將被掛載:

5.3 使用dd提取數(shù)據(jù)
dd工具是取證中最常用的工具之一,以便為數(shù)據(jù)提取過程創(chuàng)建映像。 換句話說,它用于將指定的輸入文件轉(zhuǎn)換并復(fù)制為輸出文件。 通常在分析期間,我們不允許與證據(jù)直接交互和更改。 因此,獲得設(shè)備文件系統(tǒng)的映像,然后對其執(zhí)行分析總是一個好的選擇。
默認(rèn)情況下,dd工具在大多數(shù)基于 Linux 的系統(tǒng)中,以及在 Android 設(shè)備中的/system/bin中都存在。 如果它不存在于你的設(shè)備中,您可以安裝 BusyBox,它將安裝dd以及一些其他有用的二進(jìn)制文件。 你可以從 BusyBox 應(yīng)用程序(https://play.google.com/store/apps/details?id=stericson.busybox)獲取dd的二進(jìn)制文件,或者你甚至可以自己交叉編譯。
dd的標(biāo)準(zhǔn)語法如下:
dd if = [source file which needs to be copied] of = [destination file to be created]
有幾個命令行選項可以與dd一起傳遞,其中包括:
-
if:這是要復(fù)制的輸入文件 -
of:這是內(nèi)容要復(fù)制給它的輸出文件 -
bs:這是塊大?。ㄒ粋€數(shù)字),指定dd復(fù)制映像的塊大小 -
skip:這是在開始復(fù)制過程之前要跳過的塊數(shù)
讓我們現(xiàn)在繼續(xù),并取得現(xiàn)有分區(qū)之一的映像來進(jìn)行取證
-
我們需要找到的第一個東西是不同的分區(qū),它們存在于我們的 Android 設(shè)備上,就像我們之前做的一樣。 這可以通過查看
/proc/mtd文件的內(nèi)容來完成。 -
接下來,我們需要了解數(shù)據(jù)分區(qū)的位置,因為這里我們采集數(shù)據(jù)分區(qū)的備份。 在這種情況下,它位于
mtdblock6。 這里,我們將啟動dd,并將映像存儲在sdcard中,稍后我們將使用adb pull命令拉取映像。adb pull命令只是簡單地允許你將文件從設(shè)備拉取到本地系統(tǒng)。 -
復(fù)制可能需要一些時間,一旦復(fù)制完成,我們可以退出
adb shell,訪問我們的終端,并鍵入以下代碼:adb pull /mnt/sdcard/data.img data.img -
我們還可以使用 Netcat 工具將映像直接保存到遠(yuǎn)程位置/系統(tǒng)。 為此,我們首先需要將端口從設(shè)備轉(zhuǎn)發(fā)到系統(tǒng)。
adb forward tcp:5566 tcp:5566 -
同時,我們需要在這里啟動 Netcat 工具,監(jiān)聽端口 5566。
nc 127.0.0.1 5566 > data.img -
此后,我們必須執(zhí)行
adb shell進(jìn)入設(shè)備,然后啟動dd工具,并將輸出轉(zhuǎn)發(fā)到 Netcat。nc -l -p 5566-e dd if=/dev/block/mtdblock6
這將把映像保存到系統(tǒng)中,而不是保存在設(shè)備上的任何位置,然后再拉取它。 如果你的手機(jī)上沒有dd二進(jìn)制,你也可以安裝 BusyBox 來獲得dd二進(jìn)制。
開始取證調(diào)查之前應(yīng)該確保的一件事是,檢查設(shè)備是否被設(shè)置為在超級用戶模式下操作,這通常需要設(shè)備的 root。 然而,我們遇到的所有設(shè)備并不都是 root。 在這些情況下,我們將使用我們的自定義恢復(fù)映像來啟動手機(jī),然后 root 設(shè)備。
5.4 使用 Andriller 提取應(yīng)用數(shù)據(jù)
Andriller 是由 Denis Sazonov 以 Python 編寫的開源多平臺取證工具,它有助于從設(shè)備中提取一些基本信息,并且有助于進(jìn)行取證分析。 分析完成后,將生成 HTML 格式的取證報告。
為了下載它,我們可以訪問官方網(wǎng)站http://android.saz.lt/cgi-bin/download.py并下載必要的包。 如果我們在 Linux 或 Mac 環(huán)境中,我們可以簡單地使用wget命令來下載并解壓軟件包。 因為它只是一個 Python 文件,以及一些其他必要的二進(jìn)制文件,所以沒有必要安裝它; 相反,我們可以直接開始使用它。
$ wget http://android.saz.lt/download/Andriller_multi.tar.gz
Saving to: 'Andriller_multi.tar.gz'
100%[=============================>] 1,065,574 114KB/s in 9.2s
2013-12-27 04:23:22 (113 KB/s) - 'Andriller_multi.tar.gz' saved [1065574/1065574]
$ tar -xvzf Andriller_multi.tar.gz
一旦解壓完成,我們可以訪問 Andriller 文件夾,之后只需使用python andriller.py運行它。 Andriller 的主要依賴之一是 Python 3.0。 如果你使用 Python 2.7 ,它預(yù)裝在大多數(shù)操作系統(tǒng)上,你可以從官方網(wǎng)站http://python.org/download/releases/3.0/或http://getpython3.com/下載 3.0 版本 。
現(xiàn)在,一旦我們連接了設(shè)備,我們可以繼續(xù)運行Andriller.py,以便從設(shè)備捕獲信息,并創(chuàng)建日志文件和數(shù)據(jù)庫。
$ python Andriller.py
一旦開始運行,我們會注意到,它會打印出設(shè)備的幾個信息,如 IMEI 號碼,內(nèi)部版本號和安裝的社交網(wǎng)絡(luò)應(yīng)用程序。 這里,它檢測到 WhatsApp 應(yīng)用程序以及與其相關(guān)聯(lián)的電話號碼,因此它將繼續(xù)并拉取 WhatsApp 應(yīng)用程序的所有數(shù)據(jù)庫。
分析完成后,我們將看到類似以下屏幕截圖的屏幕:

如果我們查看它為我們創(chuàng)建的 HTML 文件,它將顯示一些關(guān)于設(shè)備的基本信息,如下面的屏幕截圖所示。 它還在文件夾db下的同一文件夾目錄中創(chuàng)建所有數(shù)據(jù)庫的轉(zhuǎn)儲。

如果我們分析這個應(yīng)用程序的源代碼,我們可以在Andriller.py的源代碼中看到,它會檢查設(shè)備中存在的不同包。 我們還可以在這里添加我們自己的包并保存數(shù)據(jù)庫,我們希望 Andriller 為我們尋找它。
如下面的截圖所示,你可以手動添加更多要使用 Andriller 備份的數(shù)據(jù)庫。

5.5 使用 AFLogical 提取所有聯(lián)系人、通話記錄和短信
AFLogical 是由 viaForensics 編寫的工具,以便從設(shè)備創(chuàng)建邏輯采集并將結(jié)果呈現(xiàn)給取證員。它從設(shè)備中提取一些關(guān)鍵組件,包括短信,聯(lián)系人和通話記錄。
為了使用 AFLogical,我們需要從 GitHub 庫https://github.com/viaforensics/android-forensics下載項目的源代碼。下載后,我們可以將此項目導(dǎo)入我們的 Eclipse 工作區(qū)并進(jìn)行構(gòu)建。我們可以從我們現(xiàn)有的代碼中訪問File | New | Other | Android | Android Project,然后選擇下載的源代碼路徑。
一旦我們將項目導(dǎo)入到我們的工作區(qū),我們就可以在我們的設(shè)備上運行它,方法是右鍵單擊項目并選擇“運行為 Android 應(yīng)用程序”。一旦我們運行它,我們將注意到,我們的設(shè)備上的AFLogical應(yīng)用程序提供了選項來選擇要提取什么信息。在以下屏幕截圖中,你將看到 AFLogical 在設(shè)備上運行,并詢問用戶有關(guān)要提取的詳細(xì)信息:

我們將檢查所有東西,然后單擊Capture。 AFLogical 將開始從不同來源捕獲詳細(xì)信息,并將捕獲的詳細(xì)信息保存在 SD 卡中的csv文件中。 捕獲過程完成后,我們會注意到一個警告框。
我們現(xiàn)在可以查看我們的 SD 卡路徑,我們可以找到保存的.csv文件。

然后我們可以在任何.csv文件查看器中打開這些.csv文件來查看詳細(xì)信息。 因此,AFLogical 是一個快速有效的工具,用于從設(shè)備中提取一些信息,如聯(lián)系人,通話記錄和消息。
5.6 手動轉(zhuǎn)儲應(yīng)用的數(shù)據(jù)庫
既然我們已經(jīng)看到,很多工具可以幫助我們進(jìn)行取證,我們還可以使用adb和我們的手動技能從設(shè)備中提取一些信息。 正如我們之前學(xué)到的,應(yīng)用程序文件存儲在/data/data/[應(yīng)用程序的包名]/位置。 由于大多數(shù)應(yīng)用程序也使用數(shù)據(jù)庫來存儲數(shù)據(jù),我們注意到在名為directory的包中有另一個名為databases的文件夾。 這里需要注意的一點是,這只會幫助我們從使用數(shù)據(jù)庫的應(yīng)用程序中提取信息,以便轉(zhuǎn)儲應(yīng)用程序和其他相關(guān)信息。 在某些應(yīng)用程序中,我們可能還會注意到,應(yīng)用程序?qū)?shù)據(jù)存儲在 XML 文件中或使用共享首選項,我們需要手動審計它們。
Android 使用 SQLite 數(shù)據(jù)庫(我們將在下一章深入討論)與.db文件格式。 下面是手動提取所有數(shù)據(jù)庫的步驟:
- 進(jìn)入設(shè)備,并創(chuàng)建一個文件夾來存儲所有數(shù)據(jù)庫
- 查找所有
.db文件并將其復(fù)制到創(chuàng)建的文件夾 - 壓縮文件夾并拉取它
因此,我們可以使用adb shell查找/data/data/location中的所有數(shù)據(jù)庫文件,將它們壓縮到歸檔文件中,然后將其拉取出來。
在 SD 卡中創(chuàng)建一個名為
BackupDBS的文件夾。-
為此,我們可以簡單地執(zhí)行
adb shell,然后在/mnt/sdcard下創(chuàng)建一個名為BackupDBS的文件夾:adb shell mkdir /mnt/sdcard/BackupDBS 查找所有
.db文件并將其復(fù)制到BackupDBS。-
為此,我們可以使用一個簡單的命令行絕技來查找和復(fù)制
/data/data中的所有.db文件。 我們首先使用find命令查找所有.db文件。 在以下命令中,我們使用find工具,并指定從當(dāng)前位置搜索,然后查找具有任何文件名(通配符*)以及擴(kuò)展名db的所有文件(即*.db),以及類型為文件f。find . -name "*.db" -type f下面的截圖展示了輸出:
-
現(xiàn)在,我們可以簡單地使用
cp和find,以便將其復(fù)制到BackupDBS目錄find . -name "*.db" -type f -exec cp {} /mnt/sdcard/BackupDBS \; -
現(xiàn)在,如果我們查看
/mnt/sdcard下的BackupDBS目錄,我們的所有數(shù)據(jù)庫都已成功復(fù)制到此位置。 -
壓縮并拉取文件。 現(xiàn)在,在同一位置,我們可以使用
tar工具創(chuàng)建一個壓縮包,并使用adb pull。tar cvf backups.tar BackupDBS/ -
然后,從系統(tǒng)中,我們可以簡單地像這樣拉取它。 此方法也可以用于通過在
/data/app和/data/app-private文件夾中查找文件類型.apk,來從手機(jī)中拉取所有.apk文件。 -
如果我們仔細(xì)看一看,在我們的
backups.tar中,還有一個名為msgstore.db的 WhatsApp 應(yīng)用程序的數(shù)據(jù)庫。 讓我們繼續(xù)分析和研究數(shù)據(jù)庫內(nèi)部的內(nèi)容。
為此,我們需要首先解壓我們剛才拉取的tar歸檔文件。tar -xvf backups.tar 現(xiàn)在,為了分析名為
msgstore.db的 WhatsApp 的 SQLite 數(shù)據(jù)庫,我們可以下載并使用任何 SQLite 瀏覽器。 對于本書,我們使用 SQLite 數(shù)據(jù)庫瀏覽器,可以從http://sourceforge.net/projects/sqlitebrowser/下載。-
現(xiàn)在,如果我們在 SQLite 數(shù)據(jù)庫瀏覽器中打開
msgstore.db文件并訪問瀏覽器數(shù)據(jù),我們可以在 SQLite 瀏覽器中看到我們的所有 WhatsApp 對話。 在以下截圖中,我們可以看到在 SQLite 數(shù)據(jù)庫瀏覽器中打開的msgstore.db,它顯示 WhatsApp 應(yīng)用程序的所有聊天對話:
5.7 使用 logcat 記錄日志
Android logcat 有時在取證調(diào)查期間很有用。 它包含在電話以及收音機(jī)上執(zhí)行的所有活動的日志。 雖然不完整,它可以幫助調(diào)查員了解設(shè)備中發(fā)生了什么。
為了捕獲和保存 logcat 轉(zhuǎn)儲文件,我們可以簡單地使用adb logcat并將輸出保存到一個文件,稍后我們可以分析它。
adb logcat > logcat_dump.log
我們還可以使用logcat以更加詳細(xì)和有用的方式獲取日志。 例如,我們可以通過指定-b參數(shù)和radio來獲取收音機(jī)日志。 -b標(biāo)志用于顯示緩沖區(qū)(如收音機(jī)或事件)的 logcat。 -v標(biāo)志用于控制輸出格式,它代表verbose(詳細(xì)),也可以是time,brief,process,tag,raw,threadtime或long。 除了-v,我們還可以使用-d(調(diào)試),-i(信息),-w(警告)或-e(錯誤)。
adb logcat -v time -b radio -d
我們還可以使用其他工具,如dmesg,它將打印內(nèi)核消息,以及getprop,它將打印設(shè)備的屬性:
adb shell getprop
XDA 開發(fā)人員成員 rpierce99 還提供了一個應(yīng)用程序,用于自動捕獲來自 logcat 和其他相關(guān)來源的信息,這些信息可以從https://code.google.com/p/getlogs/下載并使用。
5.8 使用備份功能來提取應(yīng)用數(shù)據(jù)
Android 從 4.0 起引入了使用adb的備份功能。 此功能可用于創(chuàng)建應(yīng)用程序的備份及其整個數(shù)據(jù)。 這在取證上非常有用,因為取證員可以捕獲應(yīng)用程序及其整個數(shù)據(jù)。 請參閱以下步驟:
-
這可以通過在終端中執(zhí)行
adb backup命令,后面附帶應(yīng)用程序的包名來完成。 如果我們不知道應(yīng)用程序的準(zhǔn)確包名稱,我們可以使用pm列出所有包,然后過濾應(yīng)用程序名稱。 -
執(zhí)行此操作的另一種方法是使用
pm list package命令,其中-f標(biāo)志指定要在包名稱中查找的字符串。 -
接下來,我們可以簡單地使用應(yīng)用程序的包名稱,來備份任何我們需要的應(yīng)用程序。
adb backup [package name] -f [destination file name] -
目標(biāo)文件將以文件擴(kuò)展名
.ab(Android 備份)存儲。 在這里,我們采集了 WhatsApp 應(yīng)用程序的備份。 -
一旦我們運行命令,它將暫停,并要求我們在設(shè)備上確認(rèn),如下面的截圖所示:
在這里,我們需要選擇
Back up my data(備份我的數(shù)據(jù))選項,并且還可以為備份指定加密密碼。 一旦備份過程完成,我們將獲得whatsapp_backup.ab文件。-
接下來,我們需要解壓此備份,以便從
.ab文件獲取數(shù)據(jù)庫。 為此,我們將使用dd和openssl創(chuàng)建一個.tar文件,然后我們可以解壓它。 -
現(xiàn)在,由于我們獲得了
.tar文件,我們可以使用tar xvf簡單解壓它。 一旦它解壓完成,我們可以訪問
apps/[package-name]下的db文件夾,來獲取數(shù)據(jù)庫。 這里,程序包名稱為com.whatsapp。
讓我們快速使用ls -l來查看db文件夾中的所有可用文件。 正如你可以看到的,我們擁有msgstore.db文件,它包含 WhatsApp 對話,我們已經(jīng)在上一節(jié)中看到了。

總結(jié)
在本章中,我們分析了執(zhí)行取證的不同方法,以及各種工具,我們可以使用它們來幫助我們進(jìn)行取證調(diào)查。 此外,我們了解了一些我們可以執(zhí)行的手動方法,來從設(shè)備中提取數(shù)據(jù)。
在下一章中,我們將深入 SQLite 數(shù)據(jù)庫,這是 Android 滲透測試的另一個要素。











