freeBuf
主站

分類

漏洞 工具 極客 Web安全 系統安全 網絡安全 無線安全 設備/客戶端安全 數據安全 安全管理 企業安全 工控安全

特色

頭條 人物志 活動 視頻 觀點 招聘 報告 資訊 區塊鏈安全 標準與合規 容器安全 公開課

官方公眾號企業安全新浪微博

FreeBuf.COM網絡安全行業門戶,每日發布專業的安全資訊、技術剖析。

FreeBuf+小程序

FreeBuf+小程序

Docker從入門到放棄
2018-08-15 08:30:59

本文將以比較簡單的的方式讓大家理解docker,以平時常用到的測試環境為主,從用開始,慢慢理解docker。

目錄

0x00 用docker進行漏洞測試

0x01 docker運行busybox

0x02 Docker 搭建運行apache-php環境

0x03 用Dockerfile自動化構建可ssh登陸的鏡像

0x04 Docker搭建一個wordpress博客

0x05 Docker容器互聯

0x06 Docker安全

0x00 用docker進行漏洞測試

vulhub是一個開源的漏洞環境靶場(膜拜p牛一波)

接下來我們用docker來搭建一個jboss反序列漏洞的環境吧。

準備:Docker Docke-compose

以上環境安裝方法:Docker安裝Docker-compose安裝

什么?一開始就學這么難的?其實docker邊用邊學是比較合適的,用到什么學什么,沒有必要從一大堆原理開始學。既然要學docker,那就先裝一個啦,邊學邊用。

那接下來就開始吧,其實也就一條命令。

https://raw.githubusercontent.com/vulhub/vulhub/master/jboss/CVE-2017-12149/docker-compose.yml

復制如上鏈接,然后保存到文件docker-compose.yml,結果如下:Docker從入門到放棄接下來,我們只需要

docker-compose up -d

Docker從入門到放棄好了我們的靶場搭建完畢,訪問localhost:8080

接下來就可以進行漏洞復現了,步驟見:

https://github.com/vulhub/vulhub/blob/master/jboss/CVE-2017-12149/README.md

0x01 docker運行busybox

接下來我們邊搭建環境邊學習簡單的docker命令

Busybox是一個集成了三百多個最常用Linux命令和工具的軟件,簡單的cat ls echo等命令都集成在內,當然也有很多復雜的命令,我們就先來試試使用docker安裝一個busybox吧


docker pull?busybox


Docker從入門到放棄

好了,我們?從docker官方庫中得到了一個鏡像

可以通過?docker?images?查看到id以及其他信息,這里可以看到busybox鏡像大小只有1mb左右

那接下來我們用這個id為8c811b4aec35的busybox鏡像運行一下命令吧

先用來看下ifconfig命令


docker run 8c811b4aec35 ifconfig

Docker從入門到放棄

可以看到,docker使用busybox鏡像創建了一個busybox容器,并且運行了我們的測試命令,而且docker運行的容器有自己的ip地址,這說明容器是一個相對獨立的環境。

0x02 Docker 搭建運行apache-php環境

首先搜索下有哪些現成的apache-php環境


docker search apache-php

這里我們選擇別人已經構建好的start數目較多的鏡像:eboraas/apache-php



dockerpull?eboraas/apache-php


1.png

部署完成還是用docker?images查看我們pull到本地的鏡像


docker?images

2.png

接下來我們進入到id為1e9f5e13fb38的容器

和之前的命令有些區別,因為我們運行的是web服務,所以我們需要把容器內部端口映射出來這樣我們才能用外部的瀏覽器訪問它。


docker run -itd -p 80:80 1e9f5e13fb38


好了,一個apache+php的容器就可以搭建成功,我們可以在上面搭建其他服務了。

我們可以在宿主機curl測試一下我們是否搭建成功(將容器放入后臺可以使用ctrl?p+q)

Docker從入門到放棄

Docker從入門到放棄那我們php環境怎么樣了呢?那就寫一個phpinfo頁面試試吧

Docker從入門到放棄php頁面創建好了,接下來我們需要將他放在docker容器的web根目錄里,這里需要用到docker?cp命令

Docker從入門到放棄使用dockercp命令復制到容器的web根目錄/var/www/html/,這里指定容器我直接簡寫了開頭的標識 4c1

Docker從入門到放棄

可以看到,環境已經搭建好了。

我們已經在容器內做了改動了,此時,如果我們停止容器,我們的改動將會消失,如果我們想保存容器,那么就需要將我們的容器提交成鏡像。

首先用docker?commit提交成新鏡像

docker commit -a “hayasec” -m "test.php" 4c1 haya/test

Docker從入門到放棄此時可以查看一下鏡像id然后使用docker?save將鏡像導出

Docker從入門到放棄Docker從入門到放棄接下來我們可以將test.tar放到其他機器上,然后用docker?load命令就可以進行再次部署了。Docker從入門到放棄這里已經載入鏡像了,我們可以用dockertag命令對docker鏡像進行命名

