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

303 lines
8.1 KiB
Go

package server
import (
"encoding/json"
"fmt"
"github.com/Adaptix-Framework/axc2"
)
func (ts *Teamserver) TsTaskRunningExists(agentId string, taskId string) bool {
return ts.TaskManager.RunningExists(agentId, taskId)
}
func (ts *Teamserver) TsTaskCreate(agentId string, cmdline string, client string, taskData adaptix.TaskData) {
ts.TaskManager.Create(agentId, cmdline, client, taskData)
}
func (ts *Teamserver) TsTaskUpdate(agentId string, updateData adaptix.TaskData) {
ts.TaskManager.Update(agentId, updateData)
}
func (ts *Teamserver) TsTaskPostHook(hookData adaptix.TaskData, jobIndex int) error {
return ts.TaskManager.PostHook(hookData, jobIndex)
}
func (ts *Teamserver) TsTaskCancel(agentId string, taskId string) error {
return ts.TaskManager.Cancel(agentId, taskId)
}
func (ts *Teamserver) TsTaskDelete(agentId string, taskId string) error {
return ts.TaskManager.Delete(agentId, taskId)
}
func (ts *Teamserver) TsTaskSave(taskData adaptix.TaskData) error {
return ts.TaskManager.Save(taskData)
}
///// Get Tasks
func (ts *Teamserver) getAgent(agentId string) (*Agent, error) {
value, ok := ts.Agents.Get(agentId)
if !ok {
return nil, fmt.Errorf("agent %v not found", agentId)
}
agent, ok := value.(*Agent)
if !ok {
return nil, fmt.Errorf("invalid agent type for '%v'", agentId)
}
return agent, nil
}
func (ts *Teamserver) extractHostedTasks(agent *Agent, availableSize int, startSize int, maxCount int) (tasks []adaptix.TaskData, sendTasks []string, usedSize int) {
usedSize = startSize
count := 0
for {
if maxCount > 0 && count >= maxCount {
break
}
item, err := agent.HostedTasks.Pop()
if err != nil {
break
}
taskData := item.(adaptix.TaskData)
if usedSize+len(taskData.Data) < availableSize {
tasks = append(tasks, taskData)
if taskData.Sync || taskData.Type == adaptix.TASK_TYPE_BROWSER {
agent.RunningTasks.Put(taskData.TaskId, taskData)
}
sendTasks = append(sendTasks, taskData.TaskId)
usedSize += len(taskData.Data)
count++
} else {
agent.HostedTasks.PushFront(taskData)
break
}
}
return
}
func (ts *Teamserver) extractTunnelTasks(agent *Agent, availableSize int, startSize int) (tasks []adaptix.TaskData, usedSize int) {
usedSize = startSize
for {
item, err := agent.HostedTunnelTasks.Pop()
if err != nil {
break
}
taskData := item.(adaptix.TaskData)
if usedSize+len(taskData.Data) < availableSize {
tasks = append(tasks, taskData)
usedSize += len(taskData.Data)
} else {
agent.HostedTunnelTasks.PushFront(taskData)
break
}
}
return
}
func (ts *Teamserver) extractTunnelData(agent *Agent, availableSize int, startSize int) (tasks []adaptix.TaskData, usedSize int) {
usedSize = startSize
for {
item, err := agent.HostedTunnelData.Pop()
if err != nil {
break
}
taskDataTunnel := item.(adaptix.TaskDataTunnel)
if usedSize+len(taskDataTunnel.Data.Data) < availableSize {
tasks = append(tasks, taskDataTunnel.Data)
usedSize += len(taskDataTunnel.Data.Data)
} else {
agent.HostedTunnelData.PushFront(taskDataTunnel)
break
}
}
return
}
func (ts *Teamserver) extractPivotTasks(agent *Agent, availableSize int, startSize int) (tasks []adaptix.TaskData, usedSize int) {
usedSize = startSize
for i := uint(0); i < agent.PivotChilds.Len(); i++ {
value, ok := agent.PivotChilds.Get(i)
if !ok {
break
}
pivotData := value.(*adaptix.PivotData)
lostSize := availableSize - usedSize
if lostSize <= 0 {
break
}
data, err := ts.TsAgentGetHostedAll(pivotData.ChildAgentId, lostSize)
if err != nil {
continue
}
pivotTaskData, err := agent.PivotPackData(pivotData.PivotId, data)
if err != nil {
continue
}
tasks = append(tasks, pivotTaskData)
usedSize += len(pivotTaskData.Data)
}
return
}
func (ts *Teamserver) TsTaskGetAvailableAll(agentId string, availableSize int) ([]adaptix.TaskData, error) {
agent, err := ts.getAgent(agentId)
if err != nil {
return nil, fmt.Errorf("TsTaskQueueGetAvailable: %w", err)
}
var tasks []adaptix.TaskData
hostedTasks, sendTasks, size := ts.extractHostedTasks(agent, availableSize, 0, -1)
tasks = append(tasks, hostedTasks...)
if len(sendTasks) > 0 {
packet := CreateSpAgentTaskSend(sendTasks)
ts.TsSyncAllClients(packet)
}
tunnelTasks, size := ts.extractTunnelTasks(agent, availableSize, size)
tasks = append(tasks, tunnelTasks...)
pivotTasks, _ := ts.extractPivotTasks(agent, availableSize, size)
tasks = append(tasks, pivotTasks...)
return tasks, nil
}
func (ts *Teamserver) TsTaskGetAvailableTasks(agentId string, availableSize int) ([]adaptix.TaskData, int, error) {
agent, err := ts.getAgent(agentId)
if err != nil {
return nil, 0, fmt.Errorf("TsTaskQueueGetAvailable: %w", err)
}
var tasks []adaptix.TaskData
hostedTasks, sendTasks, size := ts.extractHostedTasks(agent, availableSize, 0, -1)
tasks = append(tasks, hostedTasks...)
if len(sendTasks) > 0 {
packet := CreateSpAgentTaskSend(sendTasks)
ts.TsSyncAllClients(packet)
}
tunnelTasks, size := ts.extractTunnelTasks(agent, availableSize, size)
tasks = append(tasks, tunnelTasks...)
return tasks, size, nil
}
func (ts *Teamserver) TsTaskGetAvailableTasksCount(agentId string, maxCount int, availableSize int) ([]adaptix.TaskData, int, error) {
agent, err := ts.getAgent(agentId)
if err != nil {
return nil, 0, fmt.Errorf("TsTaskQueueGetAvailable: %w", err)
}
tasks, sendTasks, size := ts.extractHostedTasks(agent, availableSize, 0, maxCount)
if len(sendTasks) > 0 {
packet := CreateSpAgentTaskSend(sendTasks)
ts.TsSyncAllClients(packet)
}
return tasks, size, nil
}
/// Get Pivot Tasks
func (ts *Teamserver) TsTasksPivotExists(agentId string, first bool) bool {
return ts.tsTasksPivotExistsWithVisited(agentId, first, make(map[string]bool))
}
func (ts *Teamserver) tsTasksPivotExistsWithVisited(agentId string, first bool, visited map[string]bool) bool {
if visited[agentId] {
return false
}
visited[agentId] = true
agent, err := ts.getAgent(agentId)
if err != nil {
return false
}
if !first {
if agent.HostedTasks.Len() > 0 || agent.HostedTunnelTasks.Len() > 0 || agent.HostedTunnelData.Len() > 0 {
return true
}
}
for i := uint(0); i < agent.PivotChilds.Len(); i++ {
value, ok := agent.PivotChilds.Get(i)
if ok {
pivotData := value.(*adaptix.PivotData)
if ts.tsTasksPivotExistsWithVisited(pivotData.ChildAgentId, false, visited) {
return true
}
}
}
return false
}
func (ts *Teamserver) TsTaskGetAvailablePivotAll(agentId string, availableSize int) ([]adaptix.TaskData, error) {
agent, err := ts.getAgent(agentId)
if err != nil {
return nil, fmt.Errorf("TsTaskQueueGetAvailable: %w", err)
}
tasks, _ := ts.extractPivotTasks(agent, availableSize, 0)
return tasks, nil
}
func (ts *Teamserver) TsProcessHookJobsForDisconnectedClient(clientName string) {
ts.TaskManager.ProcessDisconnectedClient(clientName)
}
type TaskListItem struct {
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"`
MsgType int `json:"a_msg_type"`
Message string `json:"a_message"`
Text string `json:"a_text"`
Completed bool `json:"a_completed"`
}
func (ts *Teamserver) TsTaskListCompleted(agentId string, limit int, offset int) ([]byte, error) {
if !ts.TsAgentIsExists(agentId) {
return nil, fmt.Errorf("agent %v not found", agentId)
}
tasks, err := ts.DBMS.DbTasksListCompleted(agentId, limit, offset)
if err != nil {
return nil, err
}
items := make([]TaskListItem, 0, len(tasks))
for _, task := range tasks {
items = append(items, TaskListItem{
TaskType: task.Type,
TaskId: task.TaskId,
AgentId: task.AgentId,
Client: task.Client,
User: task.User,
Computer: task.Computer,
CmdLine: task.CommandLine,
StartTime: task.StartDate,
FinishTime: task.FinishDate,
MsgType: task.MessageType,
Message: task.Message,
Text: task.ClearText,
Completed: true,
})
}
return json.Marshal(items)
}