華文網

WordPress 4.6遠端代碼執行漏洞

關於WordPress

WordPress是一個注重美學、易用性和網路標準的個人資訊發佈平臺。

WordPress雖為免費的開源軟體,但其價值無法用金錢來衡量。

使用WordPress可以搭建功能強大的網路資訊發佈平臺,但更多的是應用於個性化的博客。針對博客的應用,WordPress能讓您省卻對後臺技術的擔心,集中精力做好網站的內容。

根據w3techs.com對WordPress網站的即時市場份額統計,WordPress占所有使用內容管理系統的網站的58.9%。大約占所有網站的27.9%左右。

漏洞概述

漏洞編號:CVE-2016-10033

漏洞發現者:dawid_golunski

漏洞危害:嚴重

影響版本:4.6

漏洞描述:遠端攻擊者可以利用該漏洞執行代碼

漏洞細節

這個漏洞主要是PHPMailer漏洞(CVE-2016-10033)在WordPress Core代碼中的體現,該漏洞不需要任何的驗證和外掛程式,在預設的配置情況下就可以利用。遠端攻擊者可以利用該漏洞執行代碼。由於該漏洞影響比較大,通過和官方協商,

決定推遲更新wordpress漏洞細節。

漏洞代碼

WordPress 根據SERVER_NAME 伺服器頭設置電子郵件域,當WordPress wp_mail()函數被調用來發送電子郵件時(例如,使用者註冊,忘記密碼等)。可以看到from是這樣的

然後將其過濾並傳遞到PHPMailer的易受攻擊的setFrom()函數中,相關細節請回顧:

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code -exec-CVE-2016-10033-Vuln.html

注入

可以在Apache的預設配置上操作SERVER_NAME伺服器頭。Web伺服器(最常見的WordPress部署)通過HTTP請求中的HOST頭。

為了驗證這點,請看vars.php請求與回應的演示

我們可以看到,在HOST標頭檔中附加到主機名稱的INJECTION字串 複製到HTTP_HOST和SERVER_NAME PHP變數。

使用這個HOST頭的例子,如果攻擊者觸發了wp_mail()函數

通過使用WordPress的忘記密碼功能,HTTP請求將類似於

並將導致以下參數傳遞到/ usr / sbin / sendmail:

這裡需要注意的是第三個參數。電子郵件的功能變數名稱部分匹配請求的HOST頭,小寫“inject”除外。

繞過過濾

為了利用PHPMailer的mail()注入漏洞,攻擊者會將參數附加到域部分。但是,過濾/驗證這個地方(在wordpress方面以及PHPMailer庫方面)都會

防止攻擊者注入空字元(空格或TAB),

因此從注入參數到sendmail binary 。

例如,如果攻擊者將HOST頭修改為以下內容:

驗證將導致無效的域部分錯誤,並且WordPress應用程式將退出http回應:

在這種情況下,PHPMailer函數永遠不會被執行(sendmail binary 不會被執行)

PHPMailer庫的validateAddress()函數以及PHP的filter_var / FILTER_VALIDATE_EMAIL都符合RFC 822標準

詳細請查看:

http://php.net/manual/en/filter.filters.validate.php

它禁止域部分中的空格,從而防止注入的附加參數到/ usr / sbin / sendmail。

應該注意的是注入額外的 反斜線到電子郵件的用戶名部分

http://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

對於攻擊者來說,在這種情況下電子郵件的用戶名部分很難利用。

RFC 822和注釋語法

根據查看RFC 822規範,找到繞過驗證的一種潛在的方法:

https://www.ietf.org/rfc/rfc822.txt

電子郵寄地址可以包含注釋

該檔給出了一個電子郵件示例,其中括弧中有注釋:

作為有效的電子郵件,域內部分的簡化注釋示例:

john@example.com(comment)

經過進一步測試,結果發現注釋部分可以包含空格在功能變數名稱部分,可以作為一種繞過的方式。將驗證域部分注入附加參數到sendmail binary。

通過注釋語法注入參數

以下請求與HOST頭設置為:

不會觸發錯誤,測試以下參數發送郵件 :

我們已經設法繞過Wordpress篩檢程式的驗證以及PHPMailer的內部setFrom()驗證。

我們現在可以控制第四個參數('inject')並且可以注入。如果需要,參數3和參數5之間有更多的參數。在理論上,我們現在應該可以注入額外的參數到/ usr / sbin / sendmail包裝器 從而實現任意代碼執行。

通過Sendmail MTA執行代碼

