Java利用链URLDNS分析及利用

admin 2025年5月15日09:39:55评论2 views字数 2849阅读9分29秒阅读模式
Java利用链URLDNS分析及利用

声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢

文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。

Java利用链URLDNS分析及利用

字数 683,阅读大约需 4 分钟

前言

最简单的探测反序列化漏洞是否存在的利用链。
只要是Java就能用的利用链。

大纲:

Java利用链URLDNS分析及利用
8316674d3b57f4132ee2f218c13a9c75.png

URLDNS利用链一览

Gadget Chain:
HashMap.readObject()
HashMap.putVal()
HashMap.hash()
    URL.hashCode()
        java.net.URLStreamHandler.getHostAddress()
            java.net.InetAddress.getByName(host)

利用链分析

  • • 利用点是我们执行这个反序列化想要达成的目的。
  • • 漏洞链是如何通过一系列调用,达到利用点。
  • • 入口类是一个实现了Serializable接口的类,反序列化调用它的readObject()方法时,会触发漏洞链。

利用点

java.net.InetAddress.getByName(host)

  • • 它用于通过主机名获取 IP 地址。
  • • 此方法执行主机名到 IP 地址的解析(DNS 查询),返回一个 InetAddress 对象,该对象包含主机的 IP 地址。

最终,URLDNS就是靠这个方法,实现探测DNS。
那么是如何抵达这个利用点的呢?

漏洞链

URL.hashCode()
    java.net.URLStreamHandler.getHostAddress()
        java.net.InetAddress.getByName(host)

URL的hashCode()方法如下

Java利用链URLDNS分析及利用
b7bc4e78db777c4eb88d04d67c3a4654.png

当hashCode为-1的时候,执行

hashCode = handler.hashCode(this);

深入handler.hashCode(),其中调用了java.net.URLStreamHandler.getHostAddress()

Java利用链URLDNS分析及利用
5bc6597fa8b298ed1a6254f4f43eae7e.png

URL对象中的host不为null时,就会调用getByName(host),即上述的利用点。

Java利用链URLDNS分析及利用
b0800c38fd9556d62c8625c8d72d9c32.png

接下来寻找入口类,入口类需要满足一个特点。
在执行readObject()方法的时候,会调用到URL.hashCode()方法,或者会调用传入类的hashCode()方法。

入口类

HashMap正好满足这个条件。

HashMap.readObject()
HashMap.putVal()
HashMap.hash()
    URL.hashCode()
private void readObject(java.io.ObjectInputStream s)
    throws IOException, ClassNotFoundException {
        .....
        for (int i = 0; i < mappings; i++) {
                @SuppressWarnings("unchecked")
                    K key = (K) s.readObject();
                @SuppressWarnings("unchecked")
                    V value = (V) s.readObject();
                putVal(hash(key), key, value, false, false);
            }
        ......
    }

查看其中的hash(key)

static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

当key不为null时,调用key的hashCode()

那么,只需要key是URL对象即可。

HashMap的传入参数

public class HashMap<K,V>

HashMap 对键类型 K 有特殊要求:必须正确实现 hashCode() 和 equals() 方法
URL符合上述要求。

  • • java.net.URL#equals
  • • java.net.URL#hashCode

此时,利用链已经分析完成。

ysoserial中的URLDNS

ysoserial.payloads.URLDNS#getObject

Java利用链URLDNS分析及利用
e7d28bbc725a45c8b41cf3dd451926a0.png

可以看到,大体和分析的一致,但是多了一步反射将hashCode的值改为-1。

URL传入url的时候,hashCode不会变化,依然是-1.

但是经过java.util.HashMap.put() 经过该方法后,hashCode变了

Java利用链URLDNS分析及利用
f27fde8508057dd85f2774090786fb20.png

需要重新修改为-1。

Java利用链URLDNS分析及利用
ebe3b43c25410c39dc3881f29387059f.png

原因:
查看HashMap的put方法,会调用key.hashCode()

Java利用链URLDNS分析及利用
e7a2f984a3dccf3a20bea3f63653c6cd.png

而URL类中的hashCode在执行的时候,会覆盖URL对象的hashCode变量

Java利用链URLDNS分析及利用
5c3003a094681a2bd8f2c91b38139dcf.png

因此,需要将变量hashCode重新修改为-1。
通过反射后

Java利用链URLDNS分析及利用
f2daf721e1276a36043a3ebc358d83a7.png

URLDNS利用

发起DNS请求

Java-chains 选择

Java利用链URLDNS分析及利用
71750b0a9c5172eaa795e8adf2340661.png
Java利用链URLDNS分析及利用
0d406a1eb8b7cc7ad1e4802b3a3bd272.png

发送POST

Java利用链URLDNS分析及利用
8a2607df801c90615b81552e08279cf3.png

wireshark抓包,可以看到访问了

Java利用链URLDNS分析及利用
d10e1e935c51a8ff0438df9e5aefa34a.png

探测类

Java利用链URLDNS分析及利用
fb6291ab6dcb03e00b02244472a588dc.png

可选项

Java利用链URLDNS分析及利用
2a474fb39e3eb77d8cc22a5c978b1778.png

查看wireshark
start开始

Java利用链URLDNS分析及利用
da099b0f907459165a35c5910cde267c.png

end结束

Java利用链URLDNS分析及利用
22e4a127e1537f7e37d8577a0e89039b.png

参考资料

原文始发于微信公众号(进击的HACK):Java利用链URLDNS分析及利用

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

发表评论

匿名网友 填写信息