天天看點

Elasticsearch 遠端任意代碼執行

轉自:http://xxrenzhe.blog.51cto.com/4036116/1532469

起因:

公司使用的是Ucloud的雲主機服務,今天上午突然被告知有一台伺服器的出口流量激增,對外發包量短時間内達到了100萬,而且都是UDP類型的,第一感覺就是:诶呀,莫不是被黑了,被當殭屍電腦了呀!

探究:

立馬登入對應的伺服器,首先使用iftop檢視流量狀況

Elasticsearch 遠端任意代碼執行
Elasticsearch 遠端任意代碼執行

可以看出出口流量好吓人,1分鐘内累計700M流量,查了一下這2個IP位址,一個是在美國,一個是在浙江電信;

趕緊檢視正在運作的程序,找出疑似程序,還真有所發現:

Elasticsearch 遠端任意代碼執行
[.ECC6DFE919A382]這個程序還想冒充系統程序,疑點極大,而且/tmp/freeBSD也是一個很奇怪的東西,而498這個UID對應的使用者是elasticsearch,想起來昨天部署了Elasticsearch + Logstash,以實作日志統計系統,不會是ES有bug吧,繼續檢視原因
Elasticsearch 遠端任意代碼執行

懷疑/tmp/freeBSD就是被挂馬的程式,可惜已經被删除了,無法檢視了

原因:

罪魁禍首查出來了,細緻的原因還需要詳查,是以現在最重要的就是解決問題,迅速kill掉相關程序,再次檢視iftop發現流量迅速回落了,更加證明了我們的判斷;

接下來就需要查找被劫持挂馬的原因和具體的劫持方式,以絕後患,而通過外部搜尋引擎也是很快就定位了問題的原因,就是“Elasticsearch遠端任意代碼執行”漏洞:

  • ElasticSearch有腳本執行(scripting)的功能,可以很友善地對查詢出來的資料再加工處理; ElasticSearch用的腳本引擎是MVEL,這個引擎沒有做任何的防護,或者沙盒包裝,是以直接可以執行任意代碼。;
  • 而在ElasticSearch 1.2之前的版本裡,預設配置是打開動态腳本功能的,是以使用者可以直接通過http請求,執行任意代碼。;
  • 其實官方是清楚這個漏洞的,在文檔裡有說明: 
  • First, you should not run Elasticsearch as the root user, as this would allow a script to access or do anything on your server, without limitations. Second, you should not expose Elasticsearch directly to users, but instead have a proxy application inbetween.

終于找到原因,那就解決吧

解決方案:

法一:手動關閉ES遠端執行腳本的功能,即在每一個ES節點的配置檔案elasticsearch.yml中添加如下一行即可

1

script.disable_dynamic: 

true

然後重新開機ES即可;

法二:更新ES至1.2版本以上也可,因為在ES1.2版本中已預設關閉了遠端執行腳本的功能,但需考慮與Logstash的相容性問題;

後續:

繼續閱讀