diff --git a/bots/5000.go b/bots/5000.go new file mode 100644 index 0000000..9d1a0fe --- /dev/null +++ b/bots/5000.go @@ -0,0 +1,158 @@ +package main + +// Original 5000 bot was written in Python. This is a Go port of it by acidvegas. + +import ( + "bufio" + "crypto/tls" + "fmt" + "log" + "math/rand" + "strings" + "time" + "unicode/utf16" +) + +var sendChannel chan<- string + +const ( + nickname = "FUCKYOU" + username = "5000" + realname = "\x0304THROWN INTO THE FUCKING WALL\x0f" +) + +func randomASCIIString(n int) string { + const charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + b := make([]byte, n) + for i := range b { + b[i] = charset[rand.Intn(len(charset))] + } + return string(b) +} + +func unicodeString() string { + msg := "\u202e\u0007\x03" + fmt.Sprintf("%d", rand.Intn(12)+2) + for i := 0; i < rand.Intn(101)+200; i++ { + r := rand.Intn(0x2001) + 0x1000 + if r < 0x10000 { + msg += string(rune(r)) + } else { + r -= 0x10000 + msg += string(utf16.DecodeRune(rune(r>>10+0xD800), rune(r&0x3FF+0xDC00))) + } + } + return msg +} + +func attack(target string) { + sendChannel <- fmt.Sprintf("PRIVMSG #superbowl :I am fucking the shit out of %s right now...", target) + for i := 0; i < 200; i++ { + var channels []string + for i := 0; i < 25; i++ { + channelName := "#" + randomASCIIString(5) + channels = append(channels, channelName) + } + result := strings.Join(channels, ",") + sendChannel <- fmt.Sprintf("SAJOIN %s #%s", target, result) + sendChannel <- fmt.Sprintf("PRIVMSG #5000 :%s oh god %s what is happening %s", unicodeString(), target, unicodeString()) + sendChannel <- fmt.Sprintf("PRIVMSG %s :%s oh god %s what is happening %s", target, unicodeString(), target, unicodeString()) + } +} + +func main() { + rand.Seed(time.Now().UnixNano()) + + for { + conn, err := tls.Dial("tcp", "localhost:6697", &tls.Config{InsecureSkipVerify: true}) + if err != nil { + log.Println("Failed to connect: %v", err) + time.Sleep(15 * time.Second) + continue + } + + messageChannel := make(chan string, 100) // INCOMING + sendChannel := make(chan string, 100) // OUTGOING + quit := make(chan struct{}) + + timeoutDuration := 300 * time.Second + timeoutTimer := time.NewTimer(timeoutDuration) + + go func() { + reader := bufio.NewReader(conn) + for { + line, err := reader.ReadString('\n') + if err != nil { + log.Println("Error reading from server:", err) + conn.Close() + close(quit) + return + } + select { + case messageChannel <- line: + timeoutTimer.Reset(timeoutDuration) + case <-quit: + return + case <-timeoutTimer.C: + log.Println("No data received for 300 seconds. Reconnecting...") + conn.Close() + close(quit) + return + } + } + }() + + go func() { + for { + select { + case message := <-sendChannel: + data := []byte(message) + if len(data) > 510 { + data = data[:510] + } + _, err := conn.Write(append(data, '\r', '\n')) + if err != nil { + log.Println("Error writing to server:", err) + conn.Close() + close(quit) + return + } + case <-quit: + return + } + } + }() + + sendChannel <- fmt.Sprintf("NICK FUCKYOU") + sendChannel <- fmt.Sprintf("USER 5000 0 * :THROW INTO THE FUCKING WALL") + + for { + handleMessage(<-messageChannel, sendChannel) + } + + conn.Close() + //close(quit) + time.Sleep(15 * time.Second) + } +} + +func handleMessage(message string, sendChannel chan<- string) { + fmt.Println(message) + parts := strings.Split(message, " ") + if len(parts) > 1 && parts[0] == "PING" { + sendChannel <- fmt.Sprintf("PONG %s", parts[1]) + } else if len(parts) > 2 && parts[1] == "001" { + time.Sleep(5 * time.Second) + sendChannel <- fmt.Sprintf("MODE FUCKYOU +BDd") + sendChannel <- fmt.Sprintf("PRIVMSG NickServ IDENTIFY FUCKYOU simps0nsfan420") + sendChannel <- fmt.Sprintf("PRIVMSG OPER FUCKYOU fartsimps0n420") + sendChannel <- fmt.Sprintf("JOIN #5000") + sendChannel <- fmt.Sprintf("JOIN #superbowl") + } else if len(parts) == 3 { + if parts[1] == "JOIN" && parts[2] == "#5000" { + nick := strings.Split(parts[0], "!")[0][1:] + if nick != "acidvegas" && nick != "ChanServ" && nick != "FUCKYOU" { + go attack(nick) + } + } + } +}