nicebadge/examples/rubber-duck/main.go

84 lines
2.1 KiB
Go
Raw Normal View History

2026-04-18 11:01:06 +00:00
package main
// Rubber Duck attack - USB HID keyboard automation.
// The badge presents itself as a USB keyboard and executes a sequence of
// keystrokes on the connected computer.
//
// TARGETS UBUNTU/GNOME. For other platforms adjust the key sequences.
// NOTE: keyboard scan codes are US layout; non-US layouts may produce
// different characters for symbols (/, -, :, etc.).
//
// Press button A to trigger the attack. The badge waits on startup
// so you have time to plug it in safely.
import (
"machine"
"machine/usb/hid/keyboard"
"time"
)
func main() {
// wait for USB enumeration
time.Sleep(2 * time.Second)
// button A arms the attack — only runs when pressed
btnA := machine.P1_06
btnA.Configure(machine.PinConfig{Mode: machine.PinInputPullup})
kb := keyboard.Port()
for {
if !btnA.Get() {
runAttack(kb)
// only run once per press
for !btnA.Get() {
time.Sleep(50 * time.Millisecond)
}
}
time.Sleep(10 * time.Millisecond)
}
}
func runAttack(kb keyboard.Device) {
// open application launcher (Super key on Ubuntu/GNOME)
kb.Down(keyboard.KeyLeftGUI)
time.Sleep(time.Second)
kb.Up(keyboard.KeyLeftGUI)
time.Sleep(500 * time.Millisecond)
// search for text editor
kb.Write([]byte("text"))
time.Sleep(1500 * time.Millisecond)
kb.Press(keyboard.KeyEnter)
time.Sleep(time.Second)
// type the ominous message
kb.Write([]byte("Please wait while you are being hacked"))
time.Sleep(2 * time.Second)
// open run dialog (Alt+F2 on GNOME) and launch xdg-open
// NOTE: symbols below assume US keyboard layout
kb.Down(keyboard.KeyLeftAlt)
kb.Down(keyboard.KeyF2)
time.Sleep(time.Second)
kb.Up(keyboard.KeyF2)
kb.Up(keyboard.KeyLeftAlt)
time.Sleep(time.Second)
kb.Write([]byte("xdg"))
kb.Press(keyboard.KeypadMinus)
kb.Write([]byte("open https>"))
kb.Press(keyboard.KeypadSlash)
kb.Press(keyboard.KeypadSlash)
kb.Write([]byte("www.youtube.com"))
kb.Press(keyboard.KeypadSlash)
kb.Write([]byte("watch_v)dQw4w9WgXcQ"))
kb.Press(keyboard.KeyEnter)
// turn the volume up
time.Sleep(500 * time.Millisecond)
for i := 0; i < 12; i++ {
kb.Press(keyboard.KeyMediaVolumeInc)
}
}