This is the prototype board for [Travis Goodspeed’s] new USB development tool called the Facedancer. He took on the design with USB security exploits in mind, but we think it’s got a lot of potential for plain old development as well.
Kudos on the [Frank Herbert] reference when naming the project. Like the characters from the Dune mythology that can perfectly mimic any person they touch, this device let’s you mimic whatever you can imagine. One the USB ports connects to the victim (or host) the other connects to a development machine. Python can then be used to send USB commands in real time. Think of this as doing the same thing the Bus Pirate does for SPI and i2c, except that it’s doing it on the USB protocol itself. This way you can feel your way through all of the road-bumps of developing a new device (or testing an exploit) without the need to continually compile and flash your hardware.
9 thoughts on “Facedancer Board Lets Your Python Programs Pretend To Be USB Hardware”
It wasn’t named after the song by The Who?
wait, I’m confused. How is it pretending to be hardware when it is hardware?
I expected some terminal screenshots, not a circuit board :P I can think of several reasons to want python-based software-emulated USB. One is actually to add a fake HID so my sister can finally have a middle-click button on her laptop :P
Basically one PC, the “victim” or “host” is presented with this Freedancer board — the Freedancer emulates ANY other USB device for the “host”. The other PC is used to support Python scripting for the high-level control of the Freedancer.
Well you should be able to do this without hardware, or is there some limitation in libusb interaction with kernels?
Given that the designer of the device is doing security/exploit work, I imagine that being able to poke the entire USB system(including the specific chipset and chipset driver) and being able to test any USB host device, regardless of OS cooperation, would be necessary features only available with a hardware device.
Also, you can’t just assume that the hardware on the ‘victim’ end is a linux box, or anything you have full software-level control over. It could be a smartphone or a game console, for example.
I’ve been thinking on it for years, but for a very limited purpose: providing network storage to a device that only accepts USB storage (a cheap set top box, for instance).
Thanks to Travis.
I’ve been build one a few days ago. Since that I did some experiments on different targets. Windows, Linux, FreeBSD and many other operating systems can be targeted. It’s quite easy if you familar with Python. If you need help to build one up, let me know on my Blog.
Anyone tried plugging both USB ports on the board into the same machine and using VirtualBox to control the device while using the host OS as the ‘victim’?
Please be kind and respectful to help make the comments section excellent. (Comment Policy)