TP-Link Archer A7(AC1750)路由器RCE

匿名者  1477天前

TP-Link Archer A7 AC1750是中国普联(TP-Link)公司的一款无线路由器。固件版本为190726中tdpServer服务在未经身份验证情况下,可进行命令注入,但仅可被路由器LAN端的攻击者利用。

7.png

CVE编号

CVE-2020-10882

固件更新

A7(US)_V5_200220

本文分析基于:tdpServer守护程序/usr/bin/tdpServer,固件版本190726

tdpServer介绍

在tdpServer接口上开启本地0.0.0.0的UDP端口20002监听

  • 功能 :TP-Link移动应用程序和路由器之间的桥梁

  • 通信加密:通过使用带有加密payload的UDP数据包与移动应用程序进行通信

tdpServer格式

2020-04-09-14-12-14.jpg

从上图可知,通过数据包类型判断守护程序调用服务

  • 数据包类型一:
tdpd服务:使用特定的TETHER_KEY哈希值的数据包进行回复(与此漏洞无关),type为0
  • 数据包类型二:
onemesh服务:type为 0xf0,(产生漏洞)

TP-Link在其许多路由器的最新固件版本中引入了其专有的技术OneMesh

漏洞

设备启动,调用tdpd_pkt_handler_loop()(地址:0x40d164)——监听端口20002接收到数据传递——tpdp_pkt_parser()(地址:0x40cfe0

tpdp_pkt_parser()

第一部分:检查数据包、校验和的验证
第二部分:type判断即调用服务选择
第三部分:标志字段onemesh_flag为1,进入onemesh_main()(地址:0x40cd78),onemesh_main()根据操作码字段调用相应函数,举例:操作码为6——调用onemesh_slave_key_offer()(地址:0x414d14)

1.png

tdpd_pkt_parser()#1

首先检查UDP套接字标头大小是否至少为0x10

调用tdpd_get_pkt_len()(地址:0x40d620),该函数返回在包头中声明的包长度,如果数据包长度超过0x410,则此函数返回-1;

最后再通过tdpd_pkt_sanity_checks()(地址:0x40c9d0),检查数据包版本(版本字段,数据包中的第一个字节)是否等于1,接着,使用自定义校验和函数tpdp_pkt_calc_checksum()(地址:0x4037f0)计算数据包的校验和

由于tpdp_pkt_calc_checksum()内容较多,借助lao_bomb漏洞利用代码的calc_checksum()分析

6.png

lao_bomb漏洞利用代码的calc_checksum()

校验和的计算:

首先在数据包的校验和字段中设置魔术变量0x5a6b7c8d,然后使用带有1024个字节的表reference_tbl来计算整个数据包(包括报头)的校验和;

校验和通过验证并且所有结果正确之后,tdpd_pkt_sanity_checks()返回0。

2.png

tdpd_pkt_parser()#2

onemesh_slave_key_offer()(漏洞处)

第一部分:将payload传递给tpapp_aes_decrypt()(地址:0x40b190)——功能:使用AES算法和静态密钥“TPONEMESH_Kf!xn?gj6pMAt-wBNV_TDP”解密payload
第二部分:对onemesh对象做一些设置后,解析payload(一个json对象)获取json键及其值
第三部分:按顺序处理获取的键与值(若键不存在,直接退出函数),json对象中的值传递给堆栈变量slaveMac、slaveIp等,调用create_csjon_obj()(地址:0x405fe8)函数处理
第四部分:create_csjon_obj()处理:堆栈变量slaveMac被传递给systemCmd变量,然后由system(systemCmd)执行

3.png

onemesh_slave_key_offer()#1

image.png

onemesh_slave_key_offer()#2

4.png

onemesh_slave_key_offer()#3

5.png

onemesh_slave_key_offer()#4

利用

假设json对象如下:

2020-04-09-14-45-32.jpg

want_to_join必须为false,type设置为0xf0,将opcode设置为6,将flags设置为1,并正确获取校验和字段

加密payload

AES算法,固定密钥:TPONEMESH_Kf!xn?gj6pMAt-wBNV_TDP,使用CBC模式(IV固定值:1234567890abcdef1234567890abcdef),实际使用其中的128位密钥的AES-CBC,256位密钥和IV中有一半没有使用。

实现代码执行

  • 数据包分析

    strncpy()将slave_mac_info键中的值只能传递给slaveMac变量 0x11 字节(17个字节),其中包括终止的空字节
    slaveMac变量中的值有单双引号的使用,攻击时需要一些转义
    

    上面的这两个限制导致利用有限,而为了转义单双引号, ';<payload>'就占用了3个字节,而且实际测试中只能使用12个字节

  • 将命令写入文件当作shell脚本执行

    • cat 'a'>>z

      10个字节 
      数字:shell会将数字解释为文件描述符
      特殊字符"."或";"的无法写入
      
    • printf '1'>x

      12个字节,无法添加额外的“>” 
      创建一个仅包含字符“1”的名为“x”的新文件
      
    • 数字或特殊字符,cat x*>>z*

      首先将字符写入新文件,然后使用cat将新文件的内容附加到正在构建的命令文件 
      使用:最后的文件z会被命名成z”}),shell会使用特殊的'*'字符自动补全
      
    • 创建文件的位置在根目录下

      通常是在/tmp下,根目录通常是不可写的,而TP-Link的根文件系统是以读写方式安装,由此节省很多字节
      
    • 最后以root用户执行:sh z

本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场
来源:https://www.zerodayinitiative.com/blog/2020/4/6/exploiting-the-tp-link-archer-c7-at-pwn2own-tokyo

最新评论

昵称
邮箱
提交评论