2026-04-06 00:20:51 -05:00

771 lines
19 KiB
Go

package server
import (
"AdaptixServer/core/axscript"
"AdaptixServer/core/connector"
"AdaptixServer/core/database"
"AdaptixServer/core/eventing"
"AdaptixServer/core/extender"
"AdaptixServer/core/profile"
"AdaptixServer/core/utils/safe"
"AdaptixServer/core/utils/token"
"io"
"net"
"sync"
"sync/atomic"
"github.com/Adaptix-Framework/axc2"
"github.com/gorilla/websocket"
)
const (
CONSOLE_OUT_LOCAL = 1
CONSOLE_OUT_LOCAL_INFO = 2
CONSOLE_OUT_LOCAL_ERROR = 3
CONSOLE_OUT_LOCAL_SUCCESS = 4
CONSOLE_OUT_INFO = 5
CONSOLE_OUT_ERROR = 6
CONSOLE_OUT_SUCCESS = 7
CONSOLE_OUT = 10
)
type TsParameters struct {
Interfaces []string
}
type Teamserver struct {
Profile *profile.AdaptixProfile
DBMS *database.DBMS
AdaptixServer *connector.TsConnector
Extender *extender.AdaptixExtender
Parameters TsParameters
TaskManager *TaskManager
Broker *MessageBroker
TunnelManager *TunnelManager
EventManager *eventing.EventManager
ScriptManager *axscript.ScriptManager
listener_configs safe.Map // listenerFullName string : listenerInfo extender.ListenerInfo
agent_configs safe.Map // agentName string : agentInfo extender.AgentInfo
service_configs safe.Map // serviceName string : serviceInfo extender.ServiceInfo
wm_agent_types map[string]string // agentMark string : agentName string
wm_listeners map[string][]string // watermark string : ListenerName string, ListenerType string
notifications *safe.Slice // : sync_packet interface{}
Agents safe.Map // agentId string : agent *Agent
listeners safe.Map // listenerName string : listenerData ListenerData
downloads safe.Map // fileId string : downloadData DownloadData (only active)
tmp_uploads safe.Map // fileId string : uploadData UploadData
terminals safe.Map // terminalId string : terminal Terminal
pivots *safe.Slice // : PivotData
OTPManager *token.OTPManager
builders safe.Map // buildId string : build Build
}
type Agent struct {
mu sync.RWMutex
data adaptix.AgentData
Extender adaptix.ExtenderAgent
Tick bool
Active bool
HostedTasks *safe.Queue // taskData TaskData
HostedTunnelTasks *safe.Queue // taskData TaskData
HostedTunnelData *safe.Queue // taskData TaskDataTunnel
RunningTasks safe.Map // taskId string, taskData TaskData
RunningJobs safe.Map // taskId string, list []TaskData
PivotParent *adaptix.PivotData
PivotChilds *safe.Slice
}
func (a *Agent) GetData() adaptix.AgentData {
a.mu.RLock()
defer a.mu.RUnlock()
return a.data
}
func (a *Agent) SetData(data adaptix.AgentData) {
a.mu.Lock()
defer a.mu.Unlock()
a.data = data
}
func (a *Agent) UpdateData(fn func(*adaptix.AgentData)) {
a.mu.Lock()
defer a.mu.Unlock()
fn(&a.data)
}
func (a *Agent) Command(args map[string]any) (adaptix.TaskData, adaptix.ConsoleMessageData, error) {
return a.Extender.CreateCommand(a.GetData(), args)
}
func (a *Agent) ProcessData(packedData []byte) error {
data := a.GetData()
decrypted, err := a.Extender.Decrypt(packedData, data.SessionKey)
if err != nil {
return err
}
return a.Extender.ProcessData(data, decrypted)
}
func (a *Agent) PackData(tasks []adaptix.TaskData) ([]byte, error) {
data := a.GetData()
packed, err := a.Extender.PackTasks(data, tasks)
if err != nil {
return nil, err
}
return a.Extender.Encrypt(packed, data.SessionKey)
}
func (a *Agent) PivotPackData(pivotId string, data []byte) (adaptix.TaskData, error) {
return a.Extender.PivotPackData(pivotId, data)
}
func (a *Agent) TunnelCallbacks() adaptix.TunnelCallbacks {
return a.Extender.TunnelCallbacks()
}
func (a *Agent) TerminalCallbacks() adaptix.TerminalCallbacks {
return a.Extender.TerminalCallbacks()
}
type HookJob struct {
Sent bool
Processed bool
Job adaptix.TaskData
mu sync.Mutex
}
type TunnelChannel struct {
channelId int
protocol string
wsconn *websocket.Conn
conn net.Conn
pwSrv *io.PipeWriter
prSrv *io.PipeReader
pwTun *io.PipeWriter
prTun *io.PipeReader
ingressChan chan []byte
paused atomic.Bool
flowPaused atomic.Bool
}
type Tunnel struct {
TaskId string
Active bool
Type int
Data adaptix.TunnelData
listener net.Listener
connections safe.Map
Callbacks adaptix.TunnelCallbacks
}
type Terminal struct {
TaskId string
TerminalId int
CodePage int
agent *Agent
mu sync.Mutex
closed bool
wsconn *websocket.Conn
pwSrv *io.PipeWriter
prSrv *io.PipeReader
pwTun *io.PipeWriter
prTun *io.PipeReader
Callbacks adaptix.TerminalCallbacks
}
type AgentBuilder struct {
Id string
Name string
ListenersName []string
Config string
wsconn *websocket.Conn
mu sync.Mutex
closed bool
}
////////////////////////////////////////////////////////////////////////////////////////////
// SyncPacket
type SyncPackerStart struct {
SpType int `json:"type"`
Count int `json:"count"`
Addresses []string `json:"interfaces"`
}
type SyncPackerFinish struct {
SpType int `json:"type"`
}
type SyncPackerBatch struct {
SpType int `json:"type"`
Packets []interface{} `json:"packets"`
}
type SyncPackerCategoryBatch struct {
SpType int `json:"type"`
Category string `json:"category"` // "agents", "events", "console", "tasks", etc.
Packets []interface{} `json:"packets"`
}
type SpNotification struct {
Type int `json:"type"`
NotifyType int `json:"event_type"`
Date int64 `json:"date"`
Message string `json:"message"`
}
/// LISTENER
type SyncPackerListenerReg struct {
SpType int `json:"type"`
Name string `json:"l_name"`
Protocol string `json:"l_protocol"`
Type string `json:"l_type"`
AX string `json:"ax"`
}
type SyncPackerListenerStart struct {
SpType int `json:"type"`
ListenerName string `json:"l_name"`
ListenerRegName string `json:"l_reg_name"`
ListenerProtocol string `json:"l_protocol"`
ListenerType string `json:"l_type"`
BindHost string `json:"l_bind_host"`
BindPort string `json:"l_bind_port"`
AgentAddrs string `json:"l_agent_addr"`
CreateTime int64 `json:"l_create_time"`
ListenerStatus string `json:"l_status"`
Data string `json:"l_data"`
}
type SyncPackerListenerStop struct {
SpType int `json:"type"`
ListenerName string `json:"l_name"`
}
/// AGENT
type SyncPackerAgentReg struct {
SpType int `json:"type"`
Agent string `json:"agent"`
AX string `json:"ax"`
Listeners []string `json:"listeners"`
MultiListeners bool `json:"multi_listeners"`
Groups []AxCommandBatch `json:"groups"`
}
/// SERVICE
type SyncPackerServiceReg struct {
SpType int `json:"type"`
Name string `json:"service"`
AX string `json:"ax"`
}
type SyncPackerServiceData struct {
SpType int `json:"type"`
Service string `json:"service"`
Data string `json:"data"`
}
type SyncPackerAgentNew struct {
SpType int `json:"type"`
Id string `json:"a_id"`
Name string `json:"a_name"`
Listener string `json:"a_listener"`
Async bool `json:"a_async"`
ExternalIP string `json:"a_external_ip"`
InternalIP string `json:"a_internal_ip"`
GmtOffset int `json:"a_gmt_offset"`
WorkingTime int `json:"a_workingtime"`
KillDate int `json:"a_killdate"`
Sleep uint `json:"a_sleep"`
Jitter uint `json:"a_jitter"`
ACP int `json:"a_acp"`
OemCP int `json:"a_oemcp"`
Pid string `json:"a_pid"`
Tid string `json:"a_tid"`
Arch string `json:"a_arch"`
Elevated bool `json:"a_elevated"`
Process string `json:"a_process"`
Os int `json:"a_os"`
OsDesc string `json:"a_os_desc"`
Domain string `json:"a_domain"`
Computer string `json:"a_computer"`
Username string `json:"a_username"`
Impersonated string `json:"a_impersonated"`
CreateTime int64 `json:"a_create_time"`
LastTick int `json:"a_last_tick"`
Tags string `json:"a_tags"`
Mark string `json:"a_mark"`
Color string `json:"a_color"`
}
type SyncPackerAgentUpdate struct {
SpType int `json:"type"`
Id string `json:"a_id"`
Sleep *uint `json:"a_sleep,omitempty"`
Jitter *uint `json:"a_jitter,omitempty"`
WorkingTime *int `json:"a_workingtime,omitempty"`
KillDate *int `json:"a_killdate,omitempty"`
Impersonated *string `json:"a_impersonated,omitempty"`
Tags *string `json:"a_tags,omitempty"`
Mark *string `json:"a_mark,omitempty"`
Color *string `json:"a_color,omitempty"`
InternalIP *string `json:"a_internal_ip,omitempty"`
ExternalIP *string `json:"a_external_ip,omitempty"`
GmtOffset *int `json:"a_gmt_offset,omitempty"`
ACP *int `json:"a_acp,omitempty"`
OemCP *int `json:"a_oemcp,omitempty"`
Pid *string `json:"a_pid,omitempty"`
Tid *string `json:"a_tid,omitempty"`
Arch *string `json:"a_arch,omitempty"`
Elevated *bool `json:"a_elevated,omitempty"`
Process *string `json:"a_process,omitempty"`
Os *int `json:"a_os,omitempty"`
OsDesc *string `json:"a_os_desc,omitempty"`
Domain *string `json:"a_domain,omitempty"`
Computer *string `json:"a_computer,omitempty"`
Username *string `json:"a_username,omitempty"`
Listener *string `json:"a_listener,omitempty"`
}
type SyncPackerAgentTick struct {
SpType int `json:"type"`
Id []string `json:"a_id"`
}
type SyncPackerAgentTaskRemove struct {
SpType int `json:"type"`
TaskId string `json:"a_task_id"`
}
type SyncPackerAgentRemove struct {
SpType int `json:"type"`
AgentId string `json:"a_id"`
}
type SyncPackerAgentTaskSync struct {
SpType int `json:"type"`
TaskType int `json:"a_task_type"`
TaskId string `json:"a_task_id"`
AgentId string `json:"a_id"`
Client string `json:"a_client"`
User string `json:"a_user"`
Computer string `json:"a_computer"`
CmdLine string `json:"a_cmdline"`
StartTime int64 `json:"a_start_time"`
FinishTime int64 `json:"a_finish_time"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
type SyncPackerAgentTaskUpdate struct {
SpType int `json:"type"`
AgentId string `json:"a_id"`
TaskId string `json:"a_task_id"`
HandlerId string `json:"a_handler_id"`
TaskType int `json:"a_task_type"`
FinishTime int64 `json:"a_finish_time"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
type SyncPackerAgentTaskHook struct {
SpType int `json:"type"`
AgentId string `json:"a_id"`
TaskId string `json:"a_task_id"`
HookId string `json:"a_hook_id"`
JobIndex int `json:"a_job_index"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
type SyncPackerAgentTaskSend struct {
SpType int `json:"type"`
TaskId []string `json:"a_task_id"`
}
type SyncPackerAgentConsoleOutput struct {
SpCreateTime int64 `json:"time"`
SpType int `json:"type"`
AgentId string `json:"a_id"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
ClearText string `json:"a_text"`
}
type SyncPackerAgentErrorCommand struct {
SpType int `json:"type"`
AgentId string `json:"a_id"`
Cmdline string `json:"a_cmdline"`
Message string `json:"a_message"`
HookId string `json:"ax_hook_id"`
HandlerId string `json:"ax_handler_id"`
}
type SyncPackerAgentLocalCommand struct {
SpCreateTime int64 `json:"time"`
SpType int `json:"type"`
AgentId string `json:"a_id"`
Cmdline string `json:"a_cmdline"`
Message string `json:"a_message"`
Text string `json:"a_text"`
}
type SyncPackerAgentConsoleTaskSync struct {
SpType int `json:"type"`
TaskId string `json:"a_task_id"`
AgentId string `json:"a_id"`
Client string `json:"a_client"`
CmdLine string `json:"a_cmdline"`
StartTime int64 `json:"a_start_time"`
FinishTime int64 `json:"a_finish_time"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
type SyncPackerAgentConsoleTaskUpd struct {
SpType int `json:"type"`
AgentId string `json:"a_id"`
TaskId string `json:"a_task_id"`
FinishTime int64 `json:"a_finish_time"`
MessageType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
/// PIVOT
type SyncPackerPivotCreate struct {
SpType int `json:"type"`
PivotId string `json:"p_pivot_id"`
PivotName string `json:"p_pivot_name"`
ParentAgentId string `json:"p_parent_agent_id"`
ChildAgentId string `json:"p_child_agent_id"`
}
type SyncPackerPivotDelete struct {
SpType int `json:"type"`
PivotId string `json:"p_pivot_id"`
}
/// CHAT
type SyncPackerChatMessage struct {
SpType int `json:"type"`
Username string `json:"c_username"`
Message string `json:"c_message"`
Date int64 `json:"c_date"`
}
/// DOWNLOAD
type SyncPackerDownloadCreate struct {
SpType int `json:"type"`
FileId string `json:"d_file_id"`
AgentId string `json:"d_agent_id"`
AgentName string `json:"d_agent_name"`
User string `json:"d_user"`
Computer string `json:"d_computer"`
File string `json:"d_file"`
Size int64 `json:"d_size"`
Date int64 `json:"d_date"`
}
type SyncPackerDownloadUpdate struct {
SpType int `json:"type"`
FileId string `json:"d_file_id"`
RecvSize int64 `json:"d_recv_size"`
State int `json:"d_state"`
}
type SyncPackerDownloadDelete struct {
SpType int `json:"type"`
FileId []string `json:"d_files_id"`
}
type SyncPackerDownloadActual struct {
SpType int `json:"type"`
FileId string `json:"d_file_id"`
AgentId string `json:"d_agent_id"`
AgentName string `json:"d_agent_name"`
User string `json:"d_user"`
Computer string `json:"d_computer"`
File string `json:"d_file"`
Size int64 `json:"d_size"`
Date int64 `json:"d_date"`
RecvSize int64 `json:"d_recv_size"`
State int `json:"d_state"`
}
/// SCREEN
type SyncPackerScreenshotCreate struct {
SpType int `json:"type"`
ScreenId string `json:"s_screen_id"`
User string `json:"s_user"`
Computer string `json:"s_computer"`
Note string `json:"s_note"`
Date int64 `json:"s_date"`
Content []byte `json:"s_content"`
}
type SyncPackerScreenshotUpdate struct {
SpType int `json:"type"`
ScreenId string `json:"s_screen_id"`
Note string `json:"s_note"`
}
type SyncPackerScreenshotDelete struct {
SpType int `json:"type"`
ScreenId string `json:"s_screen_id"`
}
/// CREDS
type SyncPackerCredentials struct {
CredId string `json:"c_creds_id"`
Username string `json:"c_username"`
Password string `json:"c_password"`
Realm string `json:"c_realm"`
Type string `json:"c_type"`
Tag string `json:"c_tag"`
Date int64 `json:"c_date"`
Storage string `json:"c_storage"`
AgentId string `json:"c_agent_id"`
Host string `json:"c_host"`
}
type SyncPackerCredentialsAdd struct {
SpType int `json:"type"`
Creds []SyncPackerCredentials `json:"c_creds"`
}
type SyncPackerCredentialsUpdate struct {
SpType int `json:"type"`
CredId string `json:"c_creds_id"`
Username string `json:"c_username"`
Password string `json:"c_password"`
Realm string `json:"c_realm"`
Type string `json:"c_type"`
Tag string `json:"c_tag"`
Storage string `json:"c_storage"`
Host string `json:"c_host"`
}
type SyncPackerCredentialsDelete struct {
SpType int `json:"type"`
CredsId []string `json:"c_creds_id"`
}
type SyncPackerCredentialsTag struct {
SpType int `json:"type"`
CredsId []string `json:"c_creds_id"`
Tag string `json:"c_tag"`
}
/// TARGETS
type SyncPackerTarget struct {
TargetId string `json:"t_target_id"`
Computer string `json:"t_computer"`
Domain string `json:"t_domain"`
Address string `json:"t_address"`
Os int `json:"t_os"`
OsDesk string `json:"t_os_desk"`
Tag string `json:"t_tag"`
Info string `json:"t_info"`
Date int64 `json:"t_date"`
Alive bool `json:"t_alive"`
Agents []string `json:"t_agents"`
}
type SyncPackerTargetsAdd struct {
SpType int `json:"type"`
Targets []SyncPackerTarget `json:"t_targets"`
}
type SyncPackerTargetUpdate struct {
SpType int `json:"type"`
TargetId string `json:"t_target_id"`
Computer string `json:"t_computer"`
Domain string `json:"t_domain"`
Address string `json:"t_address"`
Os int `json:"t_os"`
OsDesk string `json:"t_os_desk"`
Tag string `json:"t_tag"`
Info string `json:"t_info"`
Date int64 `json:"t_date"`
Alive bool `json:"t_alive"`
Agents []string `json:"t_agents"`
}
type SyncPackerTargetDelete struct {
SpType int `json:"type"`
TargetsId []string `json:"t_target_id"`
}
type SyncPackerTargetTag struct {
SpType int `json:"type"`
TargetsId []string `json:"t_targets_id"`
Tag string `json:"t_tag"`
}
/// BROWSER
type SyncPacketBrowserDisks struct {
SpType int `json:"type"`
AgentId string `json:"b_agent_id"`
Time int64 `json:"b_time"`
MessageType int `json:"b_msg_type"`
Message string `json:"b_message"`
Data string `json:"b_data"`
}
type SyncPacketBrowserFiles struct {
SpType int `json:"type"`
AgentId string `json:"b_agent_id"`
Time int64 `json:"b_time"`
MessageType int `json:"b_msg_type"`
Message string `json:"b_message"`
Path string `json:"b_path"`
Data string `json:"b_data"`
}
type SyncPacketBrowserFilesStatus struct {
SpType int `json:"type"`
AgentId string `json:"b_agent_id"`
Time int64 `json:"b_time"`
MessageType int `json:"b_msg_type"`
Message string `json:"b_message"`
}
type SyncPacketBrowserProcess struct {
SpType int `json:"type"`
AgentId string `json:"b_agent_id"`
Time int64 `json:"b_time"`
MessageType int `json:"b_msg_type"`
Message string `json:"b_message"`
Data string `json:"b_data"`
}
/// TUNNEL
type SyncPackerTunnelCreate struct {
SpType int `json:"type"`
TunnelId string `json:"p_tunnel_id"`
AgentId string `json:"p_agent_id"`
Computer string `json:"p_computer"`
Username string `json:"p_username"`
Process string `json:"p_process"`
Type string `json:"p_type"`
Info string `json:"p_info"`
Interface string `json:"p_interface"`
Port string `json:"p_port"`
Client string `json:"p_client"`
Fhost string `json:"p_fhost"`
Fport string `json:"p_fport"`
}
type SyncPackerTunnelEdit struct {
SpType int `json:"type"`
TunnelId string `json:"p_tunnel_id"`
Info string `json:"p_info"`
}
type SyncPackerTunnelDelete struct {
SpType int `json:"type"`
TunnelId string `json:"p_tunnel_id"`
}
type SyncPackerAxScriptData struct {
SpType int `json:"type"`
Name string `json:"name"`
Content string `json:"content"`
Groups []AxCommandBatch `json:"groups"`
}
type AxCommandBatch struct {
Agent string `json:"agent"`
Listener string `json:"listener"`
Os int `json:"os"`
Commands string `json:"commands"`
}