在测试过程中,遇到存在java反序列化漏洞的环境,一般使用ysoserial来生成反序列化payload,但ysoserial一般用来执行命令,或者利用JRMPListener开启指定端口,利用JRMPClient发送攻击数据。
JRMPListener需要使用ysoserial的JRMPClient来生成序列化的对象发送到服务端的JRMPListener进行反序列化操作,来达到执行命令看到回显的目的。
为了方便测试目标主机是否存在漏洞,我利用socket实现了命令执行并将结果返回给攻击主机。
下载ysoserial源码,查看payload生成过程,发现其实是在Gadgets.java中把我们输入的命令拼接到了Runtime.getRuntime().exec();里:
将cmd参数中的内容修改为以下代码:
以下代码功能为,监听本地6666端口,等待客户端连接,客户端连接后,接收客户端输入命令,执行后将结果返回
以fastjson反序列化漏洞为例:其中用到了lightless师傅fastjson反序列化payload生成代码:https://www.lightless.me/
将原本插入cmd字符串中的java代码替换成上图代码
利用lightless师傅的代码生成开启socket监听的fastjson反序列化payload:
利用我自己编写的存在shiro+fastjson反序列化漏洞的环境,验证是否监听端口成功:
发送fastjson反序列化payload后,服务端会没有响应回来,开启一个ServerSocket,会让线程进入阻塞状态来等待客户端的连接:
利用反序列化payload开启监听了6666端口
Payload成功执行后,就可以使用客户端进行连接:
以上只是演示一种思路,利用ysoserial,可以将任意java代码插入到静态代码块中执行