
你是否曾在电影中见过这样的场景:黑客将一个看似普通的U盘插入电脑,瞬间窃取数据?今天,你将亲手打造一个能够实现同样功能的设备。
⚠️ 声明:
本项目中的所有内容仅供安全研究目的使用。
2022年夏天,我开始着手构建一个能从目标电脑中提取数据的设备。但究竟如何部署恶意软件并窃取信息呢?在以下章节中,我将逐步讲解创建自定义击键注入工具所涉及的关键步骤、基本概念以及技术细节。虽然本项目专门针对WiFi凭证,但你可以轻松修改负载以实现更高级或更恶意的目的——真正的限制只在于你的创造力和技术专长。
随着时间的推移,该项目已发展壮大,包含了多种脚本和工具。它最初是为了演示Rubber Ducky的能力而创建的——具体来说,是使用树莓派Pico(RPi Pico)的经济型版本。目前,该项目的主要两部分是:
物理接触目标已解锁的电脑。
电脑必须能够访问互联网,以便通过SMTP通过网络介质发送被盗数据。
对于Linux漏洞利用,需要知道受害者电脑的密码。
创建pico-ducky后,你只需将修改后的负载(针对Windows漏洞利用调整了你的SMTP信息,以及/或者针对Linux漏洞利用调整了密码和U盘名称)复制到RPi Pico上。
[!NOTE]
你也可以使用Rubber Ducky来构建此工具,但请注意,RPi Pico售价约4美元,而Rubber Ducky售价80美元。
然而,虽然pico-ducky是一个经济实惠的解决方案,但Rubber Ducky在隐蔽性和使用最新版DuckyScript方面更具优势。
为了在RPi Pico上使用Ducky Script编写负载,你需要先将其转换为pico-ducky。请按照这些简单步骤来创建pico-ducky。
击键注入工具一旦连接到主机,就会通过运行模拟用户输入的击键代码来执行恶意命令。它看起来像是一个U盘,但实际上就像一个键盘,会自动输入预编程的负载。像Rubber Ducky这样的工具每分钟可以输入超过1000个单词。一旦创建,任何拥有物理接触的人都可以轻松部署该负载。
负载使用STRING命令来处理注入的击键。它接受一个或多个字母数字/标点符号字符,并按原样将剩余的行输入到目标机器中。ENTER/SPACE将模拟键盘按键的按下操作。
我们使用DELAY命令来暂时暂停负载的执行。当负载需要等待某个元素(如命令行)加载完成时,这非常有用。在刚开始时,当新的USB设备连接到目标电脑时,使用延迟尤其重要。最初,电脑必须完成一系列操作后才能开始接受输入命令。对于HID设备而言,设置时间非常短。大多数情况下,只需几分之一秒,因为驱动程序是内置的。但在某些情况下,较慢的PC可能需要更长时间才能识别pico-ducky。一般建议根据你的目标调整延迟时间。
数据窃取是指未经授权将数据从电脑/设备中转移出去。一旦数据被收集,攻击者可以将其打包,通过加密或压缩等方式避免在通过网络发送数据时被检测到。两种最常见的数据窃取方式是:
要使用Windows负载(payload1.dd),你无需在引脚之间连接杜邦线。
一旦密码被导出到.txt文件,负载将使用Yahoo SMTP将数据发送到指定的电子邮件。有关更详细的说明,请访问以下链接。此外,负载模板需要更新你的SMTP信息,即需要更新RECEIVER_EMAIL、SENDER_EMAIL以及你的电子邮件PASSWORD。此外,你也可以更新邮件的正文和主题。
[!NOTE]
通过电子邮件发送数据后,
.txt文件会被删除。你也可以使用其他邮件提供商的SMTP,但需要注意在负载中写入正确的SMTP服务器和端口号。
请注意,某些网络可能会在防火墙中阻止未知SMTP的使用。
要使用Linux负载(payload2.dd),你需要在GND和GPIO5之间连接一根杜邦线,以符合RPi Pico上code.py中的代码。关于如何在RPi Pico上设置多个负载的更多信息,请访问此链接。
图1:Linux上的漏洞利用
一旦密码从电脑中导出,数据将保存到指定的U盘中。为了使此负载正常工作,需要更新U盘的正确名称,即在两个位置将USBSTICK替换为你的U盘名称。
此外,你还需要在负载中更新Linux的PASSWORD,共有三处。如上所述,要使此漏洞利用成功,你需要知道受害者Linux机器的密码,这降低了攻击的可行性。
要运行wifi_passwords_print.sh脚本,你需要用正确的U盘名称更新该脚本,之后可以在终端中输入以下命令:
echo PASSWORD | sudo -S sh wifi_passwords_print.sh USBSTICK
其中PASSWORD是你的账户密码,USBSTICK是你的USB设备名称。
NetworkManager基于连接配置文件的概念,并使用插件来读写数据。它采用.ini风格的keyfile格式并存储网络配置配置文件。keyfile是一个支持NetworkManager所有连接类型和功能的插件。这些文件位于/etc/NetworkManager/system-connections/。基于keyfile格式,负载使用grep命令配合正则表达式来提取感兴趣的数据。对于文件过滤,使用了修改过的正向预查断言((?<=keyword))。正向预查断言会在字符串的特定位置进行匹配,即紧跟在keyword之后的位置,而不将该文本本身作为匹配的一部分,而正则表达式(?<=keyword).*将匹配keyword之后的任何文本。这使得负载能够匹配SSID和psk(预共享密钥)关键字之后的值。
关于NetworkManager的更多信息,这里有一些有用的链接:
以下是窃取并格式化后的受害者机器数据示例,保存在.txt文件中。
Rubber Ducky相对于RPi Pico的优势之一在于,它插入后不会显示为USB大容量存储设备。电脑只会将其识别为USB键盘。这不是RPi Pico的默认行为。如果你想防止RPi Pico插入时显示为USB大容量存储设备,需要在引脚18(GND)和引脚20(GPIO15)之间连接一根杜邦线。更多详情请访问此链接。
💡 提示:
- 在连接引脚之前,请先将负载上传到RPi Pico。
- 不要焊接引脚,因为你很可能在某个时候需要更改/更新负载。
创建有效的负载文件时,你可以使用writer.py脚本,或者手动修改模板文件。要成功运行该脚本,除了脚本文件名外,还需要传入操作系统名称(windows或linux)以及负载文件名称(例如payload1.dd)。以下是如何运行writer脚本创建Windows负载的示例。
python3 writer.py windows payload1.dd
只需稍作修改,之前使用的脚本也可以适配到Bash Bunny上运行。Bash Bunny通过模拟受信任的USB设备来工作[1]。对于本项目,我们将使用以下命令将其配置为模拟闪存存储设备[1, 2]:
ATTACKMODE HID STORAGE
使用DuckyScript的ATTACKMODE命令,我们可以定义Bash Bunny应模拟的设备类型[1]。每种攻击模式都使用唯一的USB供应商ID(VID)和产品ID(PID)向系统注册[1]。也可以将多种攻击模式组合在一起。
图2:Bash Bunny Mark I插入电脑
Bash Bunny支持原始的DuckyScript命令,因此我可以重用Rubber Ducky部分的脚本。要内联使用这些命令,我们需要在它们前面加上QUACK命令[1]。例如,我们不再写WINDOWS r,而是写Q WINDOWS r。
要将负载加载到Bash Bunny上,设备必须设置为arming模式(开关位置3——最靠近USB插头的那一个)[1]。连接后,将payload.txt和exfil.txt复制到payloads\switch1。负载文件必须命名为payload.txt[1,2],而负载引用的任何辅助文件可以自由命名。
作为参考,Bash Bunny的大容量存储目录结构如下[2]:
BashBunny/
├── loot/
│ └── (从负载中窃取的数据将保存在这里)
└── payloads/
├── library/
│ └── (可重用脚本或模块)
├── switch1/
│ ├── payload.txt
│ └── (可选文件,例如exfil.txt,脚本等)
└── switch2/
├── payload.txt
└── (可选文件)
图3:Bash Bunny大容量存储目录结构
脚本执行完毕后,结果将保存在loot\wifi_pass.txt中。如果目标电脑没有保存任何WiFi密码,该文件将为空。
[!NOTE]
由于Bash Bunny攻击依赖于PowerShell脚本(
exfil.txt),因此它只能在Windows系统上使用。要在Linux上使用类似方法,你需要修改负载,将PowerShell脚本替换为上面Linux部分提到的Bash脚本。
此pico-ducky目前仅适用于Windows操作系统。
此攻击需要物理接触已解锁的设备才能成功部署。
Linux漏洞利用成功的可能性远低于Windows,因为要成功,你不仅需要物理接触已解锁的设备,还需要知道Linux机器的管理员密码。
机器的防火墙或网络防火墙可能会阻止通过网络介质发送被盗数据。
由于用于部署攻击的不同电脑速度各异,负载延迟可能不适当。
pico-ducky设备并不隐蔽,实际上恰恰相反,它非常笨重,尤其是当你焊接引脚时。
此外,pico-ducky设备在运行相同脚本时明显比Rubber Ducky慢。
如果Caps Lock处于开启状态,部分负载代码将无法执行,导致漏洞利用失败。
如果电脑设置为非英语环境,此漏洞利用将不会成功。
目前,pico-ducky不支持DuckyScript 3.0,只能使用DuckyScript 1.0。如果你需要3.0版本,则必须使用Rubber Ducky。对于此漏洞利用,3.0版本不是必需的!