From 022b15342921060fee6c93ef8e6ffa65645edeeb Mon Sep 17 00:00:00 2001 From: Ralf Date: Wed, 21 Jan 2026 20:55:53 +0300 Subject: [PATCH] rportfwd fix --- AdaptixServer/core/connector/connector.go | 2 +- AdaptixServer/core/server/ts_agent.go | 32 ++++++++++++++++--- AdaptixServer/core/server/ts_tasks.go | 6 ++-- AdaptixServer/core/server/ts_tunnels.go | 18 ++++++++--- .../extenders/beacon_listener_dns/pl_main.go | 2 +- .../beacon_listener_dns/pl_transport.go | 8 ++--- .../extenders/beacon_listener_http/pl_main.go | 2 +- .../beacon_listener_http/pl_transport.go | 2 +- .../extenders/gopher_listener_tcp/pl_main.go | 2 +- .../gopher_listener_tcp/pl_transport.go | 2 +- 10 files changed, 54 insertions(+), 22 deletions(-) diff --git a/AdaptixServer/core/connector/connector.go b/AdaptixServer/core/connector/connector.go index ae025ca9..ddda1d26 100644 --- a/AdaptixServer/core/connector/connector.go +++ b/AdaptixServer/core/connector/connector.go @@ -48,7 +48,7 @@ type Teamserver interface { TsAgentTerminate(agentId string, terminateTaskId string) error TsAgentRemove(agentId string) error TsAgentConsoleRemove(agentId string) error - TsAgentSetTick(agentId string) error + TsAgentSetTick(agentId string, listenerName string) error TsAgentTickUpdate() TsAgentConsoleOutput(agentId string, messageType int, message string, clearText string, store bool) TsAgentConsoleOutputClient(agentId string, client string, messageType int, message string, clearText string) diff --git a/AdaptixServer/core/server/ts_agent.go b/AdaptixServer/core/server/ts_agent.go index 1b0c87a0..fc5311c3 100644 --- a/AdaptixServer/core/server/ts_agent.go +++ b/AdaptixServer/core/server/ts_agent.go @@ -786,7 +786,7 @@ func (ts *Teamserver) TsAgentRemove(agentId string) error { return nil } -func (ts *Teamserver) TsAgentSetTick(agentId string) error { +func (ts *Teamserver) TsAgentSetTick(agentId string, listenerName string) error { value, ok := ts.Agents.Get(agentId) if !ok { return fmt.Errorf("agent type %v does not exists", agentId) @@ -797,12 +797,34 @@ func (ts *Teamserver) TsAgentSetTick(agentId string) error { } agentData := agent.GetData() + + listenerChanged := listenerName != "" && agentData.Listener != listenerName + if agentData.Async { - agent.UpdateData(func(d *adaptix.AgentData) { - d.LastTick = int(time.Now().Unix()) - }) - _ = ts.DBMS.DbAgentTick(agent.GetData()) + if listenerChanged { + agent.UpdateData(func(d *adaptix.AgentData) { + d.LastTick = int(time.Now().Unix()) + d.Listener = listenerName + }) + updatedAgentData := agent.GetData() + packet := CreateSpAgentUpdate(updatedAgentData) + ts.TsSyncAllClients(packet) + _ = ts.DBMS.DbAgentUpdate(updatedAgentData) + } else { + agent.UpdateData(func(d *adaptix.AgentData) { + d.LastTick = int(time.Now().Unix()) + }) + _ = ts.DBMS.DbAgentTick(agent.GetData()) + } agent.Tick = true + } else if listenerChanged { + agent.UpdateData(func(d *adaptix.AgentData) { + d.Listener = listenerName + }) + updatedAgentData := agent.GetData() + packet := CreateSpAgentUpdate(updatedAgentData) + ts.TsSyncAllClients(packet) + _ = ts.DBMS.DbAgentUpdate(updatedAgentData) } return nil } diff --git a/AdaptixServer/core/server/ts_tasks.go b/AdaptixServer/core/server/ts_tasks.go index 6622e72f..8044d0df 100644 --- a/AdaptixServer/core/server/ts_tasks.go +++ b/AdaptixServer/core/server/ts_tasks.go @@ -159,12 +159,12 @@ func (ts *Teamserver) TsTaskGetAvailableAll(agentId string, availableSize int) ( ts.TsSyncAllClients(packet) } - tunnelTasks, size := ts.extractTunnelTasks(agent, availableSize, size) - tasks = append(tasks, tunnelTasks...) - tunnelData, size := ts.extractTunnelData(agent, availableSize, size) tasks = append(tasks, tunnelData...) + tunnelTasks, size := ts.extractTunnelTasks(agent, availableSize, size) + tasks = append(tasks, tunnelTasks...) + pivotTasks, _ := ts.extractPivotTasks(agent, availableSize, size) tasks = append(tasks, pivotTasks...) diff --git a/AdaptixServer/core/server/ts_tunnels.go b/AdaptixServer/core/server/ts_tunnels.go index c952e169..771c5cc7 100644 --- a/AdaptixServer/core/server/ts_tunnels.go +++ b/AdaptixServer/core/server/ts_tunnels.go @@ -877,7 +877,9 @@ func relaySocketToTunnel(tm *TunnelManager, agent *Agent, tunnel *Tunnel, tunCha } go func() { - defer finish() + if direct { + defer finish() + } if tunChannel.pwSrv == nil || tunChannel.conn == nil { logs.Debug("", "[ERROR relaySocketToTunnel] pwSrv or conn == nil — copy (pwSrv <- conn)") return @@ -889,7 +891,9 @@ func relaySocketToTunnel(tm *TunnelManager, agent *Agent, tunnel *Tunnel, tunCha }() go func() { - defer finish() + if direct { + defer finish() + } if tunChannel.prTun == nil || tunChannel.conn == nil { logs.Debug("", "[ERROR relaySocketToTunnel] prTun or conn == nil — copy (conn <- prTun)") return @@ -904,6 +908,7 @@ func relaySocketToTunnel(tm *TunnelManager, agent *Agent, tunnel *Tunnel, tunCha if !direct { go func() { + defer finish() buf := tm.GetBuffer() defer tm.PutBuffer(buf) for { @@ -944,7 +949,9 @@ func relayWebsocketToTunnel(tm *TunnelManager, agent *Agent, tunnel *Tunnel, tun } go func() { - defer finish() + if direct { + defer finish() + } if tunChannel.wsconn == nil || tunChannel.pwSrv == nil { return } @@ -961,7 +968,9 @@ func relayWebsocketToTunnel(tm *TunnelManager, agent *Agent, tunnel *Tunnel, tun }() go func() { - defer finish() + if direct { + defer finish() + } if tunChannel.wsconn == nil || tunChannel.prTun == nil { return } @@ -982,6 +991,7 @@ func relayWebsocketToTunnel(tm *TunnelManager, agent *Agent, tunnel *Tunnel, tun if !direct { go func() { + defer finish() buf := tm.GetBuffer() defer tm.PutBuffer(buf) for { diff --git a/AdaptixServer/extenders/beacon_listener_dns/pl_main.go b/AdaptixServer/extenders/beacon_listener_dns/pl_main.go index 2ec3f458..d9e3408b 100644 --- a/AdaptixServer/extenders/beacon_listener_dns/pl_main.go +++ b/AdaptixServer/extenders/beacon_listener_dns/pl_main.go @@ -16,7 +16,7 @@ type Teamserver interface { TsAgentIsExists(agentId string) bool TsAgentCreate(agentCrc string, agentId string, beat []byte, listenerName string, ExternalIP string, Async bool) (adaptix.AgentData, error) TsAgentProcessData(agentId string, bodyData []byte) error - TsAgentSetTick(agentId string) error + TsAgentSetTick(agentId string, listenerName string) error TsAgentGetHostedAll(agentId string, maxDataSize int) ([]byte, error) } diff --git a/AdaptixServer/extenders/beacon_listener_dns/pl_transport.go b/AdaptixServer/extenders/beacon_listener_dns/pl_transport.go index 79317253..68e5e036 100644 --- a/AdaptixServer/extenders/beacon_listener_dns/pl_transport.go +++ b/AdaptixServer/extenders/beacon_listener_dns/pl_transport.go @@ -287,12 +287,12 @@ func (t *TransportDNS) handleHI(req *dnsRequest, w dns.ResponseWriter) { externalIP := "" // extractExternalIP(w.RemoteAddr()) _, _ = Ts.TsAgentCreate(agentType, agentId, beat, t.Name, externalIP, true) } - _ = Ts.TsAgentSetTick(agentId) + _ = Ts.TsAgentSetTick(agentId, t.Name) } func (t *TransportDNS) handleHB(req *dnsRequest) (needsReset bool, hasPendingTasks bool) { if req.sid != "" { - _ = Ts.TsAgentSetTick(req.sid) + _ = Ts.TsAgentSetTick(req.sid, t.Name) } // Check if this SID needs reset @@ -343,7 +343,7 @@ func (t *TransportDNS) handleHB(req *dnsRequest) (needsReset bool, hasPendingTas func (t *TransportDNS) handleGET(req *dnsRequest, w dns.ResponseWriter) []byte { if req.sid != "" { - _ = Ts.TsAgentSetTick(req.sid) + _ = Ts.TsAgentSetTick(req.sid, t.Name) } decrypted := rc4Crypt(req.data, t.Config.EncryptKey) @@ -402,7 +402,7 @@ func (t *TransportDNS) handlePUT(req *dnsRequest) putAckInfo { ack = t.handlePutFragment(req.sid, req.seq, decrypted, ack) if req.sid != "" { - _ = Ts.TsAgentSetTick(req.sid) + _ = Ts.TsAgentSetTick(req.sid, t.Name) } return ack } diff --git a/AdaptixServer/extenders/beacon_listener_http/pl_main.go b/AdaptixServer/extenders/beacon_listener_http/pl_main.go index c4d3ac3b..cc50c9fa 100644 --- a/AdaptixServer/extenders/beacon_listener_http/pl_main.go +++ b/AdaptixServer/extenders/beacon_listener_http/pl_main.go @@ -15,7 +15,7 @@ type Teamserver interface { TsAgentIsExists(agentId string) bool TsAgentCreate(agentCrc string, agentId string, beat []byte, listenerName string, ExternalIP string, Async bool) (adaptix.AgentData, error) TsAgentProcessData(agentId string, bodyData []byte) error - TsAgentSetTick(agentId string) error + TsAgentSetTick(agentId string, listenerName string) error TsAgentGetHostedAll(agentId string, maxDataSize int) ([]byte, error) } diff --git a/AdaptixServer/extenders/beacon_listener_http/pl_transport.go b/AdaptixServer/extenders/beacon_listener_http/pl_transport.go index 3a267213..e6482e99 100644 --- a/AdaptixServer/extenders/beacon_listener_http/pl_transport.go +++ b/AdaptixServer/extenders/beacon_listener_http/pl_transport.go @@ -336,7 +336,7 @@ func (t *TransportHTTP) processRequest(ctx *gin.Context) { } } - _ = Ts.TsAgentSetTick(agentId) + _ = Ts.TsAgentSetTick(agentId, t.Name) _ = Ts.TsAgentProcessData(agentId, bodyData) diff --git a/AdaptixServer/extenders/gopher_listener_tcp/pl_main.go b/AdaptixServer/extenders/gopher_listener_tcp/pl_main.go index bcd1a07a..c554ea3e 100644 --- a/AdaptixServer/extenders/gopher_listener_tcp/pl_main.go +++ b/AdaptixServer/extenders/gopher_listener_tcp/pl_main.go @@ -14,7 +14,7 @@ import ( type Teamserver interface { TsAgentIsExists(agentId string) bool TsAgentCreate(agentCrc string, agentId string, beat []byte, listenerName string, ExternalIP string, Async bool) (adaptix.AgentData, error) - TsAgentSetTick(agentId string) error + TsAgentSetTick(agentId string, listenerName string) error TsAgentProcessData(agentId string, bodyData []byte) error TsAgentGetHostedAll(agentId string, maxDataSize int) ([]byte, error) TsAgentGetHostedTasks(agentId string, maxDataSize int) ([]byte, error) diff --git a/AdaptixServer/extenders/gopher_listener_tcp/pl_transport.go b/AdaptixServer/extenders/gopher_listener_tcp/pl_transport.go index 436735d8..5919125d 100644 --- a/AdaptixServer/extenders/gopher_listener_tcp/pl_transport.go +++ b/AdaptixServer/extenders/gopher_listener_tcp/pl_transport.go @@ -305,7 +305,7 @@ func (t *TransportTCP) handleConnection(conn net.Conn, ts Teamserver) { break } - _ = Ts.TsAgentSetTick(agentId) + _ = Ts.TsAgentSetTick(agentId, t.Name) _ = Ts.TsAgentProcessData(agentId, recvData) } else {