漏洞挖掘从黑盒到白盒-下篇
字数 1955 2025-10-01 14:05:45

漏洞挖掘从黑盒到白盒实战教学

概述

本文基于奇安信攻防社区分享的漏洞挖掘案例,详细分析某设备固件中从黑盒测试到白盒审计发现的多个安全漏洞,重点覆盖命令注入漏洞的挖掘方法与技术细节。


一、漏洞背景

1.1 受影响文件

  • xxxxxxxcmd.php:Web接口文件,存在命令注入漏洞。
  • 二进制文件 xxxxxonitor:处理Socket通信并执行系统命令。

1.2 影响版本

  • 固件 2.x 和 3.x 版本(1.x 版本未受影响)。
  • 漏洞源于版本更新后引入的 exec() 函数。

二、漏洞详情

2.1 无回显命令注入(xxxxxxxcmd.php

2.1.1 触发参数

  • 前端通过 xxxxxug_cmd 参数传入命令。
  • 参数传递至后端后,通过 Socket 发送消息:eachMsg("ECMD$DBGCMD")

2.1.2 执行流程

  1. 消息发送至本地 Socket 服务。
  2. 二进制文件 xxxxxonitor 处理消息。
  3. 若消息前缀为 "ECMD",进入命令执行分支。

2.1.3 核心代码分析(IDA 反编译)

if (!strncmp(s_1, "ECMD", 4uLL)) {
    strcpy((char *)s_5, "/usr/local/apache/htdocs/ExecCmd.txt");
    sub_423458(6LL, "recv commond(%s)", s_1);
    // ... 省略部分代码 ...
    if (!strncmp(&src__2, "cd", 2uLL)) {
        // 处理 cd 命令
    } else {
        sprintf((char *)s_4, "nohup %s > %s 2>&1 &", &src__2, (const char *)s_5);
        system((const char *)s_4); // 命令注入点
    }
}

2.1.4 漏洞利用

  • 构造参数:xxxxxug_cmd=ECMD$(恶意命令)
  • 实际执行:nohup 恶意命令 > /usr/local/apache/htdocs/ExecCmd.txt 2>&1 &
  • 执行结果写入 ExecCmd.txt,可通过 Web 访问该文件获取回显。

2.2 有回显命令注入(同一接口)

2.2.1 漏洞位置

  • 同一文件 xxxxxxxcmd.php 存在第二个命令注入点(未详细展开)。
  • 通过相同参数 xxxxxug_cmd 触发,但直接回显结果。

2.3 时区设置功能命令注入

2.3.1 触发参数

  • 传入参数格式:"TSE:$TIMEZONE"

2.3.2 核心代码

if (!strncmp(s_1, "TSE", 3uLL)) {
    sprintf(s_6, "/root/timezone.shell %s &", (const char *)s_4);
    system(s_6); // 命令注入点
}

2.3.3 漏洞利用

  • 参数 $TIMEZONE 未过滤,可注入任意命令:
    • 例如:TSE:;id > /tmp/exploit
    • 实际执行:/root/timezone.shell ;id > /tmp/exploit &

2.4 用户创建功能命令注入(固件 2.x/3.x)

2.4.1 漏洞场景

  • 系统创建用户时调用二进制文件,存在命令注入。
  • 3.x 版本该接口需鉴权,但可结合认证绕过漏洞利用。

2.4.2 利用链

  1. 通过其他 RCE 漏洞或认证绕过读取用户密码。
  2. 解密密码后模拟登录获取 Cookie。
  3. 调用用户创建接口触发命令注入。

三、漏洞挖掘技巧总结

3.1 黑盒测试重点

  1. 参数模糊测试:对所有输入参数尝试命令注入 payload(如 $(id);id)。
  2. 回显识别:注意无回显漏洞需通过输出重定向到文件(如 ExecCmd.txt)。
  3. 接口鉴权绕过:寻找未鉴权接口或鉴权逻辑缺陷。

3.2 白盒审计重点

  1. 危险函数追踪:搜索 systemexecpopen 等函数调用。
  2. 参数传递链:从前端参数到后端执行,跟踪数据流是否未过滤。
  3. 版本对比:对比历史版本代码,关注新增或修改的敏感逻辑。

3.3 二进制审计补充

  • 对二进制文件(如 xxxxxonitor)使用 IDA 分析:
    • 识别字符串常量(如 "ECMD")。
    • 分析 strncmpsprintf 等函数的使用风险。

四、修复建议

  1. 输入过滤:对所有用户输入严格过滤(白名单机制)。
  2. 避免命令执行:改用 PHP 内置函数替代系统命令(如 mkdir 代替 system("mkdir"))。
  3. 权限最小化:Web 服务以低权限用户运行。
  4. 鉴权加固:敏感接口需强制鉴权且避免硬编码密钥。

附录:常用命令注入 Payload

类型 Payload 示例 适用场景
空格绕过 ${IFS}id 过滤空格时
回显重定向 id > /tmp/out 无回显漏洞
后台执行 id & 避免阻塞
管道符 `id tee /tmp/out`

免责声明:本文仅用于安全教学与研究,请勿用于非法用途。

漏洞挖掘从黑盒到白盒实战教学 概述 本文基于奇安信攻防社区分享的漏洞挖掘案例,详细分析某设备固件中从黑盒测试到白盒审计发现的多个安全漏洞,重点覆盖 命令注入 漏洞的挖掘方法与技术细节。 一、漏洞背景 1.1 受影响文件 xxxxxxxcmd.php :Web接口文件,存在命令注入漏洞。 二进制文件 xxxxxonitor :处理Socket通信并执行系统命令。 1.2 影响版本 固件 2.x 和 3.x 版本(1.x 版本未受影响)。 漏洞源于版本更新后引入的 exec() 函数。 二、漏洞详情 2.1 无回显命令注入( xxxxxxxcmd.php ) 2.1.1 触发参数 前端通过 xxxxxug_cmd 参数传入命令。 参数传递至后端后,通过 Socket 发送消息: eachMsg("ECMD$DBGCMD") 。 2.1.2 执行流程 消息发送至本地 Socket 服务。 二进制文件 xxxxxonitor 处理消息。 若消息前缀为 "ECMD" ,进入命令执行分支。 2.1.3 核心代码分析(IDA 反编译) 2.1.4 漏洞利用 构造参数: xxxxxug_cmd=ECMD$(恶意命令) 实际执行: nohup 恶意命令 > /usr/local/apache/htdocs/ExecCmd.txt 2>&1 & 执行结果写入 ExecCmd.txt ,可通过 Web 访问该文件获取回显。 2.2 有回显命令注入(同一接口) 2.2.1 漏洞位置 同一文件 xxxxxxxcmd.php 存在第二个命令注入点(未详细展开)。 通过相同参数 xxxxxug_cmd 触发,但直接回显结果。 2.3 时区设置功能命令注入 2.3.1 触发参数 传入参数格式: "TSE:$TIMEZONE" 2.3.2 核心代码 2.3.3 漏洞利用 参数 $TIMEZONE 未过滤,可注入任意命令: 例如: TSE:;id > /tmp/exploit 实际执行: /root/timezone.shell ;id > /tmp/exploit & 2.4 用户创建功能命令注入(固件 2.x/3.x) 2.4.1 漏洞场景 系统创建用户时调用二进制文件,存在命令注入。 3.x 版本该接口需鉴权,但可结合认证绕过漏洞利用。 2.4.2 利用链 通过其他 RCE 漏洞或认证绕过读取用户密码。 解密密码后模拟登录获取 Cookie。 调用用户创建接口触发命令注入。 三、漏洞挖掘技巧总结 3.1 黑盒测试重点 参数模糊测试 :对所有输入参数尝试命令注入 payload(如 $(id) 、 ;id )。 回显识别 :注意无回显漏洞需通过输出重定向到文件(如 ExecCmd.txt )。 接口鉴权绕过 :寻找未鉴权接口或鉴权逻辑缺陷。 3.2 白盒审计重点 危险函数追踪 :搜索 system 、 exec 、 popen 等函数调用。 参数传递链 :从前端参数到后端执行,跟踪数据流是否未过滤。 版本对比 :对比历史版本代码,关注新增或修改的敏感逻辑。 3.3 二进制审计补充 对二进制文件(如 xxxxxonitor )使用 IDA 分析: 识别字符串常量(如 "ECMD" )。 分析 strncmp 、 sprintf 等函数的使用风险。 四、修复建议 输入过滤 :对所有用户输入严格过滤(白名单机制)。 避免命令执行 :改用 PHP 内置函数替代系统命令(如 mkdir 代替 system("mkdir") )。 权限最小化 :Web 服务以低权限用户运行。 鉴权加固 :敏感接口需强制鉴权且避免硬编码密钥。 附录:常用命令注入 Payload | 类型 | Payload 示例 | 适用场景 | |---------------|-----------------------------|------------------| | 空格绕过 | ${IFS}id | 过滤空格时 | | 回显重定向 | id > /tmp/out | 无回显漏洞 | | 后台执行 | id & | 避免阻塞 | | 管道符 | id | tee /tmp/out | 同时输出与回显 | 免责声明 :本文仅用于安全教学与研究,请勿用于非法用途。