JNDI 注入利用工具

介绍

本项目为 JNDI 注入利用工具,生成 JNDI 连接并启动后端相关服务,可用于 Fastjson、Jackson 等相关漏洞的验证。

本项目是基于 welk1n 的 JNDI-Injection-Exploit,在此项目的基础服务框架上,重新编写了攻击利用代码,支持更多更强大的功能,并加入了多种方式进行回显的支持。

本项目为学习性项目,目前本人 Java 水平依然处于 hello world 的水平,建议各位师傅报着批判的眼光观看,不吝指导。QAQ

功能

本工具支持了利用 JNDI 注入构造多种恶意 payload,其中包括:

名称

功能

简介

BasicInfo

获取服务器基础信息

打印出 System.getProperties() 中的信息

Command

命令执行

反射调用 forkandexec 执行命令

DataSourceHack

获取Spring DataSource 明文

获取缓存在上下文中的 DataSource

DirList

目录遍历

使用 File 对象列目录

FileDelete

文件删除

使用 File 对象删除文件

FileRead

文件读取

使用 FileInputStream 读取文件

FileWrite

文件写入

使用 FileOutputStream 写文件

SQL Query

执行SQL语句

使用 JDBC 发出查询

SSRF

访问内网应用

发送 HTTP 请求,并将结果返回

对于具体功能的构建比较简单,几乎就是正常的功能性编程,只不过部分功能使用了反射,可能不易于阅读。

对这部分功能实现有疑问的同学可以在 Javasec 上找到相关的文章。

对于各项参数的配置使用了配置文件的方式,由于是在调用时会读取文件,并未将值进行缓存,所以可以随时修改配置文件中 payload 的值,无需重启服务。

除去基本功能,本工具加入了多种回显方式,使 JNDI 注入的结果能够返回,这样在研究或测试中可以更方便的看到结果,本攻击支持了如下回显方式:

名称

功能

简介

ExceptionEcho

报错回显

throw 一个异常,message 是我们执行的结果

OOBEcho

带外回显

向 dnslog 平台发送数据包携带执行结果

TomcatEcho

Tomcat 回显

通过 Tomcat 获取 response 将结果写入

WebLogicEcho

WebLogic 回显

通过 WebLogic 获取 response 将结果写入

有了这些功能,我们就可以把 JNDI 注入活活玩成 webshell。

使用

使用源代码执行:

下载项目源代码:

git clone git@github.com:JosephTribbianni/JNDI.git

执行 org.su18.server.ServerStart 的 main() 方法,可以在控制台中看到启动消息。

使用 jar 文件执行:

在 release 下载打包好的文件,解压压缩包,确保配置文件与 jar 文件位于同一目录下,请根据自定义需求修改端口号及其他配置项,运行 jar 文件:

java -jar JNDI-1.0-all.jar

查看生成的恶意类

可以使用 org.su18.asm.frame.Frame 类的 main() 方法生成 .class 文件进行查看。

执行后,会在项目根目录生成文件,使用任意手段 decompile 后可查看逻辑。

使用展示

这里利用 fastjson 结合 jndi 来进行部分功能使用展示:

命令执行 id :

基础信息:

获取 Spring 数据源信息:

对我电脑上的 /Users/phoebe/PycharmProjects 进行目录遍历:

文件读取 /etc/passwd

等等,剩余的就不展示了,自测吧。

上面使用了 TomcatEcho 进行回显,其他回显展示:

报错回显:

OOB 回显:

技术细节

服务端

服务器端完全基于原项目,未进行大改动,将服务监听端口加入了配置文件中,方便修改。

payload 细节

由于原项目仅执行了命令执行,并且是使用 Runtime.getRuntime.exec() 这种非常表面的接口调用,功能较为单一,且容易被防护阻断,因此这里我增加了多个功能模块,并对于多数模块,直接使用反射调用 native 方法执行功能,这可以在某种情况下完全绕过流量层或应用层的安全防护。对于其他功能则是正常的逻辑代码调用,基本不会触发任何规则。

回显细节

回显主要分为几类:

报错回显:直接抛出异常,这种方式能否回显完全取决于服务端对异常的处理情况。

OOB回显:这里使用了 ceye.io,由于这个域名可能会被各大安全防护产品拉入黑名单,所以可以寻找小众的 dnslog 平台或自行搭建。

response 回显:这里支持了 Tomcat 和 Weblogic 的回显,获取当前访问的 response 对象,并写回结果。

字节码拼接

在恶意类的字节码生成上,原项目使用编译好的 jdk7、jdk8 的 class 文件,使用 asm 加载并加入执行命令代码;本项目则直接使用 asm 完全生成类字节码。由于要实现模块化,这里设计了一个简单的代码结构:

public class Template {

private String result;

public Template() throw Exception{

// insert payload here

this.echo();

}

public void echo() throw Exception{

// how would you like to echo the result

}

}

由于 JNDI 注入的特性是会执行类的构造方法或 static 语句块,因此将恶意 payload 织入构造方法中,在执行完 payload 后,构造出响应的返回结果,放在 this.result 中,在构造方法的最后一行执行 this.echo() 方法,进行回显的逻辑。

未完成

由于时间有限,ASM 生成的代码十分简陋,后期会改为使用 AdviceAdapter 的 onMethodEnter、onMethodExit更优雅的生成代码。

