java asm jndi_GitHub - Q1ngShan/JNDI: JNDI 注入利用工具

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 :

image-20200408132444506.png

基础信息:

image-20200408132541104.png

获取 Spring 数据源信息:

image-20200408132656296.png

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

image-20200408133110038.png

文件读取 /etc/passwd

image-20200408133302051.png

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

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

报错回显:

image-20200408133609959.png

OOB 回显:

a07de24fdc6b5d9fee4b6f7870368838.png

技术细节

服务端

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

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。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/552542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java中fis和fos_java中-的流-与操作

/*字节输出流 OutputStrema:* OutputStream抽象类* write(int b); 将指定的字节写入此流中* write(byte[] b); 将指定的数组 输入此流中* write(byte[] b , int a , int c); 将指定的数组输入此流中 从a索引开始 获取c 个* close(); 将此流关闭 并释放资源* fl…

yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort

目标跟踪问题一直是计算机视觉的热点任务之一,简单的可以分为单目标跟踪与多目标跟踪,最常见的目标跟踪算法都是基于检测的跟踪算法,首先发现然后标记,好的跟踪算法必须具备REID的能力。今天小编斗胆给大家推荐一个结合传统算法跟…

类java的步骤_java类加载的过程

类加载就是三个过程:加载、链接、初始化链接又可以分为验证、准备、解析1.加载将class字节码文件通过类加载器装入内存中2.验证确保当前class文件的字节流所包含的内容符合当前JVM的规范要求,并且不会出现危害JVM自身安全的代码,当前字节流不…

java拓展接口_Java拓展接口-default关键词

Java接口在使用过程中有两点规定:1、接口中只能有定义方法名、方法返回类型,不能有方法的实现。2、实现接口的类,必须实现接口中所有的方法。例如下面的例子://定义接口public interface Action {//接口中的方法定义,只…

java编写通信录管理系统_Java 实现通讯录管理系统教程

本文实例为大家分享了java实现通讯录管理系统的具体代码,供大家参考,具体内容如下完成项目的流程:1.根据需求,确定大体方向2.功能模块分析3.界面实现4.功能模块设计5.coding6.代码测试下面是源代码:import java.awt.Co…

java姑娘_初识java这个小姑娘(二)

正版疯狂java讲义第5版编程教材76.5元(需用券)去购买 >妙解垃圾回收机制周一,早高峰!!!五个字,说尽心中的绝望!!!一段考验一个人耐力、智力、开车技术以及脾气的路。 我把车开进了…

JAVA script 循环 图片_深入分析JavaScript 事件循环(Event Loop)

事件循环(Event Loop),是每个JS开发者都会接触到的概念,但是刚接触时可能会存在各种疑惑。众所周知,JS是单线程的,即同一时间只能运行一个任务。一般情况下这不会引发问题,但是如果我们有一个耗时较多的任务&#xff0…

java 方法重载的作业_java第六章 方法及方法重载 课堂笔记、作业

当参数传递为基本数据类型时,参数变化不保留,基本数据类型参数传值当参数传递为引用数据类型时,参数变化会保留,引用数据类型参数传址//基本数据类型在别处被重新赋值,则本体不受影响,其值不变//引用型数据…

java旋转图片后边上变黑_Java旋转图像将背景的一部分变成黑色

因此,我下载了“原始”图像(不是正方形),对其进行了修改,使其变为正方形,运行您的代码,得到了java.awt.image.ImagingOpException:无法转换src图像异常,将BufferedImage.TYPE_INT_RGB更改为BufferedImage .TYPE_INT_ARGB并得到…import java.awt.geom.AffineTransfo…

python 数据库连接池_【转】Python 数据库连接池

python编程中可以使用pymysql进行数据库连接及增删改查操作,但每次连接mysql请求时,都是独立的去请求访问,比较浪费资源,而且访问数量达到一定数量时,对mysql的性能会产生较大的影响。因此实际使用中,通常会…

java 获取oracle表结构_获取Oracle中所有表的列表?

回答(19)2 years ago我们可以从以下查询获取所有表格,包括列详细信息:SELECT * FROM user_tab_columns;2 years ago使用sqlplus更好地查看如果您正在使用 sqlplus ,您可能需要首先设置一些参数以便在您的列被破坏时更好地查看(退出 sqlplus 会…

java后台处理excel_java后台利用Apache poi 生成excel文档提供前台下载示例

之前在项目中会用到在java在后台把数据填入Word文档的模板来提供前台下载,为了自己能随时查看当时的实现方案及方便他人学习我写了这篇博客,访问量已经是我写的博客里第一了。于是乎我在学会用Java在后台利用Apache poi 生成excel文档提供前台下载之后就…

宝塔php漏洞,[安全预警]关于最近宝塔闹得很厉害的PMA漏洞BUG

文章前言在2020年8月23日的下午有个憨憨管理在我群艾特全员 说宝塔爆出漏洞了赶快更新吧!影响机器需同时满足以下所有条件1、软件版本为Linux面板7.4.2 或者Windows面板6.8.02、开放888且未配置http认证,3、安装了phpmyadmin,mysql数据库不受…

求十个学生的平均成绩java,JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。...

JAVA 声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。mip版 关注:116 答案:3 悬赏:30解决时间 2021-01-26 06:39已解决2021-01-25 17:54声明一个数组,存一个学生的五门成绩。求该学生的总成绩、平均成绩。JAVA知识最佳答案2021-01-25 18:12public class S…

php伪静态限制网页播放视频,学习猿地-php伪静态后html不能访问怎么办

php伪静态后html不能访问的解决办法:首先判断文件是否存在;然后设置存在则不rewirte,不存在且符合规则才rewrite;最后修改htaccess文件即可。具体问题:PHP伪静态后不能访问纯html文件.htaccess文件RewriteEngine onRew…

oracle binary_integer pls_integer,oracle中binaryinteger与plsinteger的区别

oracle中binaryinteger与plsinteger的区别 Oracle 中 Binary_Integer 与 Pls_Integer 的区别Binary_Integer 与 Pls_Integer 都是整型类型. Binary_Integer 类型变量值计算是由 Oracle 来执行,不会出现溢出,但是执行速度较慢,因为它是由 Orac…

梁单元分析matlab,[FEM][有限元][编程][Matlab][Code by myself] 2D Timoshenko梁单元

(有空和小伙伴一起写写有限元程序)程序作者 ( Author )JiDong Cui (崔济东)1, XueLong Shen (沈雪龙)21.广州容柏生建筑结构设计事务所;2.华南理工大学建筑设计研究院基本概念 ( Concept )欧拉梁单元基于一定的假设(Kirchhoff假设),在梁的高度远小于其跨…

oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)

oracle的伪列以及伪表oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Oracle完成的。Oracle目前有以下伪列:一、伪列&#…

linux运行搜狗拼音,Linux 搜狗输入法的安装(Ubuntu版)

1、首先从搜狗官网下载搜狗输入法Linux版本的安装包2、按ctrl alt T 打开Linux终端3、安装搜狗输入法: sudo dkpg -i xxx.deb, 如果报错,主要是由于两个原因:a、权限不够,可以通过获取root权限,命令‘su’;…

2023年腾讯云轻量应用服务器测评2核2G4M带宽

腾讯云轻量应用服务器测评2核2G4M带宽88元一年,2核CPU、2G内存、3M带宽,腾讯云轻量应用服务器(Tencent Cloud Lighthouse)是一款开箱即用的云服务器产品,面向轻量应用场景,旨在为中小企业和开发者提供便捷高…