第五章 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ù)(智能手機及其數(shù)據(jù))具有被篡改的高風(fēng)險厂镇。
- 物理采集:這意味著對整個物理存儲介質(zhì)進行逐位拷貝纤壁。我們還可以在執(zhí)行物理采集時定位不同的單個分區(qū)。與邏輯采集相比捺信,這種方法慢得多酌媒,但更可靠和可信賴。此外迄靠,為了在智能手機上執(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 中進行物理采集有點棘手糙置,一個主要原因是文件系統(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)進行逐塊復(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í)行分析總是一個好的選擇。
默認情況下湖苞,dd
工具在大多數(shù)基于 Linux 的系統(tǒng)中拯欧,以及在 Android 設(shè)備中的/system/bin
中都存在。 如果它不存在于你的設(shè)備中袒啼,您可以安裝 BusyBox哈扮,它將安裝dd
以及一些其他有用的二進制文件。 你可以從 BusyBox 應(yīng)用程序(https://play.google.com/store/apps/details?id=stericson.busybox
)獲取dd
的二進制文件蚓再,或者你甚至可以自己交叉編譯滑肉。
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ū)之一的映像來進行取證
-
我們需要找到的第一個東西是不同的分區(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 工具將映像直接保存到遠程位置/系統(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
進入設(shè)備究孕,然后啟動dd
工具啥酱,并將輸出轉(zhuǎn)發(fā)到 Netcat。nc -l -p 5566-e dd if=/dev/block/mtdblock6
這將把映像保存到系統(tǒng)中厨诸,而不是保存在設(shè)備上的任何位置镶殷,然后再拉取它。 如果你的手機上沒有dd
二進制微酬,你也可以安裝 BusyBox 來獲得dd
二進制绘趋。
開始取證調(diào)查之前應(yīng)該確保的一件事是,檢查設(shè)備是否被設(shè)置為在超級用戶模式下操作颗管,這通常需要設(shè)備的 root陷遮。 然而,我們遇到的所有設(shè)備并不都是 root垦江。 在這些情況下帽馋,我們將使用我們的自定義恢復(fù)映像來啟動手機,然后 root 設(shè)備比吭。
5.4 使用 Andriller 提取應(yīng)用數(shù)據(jù)
Andriller 是由 Denis Sazonov 以 Python 編寫的開源多平臺取證工具绽族,它有助于從設(shè)備中提取一些基本信息,并且有助于進行取證分析衩藤。 分析完成后吧慢,將生成 HTML 格式的取證報告。
為了下載它赏表,我們可以訪問官方網(wǎng)站http://android.saz.lt/cgi-bin/download.py
并下載必要的包娄蔼。 如果我們在 Linux 或 Mac 環(huán)境中怖喻,我們可以簡單地使用wget
命令來下載并解壓軟件包底哗。 因為它只是一個 Python 文件岁诉,以及一些其他必要的二進制文件,所以沒有必要安裝它; 相反跋选,我們可以直接開始使用它涕癣。
$ 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ū)并進行構(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)要提取的詳細信息:
我們將檢查所有東西,然后單擊Capture
衡载。 AFLogical 將開始從不同來源捕獲詳細信息搔耕,并將捕獲的詳細信息保存在 SD 卡中的csv
文件中。 捕獲過程完成后痰娱,我們會注意到一個警告框弃榨。
我們現(xiàn)在可以查看我們的 SD 卡路徑,我們可以找到保存的.csv
文件梨睁。
然后我們可以在任何.csv
文件查看器中打開這些.csv
文件來查看詳細信息鲸睛。 因此,AFLogical 是一個快速有效的工具坡贺,用于從設(shè)備中提取一些信息官辈,如聯(lián)系人,通話記錄和消息遍坟。
5.6 手動轉(zhuǎn)儲應(yīng)用的數(shù)據(jù)庫
既然我們已經(jīng)看到拳亿,很多工具可以幫助我們進行取證,我們還可以使用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ù)庫的步驟:
- 進入設(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)前位置搜索唬渗,然后查找具有任何文件名(通配符*
)以及擴展名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
司志,來從手機中拉取所有.apk
文件甜紫。 -
如果我們仔細看一看,在我們的
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)查期間很有用拦键。 它包含在電話以及收音機上執(zhí)行的所有活動的日志。 雖然不完整檩淋,它可以幫助調(diào)查員了解設(shè)備中發(fā)生了什么芬为。
為了捕獲和保存 logcat 轉(zhuǎn)儲文件,我們可以簡單地使用adb logcat
并將輸出保存到一個文件狼钮,稍后我們可以分析它碳柱。
adb logcat > logcat_dump.log
我們還可以使用logcat
以更加詳細和有用的方式獲取日志。 例如熬芜,我們可以通過指定-b
參數(shù)和radio
來獲取收音機日志莲镣。 -b
標(biāo)志用于顯示緩沖區(qū)(如收音機或事件)的 logcat。 -v
標(biāo)志用于控制輸出格式涎拉,它代表verbose
(詳細)瑞侮,也可以是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)文件將以文件擴展名
.ab
(Android 備份)存儲迂烁。 在這里看尼,我們采集了 WhatsApp 應(yīng)用程序的備份。 -
一旦我們運行命令盟步,它將暫停藏斩,并要求我們在設(shè)備上確認,如下面的截圖所示:
在這里却盘,我們需要選擇
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í)行取證的不同方法梯码,以及各種工具宝泵,我們可以使用它們來幫助我們進行取證調(diào)查。 此外轩娶,我們了解了一些我們可以執(zhí)行的手動方法儿奶,來從設(shè)備中提取數(shù)據(jù)。
在下一章中鳄抒,我們將深入 SQLite 數(shù)據(jù)庫闯捎,這是 Android 滲透測試的另一個要素。