Docker從入門到放棄這時候有個小問題,之前我們運行了一個apache-php容器,現在我們已經不需要它了,所以我們用docker?ps查看鏡像id然后用docker?stop?鏡像id??來停止它。

0x03 用Dockerfile自動化構建可ssh登陸的鏡像

Dockerfile是由一系列命令和參數構成的腳本,這些命令應用于基礎鏡像并最終創建一個新的鏡像。

接下來就利用之前我們pull下來的apache-php鏡像來制作一個可以ssh登陸的鏡像吧

這里需要創建三個文件 Dockerfile run.sh sources163.txt,處于同級目錄。

dockerfile如下內容如下:

FROM eboraas/apache-php #設置基礎鏡像鏡像
MAINTAINER haya #指定作者
COPY sources163.txt /etc/apt/sources.list #更換國內源
RUN apt-get -y update
RUN apt-get install -y openssh-server --force-yes #安裝ssh服務
RUN mkdir -p /root/.ssh #創建ssh目錄
ADD run.sh /run.sh #將run.sh添加到容器內
RUN chmod 755 /run.sh
EXPOSE 22 #為暴漏容器運行時的監聽端口給外部
EXPOSE 80
EXPOSE 443
CMD ["/run.sh"] #容器啟動時要運行的命令

run.sh文件內容如下:

#!/bin/bash
service ssh start

sources163.txt內容如下:

deb http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.163.com/ubuntu/ trusty-backports main restricted universe multiverse

然后利用這個dockerfile構建鏡像

Docker從入門到放棄

鏡像構建完畢后,可以看到:

Docker從入門到放棄然后運行鏡像

docker run -itd -p 22222:22 57b46801d43c

這時候看到,內部容器的ssh服務的22端口已經被映射到本機22222端口了

Docker從入門到放棄接下來通過ssh服務連接容器

Docker從入門到放棄這時候有個問題,我們并不知道容器的密碼是多少?怎么辦呢?




而且這里需要注意一點是ssh的默認配置是不允許root登錄的,我們需要添加一個用戶或者修改sshd_config,這里進入容器的方法就有很多了




第一種:進入容器添加用戶




第二種:最開始build鏡像的時候將自己的公鑰添加進容器內的~/.ssh/authorized_keys,然后實現免密碼ssh登錄




第三:通過docker?exec -it 98defd0c6e6b /bin/bash進入容器添加用戶修改密碼,在通過ssh登錄




第四:修改ssh配置文件




這里說一下第一種,我們先用docker exec進入容器,然后添加一個可登錄的用戶




Docker從入門到放棄




添加用戶、修改完密碼之后,我們再次登錄




Docker從入門到放棄




到這里,我們就完成了利用dockerfile對原鏡像添加功能。




隨后我們可以通過docker?commit將目前我們修改過的容器再次提交成一個新的鏡像。




Docker從入門到放棄Docker從入門到放棄




現在一個apache-php-ssh的鏡像我們就制作完畢了Docker從入門到放棄

0x04 Docker搭建一個wordpress博客


最開始我們盡量使用最簡單方法部署,這里我們用到的是docker-compose。


Docker Compose是Docker?官方編排(Orchestration)項目之一,負責快速的部署分布式應用




這里用到的github中的一個開源項目,作者已經編寫好用于worfpress的docker-compose文件,接下來我們只需要直接部署就行。

項目地址:https://github.com/nezhar/wordpress-docker-compose




我們將項目clone下來




Docker從入門到放棄docker-compose.yml是容器運行的關鍵,具體編寫方法可以參考:




https://docs.docker.com/compose/




我們clone下來的是別人寫好的項目,所以可以直接用了




Docker從入門到放棄然后docker-compose up -d啟動




Docker從入門到放棄dockerps可以看到容器運行情況,這里啟動了wordpress、mysql兩個容器,分別映射到了127.0.0.1的80、3306端口Docker從入門到放棄接下來訪問127.0.0.1即可Docker從入門到放棄到這里,wordpress已經搭建完畢,我們結束它吧Docker從入門到放棄

0x05 Docker容器互聯

接下來講解docker容器通信。

網上大量文章采用docker?link進行連接,根據目前官方文檔--link是一個被遺棄,最終可能會被刪除的命令。

Docker從入門到放棄所以這里我們使用docker?networks進行容器連接,我們將啟動兩個容器,一個apache-php?一個mysql,然后用docker?network對容器進行連通。

首先創建一個名為test-net的網絡,默認連接方式bridge.

Docker從入門到放棄啟動一個mysql容器,映射3306端口,連接到test-net網絡,設置別名為db,設置mysql密碼為password

Docker從入門到放棄啟動一個apache-php容器,映射80端口,連接到test-net網絡,設置別名為webDocker從入門到放棄

