前言
一款arm架构的路由器 主要的漏洞位于httpd中 cookie可以产生栈溢出 同时httpd开启的保护很少 比较适合新手用于arm架构的学习
固件下载地址 https://drivers.softpedia.com/dyn-postdownload.php/d27e8410d32cd9de63a3506c47ded1bc/61ff85c5/75eb7/4/1
环境模拟
使用binwalk提取出固件的文件系统
随后使用readelf查看一下固件的架构
可以看到是32位的ARM架构
接下来如果我们直接使用qemu-arm-static来启动httpd的话 会提示缺失库文件
我们需要把qemu-arm-static的文件拷贝到当前目录 随后利用chroot将当前目录作为根目录 随后再重新启动
sudo apt install qemu-user-static libc6-arm* libc6-dev-arm* |
但是你会发现此时程序卡在了这里
先利用ida打开httpd 在字符串中搜索Welcome to 很快就定位了具体的位置
可以看到对于v18的值进行了检查 如果小于等于0就陷入死循环
将断点打在这个puts函数 我们看看v18的值是怎么赋值的
sudo chroot ./ ./qemu-arm-static -g 1234 ./bin/httpd |
gdb-multiarch ./bin/httpd |
可以看到此时的死循环和R3寄存器的值有关
我们需要利用keypatch更改mvn这一条指令 使得r3的值大于0后可以绕过死循环
但是可以看到此时虽然跳过了while的死循环 但是程序输出错误后就直接结束了
还是老办法 定位到对应的字符串
代码审计可以发现是这个if判断的锅
我们需要进入这个if分支 才能正常使用程序
则使得r3不为0即可
随后又迎来了一个问题 可以看到虽然此时httpd已经成功启动 但是其获取到的ip地址明显不对 所以我们需要一个网桥接口来使得可以正常获取ip地址
sudo apt install uml-utilities bridge-utils |
随后我们再次运行httpd程序 可以发现成功获取到了ip地址
暂时挂起这个进程 我们ping这个地址如果可以ping通就成功了
但是还是发现无法正常访问网页
cp -rf ./webroot_ro/* ./webroot/` |
把目录复制一下就行了 原理暂时还没搞懂
这个师傅的文章看到的 https://cn-sec.com/archives/1727127.html
漏洞分析
通过官方给出的分析
https://fidusinfosec.com/remote-code-execution-cve-2018-5767/
可以知道漏洞点位于R7WebsSecurityHandler函数中
调用了sscanf函数把cookie中的password参数传入到了栈上 而httpd文件就开启了一个NX
所以可以进行一个栈溢出的rop链利用
看其他师傅是可以使用python脚本来发送请求的 但是不知道为啥我不行 所以这里采用bp来发包 (第二天补的这句话 发现是我的终端加了http和https的代理
随后可以看到程序终止了 报段错误
于是使用gdb-multiarch来进行动态调试 寻找触发段错误的指令
sudo chroot ./ ./qemu-arm-static -g 1234 ./bin/httpd |
可以看到程序卡在了这里 由于r3寄存器被我们填入的垃圾数据覆盖
而ldrb需要访问r3寄存器存储的内存地址中的数据 所以这里产生了非法的内存访问 从而导致了段错误
通过backtrace指令 可以看到此指令是由0x2c5cc触发的 在ida中寻找一下
在if分支中有一个函数涉及到了该地址
所以我们要做的就是跳过if分支 这样才可以执行到我们控制的rop链
绕过if分支的条件则是在’.’后跟上这些后缀名
随后就是简单的栈溢出 直接打system就行了
但是 由于我的vmmap不知道为啥获取不到对应的libc地址
所以复现失败