ICRT Blog 使用了含有已知漏洞的 WordPress 導致可 RCE - HITCON ZeroDay

Vulnerability Detail Report

Vulnerability Overview

  • ZDID: ZD-2020-00698
  •  發信 Vendor: 台北國際社區廣播電台
  • Title: ICRT Blog 使用了含有已知漏洞的 WordPress 導致可 RCE
  • Introduction: 使用了含有已知漏洞的 Wordpress 導致可 RCE

處理狀態

目前狀態

公開
Last Update : 2020/09/30
  • 新提交
  • 已審核
  • 已通報
  • 未回報修補狀況
  • 未複測
  • 公開

處理歷程

  • 2020/07/31 02:15:33 : 新提交 (由 Cyku 更新此狀態)
  • 2020/08/02 22:27:53 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2020/08/03 19:22:10 : 審核完成 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2020/08/03 19:22:10 : 修補中 (由 HITCON ZeroDay 服務團隊 更新此狀態)
  • 2020/09/30 03:00:02 : 公開 (由 HITCON ZeroDay 平台自動更新)

詳細資料

  • ZDID:ZD-2020-00698
  • 通報者:kanade86514 (Cyku)
  • 風險:高
  • 類型:使用已知含漏洞之元件 (Using Known Vulnerable Components)

參考資料

系統使用已存在漏洞的元件,攻擊者可以利用該漏洞執行惡意指令,甚至操控系統。

漏洞說明: OWASP - Top 10 - 2017 A9 - Using Components with Known Vulnerabilities
https://www.owasp.org/index.php/Top_10-2017_A9-Using_Components_with_Known_Vulnerabilities
(本欄位資訊由系統根據漏洞類別自動產生,做為漏洞參考資料。)

相關網址

http://www.icrt.com.tw/wordpress/

敘述

目標使用了含有已知弱點 CVE-2018-20148 的 WordPress 4.7.2 開源軟體,
該版本的 WordPress 在 XML-RPC 功能中存在一個函式 wp.getMediaItem,
該函式未正確檢查檔案路徑,導致可傳入 phar:// URL 觸發任意反序列化 ,
最終可能導致攻擊者可以執行任意系統指令。

參考資料:
https://medium.com/@knownsec404team/extend-the-attack-surface-of-php-deserialization-vulnerability-via-phar-d6455c6a1066

前置條件

觸發此弱點必須登入一組至少有 Author 權限的帳號 (可以上傳圖片、附件檔案),
經過 recon 之後,發現目標存在一組 Author 權限帳號「joeychou」並使用弱密碼「1******2」。
( 保護當事人,因此將密碼打碼 )

截圖佐證

圖片

分析

雖然可以透過 phar 進行任意反序列化,
但要達成 RCE 需要目標存在可以利用的 gadget chain,
而在原生 WordPress 中尚未被發現一條可以直接利用的 gadget chain,
因此需要針對目標尋找可利用的物件,
經過觀察後發現目標安裝了 Jetpack 4.2.2 插件,
而恰好在此插件的原始碼中就發現了可以利用的 gadget。

在 Jetpack 4.2.2 中有一個 Jetpack 類別,定義了 __destruct 魔術方法可以作為我們 gadget chain 的起點,
可以看到在 do_stats 函式中,如果 $this->stats 陣列裡的物件是陣列,
就會執行 implode 函式將元素串接成字串,這可以進一步觸發 __toString 魔術方法的呼叫。

class Jetpack {
    function __destruct() {
        if ( ! empty( $this->stats ) ) {
            $this->do_stats( 'server_side' );
        }
    }

    function do_stats( $method = '' ) {
        if ( is_array( $this->stats ) && count( $this->stats ) ) {
            foreach ( $this->stats as $group => $stats ) {
                if ( is_array( $stats ) && count( $stats ) ) {
                    $args = array( "x_jetpack-{$group}" => implode( ',', $stats ) );
                    if ( 'server_side' === $method ) {
                        self::do_server_side_stat( $args );
                    } else {
                        echo '<img src="' . esc_url( self::build_stats_url( $args ) ) . '" width="1" height="1" style="display:none;" />';
                    }
                }
                unset( $this->stats[ $group ] );
            }
        }
    }
}

而在另一個 Crunion_Contact_Form_Shortcode 類別中定義了 __toString,
其中會對成員 $this->attributes 以 foreach 進行遍歷,
這可以進一步觸發任何繼承自 ArrayIterator 的物件的 current 函式被呼叫。

class Crunion_Contact_Form_Shortcode {
    function __toString() {
        $r = "[{$this->shortcode_name} ";

        foreach ( $this->attributes as $key => $value ) {
            // .. 略 ..
    }
}

透過上述兩個物件的 gadget chain,
就可以接入 WordPress 內建已知可利用的 Requests_Utility_FilteredIterator 類別,
觸發任意函式呼叫,達成 Remote Code Execution。

class Requests_Utility_FilteredIterator extends ArrayIterator {

    protected $callback;

    public function current() {
        $value = parent::current();
        $value = call_user_func($this->callback, $value);
        return $value;
    }
}

備註

另外感謝 @vtim 的協助,使得能順利發現此弱點。

修補建議

1.
立即針對使用弱密碼的帳號進行密碼修改,並盤點確認所有帳號的密碼均使用高強度的密碼。
建議可要求包含大小寫英文、數字及特殊符號,並且長度須大於 12 碼。

2.
將 WordPress 更新至最新版本

擷圖

留言討論

聯絡組織

 發送私人訊息
您也可以透過私人訊息的方式與組織聯繫,討論有關於這個漏洞的相關資訊。
;