このブログは、3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。
あるもりすぶろぐの内容は個人の意見です。
CVE-2020-14207の検証
自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。
今回のArmoris日記では、とあるサイトでPoCを発見したCVE-2020-14207についての検証を行います。
CVE-2020-14207はWordPressのDiveBookというプラグインに存在する脆弱性です。現在、このプラグインの開発は止まっており、当該脆弱性の修正はなされていない状態です。
脆弱性の概要はプラグインのfilter_diverパラメーターが適切にサニタイズされていなかったためSQLiが発生するというものです。
脆弱性情報:WPScan
該当プラグイン:DiveBook
影響を受けるバージョン:DiveBook <= 1.1.4 latest version
検証環境
検証に使用した環境と各種バージョンは以下のとおりです。
Name |
Version |
UbuntuServer |
20.04 |
DiveBook |
1.1.4 |
WordPress |
5.6 |
検証環境の準備
まずはVagrantを使用してUbuntuServerとWordPressの環境を構築します。
$ cat Vagrantfile
Vagrant.configure(2) do |config|
config.vm.box = "generic/ubuntu2004"
config.vm.provider "libvirt"
config.vm.network "forwarded_port", guest: 80, host: 6588, host_ip: "172.20.100.120"
end
$ vagrant up
次に仮想環境のIPアドレスを確認してhostファイルを編集後にAnsibleを実行します。
$ vagrant ssh-config
Host default
HostName 192.168.121.138
User vagrant
Port 22
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /home/ubuntu/DiveBook/.vagrant/machines/default/libvirt/private_key
IdentitiesOnly yes
LogLevel FATAL
$ cat host
[server]
192.168.121.138 ansible_ssh_user=vagrant ansible_ssh_private_key_file=./.vagrant/machines/default/libvirt/private_key ansible_python_interpreter=/usr/bin/python3
$ ansible-playbook -i host wp.yml -v
今回も普段使用している以下のymlファイルを用いてWordPressの環境を構築します。
---
- hosts: server
vars:
- dbname: wordpress
- dbuser: wordpress
- dbpassword: wordpress
- db_conf_name: define( 'DB_NAME', 'wordpress' );
- db_conf_user: define( 'DB_USER', 'wordpress' );
- db_conf_password: define( 'DB_PASSWORD', 'wordpress' );
tasks:
- name: Add apt repository
apt_repository:
repo: ppa:ondrej/php
become: yes
- name: Update apt cache
apt: update_cache=yes cache_valid_time=3600
become: yes
- name: set password for root
shell: echo "mariadb-server-10.1 mysql-server/root_password password root" | sudo debconf-set-selections
become: yes
- name: set password for root
shell: echo "mariadb-server-10.1 mysql-server/root_password_again password root" | sudo debconf-set-selections
become: yes
- name: install mariadb
apt:
name: mariadb-server
state: present
become: yes
- name: enable and start mariadb
systemd:
name: mysql
enabled: yes
state: started
become: yes
- name: Install required software
apt:
name:
- libmysqlclient-dev
- python3-pip
- python-setuptools
- build-essential
- libssl-dev
- libffi-dev
- python-dev
become: yes
- name: install MySQLclient
pip:
name: mysqlclient
state: present
become: yes
- name: create db
mysql_db:
name={{ dbname }}
state=present
encoding=utf8
login_user=root
become: yes
- name: create and grant a database user
mysql_user:
name={{ dbuser }}
password={{ dbpassword }}
priv="{{ dbuser }}.*:ALL"
state=present
become: yes
- name: Install apache and php modules
apt:
name:
- apache2
- libapache2-mod-php7.2
- php7.2-gd
- php7.2-json
- php7.2-mysql
- php7.2-pdo
- php7.2-curl
- php7.2-mbstring
- php7.2-xml
- php7.2-zip
- php7.2-opcache
become: yes
- name: Download WordPress
get_url:
url=https://wordpress.org/latest.tar.gz
dest=/tmp/wordpress.tar.gz
validate_certs=no
- name: Extract WordPress
unarchive: src=/tmp/wordpress.tar.gz dest=/var/www/ copy=no
become: yes
- name: Update default Apache site
lineinfile:
dest=/etc/apache2/sites-enabled/000-default.conf
regexp="(.)+DocumentRoot /var/www/html"
line="DocumentRoot /var/www/wordpress"
become: yes
- name: Copy sample config file
command: mv /var/www/wordpress/wp-config-sample.php /var/www/wordpress/wp-config.php creates=/var/www/wordpress/wp-config.php
become: yes
- name: Update WordPress config file DB_NAME
lineinfile: >-
dest='/var/www/wordpress/wp-config.php'
backrefs=yes
regexp='^(?=.*DB_NAME).*$'
line={{ db_conf_name }}
become: yes
- name: Update WordPress config file DB_USER
lineinfile: >-
dest='/var/www/wordpress/wp-config.php'
backrefs=yes
regexp='^(?=.*DB_USER).*$'
line={{ db_conf_user }}
become: yes
- name: Update WordPress config file DB_PASSWORD
lineinfile: >-
dest='/var/www/wordpress/wp-config.php'
backrefs=yes
regexp='^(?=.*DB_PASSWORD).*$'
line={{ db_conf_password }}
become: yes
- name: restart apache
service: name=apache2 state=restarted
become: yes
WordPressの構築が完了したらDiveBookプラグインを導入します。
vagrant@ubuntu2004:~$ wget https://downloads.wordpress.org/plugin/divebook.1.1.4.zip
vagrant@ubuntu2004:~$ unzip divebook.1.1.4.zip
vagrant@ubuntu2004:~$ sudo cp -r divebook /var/www/wordpress/wp-content/plugins/
WordPressにログイン後プラグインを有効化して準備完了です。
検証
現在脆弱性が修正されていない状態であり、WPScanでPoCが公開されていないためArmoris日記で詳しいPoCの解説は行いません。
まずはデフォルトのHello World!
ページを編集して以下の内容を入力し、DiveBookプラグインを使用できる状態にします。
[divebook]divebook_display();[/divebook]
以下の画像はプラグインを埋め込んだ状態です。
次にパラメーターを変更したURLにアクセスすることで以下のように使用しているDBのバージョン情報が表示されます。
その他にも別のパラメーターを使用することで以下のようにDBのデータを表示することができます。
おわりに
今回検証したように、プラグインの開発が終了しているなどの理由により、見つかった脆弱性が修正されていないことが多くあります。
プラグインやソフトウェアを導入する際は使いやすさだけでなく、開発が継続的に行われているか、コミュニティが活発に活動しているかなども気にかけるようにすると良いのではないでしょうか。
自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。