Skip to content

Latest commit

 

History

History
72 lines (59 loc) · 3.77 KB

File metadata and controls

72 lines (59 loc) · 3.77 KB

通过 Sleep 判断目标操作系统(OsSleep)

  • 类别:bytecode 别名:— 优先级:15
  • 作者:Ar3h
  • 依赖:无

作用

生成一段"条件延时"探测字节码:仅当目标操作系统满足条件(默认判定为 Windows)时才 Thread.sleep 指定秒数。攻击者据此通过响应耗时差异,无回显地推断目标操作系统类型。属于链尾字节码 sink(END)。

链接标签

  • 入口 tagsBytecodeEND
    • Bytecode:产出原始类字节码(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 指纹探测,无需任何回显通道。

已知缺陷(如实标注)

  1. getObject() 中第二行 modifyStringField("isWin", this.second)——字段名写成 isWin,而模板静态字段实际叫 isWindows;且传入的值取自 this.second 而非 this.isWin。这意味着用户配置的 isWin 参数并未真正写入模板(视 JavassistHelper 对不存在字段的处理而定,isWindows 很可能保持其默认/空值,Boolean.parseBoolean(null) 返回 false,从而导致延时逻辑可能永不触发)。这是 1.4.4 反编译源码中确实存在的赋值 bug,使用该 gadget 前需留意。

参数(@Param)

字段 名称 说明 默认 类型
second 命中条件时的睡眠秒数 5 ParamType.Integer
isWin 是否为 Win true:若目标系统为 Windows 则 Sleep true ParamType.Boolean

适用版本与原理要点

  • 与依赖版本无关,纯 JDK 反射/系统属性判断。
  • 用于时延盲探操作系统类型,属探测型 sink 而非 RCE;不产生回显,靠响应耗时侧信道判断。
  • 同样需要上游 TemplatesImpl 系装载器触发字节码,要求目标 JDK 允许 TemplatesImpl 定义类。
  • 注意上文赋值 bug 可能导致实际不生效。

所属预设链

自由构件,未直接出现在预设链(usedInChains 为空)。定位与预设的 Sleep 探测链[BytecodeConvert, Sleep])相近,可视为其"按操作系统条件延时"的变体。

关联

  • 上游(消费本 Bytecode 产物):BytecodeConvertTemplatesImpl
  • 同族探测 sink:Sleep(无条件延时)、DNSLog 系(外带探测)。
  • 同族命令 sink:ExecReverseShell