dnsbl.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package dnsbl
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "strings"
  7. )
  8. //go:generate go tool golang.org/x/tools/cmd/stringer -type=DroneBLResponse
  9. type DroneBLResponse byte
  10. const (
  11. AllGood DroneBLResponse = 0
  12. IRCDrone DroneBLResponse = 3
  13. Bottler DroneBLResponse = 5
  14. UnknownSpambotOrDrone DroneBLResponse = 6
  15. DDOSDrone DroneBLResponse = 7
  16. SOCKSProxy DroneBLResponse = 8
  17. HTTPProxy DroneBLResponse = 9
  18. ProxyChain DroneBLResponse = 10
  19. OpenProxy DroneBLResponse = 11
  20. OpenDNSResolver DroneBLResponse = 12
  21. BruteForceAttackers DroneBLResponse = 13
  22. OpenWingateProxy DroneBLResponse = 14
  23. CompromisedRouter DroneBLResponse = 15
  24. AutoRootingWorms DroneBLResponse = 16
  25. AutoDetectedBotIP DroneBLResponse = 17
  26. Unknown DroneBLResponse = 255
  27. )
  28. func Reverse(ip net.IP) string {
  29. if ip.To4() != nil {
  30. return reverse4(ip)
  31. }
  32. return reverse6(ip)
  33. }
  34. func reverse4(ip net.IP) string {
  35. splitAddress := strings.Split(ip.String(), ".")
  36. // swap first and last octet
  37. splitAddress[0], splitAddress[3] = splitAddress[3], splitAddress[0]
  38. // swap middle octets
  39. splitAddress[1], splitAddress[2] = splitAddress[2], splitAddress[1]
  40. return strings.Join(splitAddress, ".")
  41. }
  42. func reverse6(ip net.IP) string {
  43. ipBytes := []byte(ip)
  44. var sb strings.Builder
  45. for i := len(ipBytes) - 1; i >= 0; i-- {
  46. // Split the byte into two nibbles
  47. highNibble := ipBytes[i] >> 4
  48. lowNibble := ipBytes[i] & 0x0F
  49. // Append the nibbles in reversed order
  50. sb.WriteString(fmt.Sprintf("%x.%x.", lowNibble, highNibble))
  51. }
  52. return sb.String()[:len(sb.String())-1]
  53. }
  54. func Lookup(ipStr string) (DroneBLResponse, error) {
  55. ip := net.ParseIP(ipStr)
  56. if ip == nil {
  57. return Unknown, errors.New("dnsbl: input is not an IP address")
  58. }
  59. revIP := Reverse(ip) + ".dnsbl.dronebl.org"
  60. ips, err := net.LookupIP(revIP)
  61. if err != nil {
  62. var dnserr *net.DNSError
  63. if errors.As(err, &dnserr) {
  64. if dnserr.IsNotFound {
  65. return AllGood, nil
  66. }
  67. }
  68. return Unknown, err
  69. }
  70. if len(ips) != 0 {
  71. for _, ip := range ips {
  72. return DroneBLResponse(ip.To4()[3]), nil
  73. }
  74. }
  75. return UnknownSpambotOrDrone, nil
  76. }