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を使って構築
参考サイト
- Apache Struts2の脆弱性(CVE-2017-5638)を検証してみた – とある診断員の備忘録
- Dockerを使って、Apache Struts2の脆弱性S2-037のやられ環境を手軽に作る – DARK MATTER
サイバーディフェンスのブログ(はてなブログなのが意外)をもとに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 pycurl
やsudo 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は基幹システムで使われている反面、こうした脆弱性を抱えている。調べてみて改めてこの脆弱性が公表されるプロセスに問題があったのではないかと思った。攻撃コードが出ればゼロデイ状態に陥るわけで、危険性を考えればパッチなしで公開されるのは避けるべきだと思う。
都税納付サイトなども運用だけでカバーしていくのは厳しいんじゃないと思った。
参考資料
更新: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 … 技術評論社
コメントを残す