DIY一个专属HID注入设备吧

*本文原创作者:kincaid,本文属FreeBuf原创奖励计划,未经许可禁止转载

一、引言

BadUSB是指一类通过模拟键盘自动输入指令,实现信息窃取和恶意程序执行的HID攻击方法,最早由SRLabs在2014年美国黑帽大会上提出。

起初的BadUSB设备是通过更改U盘中的控制器固件实现的,支持的设备型号较少。于是RUBBER DUCKY(橡皮鸭)从原始的批操作设备逐步发展为一个成熟的HID攻击平台,并拥有完善的攻击脚本、可靠的硬件支持和活跃的技术论坛。但是由于价格原因,大多数研究人员首选Teensy USB开发板并基于Arduino IDE实现HID注入攻击。WHID设备在此基础上加入了无线模块,能够实现数据收发和Shell的建立,拓宽了BadUSB的攻击场景。

然而上述攻击设备没有公开底层的逻辑代码,只开放了更新攻击脚本的接口,限制了用户自行DIY的空间。EvilUSB是我基于STM32F103C8T6自行开发的一款BadUSB攻击设备,能够同时模拟出U盘和键盘进行攻击脚本的存储和执行,通过更改配置文件以适应中、英文输入环境,设备总成本不到10元。下面将详尽叙述各个功能的具体实现,源码及手册参见项目首页http://evilusb.com。

二、模拟键盘

STM32F103C8T6是意法半导体推出的ARM Cortex-M3内核MCU,包含一个全速模式USB接口,性价比高而且很容易入手,故而选取该型号芯片进行EvilUSB开发。

电脑主机是通过设备描述符识别USB设备类型的,并在规定的端点建立与设备的通信关系,因此要做的第一步是要配置好设备的描述符。参考STM32F10X USB设备开发套件(STM32_USB-FS-Device_Lib_V4.0.0)中JoyStickMouse例程,按照lsj9383[1]的思路对配置描述符和报告描述符进行修改。

在电脑识别出HID设备的基础上,调整端点收发缓存区的分配,再配置设备的Init和Reset函数。接着就可以用Joystick_Send函数发送按键数据,参数非零代表有键按下,全零则代表松开。键码不同于Ascii码,可参加MightyPork整理的usb_hid_keys.h[2]和我的例程Evilusb_Keycode.h[3]。由于BadUSB要求很高的攻击代码注入速度,故而可通过状态机用DMA加速传输。为了解决字符输入过快导致的错误和遗漏问题,需要要配置描述符中的bInterval调到一个很低的值以缩短主机的响应时间。最后一个问题是主机输入法默认的大小写及中英文环境不符合程序要求导致的注入失败,这个可以通过模拟U盘中的配置文件进行手动切换,下一章将详尽叙述。

三、模拟U盘

一个可以同时模拟出多个逻辑设备的USB设备称为复合设备,复合设备具有高集成、低成本、多功能的优点。Evilusb使用内部的NandFlash空间来存放数据、模拟一个几十Kb大小的U盘(该型芯片官方宣称flash大小为64Kb,实际大小为128Kb),能够满足攻击脚本和配置文件的存储要求。

复合设备工程参考官方的Composite_Example例程,更改配置描述符、端点缓存分配、设备初始化和复位函数以及各个端点的回调函数。按照zengming00[4]的教程,对mass_mal.c中的MAL_Init,MAL_GetStatus,MAL_Read,MAL_Write函数进行修改,使之解锁访问并读写内部flash数据。这样操作之后就能在电脑上显示出一个U盘,但由于没有添加内部的文件系统,格式化成FAT格式后才能正常访问。

配置文件包含了Default_Waiting_Time,Default_Reaction_Time,Default_Lang-

uage,Default_CapsLock四个参数,分别用来设置起始时间、响应时间、中英文和大小写环境。系统上电后会从指定的地址读取这些配置,所以配置文件的排版格式不得改动(缺少内部文件系统的弊端)。模拟U盘的另一个重要功能就是与主机通信,配合无线通信模块可以实现远程文件传输和Shell的建立。

