漏洞复现设备:Sapido RB-1732
漏洞原理:路由器中存在漏洞执行命令
漏洞产生原因:服务器的syscmd.asp页面没有对传递过来的参数进行过滤,让用户以参数的形式发送系统命令,在web上执行
复现环境:FirmAE IDA
漏洞复现
首先在本地搭建固件模拟环境,这里使用了FirmAE将bin固件加载进来,开始模拟固件环境。
sudo ./run.sh -d sapido ~/Desktop/rb1732/RB-1732_TC_v2.0.43_2.bin
FirmAE启动后会自动模拟网络环境,可以直接通过浏览器访问192.168.1.1可以访问到web页面代表着模拟成功了
由于需要授权才可以进入到syscmd.asp页面,输入账号密码admin/admin进行登陆,登陆成功后会直接跳转到home.asp界面
紧接着直接访问192.168.1.1/syscmd.asp,可以看到system command 以及输入命令的窗口
输入ls,查看当前路径下的所有文件,得到返回的结果
可以看到命令执行成功,漏洞复现成功。
漏洞分析
binwalk -Me分析固件,识别并提取其中的文件系统和其他有用的文件
命令执行漏洞的原因是出在SysCmd.asp中,所以直接查找syscmd.asp文件
find ./ -name "syscmd.asp"
得知是在web文件夹下
点进查看到action指向了/goform/formSysCmd
action指向了/goform/formSysCmd直接跟进一下formSysCmd,在命令行使用grep进行查找字符串
发现字符串都是在asp文件中,但还有一个字符串是在/bin/webs,这说明webs这个二进制文件里也包含了”FormSysCmd“,找到这个二进制文件
使用readelf -h查看webs文件类型
得知文件是MIPS大端,是ELF结构体
将webs文件拖进ida里进行分析,查找字符串“formSysCmd”搜索相关函数
由于是ELF的结构体,直接点进formSysCmd就是函数的实际地址
按F5查看代码,进行分析
可以看到变量V3的值是通过websGetVar函数获取sysCmd传递的,if(v3)检查sysCmd参数是否为有效字符串,snprintf将从sysCmd参数中获取的命令(v3)格式化一个新的字符串,并将其存储在v20中,2>&1表示将标准错误输出重定向到标准输出,而>/tmp/system.log会将输出结果保存到/tmp/system.log文件中,system(v20)执行格式化命令。
结论
个人猜测此命令注入疑似厂家预留后门,若想避免攻击者对路由器进行攻击,可以通过白名单的方式,对输入进行验证并限制sysCmd参数只能执行安全的命令即可!