Galaxy Lab

focus on information security

0x01 TP-Link wr886nv7-V1.1.0 路由器分析 - VxWorks cmd命令行获取及使用方法

作者:小黑猪(朱文哲)

嵌入式/TP-Link/WR886_V7

在之前一篇文章中对TP-Link wr886nv7 固件进行初步分析后,下一步则是尝试寻找主板上的串口调试接口从而进一步的获取引导过程中的输出信息或是进一步得到登录命令行。

焊接串口调试

在主板上焊接引脚后,可以通过使用万用表测量等方法确定GND、TX、RX等接口,随后即可使用TTL转USB的转换接口查看串口信息。

连接TTL-USB转接口

连接TTL-USB转接口的具体接线方法如下,需要将路由器和TTL-转接口的TX,RX口反接。

这里遇到了一个坑,之前使用的转接口是PL-2303HX芯片的转接口,发生了各种诡异的情况导致无法正常的使用。最后查了网上的各种资料,推荐使用FT-232芯片的转接口说是兼容性比较好,换上新的转接口后果然能够正常使用了。

使用任意串口通讯软件打开串口后即可看到类似如下内容的串口信息。 

     此时如果设备的接线正确,就可以通过键盘输入?键获取VxWorks的CmdTask命令行(前提是VxWorks固件中编入了这个模块)。 

cmd命令说明

在对这些cmd命令进行了尝试后,发现了一些有用的命令,下面会列举一些命令进行简单说明

  • tftp – tftp命令行工具。
  • mem – 内存操作相关的命令行工具。
  • flash – flash相关的命令行工具。
  • net – 网络相关的命令行工具。
  • system – 系统命令相关的指令

tftp 命令行工具说明

tftp命令行支持的功能如下图所示。

这个命令看起来非常美好,我们既可以通过`tftp -put`指令直接上传路由器的内存信息,也可以通过`tftp -get`指令从tftp server中下载数据写入到特定的内存地址中

然而在实际使用中遇到了各种奇怪的问题,`tftp -put`指令一直无法正常使用,总是返回如下的错误信息。 

通过对请求的数据包进行分析后发现了一些怪异的情况,下图是一个正常的TFTP写请求数据流。 

下图是路由器实际发送的数据包,可以看到服务器返回了TFTP的ACK请求,但是路由器却没有对其进行响应,不断的重新发送写请求。由于固件中没有编入WDB调试模块,因此在无法对tftp进行调试的前提下只能先放弃使用tftp 命令行dump路由器内存的想法。 

当然`tftp -get`命令也是类似的错误。 

mem 命令行工具说明

`mem`命令行支持的功能如下图所示

使用‘mem -dump’命令可以查看设备中的内存信息,不过串口输出的内存信息不是很稳定,经常因为各种原因导致格式错乱。 

使用‘mem -md’命令可以对内存中的数据进行修改。 

可以看到通过mem内存操作命令行工具,已经可以实现诸如内存dump及打二进制patch修改程序逻辑等功能。

如下图所示,通过编写脚本模拟串口操作即可实现dump特定内存信息的效果。在脚本编写过程中也遇到过一些坑,例如dump的内存信息经常因为路由器的一些其他输出信息导致格式错乱,或在某些特定情况下会出现CmdTask崩溃或卡死导致输入无响应等异常情况需要处理。 

flash 命令行工具说明

`flash`命令行支持的功能如下图所示, 可以通过这些命令对flash进行读写等操作。

对于Flash的写操作需要慎重,该操作很有可能会影响到路由器的正常启动,导致设备异常。其他还支持例如查看flash存储的布局信息的命令`flash -layout`。

net 命令行工具说明

`net`命令行支持的功能如下图所示, 可以通过这些命令对TCP/UDP的运行时信息进行显示。

通过使用‘net -show’命令即可查看路由器的TCP/UDP端口使用情况,方便后续进行针对性的测试。 

system 命令行工具说明

`system`命令行支持的功能如下图所示, 可以通过这些命令执行诸如系统重启,重置,设置debug级别等相关操作。

根据帮助功显示的功能来看‘System’命令本身也比较简单,但是在对固件中cmd指令处理的函数进行分析后发现了有趣的事情。‘CmdTask’模块所支持的指令是通过如下图所示的代码进行添加的,通过调用‘cmdAdd’可以添加命令行所支持的指令。 

 因此只要查看一下所有的“cmdAdd”调用信息就可以找到命令行所支持的全部指令及指令解析函数逻辑。下图是‘System’函数的指令添加代码。 

 指令解析函数‘sub_80159CE4’中会对指令的参数等进行判断,下图是‘System’命令行中对应的参数解析代码。 

 再确认一下‘System’命令的帮助输出,帮助中的确是没有‘moduletree’这个参数的。

 执行一下试试,结果的确有输出,输出还挺有趣的涉及到了http请求中传输的一些json数据内容,这部分将在后续的文档中进行说明。 

 经过测试除了moduletree参数system指令还有一个-symble的指令,该指令输出的结果如下。会把系统中的符号信息进行输出。 

 至此,路由器cmd命令行的获取及使用方法介绍就结束了,通过分析可以看到命令行的帮助有时并不会将所有的命令行指令进行说明,通过分析命令行处理相关的代码,有时会有一些额外的惊喜等着我们。