hid_sniff.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package hid
  2. import (
  3. "encoding/hex"
  4. "fmt"
  5. "time"
  6. "github.com/bettercap/bettercap/network"
  7. "github.com/bettercap/nrf24"
  8. "github.com/evilsocket/islazy/str"
  9. "github.com/evilsocket/islazy/tui"
  10. )
  11. func (mod *HIDRecon) isSniffing() bool {
  12. return mod.sniffAddrRaw != nil
  13. }
  14. func (mod *HIDRecon) setSniffMode(mode string, silent bool) error {
  15. if !mod.Running() {
  16. return fmt.Errorf("please turn hid.recon on")
  17. }
  18. mod.sniffLock.Lock()
  19. defer mod.sniffLock.Unlock()
  20. mod.sniffSilent = silent
  21. mod.inSniffMode = false
  22. if mode == "clear" {
  23. mod.Debug("restoring recon mode")
  24. mod.sniffAddrRaw = nil
  25. mod.sniffAddr = ""
  26. mod.sniffSilent = true
  27. } else {
  28. if err, raw := nrf24.ConvertAddress(mode); err != nil {
  29. return err
  30. } else {
  31. mod.Debug("sniffing device %s ...", tui.Bold(mode))
  32. mod.sniffAddr = network.NormalizeHIDAddress(mode)
  33. mod.sniffAddrRaw = raw
  34. }
  35. }
  36. return nil
  37. }
  38. func (mod *HIDRecon) doPing() {
  39. mod.writeLock.Lock()
  40. defer mod.writeLock.Unlock()
  41. if mod.inSniffMode == false {
  42. if err := mod.dongle.EnterSnifferModeFor(mod.sniffAddrRaw); err != nil {
  43. mod.Error("error entering sniffer mode for %s: %v", mod.sniffAddr, err)
  44. } else {
  45. mod.inSniffMode = true
  46. mod.inPromMode = false
  47. mod.Debug("device entered sniffer mode for %s", mod.sniffAddr)
  48. }
  49. }
  50. if time.Since(mod.lastPing) >= mod.pingPeriod {
  51. // try on the current channel first
  52. if err := mod.dongle.TransmitPayload(mod.pingPayload, 250, 1); err != nil {
  53. for mod.channel = 1; mod.channel <= nrf24.TopChannel; mod.channel++ {
  54. if err := mod.dongle.SetChannel(mod.channel); err != nil {
  55. mod.Error("error setting channel %d: %v", mod.channel, err)
  56. } else if err = mod.dongle.TransmitPayload(mod.pingPayload, 250, 1); err == nil {
  57. mod.lastPing = time.Now()
  58. return
  59. }
  60. }
  61. }
  62. }
  63. }
  64. func (mod *HIDRecon) onSniffedBuffer(buf []byte) {
  65. if sz := len(buf); sz > 0 && buf[0] == 0x00 {
  66. buf = buf[1:]
  67. lf := mod.Info
  68. if mod.sniffSilent {
  69. lf = mod.Debug
  70. }
  71. lf("payload for %s : %s", tui.Bold(mod.sniffAddr), str.Trim(hex.Dump(buf)))
  72. if dev, found := mod.Session.HID.Get(mod.sniffAddr); found {
  73. dev.LastSeen = time.Now()
  74. dev.AddPayload(buf)
  75. dev.AddChannel(mod.channel)
  76. } else {
  77. if lf = mod.Warning; mod.sniffSilent == false {
  78. lf = mod.Debug
  79. }
  80. lf("got a payload for unknown device %s", mod.sniffAddr)
  81. }
  82. }
  83. }