Tenda AC9 SetSystime 命令注入漏洞分析
0x10 前言
這個漏洞很有趣,其實在 18 年就已經報過了(后面一直沒修)

可以看到報了四個漏洞,但這些漏洞報的都是棧溢出。

但當我偶然接觸到這個設備的時候(Tenda AC9) 使用 Telnet 拿到 shell 后查看 PS 的時候發現

而我嘗試了一下發現,這里是可控的

并且這個命令確實執行了

于是我們就開始疑惑,因為在分析 httpd 的時候并沒有發現能夠執行命令的地方,沒有在 httpd 這個文件里發現doSystem這種函數來執行這個命令,但這個命令又一直存在于進程中。因此覺得這個漏洞或許很有趣,才有了下面的分析,這也幫助了挖到了 AX18 系列的命令注入漏洞。
0x20 漏洞分析
首先我們要知道,這個參數一定是從 web 端傳入進來的。因此我們首先就要去分析 httpd,我們仔細觀察這段代碼

我們發現他使用了 Cfm, 而根據我們挖掘 Tenda 設備的經驗來看,這個程序類似一個中間件,像 NVRAM 這種管理環境變量用的


而我們搜索全局字符串,發現sntp這個字符串同樣出現在了netctrl 這個文件里面 而在這個文件里面我們發現set_sntp_cfg 這個函數,在這個函數中我們又發現他連接了 Cfm 這個中間件。


通過對這個函數的分析我們發現他又調用了tp_sntp_handle 這個函數,而這個函數的實現是在libtpi.so 中實現的,我們跟過去分析發現

我們的命令是在這個函數里執行的。至此我們就找到了漏洞最終執行的地方了。我們整合調用鏈條就可以理清這個漏洞的邏輯
httpd send env -> cfm (cfm連接netctrl) -> netctrl 取 env 調用函數set_sntp_cfg -> tpi_sntp_handle -> doSystemCmd
而在這個漏洞中 netctrl 是通過 cfm 與 httpd 連接起來的
httpd -> cfm <- netctrl
0x30 總結
這個漏洞涉及了多個文件,挖掘以及使用污點分析匹配起來是很困難的(但也可以匹配),對于本漏洞數據傳遞過程為
httpd: 參數 netserver cfm: 中間件,環境變量 sntp_cfg netctrl: 連接cfm程序,set_sntp_cfg 獲取cfm中的環境變量并執行 libtpi.so: tp_sntp_handle 執行doSystem
而這個漏洞以及CVE-2022-28572這個漏洞有一個共同點,就是漏洞執行最終在 so 文件里面,而我們一般分析一個設備,大多數時間只關注他的主程序(大哥都挖爛了)而忽略了最容易出問題的地方。
因此我們想要挖出更多的漏洞或者想要自己的工具匹配到更多的漏洞,我們需要更多的去關注動態鏈接庫文件。