mirror of
https://github.com/HavocFramework/Havoc
synced 2026-06-08 11:13:29 +00:00
139 lines
3.2 KiB
Go
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
|
|
}
|