前回は公開されてるイメージから脆弱性の検証を実施してみたけど今回はイメージを作成するところからやってみる。

今回はTomcatのPUTの脆弱性(CVE-2017-12615~12617)を検証してみる。

まずはあらかじめ検証対象のTomcatをローカルに保存し、web.xmlにreadonly falseの設定を追加しておく。

なお今回はTomcat 7.0.79で検証してみた。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<servlet>
    <servlet-name>default</servlet-name>
    <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
    <init-param>
        <param-name>debug</param-name>
        <param-value>0</param-value>
    </init-param>
    <init-param>
        <param-name>listings</param-name>
        <param-value>false</param-value>
    </init-param>
    <init-param>
        <param-name>readonly</param-name>
        <param-value>false</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet></pre>

続いて以下のDockerfileを書いておく。

1
2
3
4
5
FROM centos:7
MAINTAINER uranari <uranaricb@gmail.com>
RUN mkdir /usr/local/tomcat
COPY tomcat /usr/local/tomcat
RUN yum -y install --nogpgcheck java-1.8.0-openjdk-devel.x86_64

あとはこれをbuildして脆弱なイメージを作成する。

1
docker build -t uranari/tomcat_put_vuln .

これをリポジトリにpush

1
docker push uranari/tomcat_put_vuln

実際に検証を実施してみる。

pushしたイメージを持ってきてコンテナを作成し、tomcatを起動させ検証する。

前回と同じ「192.168.30.99」のCentOS上でコンテナを作成して検証しています。

1
docker run -it -d -p 8080:8080 --name tomcat_put_vuln uranari/tomcat_put_vuln /bin/bash

コンテナを作成したらコンテナの中に入って/usr/local/tomcat/bin/startup.shを叩いてtomcatを起動させてください。

これでtomcatが起動します。

では実際に脆弱性の検証を実施してみましょう。

まずブラウザでアクセスできることを確認します。

今回はGETのqueryにcmdを指定して渡されたパラメーターのコマンドを実行するshell.jspというwebshellを設置し実際にコマンドが実行されることを確認したいと思います。

まずはPUTでwebshellを設置する。

続いてこのwebshellにcmdというqueryで実行させるコマンドをパラメーターとして渡して実行されることを確認します。

実行結果です。

このDockerイメージはDockerHubの自分のリポジトリで公開しているので誰でも試すことができます。

今後もこんな感じで脆弱性の検証用のイメージを作成してDockerHubで公開していきます。

脆弱性の検証で一番大変なのって検証用の環境を作成することなので誰かが作って公開すれば他の人はそれを流用すればいいですね。

おまけ

・ぶっちゃけるとDockerHubから直接脆弱なバージョンのTomcatのイメージ落としてきてweb.xmlを書き換えるだけのほうが早い。

・DockerfileのENTRYPOINTで/usr/local/tomcat/bin/startup.sh を指定してコンテナ作成時にTomcatも立ち上がるようにしたかったが作成したコンテナがすぐに落ちてしまった。

原因が分かってないので知ってる人は教えて欲しい。