CVE Link: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-41383

1. Getting the Firmware

Firmware for this router can be found at https://www.netgear.com/support/product/R6020.aspx#download

The version in this blog is 1.0.0.48


2. Extracting the Root Filesystem

Use binwalk to extract firmware files.

j-o-e-l-s@machine:~/Downloads$ binwalk -e R6020_V1.0.0.48.zip 
j-o-e-l-s@machine:~/Downloads$ cd _R6020_V1.0.0.48.zip.extracted
j-o-e-l-s@machine:~/Downloads/_R6020_V1.0.0.48.zip.extracted$ binwalk -e R6020_V1.0.0.48.img 
j-o-e-l-s@machine:~/Downloads/_R6020_V1.0.0.48.zip.extracted$ cd _R6020_V1.0.0.48.img.extracted/
j-o-e-l-s@machine:~/Downloads/_R6020_V1.0.0.48.zip.extracted/_R6020_V1.0.0.48.img.extracted$ binwalk -e R6020.bin 

We can now look at the root filesystem files.

j-o-e-l-s@machine:~/Downloads/_R6020_V1.0.0.48.zip.extracted/_R6020_V1.0.0.48.img.extracted/_R6020.bin.extracted/squashfs-root$ ls
bin   dev  etc_ro  init  media  proc  sys  usr  www
data  etc  home    lib   mnt    sbin  tmp  var  www.eng

3. Identifying Files of Interest

This router uses .cgi files to handle web requests and input sanitization so any of these file are available for analysis.

j-o-e-l-s@machine:~/squashfs-root$ find -name "*.cgi*"
./usr/etc/htpwd_recovery.cgi
./usr/etc/restore_config.cgi
./usr/etc/upgrade_stringTbl.cgi
./usr/etc/upgrade_flash.cgi
./usr/etc/setup.cgi
./usr/sbin/htpwd_recovery.cgi
./usr/sbin/restore_config.cgi
./usr/sbin/upgrade_flash.cgi
./usr/sbin/setupwizard.cgi
./usr/sbin/setup.cgi

Setup.cgi will be the main file of interest.


4. Finding a Vulnerability in the Web App

There are several places for the user to enter input.

image

This one in particular is able to be exploited to inject shell commands.

Let’s take a look at what happens when we try to set the NTP server.

Using BurpSuite we can see what happens when the Apply button is clicked.

image

A POST request is made to Setup.cgi with variables in the body.

POST Body Variable Description
ntp_server= Value that can be controlled by the user
todo=save todo will control the function that setup.cgi executes
this_file=FW_ntp.htm FW_ntp.htm is relevant within the save function of setup.cgi

5. Analyzing setup.cgi

In this POST request the todo=save corresponds to the save function in setup.cgi.

image

Within this function ntp_server will be saved to non-volatile RAM.

image

And there is a check for FW_ntp.htm that will perform a system call to /usr/sbin/rc ntp restart

image image

Since there is a call to /usr/sbin/rc ntp restart we need to look at /usr/sbin/rc


6. Analyzing rc

Within the main function of /usr/sbin/rc there is a write of /usr/sbin/rc_app/rc_ntp restart to /var/cmd_a.

image

This will result in the execution of /usr/sbin/rc_app/rc_ntp restart

image

rc_ntp is a symbolic link to rc_apps so that will be the next file to analyze.


7. Analyzing rc_apps

Within the main function of rc_apps argv[0] is parsed for the substring after the last /.

In this case the rc_ntp is parsed from /usr/sbin/rc_app/rc_ntp. Then this value is checked against a list of key value pairs in the form of char* function_name: void* function_ptr

image

rc_ntp is found at location 0x4bf098 in the list and the strcmp condition is satisfied.

image

Then in this line (*((index << 3) + 0x4bf034))(argc, argv) rc_ntp is called.

Now we need to analyze rc_ntp within rc_apps


8. Analyzing rc_ntp in rc_apps

Within rc_ntp argv[1] is checked against start stop restart

Since argv[1] is equal to restart. stop_ntp and start_ntp are called.

image

Within ntp_start the value ntp_server is retrieved from non-volatile RAM. (We control this value with the POST request).

This value is used in this system call /usr/sbin/netgear_ntp -h %s& as the %s format string.

image

This is where we can perform the command injection.


9. Injecting Shell Code

Now using BurpSuite we can inject our own shell code.

In this case I’ll inject & echo hello .

image

This is the serial output from the router when the command is executed.

image

So we can now execute remote shell commands.


<
Blog Archive
Archive of all previous blog posts
>
Blog Archive
Archive of all previous blog posts