Severity: Important
Vendor: The Apache Software Foundation
Versions Affected: JMeter 2.X, 3.X
Description [0]:
When using Distributed Test only (RMI based), jmeter uses an unsecured RMI
connection.
This could allow an attacker to get Access to JMeterEngine and send
unauthorized code.
This only affect tests running in Distributed mode.
Mitigation:
Besides, we remind users that in distributed mode, JMeter makes an
Architectural assumption
that it is operating on a 'safe' network. i.e. everyone with access to the
network is considered trusted.
This typically means a dedicated VPN or similar is being used.
Example:
Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象、数据库、FTP 服务器, 等等。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能
下好源码后,习惯性的翻了下,发现里面相对有点复杂,而此时我又对 rmi 完全不熟悉,搞到无从下手
只能照着许多 JMeter rmi 复现的文章里,先将 jmeter-server 跑起来再说
在源码包 bin 目录下 jmeter-server 或 jmeter-server.bat
如上图所示,jmeter-server 已经跑起来了
但是此时还是懵逼中,其他文章里除了开启服务、打payload,就没说明其他啥了
无意中在 bin 目录下发现了 jmeter-server.log 文件,感觉里面可以查到一些信息
emmmm,先找找 RemoteJMeterEngineImpl
在其 init 函数中发现开启了 rmi
这里的 CREATE_SERVER 默认为 ture 的,如果不指定 rmiPort 默认值也是 1099
稍微了解过 rmi 反序列化利用的老哥应该都知道当 rmi 创建成功后,就可以搞事了吧....
反向跟踪 init 函数的调用处
此处的 DEFAULT_RMI_PORT 值为 1099
继续反向跟踪 startServer 的调用处
在 Jmeter 里 start 函数发现了调用
可是在继续反向跟踪 start 函数的时候,却没有发现有被调用的地方 -_-
猜测可能是动态代理或者是反射请求?
搜了下路径关键字
在 NewDrever 的 main 函数中
至此整个流程已经摸清楚了
(用 3.3 版本的 JMeter 测试并未成功,查看了它的 colletions 版本是 3.2.2 的...)
用 ysoserial 打一梭子(ysoserial随便下的一个版本)
java -cp ysoserial-master-v0.0.5-gb617b7b-16.jar ysoserial.exploit.RMIRegistryExploit 127.0.0.1 1099 CommonsCollections5 "calc.exe"
参考资料
https://xz.aliyun.com/t/2082
http://bobao.360.cn/snapshot/index?id=287299