Apache Struts2の脆弱性(CVE-2017-5638)を自分なりに検証した

Apache Struts 2の環境を構築

その1. VM上に直接構築

VirtualBoxにUbuntu 16.10をインストールしてテストを試みた。以下のサイトを参考にJDKとTomcat環境を構築する。

Java開発環境を構築(JDK)

https://www.server-world.info/query?os=Ubuntu_16.04&p=jdk8

Tomcat 8 : JAVAアプリケーションサーバーの構築

https://www.server-world.info/query?os=Ubuntu_16.04&p=tomcat8

サービスの再起動用の突貫スクリプト

#!/bin/bash
# service stop
su - tomcat8 -c /usr/tomcat8/bin/shutdown.sh

sleep 3

# service start
su - tomcat8 -c /usr/tomcat8/bin/startup.sh

exit 0

作業の手順

struts2をhttps://archive.apache.org/dist/struts/2.3.31/からダウンロードして展開。

libディレクトリの中身をlib/の中にコピーする。

struts2-xxx.warをwebapps直下にコピーする。と、勝手に.warなしのディレクトリが作成される。

Webブラウザからhttp://127.0.0.1:8080/ にアクセスするとtomcatのindexページで200が帰ってくる。

今度はhttp://127.0.0.1:8080/struts2-showcase/にアクセスしてみる。帰ってくるのはなぜか404。

考えたこと

  • パーミッション (lib, webapps)
  • バージョン(tomcatとstrtus)
  • ディレクトリ、ファイルの構成と設定(WEB-INF/web.xmlあたり)

バージョンの相違(ver 2.1とve 2.0)によって問題が起きているっぽい。
おそらく、404が返されるということは初期段階で問題が起きていると思う。

原因として考えられるのはweb.xmlが濃厚。ログも読んでみたけど解決できず。

その2. VM上にdockerを使って構築

参考サイト

サイバーディフェンスのブログ(はてなブログなのが意外)をもとにDockerを構築した。異なる部分を適宜書いてみる。

1 – 脆弱性を持ったバージョンをダウンロード

影響を受けるバージョンは

  • Struts 2.3.5 – 2.3.31
  • Struts 2.5 – 2.5.10

であるので今回は2.3.31をダウンロードした。

$ wget https://archive.apache.org/dist/struts/2.3.31/struts-2.3.31-apps.zip

2 – 解凍(ハッシュ値を念のため確認しておくほうがよい)

3 – Dockerfileを作成する。

適当なアプリケーションを設置しておけばよい。今回はstruts2_2.3.15.1-showcase.warをダウンロードして使った。

labs/CVE-2017-5638 at master · nixawk/labs

$ git clone https://github.com/nixawk/labs.git

ダウンロードして解凍。

DockerをインストールしてDockerfileを書く。

FROM tomcat:7.0-jre8
ADD CVE-2017-5638/struts2_2.3.15.1-showcase.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]

4 – dockerをビルドして実行

$ sudo docker build -t struts/s2-045 .

$ sudo docker run -it --rm -p 8080:8080 struts/s2_045

終了後はCtrl + Cで終了させる

攻撃のテスト

実際にブラウザでhttp://127.0.0.1:8080/struts2_2.3.15.1-showcase/showcase.action
にアクセスしてアプリケーションが動作するか確認してみる。

テスト用のスクリプトを入手する。

CVE-2017-5638 – Apache Struts2 S2-045 · Issue #8064 · rapid7/metasploit-framework

最初にあるコードをエディタにコピペして任意の名前で保存(今回はorigin01.py)する。このスクリプトはPython 2.xで書かれているのでUbuntuでは必要に応じてpip install pycurlsudo apt-get install python-pycurlなどで必要なモジュールを導入する。

$ python origin01.py http://127.0.0.1:8080/struts2_2.3.15.1-showcase/showcase.action "ls -la"

python origin01.py http://127.0.0.1:8080/struts2_2.3.15.1-showcase/showcase.action "uname -a"
python origin01.py http://127.0.0.1:8080/struts2_2.3.15.1-showcase/showcase.action "whoami"
python origin01.py http://127.0.0.1:8080/struts2_2.3.15.1-showcase/showcase.action "cat /etc/passwd"

WiresharkでパケットキャプチャするとContent-Typeに攻撃文字列が含まれているのが確認できる。

Strutsは基幹システムで使われている反面、こうした脆弱性を抱えている。調べてみて改めてこの脆弱性が公表されるプロセスに問題があったのではないかと思った。攻撃コードが出ればゼロデイ状態に陥るわけで、危険性を考えればパッチなしで公開されるのは避けるべきだと思う。

都税納付サイトなども運用だけでカバーしていくのは厳しいんじゃないと思った。

参考資料

S2-045

更新:Apache Struts2 の脆弱性対策について(CVE-2017-5638)(S2-045)(S2-046):IPA 独立行政法人 情報処理推進機構

Struts2のリモートコード実行可能脆弱性(CVE-2017-5638)を分析した – R42日記

第32回 2017年3月~Struts 2脆弱性(S2-045~S2-046)を俯瞰してみた:インフラセキュリティの処方箋|gihyo.jp … 技術評論社

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です