VShell 基础设施指纹隐藏与访问控制代理 - 通过流量过滤和指纹阻断,保护 VShell C2 基础设施免受公开扫描和威胁情报追踪。
随着 NVISO 等安全厂商公开 VShell 后渗透工具分析报告,VShell 的网络特征指纹、通信模式和基础设施标识已被广泛公开。威胁情报机构如 Team Cymru、ThreatFox 等正在全球范围内追踪和标记 VShell C2 服务器。
vshell-firewall 是一个专门设计的反向代理防护系统,旨在:
- 🛡️ 隐藏 VShell 指纹 - 阻断已知的指纹识别请求,防止 C2 基础设施被自动化扫描发现
- 🔒 访问控制 - 基于地理位置、时间窗口、路径特征的多维度访问过滤
- 🎭 流量混淆 - 通过路由规则和响应定制,混淆真实的后端服务特征
- 📊 威胁感知 - 记录所有扫描和探测行为,提供威胁情报反馈
- 网络特征过滤 - 拦截针对 VShell stager(Windows/Linux/MacOS)的指纹探测
- 行为模式隐藏 - 阻断 beaconing 活动的特征识别请求
- 路径级访问控制 - 精细化的 HTTP 路径白名单/黑名单机制
- 自定义响应 - 为扫描请求返回伪装响应,混淆真实服务指纹
- GeoIP 过滤 - 拦截来自特定国家/地区的威胁情报扫描(如美国、欧洲等威胁追踪热点)
- 时间窗口限制 - 仅在指定时间段内允许连接,降低暴露时长
- 时区自定义 - 支持全球时区配置,匹配目标地区的活动时间
- 多端口监听 - 同时保护多个 VShell 实例,各自独立配置
- TCP 全协议支持 - 支持 VShell 的所有 TCP 通信模式(HTTP over TCP、长连接等)
- 智能超时策略 - 防护空连接攻击,同时保持合法长连接稳定
- 高效转发 - 低延迟的透明代理,不影响 VShell 正常通信性能
- 详细连接日志 - 记录所有连接尝试、地理位置、匹配规则
- 威胁行为追踪 - 识别并记录扫描器特征和探测模式
- 双重日志输出 - 同时输出到控制台和文件,支持持久化分析
当前支持:
- ✅ TCP - 支持所有基于 TCP 的后端服务(包括TCP长连接、WebSocket等)
未来计划(TODO):
- ⏳ KCP/UDP - 基于 KCP 协议的 UDP 通信
- ⏳ WebSocket - WebSocket 协议支持
Client --> vshell-firewall (多端口) --> Backend Services
Port 8880 -----> Backend:9991
Port 9880 -----> Backend:9992
Port 7880 -----> Backend:8000
代理服务可以同时监听多个端口,每个端口都有独立的:
- 后端服务地址
- 协议类型(auto/http/tcp)
- 超时配置
- 路由规则
# 克隆项目
git clone https://github.com/CRONUS-Security/vshell-firewall.git
cd vshell-firewall
# 构建二进制文件
make build
# 或构建带版本信息
make build-with-version为了启用地理位置过滤(强烈推荐),需要下载 MaxMind GeoIP2 数据库:
# 使用提供的脚本自动下载
./download-geoip.sh
# 或手动下载并放置到项目目录
# 下载地址:https://dev.maxmind.com/geoip/geolite2-free-geolocation-data详细的 GeoIP 配置说明请参阅 GEOIP.md。
复制示例配置并根据需求定制:
cp config.toml.example config.toml
vim config.toml典型防护配置示例:
[global]
buffer_size = 32768
log_level = "info"
log_file = "./vshell-firewall.log" # 记录所有访问尝试
# 地理位置防护:拦截威胁情报热点地区
[global.geoip]
enabled = true
database_path = "./GeoLite2-Country.mmdb"
block_regions = ["US", "EU", "JP"] # 美国、欧洲、日本的威胁追踪活跃
# 时间窗口:仅在目标活动时间开放(UTC+8 示例)
[global.time_window]
enabled = true
timezone = "Asia/Shanghai"
start_time = "09:00" # 上午 9 点开始
end_time = "18:00" # 下午 6 点结束
# VShell C2 监听器
[[listeners]]
name = "vshell_c2_main"
listen_port = ":443" # 对外端口(伪装成 HTTPS)
backend_addr = "127.0.0.1:9991" # VShell 实际监听端口
protocol = "tcp"
[listeners.timeout]
enabled = true
initial_read = 30 # 30 秒初始超时,防止空连接扫描
connect_backend = 5 # 5 秒后端连接超时
# 路径防护规则(针对 HTTP 探测)
[[listeners.routes]]
path = "/favicon.ico"
action = "drop"
response = "404" # 拦截常见的指纹探测请求
[[listeners.routes]]
path = "/robots.txt"
action = "drop"
response = "404"
[[listeners.routes]]
path = "/"
action = "allow" # 允许根路径(VShell 正常通信)手动运行:
# 前台运行(测试)
./build/vshell-firewall
# 指定配置文件
./build/vshell-firewall -config /path/to/config.toml
# 查看版本信息
./build/vshell-firewall -version系统服务部署(生产环境推荐):
# 安装为 systemd 服务
sudo make install-service
# 启动服务
sudo systemctl start vshell-firewall
# 设置开机自启
sudo systemctl enable vshell-firewall
# 查看运行状态
sudo systemctl status vshell-firewall
# 查看实时日志
sudo journalctl -u vshell-firewall -f[global]
buffer_size = 32768 # TCP 缓冲区大小(字节)
log_level = "info" # 日志级别:debug, info, warn, error
log_file = "./vshell-firewall.log" # 日志文件路径(强烈建议配置)日志记录:
- 配置
log_file后,日志会同时输出到控制台和文件 - 包含时间戳、来源 IP、地理位置、匹配规则等详细信息
- 用于事后审计和威胁情报分析
[global.geoip]
enabled = true # 强烈建议启用
database_path = "./GeoLite2-Country.mmdb" # GeoIP2 数据库路径
block_regions = ["US", "EU", "JP", "GB"] # 拦截的国家/地区列表推荐拦截地区:
US- 美国(大量威胁情报机构和安全研究机构)EU- 欧洲(NVISO、Team Cymru 等追踪活跃地区)GB- 英国(网络安全研究热点)JP- 日本(APT 研究活跃)AU- 澳大利亚(五眼联盟成员)
支持国家代码(ISO 3166-1 alpha-2)和大洲代码。详细配置参阅 GEOIP.md。
[global.time_window]
enabled = true # 启用时间窗口控制
timezone = "UTC" # 时区:UTC, Asia/Shanghai, America/New_York 等
start_time = "09:00" # 开放开始时间(HH:MM)
end_time = "18:00" # 开放结束时间(HH:MM)使用策略:
- 根据目标的活动时间设置窗口(如工作时间)
- 非活动时段完全拒绝新连接,降低被扫描概率
- 支持跨天配置(如
23:00-02:00) - 窗口外不影响已建立的连接
每个 VShell 实例可以独立配置防护策略:
[[listeners]]
name = "vshell_instance_1" # 监听器名称(用于日志标识)
listen_port = ":443" # 对外暴露端口
backend_addr = "127.0.0.1:9991" # VShell 实际监听地址
protocol = "tcp" # 协议:tcp(VShell 标准)多实例示例:
# 主 C2 服务器
[[listeners]]
name = "primary_c2"
listen_port = ":443"
backend_addr = "127.0.0.1:9991"
protocol = "tcp"
# 备用 C2 服务器
[[listeners]]
name = "backup_c2"
listen_port = ":8443"
backend_addr = "127.0.0.1:9992"
protocol = "tcp"[listeners.timeout]
enabled = true # 启用超时防护
initial_read = 30 # 初始读取超时(秒),0 = 无限制
connect_backend = 5 # 后端连接超时(秒),0 = 无限制超时策略说明:
-
enabled = true+initial_read > 0- 推荐配置- 防止扫描器使用空连接探测
- 真实流量到达后自动移除超时
- 支持 VShell 的长连接通信
-
enabled = false- 完全无超时- 适用于确定无扫描威胁的内网环境
- 节省资源但失去空连接防护
路由规则按顺序匹配,支持前缀匹配和精确匹配:
[[listeners.routes]]
path = "/slt" # 路径(前缀匹配)
action = "drop" # 动作:drop(拦截)或 allow(放行)
response = "404" # 拦截时的响应类型响应类型:
404- 返回 404 Not Found(伪装成不存在)403- 返回 403 Forbidden(显示禁止访问)502- 返回 502 Bad Gateway(伪装成网关错误)close- 直接关闭连接(无响应,更隐蔽)
VShell 指纹防护规则示例:
# 拦截常见的 Web 指纹探测
[[listeners.routes]]
path = "/favicon.ico"
action = "drop"
response = "404"
[[listeners.routes]]
path = "/robots.txt"
action = "drop"
response = "404"
# 拦截已知的 VShell 探测路径(根据威胁情报更新)
[[listeners.routes]]
path = "/slt"
action = "drop"
response = "404"
[[listeners.routes]]
path = "/swt"
action = "drop"
response = "404"规则匹配顺序:
- 规则按配置顺序从上到下匹配
- 第一个匹配的规则生效
- 最后建议添加兜底规则(如拦截所有其他路径)
根据 NVISO 报告,以下是威胁情报机构追踪 VShell 的主要手段:
-
网络指纹检测规则
- Windows/Linux/MacOS stager 的网络特征
- Beaconing 活动的流量模式
- 特定的 HTTP 头部和响应特征
-
基础设施追踪
- Team Cymru 的全球网络监控
- ThreatFox 的 IOC 数据库
- 被动 DNS 和证书透明度日志
-
自动化扫描
- Shodan、Censys、Zoomeye 等搜索引擎
- 安全厂商的主动探测
- 蜜罐和诱捕系统
| 检测手段 | 防护措施 | 配置项 |
|---|---|---|
| 网络指纹扫描 | 路径过滤 + 自定义响应 | listeners.routes |
| 地理位置追踪 | GeoIP 拦截热点地区 | global.geoip |
| 持续监控 | 时间窗口限制暴露 | global.time_window |
| 空连接探测 | 初始超时防护 | listeners.timeout.initial_read |
| 批量扫描 | 连接日志分析 | global.log_file |
-
多层防御组合
启用 GeoIP + 时间窗口 + 路径过滤 + 超时防护 -
定期更新拦截规则
- 关注威胁情报更新(NVISO、Google Cloud 等报告)
- 根据日志分析调整路径过滤规则
- 更新 GeoIP 数据库(每月)
-
日志审计与分析
- 定期检查
log_file中的异常访问 - 识别新的扫描器特征和探测模式
- 统计被拦截的地区和路径分布
- 定期检查
-
隐藏部署
- 使用常见端口(443、8080)伪装
- 配置 TLS 证书(通过 nginx/caddy 前置)
- 避免使用默认配置和明显的服务名称
-
基础设施隔离
- VShell 后端仅监听 127.0.0.1
- 通过 vshell-firewall 统一对外暴露
- 使用独立的网络和防火墙策略
vshell-firewall 的日志包含丰富的连接信息:
2025/12/09 10:23:45.123456 [INFO] [vshell_c2] New connection from 203.0.113.10:54321
2025/12/09 10:23:45.234567 [INFO] [vshell_c2] GeoIP: US (United States) - BLOCKED
2025/12/09 10:23:45.345678 [INFO] [vshell_c2] Connection dropped: blocked region
2025/12/09 10:24:10.123456 [INFO] [vshell_c2] New connection from 192.168.1.100:45678
2025/12/09 10:24:10.234567 [INFO] [vshell_c2] GeoIP: CN (China) - ALLOWED
2025/12/09 10:24:10.345678 [INFO] [vshell_c2] HTTP Request: GET / HTTP/1.1
2025/12/09 10:24:10.456789 [INFO] [vshell_c2] Route matched: / -> allow
2025/12/09 10:24:10.567890 [INFO] [vshell_c2] Connected to backend 127.0.0.1:9991
关键指标:
- 被拦截的地区分布(识别扫描来源)
- 被拦截的路径统计(发现新的探测模式)
- 连接时间分布(优化时间窗口配置)
# 根据实际负载调整缓冲区大小
[global]
buffer_size = 65536 # 高流量场景增大缓冲区
# 降低日志级别减少 I/O
log_level = "warn" # 生产环境仅记录警告和错误问题:无法连接到后端 VShell
# 检查后端是否监听
netstat -tlnp | grep 9991
# 检查 vshell-firewall 日志
tail -f /var/log/vshell-firewall.log问题:合法流量被拦截
# 临时禁用 GeoIP(调试)
[global.geoip]
enabled = false
# 检查路由规则匹配顺序
# 确保 allow 规则在 drop 规则之前问题:服务无法启动
# 检查端口占用
sudo lsof -i :443
# 检查配置文件语法
./build/vshell-firewall -config config.toml-
合法使用
- vshell-firewall 设计用于合法的红队演练和渗透测试
- 使用前确保获得明确的授权和许可
- 遵守当地法律法规和行业规范
-
数据保护
- 日志文件可能包含敏感信息,注意权限管理
- 定期清理或加密历史日志
- 使用
log_level = "warn"减少敏感数据记录
-
配置安全
- 保护
config.toml文件(chmod 600) - 定期更新 GeoIP 数据库
- 审查和更新拦截规则
- 保护
-
网络隔离
- VShell 后端应仅监听本地回环地址
- 使用防火墙限制 vshell-firewall 的访问来源
- 避免在公共云环境直接暴露
- GitHub: CRONUS-Security/vshell-firewall
- 许可证: MIT License
- 维护者: CRONUS-Security
欢迎提交 Issue 和 Pull Request:
- 报告 Bug 和安全漏洞
- 建议新功能和改进
- 分享部署经验和最佳实践
- 提供新的威胁情报和拦截规则
免责声明: 本工具仅供安全研究和合法授权的渗透测试使用。使用者应对自己的行为负责,开发团队不承担任何滥用导致的法律责任。