由于 JNDI 注入本身需要出网,所以一些漏洞利用方式和回显方式显得有些鸡肋,后期会继续优化,添加新功能。

仅使用了 jdk 1.8 进行测试,部分利用代码“可能”使用了 1.8 之后的新特性,在低版本上可能失效。

加入 linux 文件描述符回显:本来想加的,根据几位师傅给出的思路经过了一下午的调试,还是没有做到通用有效的寻找文件描述符 id 的方法,后续有时间再弄吧。

参考文章

交流

Java 安全技术交流微信群:javasec,请前往网站添加管理员微信邀请您入群。

Javasec 项目是由 安百科技-凌天实验室 发起,是一个免费、开源的 Java Web 安全相关知识归纳总结、培训的项目,相关问题可以在交流群内提出讨论或 Github 上提出 issues。

java asm jndi_GitHub - Q1ngShan/JNDI: JNDI 注入利用工具相关推荐

  1. java asm jndi_JNDI-Injection-Exploit JNDI注入利用工具

    介绍 JNDI注入利用工具,生成JNDI链接并启动后端相关服务,可用于Fastjson.Jackson等相关 使用 可执行程序为jar包,在命令行中运行以下命令: $ java -jar JNDI-I ...

  2. java asm jndi_JNDI 注入利用工具

    JNDI 注入利用工具 介绍 本项目为 JNDI 注入利用工具,生成 JNDI 连接并启动后端相关服务,可用于 Fastjson.Jackson 等相关漏洞的验证. 本项目是基于 welk1n 的 J ...

  3. JNDI RMI 注入(Log4j2漏洞)

    提示:重点的地方,使用★★★标记了,方便查看 目录 ■相关知识 1.SLF4J(Simple logging Facade for Java) // 简单日志门面 ■logback介绍 ●logbac ...

  4. Java:comp/env/讲解与JNDI

    转载自   "Java:comp/env/"讲解与JNDI 我们在使用JNDI调用某个对象时,会有下述两种方式 context.lookup("java:comp/env ...

  5. Java ASM框架与字节码插桩的常见用法(生成类,修改类,方法插桩,方法注入)

    前言 ASM 是一款读写Java字节码的工具,可以达到跳过源码编写,编译,直接以字节码的形式创建类,修改已经存在类(或者jar中的class)的属性,方法等. 通常用来开发一些Java开发的辅助框架, ...

  6. J2EE总结:Java命名与目录接口JNDI(转载)

    J2EE总结:Java命名与目录接口JNDI 2011-12-31 15:24 zhaosg/jnqqls zhaosg/jnqqls的博客 我要评论(0) 字号:T | T 一键收藏,随时查看,分享 ...

  7. java 反序列化利用工具 marshalsec 使用简介

    命令格式 marshalsec命令格式如下: java -cp target/marshalsec-0.0.1-SNAPSHOT-all.jar marshalsec.<Marshaller&g ...

  8. Java之控制反转和依赖注入

    1.简介 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性,下面通过一个例子来引入这一概念. 2.案例 1)一般情况下的类耦合 Main.java public clas ...

  9. java asm tree_使用ASM 4处理Java类文件–第二部分:Tree API

    java asm tree 什么是ASM树API: ASM树API是ASM的一部分,可让您创建/修改内存中的类. 该类被视为信息树. 像整个类一样,它是ClassNode的实例,其中包含FieldNo ...

最新文章

  1. [Usaco2005 Open]Disease Manangement 疾病管理 BZOJ1688
  2. IDEA 打可执行jar包(maven项目)
  3. angular 组件通信
  4. 将RGB格式的颜色值转换为十六进制
  5. 15张Vim速查表-帮你提高N倍效率
  6. 为什么用redis做缓存而不是mybatis自带的缓存_如何用Java设计一个本地缓存,涨姿势了...
  7. 用 as with ,和 ROW_NUMBER() 做分页查询
  8. Android About ContentProvider
  9. JS里设控件不可用取值
  10. Docker 删除所有容器和镜像,从头来过!
  11. 21_在线支付原理与实现
  12. springcloud ip部署_php接入SpringCloud微服务框架
  13. linux自动备份oracle数据库并上传到备份服务器 脚本实现(转)
  14. Kubernetes Downward API的介绍及使用
  15. 足球视频AI(一)——位置与平面坐标的转换
  16. cbnertvirtual内部框架下载_快速开发,支持前后端分离,微服务框架
  17. tableFooterView中的按钮点击没反应
  18. pycharm---更改背景颜色
  19. android 关机消息广播,Android开机、关机播音监听
  20. 一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效

热门文章

  1. python支持复数类型以下什么说法是错误的,【Python】专项练习题(1)
  2. 定题信息服务是从什么角度_信息管理练习题2
  3. 休眠后gpio状态_STM32中GPIO的8种工作模式总结
  4. python浅复制与深复制_Python中的浅复制与深复制
  5. Java ByteArrayInputStream mark()方法与示例
  6. Java ObjectInputStream enableResolveObject()方法与示例
  7. g++默认参数_C ++默认参数| 查找输出程序| 套装2
  8. mysql语句数据库_数据库的Mysql语句
  9. kotlin 判断数字_Kotlin程序可以逆转数字
  10. 人工智能ai 学习_人工智能中强化学习的要点