tips:遇到容器已經存在的報錯

docker停止所有容器 docker stop $(docker ps -q)

docker刪除所有容器 docker rm $(docker ps -aq)

接下來我們進入到其中一個容器,初始容器是沒有ping命令的,所以我們現在安裝ping

更新源

Docker從入門到放棄然后安裝ping

apt-get install iputils-ping

接下里我們在apache-php容器ping mysql容器,可以看到mysql容器與apache容器實現互聯。

Docker從入門到放棄

0x06 Docker安全

docker安全主要體現在以下方面

docker容器的安全性

鏡像的安全性

docker daemon的安全性

-------摘自 Docker進階與實戰

容器安全性的根源在于,容器和host共用內核,因此受攻擊面特別大。

這里就拋磚引玉地講一下docker虛擬機逃逸。

Docker與宿主機是共享內核的,一旦內核出現漏洞,那么docker容器的安全問題將危機到宿主機。

這里以大名鼎鼎的Dirty COW臟牛為例,演示docker逃逸。

在做這個實驗之前,我們先了解下臟牛漏洞。

臟牛是一個linux本地提權漏洞,臟牛漏洞(CVE-2016_5195)是公開后影響范圍最廣和最深的漏洞之一,這十年來的每一個Linux版本,包括Android、桌面版和服務器版都受到其影響。

具體影響范圍見:https://m.aliyun.com/yunqi/articles/63023

我們現在一個下載一個ubuntu14.04鏡像來對漏洞進行簡單地復現

為了試驗方便,我選擇直接用vmware搭建虛擬機。

Docker利用臟牛逃逸的關鍵在于宿主機存在臟牛漏洞

Docker從入門到放棄這樣的內核版本是存在臟牛的,我們可以在主機上創建一個低權限用戶(可讀權限即可),然后提權,由于可讀即可寫,所以利用方式很多,具體見:

POCS:https://github.com/dirtycow/dirtycow.github.io/wiki/PoCs

我用到的POC:https://github.com/gbonacini/CVE-2016-5195

  • 通過替換/?etc?/?passwd為用戶提供root權限

git?clone?? make編譯運行。

Docker從入門到放棄這樣就可以直接提權了,這節主要關注docker安全,所以這里不再細講。

接下來我們給虛擬機安裝docker

apt-get install docker.io

然后pull一個帶了POC的容器(這樣做主要是為了方便,當然也可以用其他的)

POC地址:https://github.com/scumjr/dirtycow-vdso

Docker從入門到放棄

Docker從入門到放棄然后運行鏡像進入容器make編譯POC

Docker從入門到放棄運行

Docker從入門到放棄

注意,這里并不是每次都能成功的,失敗之后vdso_patch數組也會被填充,payload的內存地址數據不為0,無法再次復現。失敗輸出:

[-] failed to win race condition...

[-] failed to restore?vDSO

這時候無法再次做實驗了,如果用虛擬機的話做之前最好做一個快照。

Docker從入門到放棄這里可以看到,已經完全獲得宿主機的權限了。

實際生產環境中,還經常遇到一個問題

docker通過環境變量的方式傳遞MySQL?存儲引擎的密碼,所以造成mysql密碼是明文

Docker從入門到放棄

比較流行的解決辦法是

第一種

1.創建兩個 MySQL 容器 MySQL1 與 MySQL2,MySQL 的 root 密碼分別為 daocloud 與 docker;

2.待 MySQL1 啟動完畢,使用docker stop命令停止 MySQL1 容器,并將 MySQL1 容器的 volume1 全部拷貝出來,最終使用docker rm命令刪除 MySQL1 容器;

3.待 MySQL2 啟動完畢,使用docker stop命令停止 MySQL2 容器,并將 MySQL2 容器 volume2 內的文件全部刪除,接著將 volume1 的內容拷貝至 volume2 下,最終啟動 MySQL2。

Docker從入門到放棄詳見:https://www.csdn.net/article/2015-12-21/2826519

第二種

還可以使用docker swarm 提供的 secret 機制,它允許將敏感信息加密后保存到 secret 中,用戶可以指定哪些容器可以使用此 secret

詳見:如何使用swarm中的secret

最后的建議:Docker近幾年發展迅速,官方為Docker的發展付出了很大的努力。官方了大量的官方文檔可以幫助我們更好地理解和使用Docker,日常閱讀官方文檔、更新日志是很有必要的。

Docker官方文檔

Docker命令文檔

本文作者:, 屬于FreeBuf原創獎勵計劃,未經許可禁止轉載

# Docker
被以下專輯收錄,發現更多精彩內容
+ 收入我的專輯
評論 按熱度排序

登錄/注冊后在FreeBuf發布內容哦

相關推薦
  • 0 文章數
  • 0 評論數
  • 0 關注者
文章目錄
登錄 / 注冊后在FreeBuf發布內容哦
收入專輯
四月天小说网