franckferman/p0wnyShellX
GitHub: franckferman/p0wnyShellX
一款用于授权红队行动的多态 PHP webshell 生成器,每次运行生成特征完全唯一的 shell,规避静态特征检测。
Stars: 4 | Forks: 0
[](LICENSE)
[](https://www.python.org/)
[](https://www.php.net/)
[](https://github.com/franckferman/p0wnyShellX/releases)
[](https://github.com/franckferman/p0wnyShellX/actions)
**用于授权红队行动的多态 PHP webshell 生成器。**
*每次运行生成唯一的 shell。没有任何两次部署共享相同的特征。*
## 什么是 p0wnyShellX
p0wnyShellX 是一个用于后渗透 PHP webshell 的**多态生成器**,基于 [p0wny-shell](https://github.com/flozz/p0wny-shell) 分叉并进行了深度扩展。
原始的 p0wny-shell 及大多数衍生版本发布的是一个**静态文件** —— 每次部署在字节级上完全一致,这使得 YARA/AV/SIEM 检测变得轻而易举。p0wnyShellX 解决了这个问题:与其使用静态 webshell,不如运行一个 Python 生成器,它每次都会生成一个**唯一的 PHP 文件**,其中包含随机化的函数名、路由 token、垃圾代码、bcrypt 哈希凭据、CSS 主题以及可配置的 AJAX 传输层。
```
flowchart LR
A["python3 p0wnyShellX.py\n-p "MyPass!" -o shell.php"]
subgraph engine ["Polymorphic Engine"]
B1["Random function names\nPHP + JS — 250+ pool"]
B2["Random routing tokens\n?x4r9tz=k2m8jvn"]
B3["Bcrypt hash — cost=12\nplaintext never stored"]
B4["Junk functions\n20–80 decoys per run"]
B5["CSS theme\n3 camouflage themes"]
B6["Shuffled exec order\nnew chain per build"]
B7["AJAX transport\nplain / mimic / rc4"]
end
C["shell.php\nunique signature — never the same"]
A --> engine
engine --> C
style engine fill:#0d1117,stroke:#27ae60,color:#ccc
style A fill:#111,stroke:#27ae60,color:#ccc
style C fill:#111,stroke:#27ae60,color:#27ae60
```
## 功能对比
| 功能 | p0wny-shell | p0wnyShellX |
|---|---|---|
| 身份验证 | 无 | 登录表单 + session |
| 密码存储 | — | bcrypt cost=12 (通过 `password_verify`) |
| 时序安全的身份验证 | — | 针对用户名的 `hash_equals` + `password_verify` |
| 静态特征 | 是 — 每次部署完全相同 | **否** — 每次部署都是唯一的 |
| 函数名 | 固定 (`featureShell` 等) | 从 250+ 个业务名称池中随机选取 |
| JS 变量名 | 固定 | 随机 |
| HTML 元素 ID | 固定 | 随机 token |
| 路由 endpoint | 固定的 `?feature=shell` | 随机 token (例如 `?x4r9tz=k2m8jvn`) |
| 垃圾代码 | 无 | 20–80 个动态生成的诱饵函数 |
| Exec 回退顺序 | 固定 | 每次运行随机打乱 |
| CSS 伪装 | 透明的 webshell | 伪装的监控仪表板 (3 种主题) |
| 文件中的密码 | — | 仅包含 bcrypt 哈希 — 绝不存储明文 |
| 可重现构建 | 是 (静态) | 通过 `--seed` 标志 |
## 与 Weevely 对比
[Weevely](https://github.com/epinna/weevely3) 是红队人员首选的 CLI webshell。这两个工具解决的是不同的问题 —— 它们可以互补。
| 功能 | Weevely | p0wnyShellX |
|---|---|---|
| 身份验证 | MD5(password) 作为 XOR 密钥 | bcrypt cost=12 + `password_verify` |
| 多态性 | 变量打乱 + 随机字符串块 | 业务名称、路由 token、垃圾函数、bcrypt salt、exec 执行顺序 |
| 通信 | POST body 中使用 XOR+gzip+base64,经过混淆的 header/footer | POST body 中使用 Base64,随机化的路由 token |
| 界面 | Python CLI 客户端 | 浏览器终端 — 操作者机器上无需安装工具 |
| 伪装 | 纯 PHP 代码片段 | 伪装的监控仪表板 (3 种主题) |
| 模块 | 30+ (反向 shell、SQL、网络扫描、代理…) | Shell、上传、下载、Tab 补全 |
| Exec 方法 | 9 种 — `exec`, `shell_exec`, `system`, `passthru`, `popen`, `proc_open`, `pcntl_fork`, `python_eval`, `perl_system` — 已打乱 | 5 种 — `exec`, `shell_exec`, `system`, `passthru`, `popen` — 每次构建随机打乱 |
| `disable_functions` 绕过 | 是 — mod_cgi + `.htaccess` (仅限 Apache,需要 `AllowOverride` + 写入权限) | 否 — 未计划作为优先事项;该技术需要 Apache + mod_cgi + AllowOverride + web 可写目录,这在生产环境中极少能同时满足 |
| 反向 shell | 是 | 否 (已规划) |
| 日志清理 | 是 | 否 (已规划) |
| 端口扫描 | 是 | 否 (已规划) |
| SQL 控制台 | 是 | 否 |
**适用 Weevely 的场景**:你需要 CLI 自动化、模块生态系统 (SQL、反向 shell、扫描),或者经过混淆的 HTTP 传输比视觉伪装更重要。
**适用 p0wnyShellX 的场景**:浏览器访问是你唯一的选项,每次部署具有唯一的特征是首要任务,或者主题化伪装有助于 shell 在人工目视检查中存活。
## 多态性是如何工作的
### 1. 函数名随机化
每个 PHP 和 JS 函数都会被分配一个从 250+ 个看似真实的业务名称池中随机提取的名称 (`archiveReplicationLog`, `fetchComplianceStatus`, `validateSchemaCompatibility`…)。每次运行都会生成一个新的映射。
```
# Run 1 # Run 2
function archiveReplicationLog function validateSchemaCompatibility
function fetchComplianceStatus function computePipelineThroughput
```
池中的名称刻意做得很通用 —— 它们与任何真实的监控仪表板、CMS 插件或企业级 PHP 应用中的函数没有区别。针对 `fetchClusterStatus` 或 `validateCertificateChain` 编写 YARA 规则会在合法代码库中产生大量误报,使得此类规则在生产环境中根本无法使用。唯一可检测的痕迹是 `p0wnyShellX.py` 内部的名称池本身 —— 但生成器永远不会接触目标。部署后的 shell 仅包含从该池中提取的 15–20 个名称,没有留下任何可识别的模式。
除此之外,垃圾函数和随机化的路由 token 增加了更多的干扰:每次构建看起来都像是一个不同的应用程序,而不是同一个工具的变种。
### 2. 路由 token 随机化
AJAX 路由参数 `?feature=` 及其值 (`shell`, `hint`, `pwd`, `upload`) 将被在构建时生成的随机字母数字 token 替换,并连贯地注入到 PHP 和 JS 中。
```
# 原始 (static, detectable)
POST /?feature=shell
# 生成 (每次 run 唯一)
POST /?x4r9tz=k2m8jvn
POST /?x4r9tz=p3nq7as
```
### 3. Bcrypt 密码哈希
生成器在构建时调用 PHP 来计算密码的 `bcrypt cost=12` 哈希。该哈希被嵌入到生成的文件中;永远不会出现明文。由于 bcrypt salt 是随机的,即使密码相同,每次运行生成的哈希值也不同。
```
# 生成文件中存储的内容:
define('PHSH_R7VX2', '$2y$12$oEYz4jk/0pa1K...');
# Auth check:
function validateClusterState(string $login, string $pass): bool {
return hash_equals($login, AUSR_5KQP) && password_verify($pass, PHSH_R7VX2);
}
```
### 4. 动态垃圾代码
每次运行都会生成 20 到 80 个诱饵 PHP 函数,这些函数取自 20 个主体模板 × 250+ 种名称组合,并带有随机化的返回值、循环计数和字符串字面量。它们散布在功能核心周围,以增加噪声比例。
## 环境要求
- **Python 3.8+**
- **PHP 8.x CLI** — 供生成器在构建时用于计算 bcrypt 哈希
```
# Verify
python3 --version
php --version
```
## 安装
```
git clone https://github.com/franckferman/p0wnyShellX
cd p0wnyShellX
```
无需安装任何依赖项。`p0wnyShellX.py` 仅使用 Python 标准库。
## 使用方法
```
python3 p0wnyShellX.py [OPTIONS]
```
### 选项
| 标志 | 简写 | 默认值 | 描述 |
|---|---|---|---|
| `--password` | `-p` | `changeme666` | 登录密码 |
| `--user` | `-u` | `sysadmin` | 登录用户名 |
| `--output` | `-o` | `shell.php` | 输出文件路径 |
| `--junk` | `-j` | 随机 20–80 | 垃圾函数的数量 (最大 200) |
| `--theme` | `-t` | 随机 | CSS 主题: `infra-dark`, `corporate-blue`, `matrix` |
| `--seed` | `-s` | — | 固定 RNG 种子,用于生成可重现的输出 |
| `--no-junk` | — | false | 禁用垃圾函数生成 |
| `--transport` | — | `plain` | AJAX 编码: `plain` / `mimic` / `rc4` |
### 示例
```
# Minimal — 仅 password
python3 p0wnyShellX.py -p "MyPass123!" -o shell.php
# Full control
python3 p0wnyShellX.py \
-p "MyPass123!" \
-u operator \
-j 60 \
-t matrix \
-o /tmp/shell_$(date +%s).php
# Reproducible (跨 run 输出相同 — 用于测试)
python3 p0wnyShellX.py -p "MyPass123!" --seed 42 -o shell.php
# Minimal output (无垃圾数据,生成最快)
python3 p0wnyShellX.py -p "MyPass123!" --no-junk -o shell.php
# Corporate blue theme,自定义 username
python3 p0wnyShellX.py -p "MyPass123!" -u webmaster -t corporate-blue -o shell.php
# Mimic mode — 随机 param names,标准 base64,融入正常 web 流量
python3 p0wnyShellX.py -p "MyPass123!" --transport mimic -o shell.php
# RC4 mode — RC4 + shuffled base64 alphabet,每次 build 唯一,WAF-blind
python3 p0wnyShellX.py -p "MyPass123!" --transport rc4 -o shell.php
```
## Shell 命令
部署并通过身份验证后,该 shell 支持:
| 命令 | 描述 |
|---|---|
| `<任意命令>` | 执行 shell 命令,并显示输出 |
| `cd /path` | 更改工作目录 (跨命令保持不变) |
| `download /path/to/file` | 将文件下载到浏览器 |
| `upload /remote/path` | 通过浏览器对话框上传本地文件 |
| `clear` | 清除终端输出 |
| `Tab` | 自动补全文件和命令 |
| `↑ / ↓` | 命令历史导航 |
| `Ctrl+L` | 清屏 |
| `Ctrl+C` | 取消当前输入 |
| `Ctrl+U` | 清除输入行 |
## CSS 主题
| 主题 | 外观 | 适用场景 |
|---|---|---|
| `infra-dark` | 深色背景上的绿色 — "Resource Monitor" | 常规 Linux 基础设施 |
| `corporate-blue` | 深色背景上的蓝色 — "InfraOps Console" | 企业环境 |
| `matrix` | 黑色背景上的绿色 — "SysCore Terminal" | 高对比度 / 经典风格 |
省略 `--theme` 可让生成器在每次运行时随机选择一个。
## Exec 回退链
该 shell 每次运行都会以随机顺序尝试执行方法 (这是特征差异的另一个来源):
- `exec()`
- `shell_exec()`
- `system()` + 输出缓冲
- `passthru()` + 输出缓冲
- `popen()` + `fread()`
如果第一个方法被 `disable_functions` 禁用,它会自动回退到下一个方法。
## CI/CD
每次推送到版本标签 (`v*.*.*`) 都会触发 GitHub Actions 工作流,它会:
1. 安装 Python 3.11 和 PHP 8.3
2. 使用默认凭据生成一个示例 shell
3. 运行 `php -l` 语法验证
4. 验证是否不存在静态特征
5. 发布一个 GitHub Release,并将 `p0wnyShellX.py` 和示例 shell 作为资产附件
在每次推送/PR 时,CI 还会运行多态性验证套件:
- 生成 7 个 shell (包含所有主题、垃圾代码级别和传输模式)
- 检查所有的 PHP 语法
- 确认没有保留静态特征
- 确认连续两次运行产生不同的输出
- 验证 mimic 传输使用随机化的参数名称
- 验证 rc4 传输注入了 `tEnc`/`tDec` 并且没有明文参数名称
## 安全提示
- 生成文件中的 bcrypt 哈希在没有暴力破解的情况下是不可逆的
- 针对用户名的 `hash_equals` 可防止时序预言机攻击
- `password_verify` 在进行密码比较时是常量时间的
- Session 使用了 `cookie_httponly`, `use_strict_mode`, `cookie_samesite: Lax`
- 密码错误会触发 400–700 毫秒的随机延迟 (防暴力破解)
## 交互式命令构建器
**[franckferman.github.io/p0wnyShellX](https://franckferman.github.io/p0wnyShellX/)** — 基于浏览器的工具,用于配置并复制 `p0wnyShellX.py` 命令。包含预设选项卡 (快速、infra-dark、corporate、matrix、minimal) 以及带有 password/user/theme/transport/junk/output 输入项的实时自定义构建器。
## 法律免责声明
本工具仅供**授权的渗透测试、红队交战和安全研究使用**。仅对你拥有或获得明确书面许可进行测试的系统使用它。未经授权对你不拥有的系统使用是非法行为。作者对滥用行为不承担任何责任。
## 许可证
GNU Affero General Public License v3.0 — 见 [LICENSE](LICENSE)。
标签:OpenVAS, PHP, Python, WebShell, 数据可视化, 无后门, 逆向工具