四、攻击流程

Evilusb插入电脑后会延迟一段时间等待系统识别完毕,然后陆续执行:

cmd.exe /T:01 /K mode CON: COLS=16 LINES=1 //打开Shell

(wmic LOGICALDISK where filesystem=”FAT” get name | findstr “:” && echo EvilUSB.bat) >%tmp%\TMP.bat //输入模拟U盘盘符和攻击脚本文件名到缓存脚本文件中

%tmp%\TMP.bat || exit //执行刚才的缓存脚本文件然后退出

EvilUSB.bat的文件内容如下,首先检查主机用户是否是攻击对象,然后再调用攻击脚本,删除用到的缓存文件以避免磁盘损坏。

五、攻击测试

六、总结与展望

本例完成了基于STM32F103C8T6模拟键盘和U盘实现HID注入攻击的BadUSB设备软硬件原型设计,接下来将在三个方面做出改进:一是增加SD卡卡槽扩展U盘容量,方便文件窃取;二是通过添加无线通信模块建立远程Shell、实现无线配置和文件传输;第三是加入Bootloader,实现安全的U盘升级(OTG)和无线网络升级(OTA)。

七、资源及参考文档

[1] 关于 KEIL提供的JoystickMouse例程 转化为 USB虚拟键盘http://www.openedv.com/thread-10971-1-1.html(出处: OpenEdv-开源电子网)

[2] usb_hid_keys.h https://gist.github.com/MightyPork/6da26e382a7ad91b5496ee55fdc73db2

[3] Evilusb_Keycode.h http://evilusb.com#Resource

[4] U盘GPIO文件系统映射-STM32利用内置FLASH做U盘http://bbs.mydigit.cn/read.php?tid=1771843

*本文原创作者:kincaid,本文属FreeBuf原创奖励计划,未经许可禁止转载

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2018-06-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

CTF实战31 综合实战和讲解一(讲解部分)

该培训中提及的技术只适用于合法CTF比赛和有合法授权的渗透测试,请勿用于其他非法用途,如用作其他非法用途与本文作者无关

29930
来自专栏ImportSource

并发编程-多线程的好处

上一文:并发编程-并发的简史 如果线程使用得当,多线程可以降低你的开发和维护成本,而且还能改善复杂应用程序的性能。多线程让模仿人类工作方式以及交互变得简单,多线...

37460
来自专栏IT技术精选文摘

程序员必知必会的那些邪恶的脚本

set -o errexit 等价于 set -e,表示有任何错误(命令的返回状态非 0 )时即退出。

14420
来自专栏小文博客

换肤大师国服版FOR6.20即将发布

15750
来自专栏乐享123

从MongoDB迁移到TokuMx

26580
来自专栏Java架构

Java 10正式发布,最新特性全解读

19540
来自专栏FreeBuf

一种几乎无法被检测到的Punycode钓鱼攻击,Chrome、Firefox和Opera等浏览器都中招

国内的安全专家最近发现一种新的钓鱼攻击,“几乎无法检测”,即便平时十分谨慎的用户也可能无法逃过欺骗。黑客可利用Chrome、Firefox和Opera浏览器中的...

25790
来自专栏腾讯Bugly的专栏

【MIG专项测试组】腾讯手机管家实战分析:内存突增是为神马?

应用版本升级后使用内存突增?如何跟踪?这次MIG专项测试组为大家分享内存问题跟踪实战过程! MIG专...

34340
来自专栏ChaMd5安全团队

NSCTF “表情包” 详细writeup

偶尔打了一下NSCTF,其中大家比较蒙蔽的有一题,叫“表情包”,是常见的颜文字。 ? 这种叫aaencode(可以把任意js编码成颜文字表情),然后在这里全选复...

481120
来自专栏JMCui

Node.js入门以及第一个helloworld程序.

1、概念:简单的说 Node.js 就是运行在服务端的 JavaScript。学之前需要明白Node.js是无法挑战jsp、php或者asp这种老牌网站的地位的...

29130

扫码关注云+社区

领取腾讯云代金券