Terminals
Terminals provide an interactive shell on the target machine via WebSocket connection with the GUI.
Flow
┌──────────────────────────────────────────────────────────────────────────────────┐
│ TERMINAL FLOW │
├──────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ OPEN TERMINAL ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ GUI ──> WS /channel (agent/terminal, data=base64(agentId|termId|...)) │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ TEAMSERVER │ │
│ │ │ │ │
│ │ V │ │
│ │ TsAgentTerminalCreateChannel(terminalData, wsconn) │ │
│ │ │ │ │
│ │ ├──> Decode: agentId, terminalId, program, sizeH, sizeW │ │
│ │ ├──> Create Terminal with Pipes (prSrv, pwSrv, prTun, pwTun) │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ EXTENDER (Agent Plugin) │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ TerminalCallbacks.Start(terminalId, program, sizeH, sizeW) │ │ │
│ │ │ │ │ │ │
│ │ │ └──> return TaskData (added to agent queue) │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ AGENT STARTS PROCESS ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ Agent ──> COMMAND_TERMINAL_OUTPUT (process ready) │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ EXTENDER (Agent Plugin - ProcessTasksResult) │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ TEAMSERVER │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ TsTerminalConnResume(agentId, terminalId, ioDirect) │ │ │
│ │ │ │ │ │ │
│ │ │ └──> Start relay goroutines: │ │ │
│ │ │ - WebSocket → pwSrv → prSrv → TaskData → Agent │ │ │
│ │ │ - Agent → pwTun → prTun → WebSocket │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ DATA FLOW (bidirectional) ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ User types ──> WebSocket ──> pwSrv ──> prSrv ──read──> │
│ ──> TerminalCallbacks.Write(terminalId, data) │
│ ──> TaskData ──> Agent ──> Process stdin │
│ │
│ Process stdout ──> Agent ──> TsTerminalConnData(terminalId, data) │
│ ──> pwTun ──> prTun ──read──> WebSocket ──> GUI │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ TERMINAL CLOSE ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ User closes ──> TerminalCallbacks.Close(terminalId) ──> TaskData ──> Agent │
│ Process exits ──> TsTerminalConnClose(terminalId, status) ──> Close WebSocket │
│ │
└──────────────────────────────────────────────────────────────────────────────────┘Teamserver API for Terminal
Last updated