声明:文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途给予盈利等目的,否则后果自行承担!如有侵权烦请告知,我会立即删除并致歉。谢谢!
文章有疑问的,可以公众号发消息问我,或者留言。我每天都会看的。
字数 683,阅读大约需 4 分钟
前言
最简单的探测反序列化漏洞是否存在的利用链。
只要是Java就能用的利用链。
大纲:
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()方法如下
当hashCode为-1的时候,执行
hashCode = handler.hashCode(this);
深入handler.hashCode(),其中调用了java.net.URLStreamHandler.getHostAddress()
URL对象中的host不为null时,就会调用getByName(host)
,即上述的利用点。
接下来寻找入口类,入口类需要满足一个特点。
在执行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
可以看到,大体和分析的一致,但是多了一步反射将hashCode的值改为-1。
URL传入url的时候,hashCode不会变化,依然是-1.
但是经过java.util.HashMap.put() 经过该方法后,hashCode变了
需要重新修改为-1。
原因:
查看HashMap的put方法,会调用key.hashCode()
而URL类中的hashCode在执行的时候,会覆盖URL对象的hashCode变量
因此,需要将变量hashCode重新修改为-1。
通过反射后
URLDNS利用
发起DNS请求
Java-chains 选择
发送POST
wireshark抓包,可以看到访问了
探测类
可选项
查看wireshark
start开始
end结束
参考资料
-
• URLDNS的反序列化调试分析 https://mp.weixin.qq.com/s/7zHKoi53HU2FXDTQIy6gsA -
• https://xz.aliyun.com/news/12115
原文始发于微信公众号(进击的HACK):Java利用链URLDNS分析及利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论