第四章 對 Android 設(shè)備進行流量分析
作者:Aditya Gupta
譯者:飛龍
協(xié)議:CC BY-NC-SA 4.0
在本章中厌蔽,我們將研究 Android 設(shè)備的網(wǎng)絡(luò)流量奴饮,并分析平臺和應(yīng)用程序的流量數(shù)據(jù)戴卜。 通常應(yīng)用程序會在其網(wǎng)絡(luò)數(shù)據(jù)中泄漏敏感信息投剥,因此發(fā)現(xiàn)它是滲透測試程序最重要的任務(wù)之一。 此外吃警,你經(jīng)常會遇到通過不安全的網(wǎng)絡(luò)協(xié)議執(zhí)行身份驗證和會話管理的應(yīng)用程序酌心。 因此谒府,在本章中完疫,我們將學(xué)習(xí)如何攔截和分析 Android 設(shè)備中壳鹤,各種應(yīng)用程序的流量芳誓。
4.1 Android 流量攔截
根據(jù) OWASP 移動 Top10(https://www.owasp.org/index.php/Projects/OWASP_Mobile_Security_Project_-_Top_Ten_Mobile_Risks
),不完善的傳輸層保護是第三大威脅匿值。實際上挟憔,假設(shè)一個應(yīng)用程序通過 HTTP 將用戶的登錄憑據(jù)提交到服務(wù)器绊谭。 如果用戶位于咖啡店或機場达传,并在有人嗅探網(wǎng)絡(luò)時登錄到他的應(yīng)用程序宪赶,會怎么樣逊朽? 攻擊者能夠獲得特定用戶的整個登錄憑據(jù)叽讳,它以后可能用于惡意目的岛蚤。 假設(shè)應(yīng)用程序正在通過 HTTPS 進行身份驗證涤妒,通過 HTTP 的會話管理她紫,并且在請求中傳遞身份驗證 Cookie贿讹。 在這種情況下,攻擊者也能夠通過在執(zhí)行中間人攻擊時攔截網(wǎng)絡(luò)來獲取身份驗證 Cookie茄菊。 使用這些認證 cookie面殖,他可以直接作為受害用戶登錄到應(yīng)用程序脊僚。
4.2 流量分析方式
在任何情況下都有兩種不同的流量捕獲和分析方法吃挑。 我們將研究 Android 環(huán)境中可能的兩種不同類型,以及如何在真實場景中執(zhí)行它們赎离。 被動和主動分析如下:
- 被動分析:這是一種流量分析的方法梁剔,其中應(yīng)用程序發(fā)送的網(wǎng)絡(luò)數(shù)據(jù)不會被攔截荣病。 相反个盆,我們將嘗試捕獲所有網(wǎng)絡(luò)數(shù)據(jù)包颊亮,然后在網(wǎng)絡(luò)分析器(如Wireshark)中打開它终惑,然后嘗試找出應(yīng)用程序中的漏洞或安全問題雹有。
- 主動分析:在主動分析中霸奕,滲透測試者將主動攔截所有正在進行的網(wǎng)絡(luò)通信铅祸,并可以即時分析临梗,評估和修改數(shù)據(jù)盟庞。 這里什猖,他需要設(shè)置代理不狮,并且由應(yīng)用/設(shè)備生成和接收的所有網(wǎng)絡(luò)流量會通過該代理摇零。
被動分析
被動分析的概念是驻仅。將所有網(wǎng)絡(luò)信息保存到特定文件中噪服,之后使用數(shù)據(jù)包分析器查看粘优。 這就是我們將在 Android 設(shè)備中進行被動分析。 我們將使用tcpdump
來將所有的信息保存到設(shè)備中一個位置芬位。 此后昧碉,我們將該文件拉取到我們的系統(tǒng),然后使用 Wireshark 或 Cocoa 包分析器查看它狭握。 請參閱以下步驟:
-
我們從 Timur Alperovich 的網(wǎng)站
http://www.eecs.umich.edu/~timuralp/tcpdump-arm
下載為 ARM 編譯的tcpdump
二進制文件论颅。 如果我們需要恃疯,我們還可以下載tcpdump
的原始二進制文件并交叉編譯(為 Android 交叉編譯你的二進制文件今妄,請按照鏈接http://machi021.blogspot.jp/2011/03/compile-busybox-for-android.html
盾鳞。鏈接展示了交叉編譯 BusyBox腾仅,但相同的步驟可以應(yīng)用于tcpdump
)攒砖。一旦我們下載了
tcpdump
惰蜜,我們可以通過在我們剛剛下載的二進制上執(zhí)行一個文件抛猖,來確認它是否為 ARM 編譯。對于 Windows 用戶撑碴,你可以使用 Cygwin 來執(zhí)行命令醉拓。 輸出類似于以下屏幕截圖中所示: 這里的下一步是將
tcpdump
二進制文件推送到設(shè)備中的一個位置。 我們還必須記住排吴,我們需要繼續(xù)執(zhí)行這個文件钻哩。 因此街氢,我們將它推送到一個位置阳仔,我們可以從中更改權(quán)限近范,以及執(zhí)行二進制來捕獲流量评矩。現(xiàn)在,繼續(xù)并使用
adb
的push
命令推送二進制來將二進制推送到設(shè)備蔗喂。 同樣缰儿,在我們需要從設(shè)備中拉取內(nèi)容的情況下乖阵,我們可以使用pull
而不是push
宣赔。-
這里,我們將使用
adb push
將其推送到 Android 中的/data/local/tmp
:adb push tcpdump-arm /data/local/tmp/tcpdum
-
一旦我們將
tcpdump
二進制推送到設(shè)備瞪浸,然后需要使用adb
在 shell 中訪問設(shè)備儒将,并更改二進制的權(quán)限。 如果我們試圖運行tcpdump
对蒲,它會給我們一個權(quán)限錯誤钩蚊,因為我們沒有執(zhí)行權(quán)限齐蔽。為了更改權(quán)限两疚,我們需要訪問
/data/local/tmp
,使用chmod
命令含滴,并授予其權(quán)限777
诱渤,這意味著應(yīng)用程序?qū)⒕哂兴袡?quán)限。 以下屏幕截圖顯示了上述命令的結(jié)果輸出: -
這里的最后一步是啟動
tcpdump
并將輸出寫入.pcap
文件谈况。 使用-s
勺美,-v
和-w
標(biāo)志啟動tcpdump
。 參考以下描述:- -s:這表示從每個封包抽取給定(在我們的例子中為 0)字節(jié)的數(shù)據(jù)碑韵,而不是默認的 65535 字節(jié)赡茸。
- -v:這表明詳細輸出。
- -w:這表明寫入原始數(shù)據(jù)包的文件名祝闻。 例如占卧,我們可以使用
./tcpdump -v -s 0 -w output.pcap
,以便將所有文件寫入output.pcap
联喘,并輸出詳細信息华蜒。
-
在流量捕獲執(zhí)行期間,打開手機瀏覽器并訪問位于
http://attify.com/data/login.html
的漏洞登錄表單豁遭,該表單通過 HTTP 發(fā)送所有數(shù)據(jù)并使用 GET 請求: 這里使用用戶名
android
和密碼mysecretpassword
登錄應(yīng)用程序叭喜。-
我們現(xiàn)在可以在任何時候通過
adb shell
服務(wù)終止進程(使用Ctrl + C
)。 下一步是將捕獲的信息從設(shè)備拉取到我們的系統(tǒng)蓖谢。 為此捂蕴,我們將簡單地使用adb pull
如下:adb pull /data/local/tmp/output.pcap output.pcap
-
你可能還需要更改
output.pcap
的權(quán)限才能拉取它。 在這種情況下闪幽,只需執(zhí)行以下命令:chmod 666 output.pcap
-
一旦我們下載了捕獲的網(wǎng)絡(luò)數(shù)據(jù)的.pcap文件啥辨,我們可以在 Wireshark 中打開它并分析流量。 在這里盯腌,我們將嘗試查找捕獲的登錄請求溉知。 我們可以從網(wǎng)站
http://www.wireshark.org/download.html
下載 Wireshark。 一旦下載并安裝完畢,打開 Wireshark 并在里面打開我們新拉取的文件output.pcap
着倾,通過訪問File | Open
。一旦我們在 Wireshark 中打開
.pcap
文件燕少,我們會注意到一個類似下面截圖所示的屏幕:Wireshark 是一個開源封包分析器卡者,它幫助我們發(fā)現(xiàn)敏感信息,并分析來自所有網(wǎng)絡(luò)連接的流量數(shù)據(jù)客们。 在這里崇决,我們正在搜索我們對
http://attify.com
所做的請求,并輸入了我們的登錄憑據(jù)底挫。 -
現(xiàn)在恒傻,訪問
Edit
并單擊Find Packets
。 在這里建邓,我們需要查找我們提交登錄憑據(jù)的網(wǎng)站盈厘,并檢查String
。 -
在這里官边,我們可以看到與
http://attify.com/data/login.html
的連接沸手。 如果我們在底部窗格中查找有關(guān)此數(shù)據(jù)包的更多信息,我們可以看到包含我們輸入的用戶名和密碼的請求網(wǎng)址注簿。
因此契吉,我們使用tcpdump
成功捕獲了網(wǎng)絡(luò)數(shù)據(jù),并將其存儲在.pcap
文件中诡渴,然后使用 Wireshark 進行分析捐晶。 然而,被動流量捕獲也可以通過adb shell
直接完成妄辩。
adb shell /data/local/tmp/tcpdump -i any -p -s 0 -w /mnt/sdcard/output.pcap
這里惑灵,-i
代表接口。 在這種情況下恩袱,它從所有可用接口捕獲數(shù)據(jù)泣棋。 -p
指定tcpdump
不將設(shè)備置于混雜模式(這是在執(zhí)行嗅探攻擊時經(jīng)常使用的模式,并且不適合我們目前使用的模式)畔塔。 在使用-tcpdump
標(biāo)志啟動模擬器時潭辈,我們還可以指定使用tcpdump
。 我們還需要使用-avd
標(biāo)志澈吨,指定要捕獲流量的 AVD 名稱把敢。
emulator -avd Android_Pentesting --tcpdump trafficcapture.pcap
主動分析
主動分析的基本規(guī)則是,使每個請求和響應(yīng)通過我們定義的中間設(shè)備谅辣。 在這種情況下修赞,我們將設(shè)置一個代理,并使所有請求和響應(yīng)通過該特定代理。 此外柏副,我們可以選擇操縱和修改請求和響應(yīng)中的數(shù)據(jù)包勾邦,從而評估應(yīng)用程序的安全性:
-
為了為 HTTP 創(chuàng)建代理,請使用指定代理 IP 和端口以及
-http-proxy
標(biāo)志啟動模擬器割择。 由于我們在同一個系統(tǒng)上運行模擬器眷篇,我們使用IP127.0.0.1
和任何可用的端口。 在這種情況下荔泳,我們使用端口 8080蕉饼。emulator -avd Android_Pentesting –http-proxy 127.0.0.1:8080
在設(shè)備上,我們還可以訪問
Settings | Wi-Fi
玛歌,然后長按我們連接的網(wǎng)絡(luò) Wi-Fi昧港。 此外如果我們使用一個實際的設(shè)備,我們用于攔截的系統(tǒng)應(yīng)該在同一個網(wǎng)絡(luò)上支子。-
一旦我們長按 Wi-Fi 連接创肥,我們將會得到一個類似于下面的截圖所示的屏幕。 此外译荞,如果你使用真實設(shè)備執(zhí)行此練習(xí)瓤的,設(shè)備需要與代理位于同一個網(wǎng)絡(luò)。
-
一旦進入連接修改屏幕吞歼,請注意圈膏,代理配置會詢問網(wǎng)絡(luò)上的設(shè)備的 IP 地址和代理系統(tǒng)的端口。
但是篙骡,這些設(shè)置僅存于從 4.0 開始的最新版本的 Android 中稽坤。 如果我們要在小于 4.0 的設(shè)備上實現(xiàn)代理,我們將必須安裝第三方應(yīng)用程序糯俗,例如 Play Store 上可用的 ProxyDroid尿褪。
5, 一旦我們在設(shè)備/模擬器中設(shè)置了代理得湘,請繼續(xù)并啟動 Burp 代理杖玲,來攔截流量。 下面Options
選項卡中 Burp 代理的樣子淘正,以便有效攔截瀏覽器和應(yīng)用程序的流量摆马。
6, 我們還需要檢查不可見的代理鸿吆,以確保我們的代理也捕獲 nonproxy 請求囤采。 (讀者可以在 Burp 的網(wǎng)站http://blog.portswigger.net/2008/11/mobp-invisible-proxying.html
上詳細了解不可見代理和非代理請求。)
![](http://upload-images.jianshu.io/upload_images/118142-7f870abd10e663a5.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
為了檢查代理是否工作惩淳,打開瀏覽器并啟動網(wǎng)站蕉毯。 然后我們能夠看到它是否在代理中被攔截。
正如我們在上面的屏幕截圖中看到的,我們打開了 URLhttp://attify.com
代虾,請求現(xiàn)在顯示在 Burp Proxy 屏幕中进肯。 因此,我們成功地攔截了來自設(shè)備和應(yīng)用程序的所有基于 HTTP 的請求棉磨。
4.3 HTTPS 代理攔截
當(dāng)通過 HTTP 協(xié)議進行通信時坷澡,上述方法可以正常用于應(yīng)用和流量器的流量攔截。 在 HTTPS 中含蓉,由于證書不匹配,我們將收到錯誤项郊,因此我們無法攔截流量馅扣。
然而,為了解決這個挑戰(zhàn)着降,我們需要創(chuàng)建自己的證書或 Burp/PortSwigger 并將其安裝在設(shè)備上差油。 為了創(chuàng)建我們自己的證書,我們需要在 Firefox(或任何其他瀏覽器或全局代理)中設(shè)置代理:
-
為了在 Firefox 中設(shè)置代理任洞,請訪問
Tools
中顯示的Options
(Mac上為Firefox | Preferences
)蓄喇,然后訪問Advanced
選項卡。 在Advanced
選項卡下交掏,我們單擊Network
選項妆偏。 -
在
Network
標(biāo)簽中,我們需要點擊Settings
來使用 Firefox 配置代理盅弛。 完成后钱骂,在我們的系統(tǒng)瀏覽器上訪問 HTTPS 網(wǎng)站,我們能跟攔截我們設(shè)備上的流量挪鹏。 這里我們將收到一個
The Network is Untrusted
消息见秽。 點擊I understand the Risks
,并點擊Add Exception
讨盒。-
然后解取,單擊
Get Certificate
,最后單擊View
返顺,然后單擊Export
來保存證書禀苦。 -
一旦證書保存在我們的系統(tǒng)上,我們現(xiàn)在可以使用
adb
將其推送到我們的設(shè)備创南。adb push portswiggerca.crt /mnt/sdcard/portswiggerca.crt
-
現(xiàn)在伦忠,在我們的設(shè)備中,訪問
Settings
稿辙,在Personal
類別下昆码,我們可以找到Security
。 一旦我們進入Security
,請注意赋咽,你可以選擇從 SD 卡安裝證書旧噪。 點擊它使我們可以保存具有給定名稱的證書,這適用于所有應(yīng)用程序和瀏覽器脓匿,甚至是 HTTPS 站點淘钟。 -
通過返回到我們的瀏覽器,并打開 HTTPS 網(wǎng)站(例如
https://gmail.com
)來確認陪毡。 正如我們在下面的截圖中可以看到的煌寇,我們在這種情況下也成功地攔截了通信:
其它用于攔截 SSL 流量的方式
還有用于 SSL 流量攔截的其他方法,以及在設(shè)備上安裝證書的不同方法署拟。
其他方法之一是從 Android 設(shè)備的/system/etc/security
位置拉取cacerts.bks
文件舍杜。 一旦我們拉取了它,我們就可以使用密鑰工具以及 Bouncy Castle(位于 Java 安裝目錄中)來生成證書桅滋。 如果你在 Java 安裝目錄中找不到 Bouncy Castle慧耍,也可以從http://www.bouncycastle.org/latest_releases.html
下載并將其放置在已知路徑。 此后丐谋,我們需要掛載/system
分區(qū)作為讀/寫分區(qū)芍碧,以便將更新的cacerts.bks
證書推送回設(shè)備。 然而号俐,為了使這種更改長期有效泌豆,如果我們使用模擬器,我們將需要使用mks.yaffs2
來創(chuàng)建一個新的system.img
然后使用它吏饿。
此外践美,還有其他工具可用于攔截 Android 設(shè)備的流量,例如C harles Proxy 和 MITMProxy(http://mitmproxy.org
)找岖。 我強烈建議你在 Burp 代理的知識的基礎(chǔ)上嘗試他們陨倡,因為它們在可用性方面是相同的,但是更強大许布。 在使用 Charles Proxy 時兴革,我們可以直接從www.charlesproxy.com/charles.crt
下載證書。
在一些滲透測試中蜜唾,應(yīng)用程序可能正在和服務(wù)器通信并獲得響應(yīng)杂曲。 例如,假設(shè)用戶試圖訪問應(yīng)用的受限區(qū)域袁余,該應(yīng)用由用戶從服務(wù)器請求擎勘。 然而,由于用戶沒有被授權(quán)查看該區(qū)域颖榜,服務(wù)器使用403 Forbidden
進行響應(yīng)棚饵。 現(xiàn)在煤裙,我們作為滲透測試人員,可以攔截流量噪漾,并將響應(yīng)從403 Forbidden
改為200 OK
硼砰。 因此,用戶現(xiàn)在甚至能夠訪問應(yīng)用的未授權(quán)區(qū)域欣硼。修改類似響應(yīng)的示例可以在第8章“ARM 利用”中找到题翰,其中我們將討論可通過流量攔截利用的一些其他漏洞。
在應(yīng)用程序中诈胜,保護流量的安全方法是讓所有內(nèi)容通過 HTTPS 傳遞豹障,同時在應(yīng)用程序中包含一個證書。 這樣做使得當(dāng)應(yīng)用程序嘗試與服務(wù)器通信時焦匈,它將驗證服務(wù)器證書是否與應(yīng)用程序中存在的證書相對應(yīng)沼填。 但是,如果有人正在進行滲透測試并攔截流量括授,則由滲透測試程序添加的設(shè)備使用的新證書(如 portswigger 證書)與應(yīng)用程序中存在的證書不匹配。 在這些情況下岩饼,我們必須對應(yīng)用程序進行逆向工程荚虚,并分析應(yīng)用程序如何驗證證書。 我們甚至可能需要修改和重新編譯應(yīng)用程序籍茧。
4.4 使用封包捕獲來提取敏感文件
現(xiàn)在我們來看看如何使用 Wireshark 從流量數(shù)據(jù)中提取敏感文件版述。 為了做到這一點,我們可以捕獲數(shù)據(jù)包寞冯,并加載到 Wireshark 進行分析渴析。
從網(wǎng)絡(luò)捕獲中提取文件的基本概念是,它們含有指定文件類型的頭部(multipart/form-data
)吮龄。 以下是從網(wǎng)絡(luò)流量捕獲中提取任何類型文件的步驟:
-
在 Wireshark 中俭茧,只需訪問編輯并從包詳細信息中搜索字符串
multipart
。 -
一旦我們收到了向服務(wù)器發(fā)送 POST 請求的數(shù)據(jù)包(或者極少數(shù)情況下是 GET)漓帚,右鍵單擊該數(shù)據(jù)包母债,然后點擊
Follow TCP Stream
。 -
此后尝抖,根據(jù)文件起始值(如 PDF 的情況下為
%PDF
)毡们,從以下選項中選擇Raw
,然后使用擴展名.pdf
保存文件昧辽。 因此衙熔,我們擁有了最終的 PDF,通過 Android 設(shè)備上傳到網(wǎng)站搅荞,而且我們恰巧在我們的滲透中開啟了網(wǎng)絡(luò)捕獲红氯。 我們還可以使用其他工具框咙,如 Windows 上的 NetworkMiner(可從
http://www.netresec.com/?page=NetworkMiner
下載),它提供了一個精心構(gòu)建的 GUI 來與之交互脖隶,并顯式指定保存的網(wǎng)絡(luò)流量捕獲文件扁耐。
總結(jié)
在本章中,我們了解了在 Android 設(shè)備上執(zhí)行流量分析的各種方法产阱。 此外婉称,我們會繼續(xù)攔截來自應(yīng)用程序和瀏覽器的 HTTP 和 HTTPS 流量數(shù)據(jù)。 我們還看到如何從網(wǎng)絡(luò)捕獲信息中提取敏感文件构蹬。
在下一章中王暗,我們將介紹 Android 取證,并使用手動方式以及在不同工具的幫助下庄敛,從 Android 設(shè)備中提取一些敏感信息俗壹。