Dlink设备中的HNAP分析
字数 1499 2025-08-06 20:12:39

D-Link设备HNAP协议漏洞分析教学文档

0x01 HNAP协议概述

HNAP(Home Network Administration Protocol)是D-Link设备使用的一种家庭网络管理协议,基于SOAP实现,用于设备远程管理。

0x02 CVE-2020-8864漏洞分析

2.1 漏洞定位方法

  1. 使用grep搜索关键字符串定位漏洞程序:

    • 关键程序:/bin/prog.cgi
    • 关键函数:sub_42141C(包含登录逻辑判断)
  2. 逆向分析技巧:

    • 从响应包内容入手,搜索如"LoginPassword"等字符串
    • 交叉引用bin/prog.cgibin/prog-cgi程序
    • 关键函数调用链:
      • websSecurityHandler:HNAP认证入口
      • sub_423DF4:主要认证函数
      • sub_424090:响应包生成函数

2.2 漏洞原理

漏洞出现在sub_42141C函数的登录逻辑中:

  1. 使用nvram获取登录状态
  2. 使用strncmp比较密码:
    strncmp(x, y, strlen(y))
    
  3. 漏洞模式:
    • 当输入密码为\x00时,strlen(y)返回0
    • strncmp比较前0个字符,总是返回0(表示匹配)
    • 导致非预期的登录成功

2.3 调试方法

CGI调试建议:

  1. 使用shell脚本设置环境变量
  2. 在qemu环境中开启调试

0x03 CVE-2020-8863漏洞分析

3.1 漏洞原理

  1. 关键比较逻辑:

    • 检查privatelogin节点前8字节是否为"Username"
    • 如果是,将传入的username当作password使用
    • 否则,通过nvramhttp_passwd获取密码
  2. 密码处理流程:

    • 密码被用于加密
    • 最终结果传递到变量a4
    • 函数调用链:
      • sub_41EA9C(a1, (int)v23):将v23指针赋给a1+212
      • sub_424090(a1, 0):生成challenge等认证数据
  3. 关键发现:

    • public_keyhttp_passwd生成
    • 通过控制private_login可自行构造响应数据包
    • 允许用户构造认证响应,完成登录

3.2 漏洞特征

  1. 类似预留后门,非典型代码失误
  2. 与CVE-2020-8864不同点:
    • 不依赖strncmp的截断特性
    • 通过特殊逻辑分支实现认证绕过

0x04 漏洞对比与总结

特征 CVE-2020-8864 CVE-2020-8863
类型 strncmp截断漏洞 逻辑设计缺陷
触发条件 输入\x00密码 构造privatelogin节点
影响 认证绕过 认证绕过
修复难度 简单(修改比较逻辑) 复杂(需重构认证流程)

0x05 扩展分析

  1. 安全编码建议:

    • 避免使用strncmp(x, y, strlen(y))模式
    • 敏感比较应使用固定长度或安全比较函数
    • 认证逻辑应避免特殊分支
  2. HNAP协议安全建议:

    • 实现完整的加密认证流程
    • 避免硬编码或特殊逻辑路径
    • 对输入进行严格验证
  3. 相关漏洞:

    • 文中提到设备还存在多个命令注入漏洞
    • 建议对用户输入进行全面过滤

0x06 研究价值

  1. 展示了嵌入式设备中常见的两类漏洞:

    • 低级编程错误导致的漏洞
    • 设计缺陷导致的后门类漏洞
  2. 逆向工程技巧:

    • 字符串搜索定位关键代码
    • 函数调用链分析
    • 关键变量跟踪技术
  3. 漏洞利用思路:

    • 从协议处理流程中寻找薄弱环节
    • 关注认证逻辑的特殊分支
    • 注意内存/字符串处理函数的使用方式
D-Link设备HNAP协议漏洞分析教学文档 0x01 HNAP协议概述 HNAP(Home Network Administration Protocol)是D-Link设备使用的一种家庭网络管理协议,基于SOAP实现,用于设备远程管理。 0x02 CVE-2020-8864漏洞分析 2.1 漏洞定位方法 使用grep搜索关键字符串定位漏洞程序: 关键程序: /bin/prog.cgi 关键函数: sub_42141C (包含登录逻辑判断) 逆向分析技巧: 从响应包内容入手,搜索如"LoginPassword"等字符串 交叉引用 bin/prog.cgi 和 bin/prog-cgi 程序 关键函数调用链: websSecurityHandler :HNAP认证入口 sub_423DF4 :主要认证函数 sub_424090 :响应包生成函数 2.2 漏洞原理 漏洞出现在 sub_42141C 函数的登录逻辑中: 使用 nvram 获取登录状态 使用 strncmp 比较密码: 漏洞模式: 当输入密码为 \x00 时, strlen(y) 返回0 strncmp 比较前0个字符,总是返回0(表示匹配) 导致非预期的登录成功 2.3 调试方法 CGI调试建议: 使用shell脚本设置环境变量 在qemu环境中开启调试 0x03 CVE-2020-8863漏洞分析 3.1 漏洞原理 关键比较逻辑: 检查 privatelogin 节点前8字节是否为"Username" 如果是,将传入的username当作password使用 否则,通过 nvram 从 http_passwd 获取密码 密码处理流程: 密码被用于加密 最终结果传递到变量a4 函数调用链: sub_41EA9C(a1, (int)v23) :将v23指针赋给a1+212 sub_424090(a1, 0) :生成challenge等认证数据 关键发现: public_key 由 http_passwd 生成 通过控制 private_login 可自行构造响应数据包 允许用户构造认证响应,完成登录 3.2 漏洞特征 类似预留后门,非典型代码失误 与CVE-2020-8864不同点: 不依赖 strncmp 的截断特性 通过特殊逻辑分支实现认证绕过 0x04 漏洞对比与总结 | 特征 | CVE-2020-8864 | CVE-2020-8863 | |------|--------------|--------------| | 类型 | strncmp截断漏洞 | 逻辑设计缺陷 | | 触发条件 | 输入\x00密码 | 构造privatelogin节点 | | 影响 | 认证绕过 | 认证绕过 | | 修复难度 | 简单(修改比较逻辑) | 复杂(需重构认证流程) | 0x05 扩展分析 安全编码建议: 避免使用 strncmp(x, y, strlen(y)) 模式 敏感比较应使用固定长度或安全比较函数 认证逻辑应避免特殊分支 HNAP协议安全建议: 实现完整的加密认证流程 避免硬编码或特殊逻辑路径 对输入进行严格验证 相关漏洞: 文中提到设备还存在多个命令注入漏洞 建议对用户输入进行全面过滤 0x06 研究价值 展示了嵌入式设备中常见的两类漏洞: 低级编程错误导致的漏洞 设计缺陷导致的后门类漏洞 逆向工程技巧: 字符串搜索定位关键代码 函数调用链分析 关键变量跟踪技术 漏洞利用思路: 从协议处理流程中寻找薄弱环节 关注认证逻辑的特殊分支 注意内存/字符串处理函数的使用方式