Tenda AC7 V15.03.06.44_CN、AC9 V15.03.05.19(6318)_CN、AC10 V15.03.06.23_CN、AC15 V15.03.05.19_CN、AC18 V15.03.05.19(6318)_CN系列路由器固件中存在缓冲区溢出漏洞,在处理 POST 请求传输过来的 ssid 参数时,ssid 参数的值直接复制到栈上的一个局部变量中,这会覆盖函数的返回地址,从而导致了缓冲区溢出漏洞。首先从https://github.com/Snowleopard-bin/pwn/tree/master/IOT/Tenda_CVE-2018-16333下载存在漏洞的固件
binwalk -Me US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin --run-as=root
解压后在_US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin.extracted/目录下存在squashfs-root文件系统接下来进行固件模拟,在本文中主要进行qemu user级调试
sudo apt install qemu-user-static
cp $(which qemu-arm-static) .
sudo chroot ./ ./qemu-arm-static ./bin/httpd
使用alt+t组合键搜索“WeLoveLinux”关键字,查询资料发现此处存在check_network、ConnectCfm会进行网络连接方面的确认,需要对这两个方法的返回值进行patch才能绕过此处的判断逻辑让程序正常执行下去通过以下的链接和命令下载和安装IDA插件keypatch
https://github.com/keystone-engine/keypatchhttps://github.com/polymorf/findcrypt-yara
pip install keystone-enginepip install sixpip install yara-python
将keypatch.py、findcrypt3.py、 findcrypt3.rules三个文件拷贝到IDA的plugin目录即可值得注意的是,在IDA7.5及更新的版本中,keypatch仓库的主分支文件在导入到IDA中时可能会报错无法正常使用,这个时候可以使用这个分支的keypatch.py文件:安装完成后,右键即可看到Keypatch插件的工具栏

接下来我们通过Keypatch->Patcher将check_network、ConnectCfm的点击Edit->Patch->Apply patches to input file,即可让上面的patch生效将patch后的httpd替换掉原本的/bin/httpd文件(注意进行备份)
mv ./bin/httpd ./bin/httpd.bak
chmod 777 ./bin/httpd
查询资料发现除了要对httpd文件patch之外,还需要建立虚拟网桥br0,因为程序是从名为br0的网卡获取网络地址
apt-get install bridge-utils
apt-get install uml-utilities
sudo brctl addbr br0
sudo brctl addif br0 ens32
sudo ifconfig br0 172.16.1.1/24
sudo ifconfig br0 up
完成br0的创建后,执行下面的命令在此进行固件模拟
sudo chroot ./ ./qemu-arm-static ./bin/httpd
此时可能还是不能正常访问路由器后台界面,如下图,这时因为程序无法找到部分文件导致的这时只需要执行下面的命令拷贝web程序所需文件到/webroot/目录即可
cp -rf ./webroot_ro/* ./webroot/
此时再访问http://172.16.1.1,发现已能正常访问路由器管理界面

存在漏洞的接口地址为/goform/fast_setting_wifi_set
当通过GET方式直接请求http://172.16.1.1/goform/fast_setting_wifi_set时,可以发现响应是跳转到登录页面
此时将请求修改为POST方式,并在请求body中加入ssid参数,此时ssid=aaa,发送请求后,程序返回了一个errCode的响应,此时程序仍正常运行
我们将ssid参数修改为较长的脏数据,再次发送请求包,这个时候程序不再返回任何响应,刷新路由器页面发现已经不能正常访问
查看模拟路由器的启动命令窗口,可以看到模拟固件进程已经退出,并提示“段错误”,溢出漏洞复现成功

根据漏洞原作者的描述,漏洞出现在路由器的web服务器--httpd文件中
https://github.com/ZIllR0/Routers/blob/master/Tenda/oob1.md
使用IDA打开_US_AC15V1.0BR_V15.03.05.19_multi_TD01.bin.extracted/bin目录下的httpd文件
使用alt+t组合键搜索"ssid"关键字
定位到调用了ssid的fast_setting_wifi_set函数,程序获取ssid参数后,没有经过检查就直接使用strcpy函数复制到栈变量中,造成了栈溢出漏洞。
