exfil_auto_eof_detect扩展详解:USB Rubber Ducky数据渗出结束检测完全指南
【免费下载链接】usbrubberducky-payloadsThe Official USB Rubber Ducky Payload Repository项目地址: https://gitcode.com/GitHub_Trending/us/usbrubberducky-payloads
exfil_auto_eof_detect是 USB Rubber Ducky 官方 Payload 仓库(README.md)中payloads/extensions/目录下的一个核心扩展,用于在 USB HID 数据渗出(Keystroke Reflection)过程中自动检测渗出何时结束。它通过轮询 CapsLock / NumLock 的状态变化判断数据流是否走完,是构建"纯键盘 HID 渗出"Payload 的关键组件。
一、什么是数据渗出结束检测?
在 USB Rubber Ducky 的数据渗出(Data Exfiltration)场景中,Ducky 并不依赖网络连接,而是把目标主机上的文件内容"编码"成一串锁键(Lock Key)按键事件回打给主机,再反射回 Ducky 的存储区。整个过程就像一场无声的键盘对话:
那么问题来了:Ducky 怎么知道"最后一个比特已经发完了"?
- Windows 版 HID 渗出(windows_hid_exfil.txt)会在数据末尾追加一个
%{SCROLLLOCK}作为"结束帧"; - Linux 版 HID 渗出(linux_hid_exfil.txt)则没有结束帧,位流直接结束。
exfil_auto_eof_detect 扩展就是为后一种情况设计的:它不靠"结束帧",而是靠"等待"——当 CapsLock 和 NumLock 持续一段时间不再翻转时,就判定数据流已经结束。这正是它名字中EOF(End Of File,结束符)的含义。
二、核心函数 WAIT_FOR_EOF 的工作原理
扩展源码见 exfil_auto_eof_detect.txt,版本 1.1,作者 Korben。它的逻辑非常直观:
| 步骤 | 行为 | 说明 |
|---|---|---|
| 1 | 记录 CapsLock / NumLock 当前状态 | 作为下一轮对比的基准 |
| 2 | 每20ms轮询一次锁键状态 | DELAY 20轮询间隔 |
| 3 | 检测到 CapsLock 变化 → 亮绿灯(LED_G),重置静默计数 | 说明主机还在"打"位流 |
| 4 | 检测到 NumLock 变化 → 亮红灯(LED_R),重置静默计数 | 同上 |
| 5 | 两个锁键都没变化 → 静默计数 +1,熄灭 LED | 累计"安静"的轮次 |
| 6 | 静默计数达到#INACTIVTY_TARGET(默认 10)→ 判定结束,跳出循环 | 约 200ms 无数据即结束 |
几个值得注意的细节:
- 可配置阈值:
DEFINE #INACTIVTY_TARGET 10(L15)。默认 10 次 × 20ms ≈200ms的静默窗口。如果渗出速度较慢或位间隔较长,可以适当调大该值,避免"误判提前结束";追求快速收尾则可调小。 - 前提约束:官方文档明确要求"目标系统至少反射 2 个锁键",且不反射超过 2 个锁键(L9-L11),因此它默认 CapsLock 和 NumLock 分别代表 0 和 1 两个比特。
- LED 状态反馈:渗出进行中绿灯/红灯交替闪烁,结束后稳定亮绿(
LED_G),与仓库中 LED-example1.txt 演示的锁键—LED 联动是同一套机制。
三、实战使用:与 HID 渗出扩展搭配
WAIT_FOR_EOF()是函数式 API,必须先引入本扩展,再在渗出脚本中调用:
1. 引入顺序
在 PayloadStudio 中加载扩展时,把 exfil_auto_eof_detect.txt 放在 linux_hid_exfil.txt之前编译。Linux 扩展在文档中直接声明了依赖关系:"REQUIRES EXTENSION EXFIL_AUTO_EOF_DETECT"(L5、L15)。
2. 调用位置
在RUN_LINUX_EXFIL()发起位流之后等待结束(L66-L71):
ENTER WAIT_FOR_EOF() $_EXFIL_MODE_ENABLED = FALSE3. 锁键状态保护
两个 HID 渗出扩展都提供SAVE_AND_RESTORE_LOCKS开关:渗出前保存目标机原有的 CapsLock/NumLock 状态,WAIT_FOR_EOF()返回后通过RESTORE_HOST_KEYBOARD_LOCK_STATE复原(linux_hid_exfil.txt L27、windows_hid_exfil.txt L24),让目标用户几乎无感知。
💡 对比记忆:Windows 版用
WAIT_FOR_SCROLL_CHANGE等待"结束帧"(windows_hid_exfil.txt L62),Linux 版用WAIT_FOR_EOF()等待"静默超时"。二者思路不同,选择时要看位流格式。
四、渗出完成后的数据在哪?
渗出结束后,位流被解码写入 Ducky 的 U 盘存储区(通常需要ATTACKMODE HID STORAGE),在资源管理器中即可看到收集到的文件,效果类似下面这种"loot 文件落盘"的结果:
如果需要更简单、以网络方式落盘的渗出对照,可以看看示例 Exfiltration-example1.txt——它把抓到的凭据直接重定向写入 DUCKY 盘,原理不同但目标一致。
五、相关扩展与配套文件清单
| 文件 | 作用 |
|---|---|
| exfil_auto_eof_detect.txt | 本次主角:静默超时式结束检测,WAIT_FOR_EOF() |
| linux_hid_exfil.txt | Linux 键盘反射渗出,强依赖本扩展 |
| windows_hid_exfil.txt | Windows 键盘反射渗出,用 ScrollLock 结束帧 |
| detect_ready.txt | 用 CapsLock 反射探测"主机就绪",动态启动延迟,常与渗出组合使用 |
| os_detect.txt | 操作系统探测,用于分流不同平台的渗出逻辑 |
六、常见问题(FAQ)
Q1:为什么我的渗出总是提前结束?位流间隔超过了静默窗口。调大#INACTIVTY_TARGET(例如 10 → 30,约 600ms),或检查目标机xdotool --delay等参数是否过小导致位与位之间抖动。
Q2:它能在 Windows 上用吗?函数本身是平台无关的轮询逻辑,理论上可以,但官方定位是"仅反射 2 个锁键"的场景;Windows 渗出自带 ScrollLock 结束帧,直接WAIT_FOR_SCROLL_CHANGE更可靠。
Q3:LED 一直闪烁不结束怎么办?说明 CapsLock/NumLock 仍在被翻转——通常是渗出脚本没执行完、目标窗口没聚焦,或主机锁键状态有外部干扰。可先用 detect_ready.txt 确认主机确实会反射 CapsLock。
Q4:编译要注意什么?所有 Payload 需使用 Hak5 PayloadStudio 编译(见 README.md 的 Getting Started 说明),扩展之间靠DEFINE/FUNCTION共享,加载顺序决定了WAIT_FOR_EOF()是否可用。
七、小结
- exfil_auto_eof_detect用"20ms 轮询 + 200ms 静默阈值"实现了 USB HID 数据渗出的结束检测,让无结束帧的位流也能优雅收尾;
- 核心函数
WAIT_FOR_EOF()是 linux_hid_exfil.txt 的硬性依赖,编译时注意扩展加载顺序; - 通过
#INACTIVTY_TARGET一个参数即可调节灵敏度,LED 三色反馈让渗出过程"看得见"; - 想动手实践,建议按"本扩展 → linux_hid_exfil → 简单示例"的顺序,在自己拥有或已获授权的设备上测试。
⚠️ 安全声明:本仓库 Payload 仅供学习、研究与已授权环境下的红蓝对抗演练,请勿用于任何未授权的系统。
【免费下载链接】usbrubberducky-payloadsThe Official USB Rubber Ducky Payload Repository项目地址: https://gitcode.com/GitHub_Trending/us/usbrubberducky-payloads
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考