Apache Struts2の脆弱性(CVE-2017-5638)を検証してみた

Blogでもやろうかなと思いつつ、やるやる詐欺になっていたし、たまたま朝早く目が覚めたので思い切って始めることにしました。このBlogでは私が趣味でチョコチョコやっている脆弱性やスキャナの検証などについて書いていこうと思います。

さて、話題となっている以下Struts2脆弱性を昨日検証しました。

S2-045 - Apache Struts 2 Documentation - Apache Software Foundation

上記に記載がありますが、リモートから任意のコマンドが実行可能な脆弱性であり、影響範囲は Struts 2.3.5 - 2.3.31及び2.5 - 2.5.10だそうです。
また、既に複数サイトにてPoCが公開されているようです。

Struts脆弱性については定期的にみつかっているので、以前に試した検証用の環境などをすでにお持ちの方も多いと思われますが、dockerを利用すれば簡単に作成できます。
以下の記事にてdockerを利用したStruts2の検証環境の構築方法を解説されていますので、非常に参考になると思います。

Dockerを使って、Apache Struts2の脆弱性S2-037のやられ環境を手軽に作る - DARK MATTER

今回私もdocker環境を用いて検証してみました。

https://dist.apache.org/repos/dist/release/struts/2.3.31/

上記サイトよりstruts-2.3.31-apps.zipをダウンロードして以下のようなDokcerfileを作成しました。

FROM tomcat:7.0-jre8
ADD struts-2.3.31/apps/struts2-blank.war /usr/local/tomcat/webapps/
CMD ["catalina.sh", "run"]

docker環境でビルドして実行すればサクッと検証環境は出来上がります。

f:id:tigerszk:20170308062627j:plain

後はPoCを検証するだけの簡単なお仕事です。

以下では分かりやすくBurp Suiteを利用して攻撃のHTTPリクエストを送信しています。
PoCの中身を見ればすぐにわかりますが、内容としてはContent-Typeヘッダに細工したOGNLを指定してブン投げてるだけの非常にシンプルなものです。
あまりにもあっさり刺さったので、検証していてビックリしました。

攻撃が成功し、リモートからOSコマンドが実行されて、/etc/passwdの内容がレスポンス中に出力されています。

f:id:tigerszk:20170308061125j:plain
ちなみに本脆弱性が修正されているStruts 2.3.32 と 2.5.10.1はもう既にリリースされているようです。
https://dist.apache.org/repos/dist/release/struts/

同じくdocker環境を利用して修正版についても検証してみましたが、最新版の環境ではPoCの攻撃が刺さらないことを確認しました。Dokcerfile書き換えるだけなのでこういう時にもお手軽ですね。

後は、Struts脆弱性で大体話題になるのは1系への影響ですが、今回の脆弱性はOGNLを利用しているので、OGNLをサポートしていないStruts 1系には影響がないんじゃないかと推測しています。

そして、案の定早速攻撃が観測されているようですので、早急にアップデートなどの対策をされた方がよいでしょう。

Strutsは相変わらず定期的にポンポン割と影響度の高い脆弱性が報告されるので、サービスで利用されている場合はWAFなどを導入したほうが費用対効果的にも良い気がしますね。運用されている方もその方が多少気が楽になるのではないかなと思いました。

またこの記事を書いている途中に気づいたのですが、すでにpiyokangoさんが本件の詳細をまとめてくださってますね。

Struts2の脆弱性 CVE-2017-5638 (S2-045)についてまとめてみた - piyolog