环境搭建
调试和分析主要在路由器环境中进行。通过USB-TTL设备获取路由器交互式shell的方法已有相关指南,这里不再赘述。OpenWRT提供了指南1和指南2说明具体操作。
对于代码分析,采用了bindiff方法来定位漏洞函数。可从以下链接下载有漏洞和已修复的固件版本:
- 修复版本:Archer A7(US)_V5_200220
- 漏洞版本:Archer C7(US)_V5_190726
注意Archer C7和A7型号共享大多数二进制文件,因此分析C7或A7固件镜像均可。
BinDiff分析
首先从固件中提取MIPS(Big Endian)二进制文件并加载到Ghidra中。按照BinDiffHelper项目的说明进行操作,同时下载安装bindiff6。
使用Ghidra和Bindiff后,发现几个相似度很低的函数。跟踪这些地址发现,FUN_00414D14似乎指向一个函数,这可能是存在漏洞的函数。
静态分析
根据ZDI网站上的CVE报告描述,漏洞存在于默认监听UDP端口20002的tdpServer服务中。当解析slave_mac参数时,该服务未正确验证用户输入的字符串就直接用于执行系统调用。
在反编译代码中搜索slave_mac字符串,发现多个结果。第一个搜索结果中,有多个地方包含slave_mac字符串,其中还包括对FUN_00414d14函数的引用。
关键的字符串"tdpUciInterface.c:644",“About to get slave mac %s info"只有一处引用,地址为0x40e7e4。根据Bindiff,这里很可能没有变化或差异。
寻找system()调用
根据CVE描述,我们需要寻找攻击者可能控制的system()函数调用。在FUN_00414d14函数中发现了三个system调用,其中一个特别有趣:
|
|
漏洞利用
在这个漏洞函数中,slave_mac值可以控制传递给system()的参数。我们可以通过以下步骤实现利用:
- 为MIPS Big Endian设置GDB服务器
- 测试与tdpServer的连接
- 制作有效载荷
- 完整漏洞利用
制作数据包
数据包由16字节的包头和最大0x410字节的JSON有效载荷组成。第一个字节表示tdp版本,这个固件只接受版本1的数据包。
数据包校验和计算使用CRC-32算法。校验通过后,有效载荷会使用IV和DecryptKey通过AES_DECRYPT在CBC模式下解密。
命令注入
slave_mac字段用于将字符写入文件p。该字段有17个字符的限制。命令注入工作原理如下:
|
|
我们使用printf将字符追加到文件中,通过发送多个数据包构建完整脚本后执行。
完整漏洞利用
要实现反向shell,可以从我们的机器下载busybox,然后使用telnetd获取反向shell,通过wget命令逐个字符写入文件并执行。
|
|
该漏洞允许攻击者在root用户上下文中执行任意代码,危害极大。建议用户及时更新固件版本。