如何看懂USB Rubber Ducky摩斯密码渗出:Win_PoSH_MorseCode Payload完整解析
【免费下载链接】usbrubberducky-payloadsThe Official USB Rubber Ducky Payload Repository项目地址: https://gitcode.com/GitHub_Trending/us/usbrubberducky-payloads
Win_PoSH_MorseCode是 USB Rubber Ducky 官方 Payload 仓库中的一个摩斯密码渗出(Morse Code Exfiltration)Payload:它运行在 Windows 系统上,悄悄读取用户"我的文档"里的所有 txt 文件,然后用键盘指示灯(Scroll Lock)的长短闪烁,把文件内容翻译成摩斯密码"放"到屏幕上。没有弹窗、没有网络流量、没有声音——数据就以光的形式离开了受害者电脑。🦆
下面这篇指南带你完整拆解它的执行流程、摩斯码映射表和时序设计,并说明如何安全地观察与解码它。
一、这个 Payload 是做什么的?
一句话概括:把文件变成灯光秀。它是典型的"低带宽、零流量"渗出(数据外带)手法,核心价值不在于实用,而在于演示"数据渗出可以不用一根网线"。
| 项目 | 说明 |
|---|---|
| 作者 | Cribbit(1.2 版,从 BashBunny 仓库移植) |
| 目标系统 | Windows(PowerShell 5.1+) |
| 分类 | 数据渗出(Exfiltration) |
| 攻击模式 | HID & STORAGE(键盘模拟 + U盘存储双模式) |
| 渗出通道 | Scroll Lock 指示灯闪烁(短闪=点,长闪=划) |
| 渗出内容 | "我的文档"目录下所有.txt文件 |
核心文件都在 payloads/library/exfiltration/Win_PoSH_MorseCode/ 目录下:
- payload.txt:DuckyScript 主脚本(烧录进 Ducky 的文件)
- MorseCodeFileExfiltration.ps1:可读的 PowerShell 渗出逻辑
- b.txt:上面脚本的 base64 编码版(实际被调用)
- readme.md:官方说明与版本日志
二、工作原理:用滚动锁指示灯"说"摩斯密码
摩斯码映射表
脚本内部内置了一张完整的摩斯映射表(3代表点,9代表划):
| 字符 | 摩斯码 | 字符 | 摩斯码 | 字符 | 摩斯码 |
|---|---|---|---|---|---|
| E | 3 | A | 39 | T | 9 |
| S | 333 | I | 33 | O | 999 |
| N | 93 | V | 3339 | Z | 9933 |
| ... | ... | ... | ... | ... | ... |
覆盖0~9和A~Z共 36 个字符,超出范围的字符(如@)采用兜底策略:先闪一次 2700ms 的超长脉冲,再闪烁该字符 ASCII 码值的数字(@ = 64就闪64的摩斯码)。
时序设计(解码的关键)
flashy函数每次点亮 Scroll Lock、等待指定毫秒后再熄灭,形成"闪烁脉冲":
- 点(dot):3 × 100 =300ms短闪
- 划(dash):9 × 100 =900ms长闪
- 未知字符:2700ms超长闪(提示:下一个是数字编码)
- 每个字符结束后固定停顿600ms,空格则停顿1200ms
这种"用时间间隔编码数据"的思路,在仓库其他渗出 Payload 中也大量存在,比如基于 ICMP 时延的外带:
三、Payload 执行流程拆解
打开 payload.txt,整个流程分为 5 步:
- 声明双模式:
ATTACKMODE HID STORAGE,让 Ducky 既模拟键盘又暴露为 U 盘(脚本要存在 U 盘里)。 - 静默检测操作系统:内嵌 PASSIVE_WINDOWS_DETECT 扩展,通过统计主机配置请求次数被动判断是否 Windows,全程不打扰用户;判定结果写入
$_OS。 - 绿灯提示:
LED_GREEN表示已识别为 Windows,可观察 Ducky 指示灯判断执行状态。 - 打开运行对话框:
GUI r快捷键唤出 Win+R。 - 执行编码脚本:
STRINGLN输入一行 PowerShell 命令,用-encodedCommand参数执行 U 盘里 base64 编码的 b.txt:
powershell .(powershell.exe -encodedCommand (gc((gwmi win32_volume -f 'label=''DUCKY''').Name+'\b.txt')))注意它先用 WMI 查出卷标为DUCKY的盘符,再读取该盘上的b.txt,实现了"Payload 本体藏在 U 盘存储区"的HID & STORAGE 混合渗出。
Ducky 存储分区中渗出数据的典型场景长这样(另一渗出 Payload 的截图):
四、为什么用 base64 编码的脚本?
作者在 readme.md 中解释:base64 版本是为了绕过 PowerShell 脚本执行策略(Execution Policy)。如果你不想用编码版,仓库也给了明文替代方案:
RUN WIN "powerShell -Noni -NoP -W h -EP Bypass .((gwmi win32_volume -f 'label=''DUCKY''').Name+'payloads\$SWITCH_POSITION\MorseCodeFileExfiltration.ps1')"⚠️安全提示:官方特别强调——执行前请自行解码校验 base64 内容(
MorseCodeFileExfiltration.ps1就是可核对的明文版),防止编码 payload 被替换成恶意代码。这也是所有-encodedCommand类 Payload 的通病:审计门槛高。
解码后的 MorseCodeFileExfiltration.ps1 逻辑非常清晰:递归遍历"我的文档"中所有.txt→ 逐字符查摩斯表 → 调用flashy函数闪灯。
五、如何解码这些"灯光暗号"?
站在防守方视角,观察 + 简单工具就能还原:
- 肉眼观察:屏幕上无任何异常,只有 Scroll Lock 灯在"闪摩斯"。用秒表记录每次闪烁的时长,短(≈300ms)=点、长(≈900ms)=划、超长(≈2700ms)=未知字符标记。
- 查表还原:把点划序列对照标准摩斯表还原成
0~9 A~Z;遇到 2700ms 长闪后,把接下来的数字序列当作 ASCII 码值转回字符。 - 脚本记录:写一个监听 Scroll Lock 状态变化的脚本,把每次状态翻转的时间戳落盘,事后再离线解码——这正是"视觉渗出"可被检测的根本原因:时序信息会留在监控数据里。
六、局限性与同类 Payload 对比
作者自己承认:"这是一个受摩斯码限制、实用性不高的 Payload,但做出来很有意思"。它的短板:
- 只渗出
.txt文件,且必须先存到"我的文档" - 带宽极低:一个文件就要以秒为单位逐字符闪烁
- 只能被"人眼"或专门监控解码,无法自动接收
仓库里还有几个更"工程化"的同类思路可以对比:
| Payload | 渗出方式 | 特点 |
|---|---|---|
| Win_PoSH_PixelReflection | 屏幕左上角 1 像素窗口黑/白闪位 | 比特级、更隐蔽,同样是概念验证 |
| Win_Hid_ImgOverKey | 用大小写锁定键闪图片二进制 | 807 字节的图要闪约 7 分钟 |
| ClipBoard-Creep | 剪贴板 → 外部 Webhook | 自动接收,但会产生网络流量 |
带 Webhook 的自动接收是实用路线,数据到达攻击者端点后的样子如下:
七、防守方检查清单 🛡️
如果你担心内部存在这类"无声渗出"行为,可以按以下清单排查:
- 键盘指示灯行为:监控 Scroll Lock / Caps Lock 状态的异常高频翻转(正常用户很少反复按这些键)。
- PowerShell 命令行审计:
-encodedCommand、-EP Bypass、-NoP(NoProfile)组合出现即应告警;开启 PowerShell 脚本块日志(Script Block Logging)可完整还原解码后的命令。 - USB 设备策略:对无盘标或标为
DUCKY的可移动介质访问记录审计;HID + 存储双模式的 U 盘是 Ducky 类设备的典型特征。 - 文档区异常读操作:批量递归读取"我的文档"中所有 txt 文件的行为,可用 EDR 的文件读取监控捕获。
八、小结
Win_PoSH_MorseCode 是 USB Rubber Ducky 数据渗出家族里最"艺术化"的一员:
- HID & STORAGE 双模式+ 被动 OS 检测,让它在正确环境安静启动;
- 300ms/900ms/2700ms 三档脉冲构成完整的摩斯编码协议;
- base64 编码 + encodedCommand展示了一类真实攻击中常见的审计规避手法;
- 它证明了渗出通道可以完全不经过网络,也提醒我们:防守时别只盯流量,物理与视觉通道同样需要可观测性。
想动手复现或深入研究,建议先在隔离虚拟机中阅读 payload.txt 与 MorseCodeFileExfiltration.ps1 的对应关系,再对照时序表尝试手工解码——这比任何文档都直观。
【免费下载链接】usbrubberducky-payloadsThe Official USB Rubber Ducky Payload Repository项目地址: https://gitcode.com/GitHub_Trending/us/usbrubberducky-payloads
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考