漏洞挖掘从黑盒到白盒-下篇
字数 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 执行流程
- 消息发送至本地 Socket 服务。
- 二进制文件
xxxxxonitor处理消息。 - 若消息前缀为
"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 利用链
- 通过其他 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` |
免责声明:本文仅用于安全教学与研究,请勿用于非法用途。