迄今為止,唯一已知的方法是通過遠端執行代碼執行PHPmailer(),PHPmailer()依賴於目標系統上的Sendmail MTA

最常見的Sendmail MTA向量類似於:

它通常通過輸入資訊寫入一個包含php後門的日誌檔

然而,這種技術有兩個問題:

1)

Sendmail MTA不再常用,我們可以通過查看來驗證

http://www.securityspace.com/s_survey/data/man.201703/mxsurvey.html

這表明Sendmail在Linux MTA中最不受歡迎。它不附帶任何現代的Linux發行版本。

2)

上述的Sendmail技術在這種情況下不起作用。如前所述,主機名稱複製到SERVER_NAME伺服器變數被轉換成小寫,因此被注入Sendmail參數在請求中類似於:

將出現以下一組sendmail參數:

Sendmail會失敗並出現錯誤,因為這裡參數是區分大小寫的,而-q和-x都不會工作。

通過Exim4 MTA執行代碼

PHPMailer和其他電子郵件庫中的漏洞同樣也可以利用Exim4 MTA執行代碼,基本格式如下

-be開關啟用字串擴展測試模式。上述擴展執行/ bin / true並返回值

同樣,以下將執行id命令:

注意:在使用Exim4的系統上,/ usr / sbin / sendmail只是一個符號連結:/ usr / sbin / sendmail - > exim4與Sendmail MTA無關。

這個點可以可靠的方式實現執行命令

$ run expand指定為參數,不需要將檔寫入/ var / www / html或猜測目錄路徑

未完待續...

POC

PoC演示視頻

修復建議

更新到最新版本或者4.7以上版本

參考

https://legalhackers.com/

https://exploitbox.io/

https://youtu.be/ZFt_S5pQPX0

https://w3techs.com/technologies/details/cm-wordpress/all/all

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

https://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2016-10074-Vuln.html

通過注釋語法注入參數

以下請求與HOST頭設置為:

不會觸發錯誤,測試以下參數發送郵件 :

我們已經設法繞過Wordpress篩檢程式的驗證以及PHPMailer的內部setFrom()驗證。

我們現在可以控制第四個參數('inject')並且可以注入。如果需要,參數3和參數5之間有更多的參數。在理論上,我們現在應該可以注入額外的參數到/ usr / sbin / sendmail包裝器 從而實現任意代碼執行。

通過Sendmail MTA執行代碼

迄今為止,唯一已知的方法是通過遠端執行代碼執行PHPmailer(),PHPmailer()依賴於目標系統上的Sendmail MTA

最常見的Sendmail MTA向量類似於:

它通常通過輸入資訊寫入一個包含php後門的日誌檔

然而,這種技術有兩個問題:

1)

Sendmail MTA不再常用,我們可以通過查看來驗證

http://www.securityspace.com/s_survey/data/man.201703/mxsurvey.html

這表明Sendmail在Linux MTA中最不受歡迎。它不附帶任何現代的Linux發行版本。

2)

上述的Sendmail技術在這種情況下不起作用。如前所述,主機名稱複製到SERVER_NAME伺服器變數被轉換成小寫,因此被注入Sendmail參數在請求中類似於:

將出現以下一組sendmail參數:

Sendmail會失敗並出現錯誤,因為這裡參數是區分大小寫的,而-q和-x都不會工作。

通過Exim4 MTA執行代碼

PHPMailer和其他電子郵件庫中的漏洞同樣也可以利用Exim4 MTA執行代碼,基本格式如下

-be開關啟用字串擴展測試模式。上述擴展執行/ bin / true並返回值

同樣,以下將執行id命令:

注意:在使用Exim4的系統上,/ usr / sbin / sendmail只是一個符號連結:/ usr / sbin / sendmail - > exim4與Sendmail MTA無關。

這個點可以可靠的方式實現執行命令

$ run expand指定為參數,不需要將檔寫入/ var / www / html或猜測目錄路徑

未完待續...

POC

PoC演示視頻

修復建議

更新到最新版本或者4.7以上版本

參考

https://legalhackers.com/

https://exploitbox.io/

https://youtu.be/ZFt_S5pQPX0

https://w3techs.com/technologies/details/cm-wordpress/all/all

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10045-Vuln-Patch-Bypass.html

https://legalhackers.com/advisories/PHPMailer-Exploit-Remote-Code-Exec-CVE-2016-10033-Vuln.html

https://legalhackers.com/advisories/SwiftMailer-Exploit-Remote-Code-Exec-CVE-2016-10074-Vuln.html