IT技術互動交流平臺

Android滲透測試學習手冊第八章ARM利用

來源:IT165收集  發布日期:2016-12-09 21:39:21

第八章 ARM 利用

作者:Aditya Gupta

譯者:飛龍

協議:CC BY-NC-SA 4.0

在本章中,我們將了解 ARM 處理器的基礎知識,和 ARM 世界中存在的不同類型的漏洞。 我們甚至會繼續利用這些漏洞,以便對整個場景有個清晰地了解。 此外,我們將研究不同的 Android root 攻擊和它們在漏洞利用中的基本漏洞。 考慮到目前大多數 Android 智能手機都使用基于 ARM 的處理器,對于滲透測試人員來說,了解 ARM 及其附帶的安全風險至關重要。

8.1 ARM 架構導論

ARM 是基于精簡指令集(RISC)的架構,這意味著其指令比基于復雜指令集(CISC)的機器少得多。 ARM 處理器幾乎遍布我們周圍的所有設備,如智能手機,電視,電子書閱讀器和更多的嵌入式設備。

ARM 總共有 16 個可見的通用寄存器,為 R0-R15。 在這 16 個中,有 5 個用于特殊目的。 以下是這五個寄存器及其名稱:

R11: 幀指針 (FP) R12: 過程內寄存器 (IP) R13: 棧指針 (SP) R14: 鏈接寄存器 (LR) R15: 程序計數器 (PC)

下面的圖展示了 ARM 架構:

在五個里面,我們會特別專注于這三個,它們是:

堆棧指針(SP):這是保存指向堆棧頂部的指針的寄存器 鏈接寄存器(LR):當程序進入子過程時存儲返回地址 程序計數器(PC):存儲要執行的下一條指令

注意

這里要注意的一點是,PC 將總是指向要執行的指令,而不是簡單地指向下一條指令。 這是由于被稱為流水線的概念,指令按照以下順序操作:提取,解碼和執行。 為了控制程序流,我們需要控制 PC 或 LR 中的值(后者最終引導我們控制 PC)。

執行模式

ARM 有兩種不同的執行模式:

ARM 模式:在 ARM 模式下,所有指令的大小為 32 位 Thumb 模式:在 Thumb 模式下,指令大部分為 16 位

執行模式由 CPSR 寄存器中的狀態決定。 還存在第三模式,即 Thumb-2 模式,它僅僅是 ARM 模式和 Thumb 模式的混合。 我們在本章不會深入了解 ARM 和 Thumb 模式之間的區別,因為它超出了本書的范圍。

8.2 建立環境

在開始利用 ARM 平臺的漏洞之前,建議你建立環境。 即使 Android SDK 中的模擬器可以通過模擬 ARM 平臺來運行,大多數智能手機也是基于 ARM 的,我們將通過配置 QEMU(它是一個開源硬件虛擬機和模擬器)開始 ARM 漏洞利用。

為了在 Android 模擬器/設備上執行以下所有步驟,我們需要下載 Android NDK 并使用 Android NDK 中提供的工具為 Android 平臺編譯我們的二進制文件。 但是,如果你使用 Mac 環境,安裝 QEMU 相對容易,可以通過鍵入brew install qemu來完成。 現在讓我們在 Ubuntu 系統上配置 QEMU。 遵循以下步驟:

第一步是通過安裝依賴來下載并安裝 QEMU,如圖所示:

sudo apt-get build-dep qemu
wget http://wiki.qemu-project.org/download/qemu-
1.7.0.tar.bz2

接下來,我們只需要配置QEMU,指定目標為 ARM,最后充分利用它。 因此,我們將簡單地解壓縮歸檔文件,訪問該目錄并執行以下命令:

./configure --target-list=arm-softmmu
make && make install

一旦QEMU成功安裝,我們可以下載 ARM 平臺的 Debian 鏡像來進行利用練習。 所需下載列表位于http://people.debian.org/~aurel32/qemu/armel/。

這里我們將下載格式為qcow2的磁盤映像,它是基于 QEMU 的操作系統映像格式,也就是我們的操作系統為debian_squeeze_armel_standard.qcow2。 內核文件應該是vmlinuz-2.6.32-5-versatile,RAM 磁盤文件應該是initrd.img-2.6.32-versatile。 一旦我們下載了所有必要的文件,我們可以通過執行以下命令來啟動 QEMU 實例:

qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-
versatile -initrd initrd.img-2.6.32-5-versatile -hda 
debian_squeeze_armel_standard.qcow2 -append 
'root=/dev/sda1' --redir tcp:2222::22 

