2017年6月11日hack2Win(網絡設備黑客競賽)舉辦首屆線上比賽,參賽選手可以通過網際網路連入D-Link Dir-850L路由器然後黑掉它,其中有一名選手實現了遠程任意代碼執行。D-Link官方在7月27日推出了Dir-850L 路由器1.47B07版本的補丁,地址:http://support.dlink.com/ProductInfo.aspx?m=DIR-850L。
現今公布了Hack2Win競賽中提交的3個漏洞的相關細節,地址:https://blogs.securiteam.com/index.php/archives/3364。
通過廣域網或區域網實現遠程代碼執行
通過廣域網或區域網實現遠程未授權信息洩露
通過區域網實現root用戶遠程代碼執行
這裡僅僅分析遠程命令執行的漏洞。
0x01 獲取源碼D-Link Dir-850L 路由器的固件可以從官方下載獲取,這裡下載1.14.B07版本的固件,地址: ftp://ftp2.dlink.com/PRODUCTS/DIR-850L/REVA/DIR-850L_REVA_FIRMWARE_1.14.B07_WW.ZIP。下載固件並解壓後,我們得到固件文件DIR850LA1_FW114b07WW.bin,利用binwalk提取固件內容。
上圖可以看到該固件採用的是Squashfs文件系統,從binwalk解壓出的文件中找到190090.squashfs文件,然後繼續用binwalk提取,得到如下內容
可以看出這是一個標準的linux文件根目錄。我們需要關注的是處理web服務的程序,該程序開啟各種服務埠,並且為外部訪問提供配置,修改等服務,文件存在於htdocs目錄下, 其中應用層的服務是用PHP語言編寫,也是本次分析需要重點關注的地方。
0x03 分析遠程命令執行漏洞要成功利用遠程代碼執行漏洞,需要組合未授權任意文件上傳漏洞和命令注入漏洞才能實現。
未授權任意文件上傳漏洞利用hedwig.cgi上傳xml文件,獲取管理員用戶名和密碼。當管理員接口設置改變時,會將改變的設置以xml的格式發送給hedwig.cgi,hedwig.cgi會調用htdocs/webinc/fatlady.php去載入設置。fatlady.php核心代碼如下:
foreach ($prefix."/postxml/module"){ del("valid"); if (query("FATLADY")=="ignore") continue; $service = query("service"); if ($service == "") continue; TRACE_debug("FATLADY: got service [".$service."]"); $target = "/htdocs/phplib/fatlady/".$service.".php"; $FATLADY_prefix = $prefix."/postxml/module:".$InDeX; $FATLADY_base = $prefix."/postxml"; if (isfile($target)==1) dophp("load", $target);
可以看出,fatlady.php直接將xml文件中的service拼接在了路徑中,沒有做任何校驗,然後直接加載文件,加載的文件以』.php』結尾,那麼可以構造service為../../../htdocs/webinc/getcfg/DEVICE.ACCOUNT.xml
讀取用戶名和密碼。
有了用戶名和密碼,可以登錄,然後利用NTP伺服器的命令注入漏洞實現命令執行。命令注入漏洞發生在/etc/services/DEVICE.TIME.php文件, 核心代碼如下:
$enable = query("/device/time/ntp/enable");if($enable=="") $enable = 0;$enablev6 = query("/device/time/ntp6/enable");if($enablev6=="") $enablev6 = 0;$server = query("/device/time/ntp/server");$period = query("/device/time/ntp/period"); if ($period=="") $period="604800";$period6 = query("/device/time/ntp6/period"); if ($period6=="") $period6="604800";$ntp_run = "/var/run/ntp_run.sh";if ($enable==1 && $enablev6==1){ if ($server=="") fwrite(a, $START, 'echo "No NTP server, disable NTP client ..." > /dev/console\n'); else { fwrite(w, $ntp_run, '#!/bin/sh\n'); fwrite(a, $ntp_run, 'echo "Run NTP client ..." > /dev/console\n'. 'echo [$1] [$2] > /dev/console\n'. 'STEP=$1\n'. 'RESULT="Null"\n'. 'xmldbc -s /runtime/device/ntp/state RUNNING\n'. 'SERVER4='.$server.'\n'. 'SERVER6=`xmldbc -g /runtime/device/ntp6/server | cut -f 1 -d " "`\n'. 'if [ "$STEP" == "V4" ]; then\n'. ' xmldbc -t "ntp:'.$period.':'.$ntp_run.' $STEP"\n'. ' echo "ntpclient -h $SERVER4 -i 5 -s -4" > /dev/console\n'. ' ntpclient -h $SERVER4 -i 5 -s -4 > /dev/console\n'.
可以看出通過$server變量直接拼接在了命令執行的代碼中,沒有做任何校驗,存在命令注入。那麼需要構造惡意的service數據,方法同獲取用戶的用戶名和密碼方式相似。首先,獲取DEVICE.TIME服務的xml文件格式
根據得到的xml文件格式,構造數據發送給hedwig.cgi加載服務, 設置服務enable=1, server為惡意命令,在23090埠開啟telnetd服務。
最後設置加載的服務生效,向pigwidgeon.cgi發送激活請求。
服務激活後,telnet遠程連接23090埠測試。
0x04 防禦方案官方針對此次漏洞已經推出了補丁,推薦下載官方補丁更新,詳情:http://support.dlink.com/ProductInfo.aspx?m=DIR-850L。或者,開啟防火牆,禁止外網訪問web服務,降低被黑的風險。
0x05 後記針對公布的Dir-850L路由器漏洞,官方發布了相應的補丁,但是Dir系列其他的路由器是否存在同樣漏洞呢?測試Dir-815路由器,發現存在相同漏洞的,然而官方並沒有及時推出補丁,地址: http://support.dlink.com/ProductInfo.aspx?m=DIR-815。根據以往Dir系列爆出的漏洞來看,猜測D-Link Dir系列多數路由器都是受該漏洞影響,建議大家開啟路由器防火牆,禁止外網訪問web服務或設置訪問地址白名單,以此降低被黑的風險,同時多關注官方的動態和安全補丁的發布,及時更新固件。