【漏洞預警】AXIS大量攝像頭產品多個連環漏洞利用,影響嚴重

FLy_鵬程萬里發表於2018-07-04

近日白帽匯安全研究院關注到,Axis攝像頭被報存在一系列安全漏洞。該漏洞可使攻擊者在連環利用多個漏洞後獲取root 許可權shell進行遠端命令執行或直接進行拒絕服務或獲取敏感資訊。該漏洞影響Axis從1.x 到8.x 眾多系列390 多個型號(具體版本詳情見附件)。安全監控攝像頭作為服務於安全使用的裝置,卻存在如此之多的安全漏洞,是用來監控還是被“監控”令人深思。

Axis產品專注於安全監視和遠端監控應用領域,在全球的20個國家和地區開設有分支機構,並與超過70個國家和地區的合作伙伴展開合作。根據華順信安FOFA系統資料顯示,目前全網共有  25908個系統對外開放。Axis的使用受眾數量龐大,該漏洞將影響眾多的企業單位使用者,相關企業、使用者需要高度重視。

 AXIS網路攝像頭全球網路資產分佈情況(僅為分佈情況,非漏洞影響情況

 

AXIS網路攝像頭中國網路資產分佈情況(僅為分佈情況,非漏洞影響情況

漏洞原理與危害

這些漏洞將直接導致攻擊者可訪問攝像頭視訊流,凍結攝像頭視訊流,控制攝像頭 – 將鏡頭移動到需要的位置,開啟/關閉 運動檢測,將此攝像頭納入殭屍網路中,替換攝像頭的軟體,使用攝像頭作為網路的滲透點(進行橫向移動),渲染無用的攝像頭,使用攝像頭執行其他惡意的任務(如 DDOS 攻擊,挖礦等)。

以下為相關漏洞分析:

0x01 授權繞過漏洞(CVE-2018-10661)--連環利用第一步

此漏洞允許攻擊者傳送未通過身份驗證的請求到 /bin/ssid 的 .srv 功能來繞過 web 伺服器的授權機制,而無需提供使用者憑證。

當收到 http://CAMERA_IP/index.html/a.srv 的 HTTP 請求時,會出現以下(抽象的)邏輯。

1.
當 Apache httpd 解析 URI 請求時,他在請求的 request_rec 結構體中設定以下成員欄位。

  • uri = “/index.html/a.srv”
  • filename = “/usr/html/index.html” # 假設 web 根目錄是 /usr/html
  • path_info = “/a.srv”

2.對 web 根目錄下的檔案訪問由 Axis 自定義的授權程式碼 so 模組控制(由於 httpd 配置檔案中的 /usr/html 目錄指令中需要 axis-group-file 指令)。

3.既然請求獲得了授權,那麼配置的 <LocationMatch “.+.(shtml|shtm|srv)($|&)”> 指令與 URI(我們請求的完整 uri,見上文)進行正則匹配。因為通過正規表示式匹配到的 URI 都是以 .srv 結尾,因此呼叫 .srv 處理程式碼 – “TransferMime /var/run/ssid/ssidsocket” 處理。它的功能是將請求傳輸到 /var/run/ssid/ssidsocket unix 套接字,以便 /bin/ssid 程式處理。

4.隨後,/bin/ssid 程式接收到這個請求檢查其(完整的)URI,並將請求視為對 .srv 檔案的合法請求 —— 允許請求到達 .srv 功能。

為了展示能夠到達 /bin/ssid 的 .srv 功能,我們傳送一個帶有 return_page 引數的請求。這是用於 HTTP 重定向的一個特殊引數。 當引數值(字串 “it_worked”)出現在響應中,我們就知道了我們已經到達了 /bin/ssid 的 .srv 功能。

 

 

 

0x02 .srv 功能使用者不受限制的 dbus 訪問 (CVE-2018-10662) -- 連環利用第2步

達到 /bin/ssid 的 .srv 功能的合法請求可以通過在請求的查詢字串中設定操作引數來選擇其中的一個功能。其中的一個功能是 dbus,它允許使用者以 root(/bin/ssid 程式的 uid 和 gid) 許可權呼叫任何 dbus 請求,並且不會受到目的地或者內容的限制。由於是來自 root 程式的 dbus 請求 —— 被授權不受限制的訪問許多 dbus 服務介面。之所以會這樣,是因為旨在限制此類請求的授權機制 PliocyKit 被配置成為來自 root 的請求自動授予訪問權。

 

檢視 PolicyKit.conf 手冊得知,/etc/PolicyKit/PolicyKit.conf 最初設定為 “yes” 意味著已授予許可權。

雖然 /bin/ssid 中 的 dbus 介面僅用於從某些特定的啟用了 dbus 的服務中獲取特定值,但是它暴露了更廣泛的功能,從而產生了安全後果。

例如,該介面允許使用者控制裝置 parhand 引數的任意值。可以通過傳送 dbus 請求來呼叫 policykit_parhand 程式的 dbus-interface (PolicyKitParhand)函式來實現。這個介面提供了可由 root dbus-client 呼叫的 SetParameter 和 SynchParameter 方法。通過在執行 SynchParameter 後面的 SetParameter,使用者可以設定任意的 parhand 引數值並應用更改。

 

在存在此漏洞的攝像頭上執行這些命令後,視訊的左上方會疊加一張圖片(預設是 Axis 的小標誌)。可以登入到 web 介面檢視:

 

 

0x03 shell 命令注入漏洞 (CVE-2018-1066) -- 連環利用第3步

需要有修改引數 parhand 的許可權才能利用這個漏洞。這可以通過以下幾步實現:

  1. 獲得/擁有管理員許可權(通過使用 cgi 介面)
  2. 在 upnp 守護程式中執行程式碼
  3. 找到其他方法來控制 parhand 引數 —— CVE-2018-10662 在直接呼叫 policykit_parhand 函式的示例中實現了這一點(見上文)。

parhand 引數處理程式負責獲取、儲存、更改裝置的許多內部引數。當使用者通過 web 介面設定引數時,相關的 CGI 指令碼(param.cgi) 轉發設定引數請求到二進位制檔案 parhand,它檢查訪問許可權,並將引數值儲存在相關的配置檔案中。

一些引數用於提供 shell 指令碼,並被定義為 shell 掛載(在 parhand 配置檔案中 mount =“shell()”)。引數值由 parhandshell 解析器解析,它不清理特殊的 shell 字元,也不引用引數值。其中的一些引數(例如,我們使用的 Time.DEST.Enable)以 shell 賦值的格式(例如,FOO=Bar)儲存在配置(例如,/etc/sysconfig/openntpd.conf)檔案末尾。之後,shell 初始化指令碼(例如,parhand-systemctl restart time-source.service),它們作為設定命令的結果執行,該命令在為引數應用新值時執行 —— 通過 sync 命令。

shell 指令碼直接執行配置檔案(目的是包含配置引數),並且通過使用分號(“;”)設定引數值,使我們能夠以 root 許可權注入任意命令。

這個漏洞的關鍵因素在於:

  • 解析 shell 環境中輸入值時缺乏過濾
  • 裝置使用了一個過時的方法,使用 shell 指令碼去是設定引數並將它們以 shell 賦值的方式存貯在檔案中,然後執行這些檔案。

請注意這些引數不僅能夠通過攝像頭的 upnp 守護程式設定。如果攻擊者恰巧有能力在 UPnP 守護程式中執行程式碼,也能利用這個漏洞來提升許可權。

 

 

 

0x04 使 httpd 程式崩潰 (CVE-2018-10664)

這個漏洞允許未授權的攻擊者擊崩 httpd 程式 —— 導致(至少)使用預設配置的使用者通過 web 介面檢視到的視訊介面為黑屏狀態。

在觸發這個漏洞後,系統日誌會出現以下一行(接下來是崩潰轉儲)。

[ ERR     ] kernel: [ 2819.017996] httpd: httpd: potentially unexpected fatal signal 11.

POC

這個漏洞通過向 .cgi 指令碼 URL 傳送帶有 PATH_INFO 引數並以 .srv 擴充結束的 HTTP 請求觸發。

0x05 /bin/ssid 程式資訊洩露漏洞 (CVE-2018-10663)

這個漏洞不需要任何使用者憑證。使用者控制著在 /bin/ssid 的 .srv 功能中的查詢字元 return_page 和 servermanager_return_page。當在響應構建程式碼處理時 —— 這些欄位的值被縮減為 0x200 位元組,並通過使用安全的 __snprintf_chk 函式複製到已分配的 0x200 位元組的空間。然後 __snprintf_chk 函式的返回值(假設它們的長度)儲存在結構體成員變數中,以便以後計算響應的內容長度。

 

__snprintf_chk 的返回值儲存在結構體成員變數的 IDA 截圖(部分)

_snprint_chk 函式的返回值的問題在於,“The number of characters that would have been written if n had been sufficiently large…”(摘自 sprintf 的手冊)。這導致計算出來的內容的長度大於實際資料的大小,因此,記憶體中額外的位元組會洩露在響應中。

 

 

 

0x06 使 /bin/ssid 程式崩潰 (CVE-2018-10658)

這個漏洞不需要任何使用者憑證。未認證的使用者能夠傳送帶有特殊的字元 dbus 請求致使 ssid 服務崩潰。崩潰源於 libbus-send.so 共享物件或相似的程式碼中。它生成的日誌如下:

[ INFO ] ssid[2334]: process 2334: arguments to dbus_message_new_method_call() were incorrect, assertion “iface == NULL || _dbus_check_is_valid_interface (iface)” failed in file ../../dbus-1.10.14/dbus/dbus-message.c line 1373.

程式崩潰同樣出現在直接呼叫帶有相似字元的 “/usr/bin/dbus-send“ 時。他可能還影響到包含這些程式碼其他程式。值得注意的是 /bin/ssid 程式將會重啟。

 

0x07 使 /bin/ssid 程式崩潰 (CVE-2018-10659)

未授權使用者可以傳送(通過 /bin/ssid .srv 介面)特殊構造的命令,該命令將呼叫 UND undefined ARM 指令(MIPS 或者其他架構的攝像頭可能也有類似的情況),這樣導致程式崩潰。值得注意的是 /bin/ssid 程式將會重啟。

在觸發這個漏洞以後會出現以下的日誌:

[ ERR     ] kernel: [ 2390.374778] ssid: ssid: potentially unexpected fatal signal 11.

這個漏洞不需要任何的使用者憑證。

 

 

 

CVE編號

CVE-2018-10661 
CVE-2018-10662  
CVE-2018-1066  
CVE-2018-10664 
CVE-2018-10663  
CVE-2018-10658  
CVE-2018-10658  

漏洞影響產品列表

 

 

 

漏洞POC

目前,FOFA客戶端已經支援該相關漏洞的POC。

 

漏洞修復及建議

1。將攝像頭恢復到出廠設定,在重新設定裝置後,把攝像頭直連到網際網路之前執行韌體升級。你可以使用 Axis 裝置管理器,攝像頭的 web 介面或者 FTP。在 https://www.axis.com/en-in/support/tecnical-notes/how-to-upgrade頁面檢視廠商關於韌體更新的說明。

白帽匯會持續對該漏洞進行跟進。後續可以關注本連結。

 

相關文章