redir命令只是在登錄遠程系統時使用端口 2222 啟用 ssh。
一旦配置完成,我們可以使用以下命令登錄到 Debian 的 QEMU 實例:

ssh root@[ip address of Qemu] -p 2222

登錄時會要求輸入用戶名和密碼,默認憑據是root:root。一旦我們成功登錄,我們將看到類似如下所示的屏幕截圖:

8.3 基于棧的簡單緩沖區溢出

簡單來說,緩沖區是存儲任何類型的數據的地方。 當緩沖區中的數據超過緩沖區本身的大小時,會發生溢出。 然后攻擊者可以執行溢出攻擊,來獲得對程序的控制和執行惡意載荷。

讓我們使用一個簡單程序的例子,看看我們如何利用它。 在下面的截圖中,我們有一個簡單的程序,有三個函數:weak,ShouldNotBeCalled和main。 以下是我們試圖利用的程序:

在整個程序運行期間,從不調用ShouldNotBeCalled函數。

漏洞函數簡單地綒喎?http://www.bjxfcs.com/design/wrss/" target="_blank" class="keylink">rss7K/bi01sa1vcP7zqpidWZmtcS7urPlx/ijrLTz0KHOqiAxMCDX1r3aoaM8L3A+CjxwPtK7tanO0sPHzeqzybPM0PKx4NC0o6zO0sPHv8nS1Mq508NnY2Ox4NLry/yjrMjnz8LSu7j2w/zB7sv5yr6hoyC0y83io6zO0sPHvavU2tXiwO+9+9PDtdjWt7/VvOSyvL7Wy+a7+ruvo6hBU0xSo6mjrNa7ysfOqsHLyrmzob6wydTOorzytaXSu9CpoaMgQVNMUiDKx9PJIE9TIMq1z9a1xLCyyKu8vMr1o6zAtLfA1rm5pbv31d/T0NCntdjIt7ao1Ni6ybXEtdjWt7Ki1rTQ0Lbx0uLWuMHuoaMg1NogQW5kcm9pZCDW0KOsQVNMUiC1xMq1z9bKvNPaIDQuMKGjIMTjv8nS1LfDzspodHRwOi8vd3d3LmR1b3NlY3VyaXR5LmNvbS9ibG9nL2V4cGxvaXQtbWl0aWdhdGlvbnMtaW4tYW5kcm9pZC1qZWxseS1iZWFuLTQtMcHLveLL+dPQIEFuZHJvaWQgsLLIq8q1yqmhozwvcD4KPHByZSBjbGFzcz0="brush:java;"> echo 0 > /proc/sys/kernel/randomize_va_space gcc -g buffer_overflow.c -o buffer_overflow

接下來,我們可以簡單將二進制文件加載到 GNU 調試器,簡稱 GDB,然后開始調試它,如下面的命令所示:

gdb -q buffer_overflow

現在我們可以使用disass命令來反匯編特定的函數,這里是ShouldNotBeCalled,如下面的截圖所示:

正如我們在上面的截圖中可以看到的,ShouldNotBeCalled函數從內存地址0x00008408開始。 如果我們查看main函數的反匯編,我們看到漏洞函數在0x000084a4被調用并在0x000084a8返回。 因此,由于程序進入漏洞函數并使用易受攻擊的strcpy,函數不檢查要復制的字符串的大小,并且如果我們能夠在程序進入漏洞函數時控制子過程的 LR ,我們就能夠控制整個程序流程。

這里的目標是估計何時 LR 被覆蓋,然后放入ShouldNotBeCalled的地址,以便調用ShouldNotBeCalled函數。 讓我們開始使用一個長參數運行程序,如下面的命令所示,看看會發生什么。 在此之前,我們還需要在漏洞函數和strcpy調用的地址設置斷點。

b vulnerable 
b *<address of the strcpy call>

一旦我們設置了斷點,我們可以使用參數AAAABBBBCCCC來運行我們的程序,看看它是如何被覆蓋的。 我們注意到它在漏洞函數的調用處命中了第一個斷點,之后在strcpy調用處命中了下一個斷點。 一旦它到達斷點,我們可以使用x命令分析堆棧,并指定來自 SP 的地址,如下面的截圖所示:

我們可以看到,堆棧已經被我們輸入的緩沖區覆蓋(ASCII:41 代表 A,42 代表 B,等等)。 從上面的截圖中,我們看到,我們仍然需要四個更多的字節來覆蓋返回地址,在這種情況下是0x000084a8。

