友情提示点击顶部放大镜 可以使用站内搜索 记住我们的地址 www.hainabaike.com
本文转自 strcpy.me,封面图为配图:安装了 Zero Quick Plug 的树莓派 Zero。
小编按:USB中间人是什么?USB HID设备是如何工作的?下面带你了解 BADUSB 在树莓派上的实现。文中所列举的案例仅供理解需要,请勿不当使用此类技术。
某天小黑以修理网络的名义潜入某公司办公室,想窃取一位运维台式机上的某个私钥文件,根据之前的信息收集,该公司电脑不能连接外网,而且有 DLP 产品监控的 agent,插入优盘后会提示,如果向优盘复制文件,会立即报警,文件也会被加密,无线网卡类设备也也不可以,只有键盘鼠标可以随便使用。办公环境下有一个 SSID 和密码已知的 guest 网络,可以访问外网。这种情况下怎么窃取私钥,并尽可能长时间的维持权限呢?
现有的 BadUSB 设备的缺点
底层硬件和驱动修改复杂
BadUSB 火了有几年了,网上的教程也是花式繁多,主要分为 Teensy 系列和 USB Rubber Ducky 系列,它们是使用 Arduino 或者优盘实现的,相对来说制作的难度比较大,因为宽泛来说都是属于”嵌入式编程”了,而且因为很多固件并不是真正开源的,是通过各种 Hack 实现的。还有一点就是这个硬件平台都是很简化的,想增加功能,还受到硬件的限制。
单向数据传递,没有回显,无法更新 Paylaod
黑客在进行渗透测试的时候,很是很讨厌没有回显的洞的,因为看不到是否执行成功,甚至看不到执行结果,只能靠运气和人品。而且设备插上之后,是否成功就已经决定了,即使执行失败,也没有办法去更新和修复自己的 Payload,不是一个持久化的方案。我们希望的是能实现攻击者、BadUSB 和受害者三部分两条链路的长时间的双向通信。
遇到密码就懵逼
如果你的 Payload 会弹出 UAC 或者需要 root 权限,那基本上避免不了需要输入密码了。有几个办法可以尝试下,首先是通过社工尝试收集密码字典然后暴力尝试,其次是自带一个提权脚本,很多洞的提权脚本并不长,而且很好用,最后那就是寄希望于人品了,如果对方直接就是使用的高权限用户,那就是人品大爆发了。这个问题的解决方案我们会放在展望章节中,并不在这一次的文章中解决。
树莓派也可以做 BadUSB?
一般来说,USB 设备有两种,一种是 Host,比如电脑,可以去读取其他 USB 设备的数据,另外一种是 Device,比如键盘鼠标优盘。所以从根本上来说,制作一个 Bad USB 核心要求只有一个,就是自身可以作为 USB Device。参考 https://electronics.stackexchange.com/questions/49140/what-exactly-are-the-difference-between-a-usb-host-and-device
市面上稍早些的树莓派,比如树莓派2B,树莓派3等,它们都只支持作为 Host,而迷你的树莓派 Zero 和 Zero w 同时支持作为 Host 和 Device。
和 Zero 比,Zero w 主要是增加了 WiFi 和蓝牙,所以以下都是用的这个型号,官方价10刀,某宝大约需要25刀才能买到。缺点是体积稍大,长度略长,而宽度就是正常优盘的两倍多了。
电脑怎么知道我是一个键盘的
http://www.usb.org/developers/hidpage/Hut1_12v2.pdf 是 HID 设备(人机交互设备)的部分通信协议,不需要看的太仔细,有大致印象,需要的时候会再回来翻阅。
树莓派中运行的是更加熟悉的 Linux,系统已经集成了很多底层驱动,不用接触硬件细节,想声明自己是一个键盘也非常简单。
声明 USB HID 设备
USB Gadget 实现了 USB 协议定义的设备端的软件功能,它需要一些配置,比如声明设备类型,序列号等。如果要创建一个 USB Gadget,就需要先配置那些信息。
Linux 中一切皆文件,配置也是,使用创建文件和目录的方式就可以操作 configfs,告诉内核相关的配置,这一段就是围绕着这个来的。
在 https://www.kernel.org/doc/Documentation/usb/gadget_configfs.txt 也有相关的配置说明。
首先,每个 gadget 都有一个独立的文件夹,先创建一个
cd /sys/kernel/config/usb_gadget/ mkdir -p g1 cd g1
然后需要 vender id
和 product id
等信息,这里我们用别人的id
echo 0x1d6b > idVendor # Linux Foundation echo 0x0104 > idProduct # Multifunction Composite Gadget echo 0x0100 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB2
每个设备还需要序列号,制造商等信息,Linux 要求的是在一个子文件夹中存储
mkdir -p strings/0x409 echo "fedcba9876543210" > strings/0x409/serialnumber echo "Valentin Brosseau" > strings/0x409/manufacturer echo "Keyboard-dev" > strings/0x409/product
接下来是创建配置了,都是在 configs/<name>.<number>
中的
C=1 mkdir -p configs/c.$C/strings/0x409 echo "Config $C" > configs/c.$C/strings/0x409/configuration echo 1000 > configs/c.$C/MaxPower
然后是需要创建一些功能的描述,是在 functions/<name>.<instance name>
中的
mkdir -p functions/hid.$N echo 1 > functions/hid.usb0/protocol echo 1 > functions/hid.usb0/subclass echo 8 > functions/hid.usb0/report_length echo -ne \x05\x01\x09\x06\xa1\x01\x05\x07\x19\xe0\x29\xe7\x15\x00\x25\x01\x75\x01\x95\x08\x81\x02\x95\x01\x75\x08\x81\x03\x95\x05\x75\x01\x05\x08\x19\x01\x29\x05\x91\x02\x95\x01\x75\x03\x91\x03\x95\x06\x75\x08\x15\x00\x25\x65\x05\x07\x19\x00\x29\x65\x81\x00\xc0 > functions/hid.usb0/report_desc
最后是关联配置和功能的文件夹和启用设备
ln -s functions/hid.$N configs/c.$C/ ls /sys/class/udc > UDC
其中在创建功能描述的时候,有一些 Magic number,这些都是需要参考 USB 输入设备的协议规定的。
对于 HID 设备来说,protocol
和 subclass
都是1,report_length
是8,然后 report_desc
是比较复杂的结构。暂时不用关心,后面才会用到。
大家可以参考 https://github.com/c4software/pi-as-keyboard 的初始化脚本。
这就做完了
注意:树莓派 Zero 有两个 micro USB,一个标记 USB,一个标记 PWR,要使用标记 USB 的那个(题图红框区域),否则只能供电。
Linux 上 lsusb
就可以看到这个设备
Bus 001 Device 011: ID 1d6b:0104 Linux Foundation Multifunction Composite Gadget
Mac上显示是这样的
我们先简单的测试下,在树莓派上把
for run in {1..10} do echo -ne "