CVE-2020-10882 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

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

  • 數據包類型一:
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)

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()(漏洞處)

第一部分:將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)執行

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

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'>>z10個字節 數字:shell會將數字解釋爲文件描述符 特殊字符"."或";"的無法寫入 printf '1'>x12個字節,無法添加額外的“>” 創建一個僅包含字符“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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章