所以,最后的字符串是 16 字節的垃圾,然后是ShouldNotBeCalled的地址,如下面的命令所示:

r `printf 'AAAABBBBCCCCDDDD8?'` 

我們可以在下面的截圖中看到,我們已經將IShouldNeverBeCalled的起始地址添加到了參數中:

請注意,由于這里是小端結構,字節以相反的順序寫入。 一旦我們運行它,我們可以看到程序ShouldNotBeCalled函數被調用,如下面的截圖所示:

8.4 返回導向編程

在大多數情況下,我們不需要調用程序本身中存在的另一個函數。 相反,我們需要在我們的攻擊向量中放置 shellcode,這將執行我們在 shellcode 中指定的任何惡意操作。 但是,在大多數基于 ARM 平臺的設備中,內存中的區域是不可執行的,這會阻止我們放置并執行 shellcode。

因此,攻擊者必須依賴于所謂的返回導向編程(ROP),它是來自內存不同部分的指令片段的簡單鏈接,最終它會執行我們的 shellcode。 這些片段也稱為 ROP gadget。 為了鏈接 ROP gadget,我們需要找到存在跳轉指令的 gadget,這將允許我們跳到另一個位置。

例如,如果我們在執行程序時反匯編seed48(),我們將注意到以下輸出:

如果我們查看反匯編,我們將注意到它包含一個 ADD 指令,后面跟著一個 POP 和 BX 指令,這是一個完美的 ROP gadget。 這里,攻擊者可能會想到,為了將其用作 ROP gadget,首先跳到控制 r4 的 POP 指令,然后將比/bin/sh的地址小 6 的值放入 r4 中,將 ADD 指令的值放入 LR 中。 因此,當我們跳回到 ADD 也就是R0 = R4 + 6時,我們就擁有了/bin/sh的地址,然后我們可以為 R4 指定任何垃圾地址并且為 LR 指定system()的地址。

這意味著我們將最終跳轉到使用參數/bin/sh的system(),這將執行 shell。 以同樣的方式,我們可以創建任何 ROP gadget,并使其執行我們所需要的任何東西。 由于 ROP 是開發中最復雜的主題之一,因此強烈建議你自己嘗試,分析反匯編代碼并構建漏洞。

8.5 Android root 利用

從早期版本的 Android 開始,Android root 漏洞開始出現于每個后續版本和不同的 Android 設備制造商的版本中。 Android root 簡單來說是獲得對設備的訪問特權,默認情況下設備制造商不會將其授予用戶。 這些 root 攻擊利用了 Android 系統中存在的各種漏洞。 以下是其中一些的列表,帶有漏洞利用所基于的思想:

Exploid:基于 udev 中的 CVE-2009-1185 漏洞,它是 Android 負責 USB 連接的組件,它驗證 Netlink 消息(一種負責將 Linux 內核與用戶連接的消息)是否源自原始來源或是由攻擊者偽造。因此,攻擊者可以簡單地從用戶空間本身發送 udev 消息并提升權限。 Gingerbreak:這是另一個漏洞,基于 vold 中存在的漏洞,類似于 Exploid 中的漏洞。 RageAgainstTheCage:此漏洞利用基于RLIMIT_NPROC,它指定在調用setuid函數時可為用戶創建的進程的最大數目。 adb 守護程序以 root 身份啟動;然后它使用setuid()調用來解除特權。但是,如果根據RLIMIT_NPROC達到了最大進程數,程序將無法調用setuid()來解除特權,adb 將繼續以 root 身份運行。 Zimperlich:使用與 RageAgainstTheCage 的相同概念,但它依賴于 zygote 進程解除 root 權限。 KillingInTheNameOf:利用了一個稱為ashmem(共享內存管理器)接口的漏洞,該漏洞用于更改ro.secure的值,該值確定設備的 root 狀態。

這些是一些最知名的 Android 漏洞利用,用于 root Android 設備。

總結

在本章中,我們了解了 Android 利用和 ARM 利用的不同方式。 希望本章對于任何想要更深入地利用 ARM 的人來說,都是一個好的開始。

在下一章中,我們將了解如何編寫 Android 滲透測試報告。

Tag標簽: 手冊   第八章  
  • 專題推薦

About IT165 - 廣告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站地圖 - 網友投稿 - 聯系方式
本站內容來自于互聯網,僅供用于網絡技術學習,學習中請遵循相關法律法規
香港最快开奖现场直播结果