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

TP-Link Archer A7 AC1750是中國普聯(TP-Link)公司的一款無線路由器。固件版本為190726中tdpServer服務在未經身份驗證情況下,可進行命令注入,但僅可被路由器LAN端的攻擊者利用。

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

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格式

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

從上圖可知,通過數據包類型判斷守護程序調用服務

  • 數據包類型一:
<code>tdpd服務:使用特定的TETHER_KEY哈希值的數據包進行回覆(與此漏洞無關),type為0
/<code>
  • 數據包類型二:
<code>onemesh服務:type為 0xf0,(產生漏洞)
/<code>

TP-Link在其許多路由器的最新固件版本中引入了其專有的技術OneMesh。

漏洞

設備啟動,調用tdpd_pkt_handler_loop()(地址:0x40d164)——監聽端口20002接收到數據傳遞——tpdp_pkt_parser()(地址:0x40cfe0)

tpdp_pkt_parser()

<code>第一部分:檢查數據包、校驗和的驗證
第二部分:type判斷即調用服務選擇
第三部分:標誌字段onemesh_flag為1,進入onemesh_main()(地址:0x40cd78),onemesh_main()根據操作碼字段調用相應函數,舉例:操作碼為6——調用onemesh_slave_key_offer()(地址:0x414d14)

/<code>
TP-Link Archer A7(AC1750)路由器RCE


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()分析

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


lao_bomb漏洞利用代碼的calc_checksum()


校驗和的計算:

首先,在數據包的校驗和字段中設置魔術變量0x5a6b7c8d,然後使用帶有1024個字節的表reference_tbl來計算整個數據包(包括報頭)的校驗和;


校驗和通過驗證並且所有結果正確之後,tdpd_pkt_sanity_checks()返回0。

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


tdpd_pkt_parser()#2


onemesh_slave_key_offer()(漏洞處)

<code>第一部分:將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)執行
/<code>
TP-Link Archer A7(AC1750)路由器RCE


onemesh_slave_key_offer()#1

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

onemesh_slave_key_offer()#2

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


onemesh_slave_key_offer()#3

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


onemesh_slave_key_offer()#4

利用

假設json對象如下:

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

want_to_join必須為false,type設置為0xf0,將opcode設置為6,將flags設置為1,並正確獲取校驗和字段

加密payload

<code>AES算法,固定密鑰:TPONEMESH_Kf!xn?gj6pMAt-wBNV_TDP,使用CBC模式(IV固定值:1234567890abcdef1234567890abcdef),實際使用其中的128位密鑰的AES-CBC,256位密鑰和IV中有一半沒有使用。
/<code>

實現代碼執行

  • 數據包分析strncpy()將slave_mac_info鍵中的值只能傳遞給slaveMac變量 0x11 字節(17個字節),其中包括終止的空字節 slaveMac變量中的值有單雙引號的使用,攻擊時需要一些轉義 上面的這兩個限制導致利用有限,而為了轉義單雙引號, ';<payload>'就佔用了3個字節,而且實際測試中只能使用12個字節/<payload>
  • 將命令寫入文件當作shell腳本執行cat 'a'>>z10個字節 數字:shell會將數字解釋為文件描述符 特殊字符"."或";"的無法寫入 printf '1'>x12個字節,無法添加額外的“>” 創建一個僅包含字符“1”的名為“x”的新文件 數字或特殊字符,cat x*>>z*首先將字符寫入新文件,然後使用cat將新文件的內容附加到正在構建的命令文件 使用:最後的文件z會被命名成z”}),shell會使用特殊的'*'字符自動補全 創建文件的位置在根目錄下通常是在/tmp下,根目錄通常是不可寫的,而TP-Link的根文件系統是以讀寫方式安裝,由此節省很多字節 最後以root用戶執行:sh z
<code>本文由白帽彙整理並翻譯,不代表白帽匯任何觀點和立場
來源:https://www.zerodayinitiative.com/blog/2020/4/6/exploiting-the-tp-link-archer-c7-at-pwn2own-tokyo/<code>


分享到:


相關文章: