Andorid-APP 安全(四)之流量分析與內外儲存
繼上一篇Andorid-APP 安全測試(三)的內容
安全測試(四)主要針對三個方面來寫:Andorid逆向與審計的補充、對 Android 裝置進行流量分析、Android內外儲存基礎知識、Android 取證。因Android 取證涉及內容有點多,大部分內容會在安全測試(五)中寫到。
Andorid逆向與審計的補充
Android 逆向與審計中對於原始碼混淆的審計我在第一篇APP文章中有寫到, https://www.secpulse.com/archives/74861.html。前不久在一論壇看到一個大佬在2012 的一篇文章,對於判斷APK檔案是否混淆 思路簡單新穎(2012年的時候就有大佬提出了,然而我卻在2019年才偶遇這篇文章~我和大佬的距離差了七年。)在這裡分享給小夥伴,參考連結: https://bbs.pediy.com/thread-159959.htm 。
一個簡單的方法判斷APK檔案是否混淆。
目前越來越多的惡意apk檔案為了對抗防毒軟體以及分析人員的分析,由於商業軟體自身的保密需要,很大程度上都會進行一定的混淆,更有甚者採用全反射呼叫的來掩藏自己的真實意圖。雖然一定程度上經過混淆的檔案的其檔案大小都會變小。以著名的proguard為例,經過處理的apk檔案大小往往不到其未經過處理的apk檔案的1/3。
由於apk檔案的混淆往往是伴隨著檔案的壓縮和程式碼的優化問題,混淆的apk檔案解壓轉換為jar檔案,使用ju-gui開啟以後有一個不太引人注意的細節問題---其中找不到資原始檔類。
利用這一特性,我們可以直接利用apktool解壓apk檔案,對其smali檔案的檔名進行分析,如果存在一個或以上的資源的smali檔案,就可以證明該apk檔案沒有混淆,反之,則說明已經是混淆過了的檔案。如下圖所示
而全反射呼叫的判斷就比較簡單了,直接判斷是否存在forname函式。
對於全反射呼叫請自行百度瞭解下吧~。
** 呼叫系統隱藏的API: 使用Class.forName("全類名")呼叫
哪些情況會使用反射
1. 指定類名/全類名字串
2. 使用反射相關API : Class Method Field
對 Android 裝置進行流量分析
網路流量是指,能夠連線網路的裝置在網路上所產生的資料流量。
效能資料給出的網路流量效能資料可以區分接收流量和傳送流量:
接收流量:應用執行期間,網絡卡的下行流量,單位是位元組
傳送流量:應用執行期間,網絡卡的上行流量,單位是位元組
通常應用程式會在網路資料中洩漏敏感資訊。此外,你經常會遇到通過不安全的網路協議執行身份驗證和會話管理的應用程式。網路流量分析我們主要分兩種:被動分析和主動分析。
被動分析:
應用程式傳送的網路資料不會被攔截。相反,我們將嘗試捕獲所有網路資料包,然後在網路分析器(如Wireshark)中開啟它,然後嘗試找出應用程式中的漏洞或安全問題。
被動分析:可以使用 tcpdump 來將所有的資訊儲存到裝置中一個位置。此後,我們將該檔案拉取到我們的系統,然後使用 Wireshark或其他包分析器檢視它。
下面是我對被動分析做的詳細實驗步驟,僅供參考~
準備工具:wireshark,netcat,tcpdump
tcpdump連結: http://www.strazzere.com/android/tcpdump
tcpdump(需Root使用者執行)攔截和顯示傳送或收到過網路連線到該機器的TCP/IP和其他資料包。簡單說就監控手機進出網路資料。
Tcpdump抓取手機資料包特點:
1).基本只能針對Android手機
2).不能實時抓包
3).電腦需要安裝Android SDK
4).電腦需要安裝Wireshark
5).測試手機需要獲取root許可權
6).測試手機需要安裝tcpdump軟體
假如你的Android裝置已經root了,你可以用如下方式建立一個目錄,存放TCPdump的二進位制可執行檔案。
通過ADB命令,在Android裝置上依次執行下面的命令。
adb shell su mkdir /data/tcpdump/ chmod 777 /data/tcpdump/
然後跳轉到你本地tcpdump 的儲存目錄下,把下載後的tcpdump 上傳到你的Android的tcpdump 的目錄下。
執行下面命令:
adb push tcpdump /data/tcpdump / adb shell su chmod 777 /data/tcpdump /tcpdump
當你把for android 版的tcpdump上傳到裝置上後,並把他的許可權設為可執行之後,你應該執行下面這條命令,確認Android裝置上的NETCAT是可用的。
如圖:
上面執行 nc 不過是個確認檢查而 已,在大多數版本的Android系統上預設都自帶了NETCAT 。如果沒有,可以去下載一個。
確認了tcpdump和NETCAT都已經安裝到你的Android裝置上後,你可以執行下面命令,抓取網路流量,如果一切正常,你應該在螢幕上看見輸出下面的這些資訊。
./data/tcpdump/tcpdump -w - | nc -l -p 31337
你應該把 tcpdump 的輸出傳給裝在你本地計算機的 Wireshark 上,要完成這個任務,首先要執行下面命令,通過 ADB 設定一下埠轉發
adb forward tcp:12345 tcp:31337
在埠轉發之後,執行你本地計算機的NETCAT
ne .exe 127.0.0.1 12345
這樣做了之後,所有的流量都會被正確的轉發,你可以通過管道把輸出轉接到Wireshark。
adb forward tcp:12345 tcp:31337 && nc.exe 127.0.0.1 12345 | Wireshark -k -S -i -
執行此命令前我將netcat還有wireshark放在了同一目錄下,之後就可以看到wireshark運轉起來。
還可以將資料包匯出到電腦,用wireshark開啟
如下命令:
/tcpdump -p -vv -s 0 -w /sdcard/11.pcap #執行抓包命令,結果儲存到SD卡22.pcap檔案中 adb pull /sdcard/22.pcap E:/ #前為手機中檔案及存放路徑,後為電腦E盤根目錄
使用Wireshark等工具分析抓包檔案22.pcap
主動分析:
在主動分析中,滲透測試者將主動攔截所有正在進行的網路通訊,並可以即時分析,評估和修改資料。這裡需要設定代理,並且由應用/裝置生成和接收的所有網路流量會通過該代理。
這裡我們最常用的抓包工具就是burpsuite。利用burpsuite攔截資料包流量只需要在設定代理。
為了檢查代理是否工作,開啟任意APP。 然後我們能夠看到它是否在代理中被攔截。
就先不說講述的專業不專業,說我這個碼是不是打的很專業~
正如我們在上面的螢幕截圖中看到的,我們成功地攔截了來自裝置和應用程式的所有基於 HTTP 的請求。
當通過 HTTP 協議進行通訊時,上述方法可以正常用於應用和流量器的流量攔截。 在
HTTPS 中,由於證書不匹配,因此我們無法攔截流量。我們只需要將burpsuite中證書匯出,安裝到手機證書中即可。網上關於“Burpsuite抓取手機app的資料包-證書的匯入”這類文章很多,百度到的一個僅供參考:https://blog.csdn.net/u011975363/article/details/83654074
之後就能看到抓包工具中抓取到了Https流量
以上是對Android被動分析、主動分析工具使用的詳細介紹,歡迎小夥伴評論分享新思路哦~
Android內外儲存基礎知識
在這裡提到Android內外儲存的基礎知識,也是為了後面在Android取證部分中會涉及到資料的儲存位置。
Android手機上的儲存空間可做如下劃分:
記憶體:RAM
內部儲存:內部ROM
外部儲存:外部ROM和SDCard
手機上的儲存在概念上分成了”內部internal“和”外部external“兩部分,但其實都在手機內部。因此無論Android手機是否有可移動的sdcard,它都有外部儲存和內部儲存,且通過相同的Api方法來訪問可移動的sdcard或者手機自帶的儲存。
以下是一部手機的儲存展示圖,用SDK中DDMS自帶的Device File Explore開啟後展現的檔案目錄。
(1)內部儲存:
Android可以說是一個Linux作業系統,它的內部儲存空間對於應用程式和使用者來講就是“/data/data“目錄。內部儲存與外部儲存相比有著比較穩定,儲存方便,操作簡單,更加安全(可以控制訪問許可權)等優點,而它唯一的缺點就是空間有限。
內部儲存空間的有限意味著應物盡其用,用來儲存比較重要的資料,例如使用者資訊資料,口令祕碼等不需要與其他應用程式共享的資料。注意應用程式被解除安裝時,應用程式在內部儲存空間的檔案資料將全部被刪除,避免佔用寶貴的空間。
內部儲存即data資料夾,其中裡面有兩個資料夾值得關注:
·app資料夾(未root無法開啟):存放著所有app的apk資料夾,當開發者除錯某個app時,AS控制檯輸出的內容中有一項是uploading…,代表正在上傳apk到這個資料夾。
·data資料夾:內部都是app的包名,儲存著應用程式相關的資料,例如 data/data/包名/(shared_prefs、database、files、cache)
(2)外部儲存:
外部儲存是指使用者在使用時自行在手機上新增的外部儲存介質,例如TS卡,SD卡等快閃記憶體儲介質。其顯著的優點就是儲存空間大,無需擔心資料清除問題,與內部儲存不同的是當應用程式解除安裝時,它在外部儲存所建立的檔案資料不會被清除,因此清理外部儲存空間的責任丟給了使用者自己。缺點則是不太穩定,快閃記憶體介質對於Android手機而言會出現SD卡不能正常使用的情況。
外部儲存即storage資料夾或mnt資料夾。需要注意的是storage中有一個sdcard0資料夾,其中又分為公有目錄和私有目錄:
-
公有目錄:有9大類,比如DCIM、Download等系統為使用者建立的資料夾;
-
私有目錄: 即Android資料夾/storage/sdcard/Android/,其中的data資料夾包含了許多包名組成的資料夾。
若應用程式在執行過程中需要向手機上儲存資料,通常是儲存在sdcard中/storage/sdcard,即應用直接在sdcard的根目錄建立一個資料夾用於資料儲存,不過當該app被解除安裝後,資料還保留在sdcard中,意味著留下了垃圾資料。
在開發中,Google官方建議App資料儲存在外部儲存的私有目錄中對應App的包名下storage/sdcard/Android/data/包名/,這樣當用戶解除安裝掉App之後,相關的資料會一併刪除!
(3)內外部儲存常用目錄操作
-
context.getFilesDir() 內部儲存data/data/包名/files目錄
-
context.getCacheDir() 內部儲存data/data/包名/cache目錄
-
Environment.getExternalStorageDirectory() 外部儲存根目錄
-
Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_DCIM) 外部儲存公有目錄
-
context.getExternalFilesDir() 外部儲存私有目錄storage/sdcard/Android/data/包名/files。一般儲存長時間儲存的資料。
-
context.getExternalCacheDir() 外部儲存私有目錄storage/sdcard/Android/data/包名/cache。一般儲存臨時快取資料。
注意上述最後兩個API:當app被解除安裝後,sdCard/Android/data/PackageName/下的所有檔案都會被刪除,不會留下垃圾資訊。兩個API對應的目錄分別對應著 設定->應用->應用詳情裡面的“清除資料”與“清除快取”選項。
(4)sd卡路徑隨著Android版本變化
-
android 4.0
Galaxy Nexus(GN)手機上的userData分割槽很大,被掛在/data 目錄下。使用者的資料通常是儲存在SD卡上,可是GN無SD卡,即只有intenal內部儲存。
Google直接在userData分割槽下虛擬了一個media目錄,它是內建sd卡的資料儲存位置,具體使用了fuse技術將/data/media虛擬成為一個叫做/dev/fuse的裝置,為了讓程式能認出來,被同時掛載在 /mnt/sdcard 目錄,又為了相容以前的程式,做了一個快捷方式(linux系統裡叫軟連線),因此 /sdcard 指向的就是 /mnt/sdcard。
-
android 4.1
在4.1中同樣使用fuse技術,/dev/fuse 會被同時掛載到/storage/sdcard0 目錄。“sdcard0”表示第一個sd卡(若有外接sd卡,那會多一個 /storage/sdcard1) /sdcard 軟連線會指向 /storage/sdcard0 ,此時/mnt/sdcard 也是個軟連線,會指向/storage/sdcard0。
/storage/sdcard0才是最終源頭,/sdcard、/mnt/sdcard是指向它的一個軟連線而已。
-
android 4.2及之後
在4.2之後,Android出現了一個“多使用者”的功能特徵,意味著一臺裝置可能被多個人同時應用,因此需要將每個人的資料、應用、個性配置分開。
4.2版本中同樣使用fuse技術,而/dev/fuse 會被掛載到/storage/emulated/0 目錄。(若有多個使用者,0資料夾名稱依次增加,例如/storage/emulated/1)
不僅如此,為了相容Android版本升級,還同時掛載到/storage/emulated/legacy,建立了三個軟連線指向自己:
-
·/storage/sdcard0
-
·/sdcard
-
·/mnt/sdcard
也許在手機裝置開發中似乎沒太注意到“多使用者”新特性的作用,無需太過在意,它主要在平板上使用,手機端是禁用的,但底層實現原理相同。
/mnt/shell/emulated 目錄和 /storage/emulated 下的資料夾是一樣的。
/sdcard/:只是一個符號連結,連結到/storage/sdcard0/
/mnt/sdcard:Android4.0版本之前的顯示
/storage/sdcard0 :Android4.0版本之後的顯示
/storage/emulated/0/:這是參照“emulated MMC”,通常指其內部,“0”代表第一個使用者,即裝置擁有者。 如果您建立其他使用者,則此數字將為每個使用者增加。
/storage/emulated/legacy/:與上同理,但指向當前工作使用者的部分。(對於“0”使用者而言,這是/storage/emulated/0/的符號連結)
/storage/sdcard0/:注意這裡的“0”並非是一個單獨資料夾名,而是作為字尾一樣,意味著“0”並不代表使用者,而是裝置(卡)本身,因此它不需要legacy連結。人們可以通過OTG將讀卡器與另一個SD卡連線起來,然後路徑將成為/storage/sdcard1/。
為了相容Android版本升級,還同時掛載到/storage/emulated/legacy,建立了三個軟連線指向自己:/storage/sdcard0 、/sdcard、/mnt/sdcard。
Android 取證
Android 取證這部分內容會涉及比較多,大部分內容我會寫在安全測試(五)中。本章安全測試(四)只做一個簡單介紹,以下對Android 取證技術的講解,思路取材大多來源於網路以及《Android 取證實戰》一書。
之後所寫的關於Android取證的大概思路,都在如下我清晰的草稿紙上。
取證型別:
邏輯採集:取證員與裝置互動並從檔案系統提取資料。該資料可以是任何內容,諸如應用特定資料,聯絡人,通話記錄,訊息,web 瀏覽器歷史,社交網路使用者資訊和財務資訊。邏輯採集的優點是,在大多數情況下比物理採集更容易獲取邏輯資訊。然而,在一些情況下,該方法的一個限制是,在這種情況下的證據(智慧手機及其資料)具有被篡改的高風險。
物理採集:這意味著對整個物理儲存介質進行逐位拷貝。我們還可以在執行物理採集時定位不同的單個分割槽。與邏輯採集相比,這種方法慢得多,但更可靠和可信賴。此外,為了在智慧手機上執行物理採集,檢查者需要熟悉不同型別的檔案系統,例如 Yet Another Flash File System 2(YAFFS2),ext3,ext4,rfs 等。
檔案系統:
在 Android 中進行物理採集有點棘手,一個主要原因是檔案系統不同。
Android 檔案系統的主分割槽通常被分割槽為 YAFFS2。在 Android 中使用 YAFFS2 的原因是,它為裝置提供了優勢,這包括更高的效率和效能,以及更低的佔用空間。幾年前,當 Android 剛剛推出時,取證是平臺上的一個大問題,因為幾乎沒有支援 YAFFS2 檔案系統格式的取證工具。
SD 卡是 FAT32 型別,是正常系統使用者中的共享格式。因此,為了獲取SD卡的映像,可以使用任何常規的資料採集取證工具。
大多說使用者使用的U盤格式都是FAT32格式,因為它的相容性相對好一些,幾乎可以完美應對所有作業系統,並且快速的進行讀寫工作。但是它的缺點是是不能設定許可權,安全等級較低。並且最關鍵的一點就是它最高只能支援4G以下的單個檔案傳輸。隨著檔案越來越大,一個高清的電影就已經達到了好幾個G的大小,相比之下FAT32已經屬於落後“產品”。
製作副本或建立現有資料系統映像的最有名的工具之一是 dd,它從原始來源到系統進行逐塊複製。然而,由於該工具的一些缺點,例如缺少記憶體塊以及跳過壞塊,會導致資料損壞,因此不推薦在取證調查期間使用。
如何檢視Android 檔案系統分割槽:
Android 基於 Linux 核心,並從 Linux 本身派生其大部分功能和屬性。 在 Android 中,檔案系統被劃分為不同的分割槽,每個分割槽都具有重要意義。在 Android 裝置上檢視分割槽,我們可以使用 adb shell 然後檢視 proc下的 mtd檔案,如下面的命令所示。
在大多數 Android裝置上,我們通常會看到一些資料分割槽,如system,userdata , cache ,recovery ,boot ,pds ,kpanic 和misc ,它們安裝在dev 列指定的不同位置。為了看到不同的分割槽和型別,我們可以在 adb shell中鍵入mount。
通過執行 mount 命令列表,所有不同的分割槽及其位置將被掛載:
Android USB大容量儲存終端裝置映像
目前所有的Android終端裝置都配備有外接的安全數字(SDK)卡,或者是內建的多媒體卡(eMMC),給使用者提供所需要的大容量儲存空間。需要這些儲存終端裝置的理由是基於安全和隱私保護的需要,通常儲存在/data/data中的使用者應用資料都是被隔離開的。然而,使用者希望在Android終端裝置和個人電腦之間來回拷貝音樂、影象、視訊或者其他各類檔案,這些大容量的FAT檔案系統分割槽可以解決這些問題。使用者的敏感資料依然能夠得到保護,同時,使用者又能夠訪問大尺寸、行動式的檔案。
如何獲得SD卡或eMMC的取證映像
在不需要從終端裝置中取出任何卡的前提下,目前從SD卡或eMMC中獲取取證映像的方式主要有兩種。第一種方法將UMS終端裝置介面暴露給取證工作站,然後使用任何可選擇的取證工具獲取映像。第二種方法,不將USB暴露給取證工作站,而是在終端裝置上使用dd命令。
關於android取證詳細的工具介紹以及使用方式將在下一篇寫到,歡迎小夥伴一起探討android安全相關問題,一起學習一起成長~
最後:祝大家新年快樂哦~
本文參考連結:
https://www.jianshu.com/p/23abbd62781e
https://bbs.pediy.com/thread-159959.htm 。
https://www.jianshu.com/p/70db63beafff
https://blog.csdn.net/itermeng/article/details/79423035
參考資料:
《Android 滲透測試學習手冊》
《Android取證實戰:調查、分析與移動安全》