Files

139 lines
3.2 KiB
Go

package webhook
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
"strconv"
)
type WebHook struct {
Discord struct {
Avatar string
User string
Url string
}
}
func StringPtr(str string) *string {
return &str
}
func BoolPtr(b bool) *bool {
return &b
}
func NewWebHook() *WebHook {
return new(WebHook)
}
func (w *WebHook) NewAgent(agent map[string]any) error {
if len(w.Discord.Url) > 0 {
var (
payload = new(bytes.Buffer)
message Message
embed Embed
field Field
AgentInfo map[string]any
)
AgentInfo = agent["Info"].(map[string]any)
message.AvatarUrl = &w.Discord.Avatar
message.Username = &w.Discord.User
message.Embeds = new([]Embed)
embed.Title = StringPtr("New Agent Initialized")
embed.Fields = new([]Field)
field.Name = StringPtr("Agent ID")
field.Value = StringPtr(agent["NameID"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Username")
field.Value = StringPtr(AgentInfo["Username"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Hostname")
field.Value = StringPtr(AgentInfo["Hostname"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Internal IP")
field.Value = StringPtr(AgentInfo["InternalIP"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Process Path")
field.Value = StringPtr(AgentInfo["ProcessPath"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Process Name")
field.Value = StringPtr(AgentInfo["ProcessName"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Process ID")
field.Value = StringPtr(strconv.Itoa(AgentInfo["ProcessPID"].(int)))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("Process Arch")
field.Value = StringPtr(AgentInfo["ProcessArch"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("OS Version")
field.Value = StringPtr(AgentInfo["OSVersion"].(string))
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("OS Arch")
field.Value = StringPtr(AgentInfo["OSArch"].(string))
field.Inline = BoolPtr(true)
*embed.Fields = append(*embed.Fields, field)
field.Name = StringPtr("First Callback")
field.Value = StringPtr(AgentInfo["FirstCallIn"].(string))
*embed.Fields = append(*embed.Fields, field)
*message.Embeds = append(*message.Embeds, embed)
err := json.NewEncoder(payload).Encode(message)
if err != nil {
return err
}
resp, err := http.Post(w.Discord.Url, "application/json", payload)
if err != nil {
return err
}
if resp.StatusCode != 200 && resp.StatusCode != 204 {
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
return err
}
return fmt.Errorf(string(responseBody))
}
return nil
}
return nil
}
func (w *WebHook) SetDiscord(AvatarUrl, User, Url string) {
w.Discord.Avatar = AvatarUrl
w.Discord.User = User
w.Discord.Url = Url
}