┌──────────────────────────────────────────────────────────────────────────────────┐
│ INTERNAL LISTENER FLOW │
├──────────────────────────────────────────────────────────────────────────────────┤
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ CREATE INTERNAL LISTENER ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ GUI ──> POST /listener/create │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ TEAMSERVER │ │
│ │ │ │ │
│ │ V │ │
│ │ TsListenerCreate(listenerType, name, config) │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ EXTENDER │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ PluginListener.Create(name, config, customData) │ │ │
│ │ │ │ │ │ │
│ │ │ └──> Save configuration (pipename, encrypt_key, etc.) │ │ │
│ │ │ Does NOT open ports/pipes on the server! │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
│ ╔════════════════════════════════════════════════════════════════════════════╗ │
│ ║ PIVOT AGENT CONNECTION ║ │
│ ╚════════════════════════════════════════════════════════════════════════════╝ │
│ │
│ Child Agent ──> COMMAND_LINK via Parent Agent │
│ │ │
│ V │
│ ┌─────────────────────────────────────────────────────────────────────────────┐ │
│ │ EXTENDER (Agent Plugin) │ │
│ │ │ │ │
│ │ V │ │
│ │ ExtenderAgent.ProcessData() ──> ProcessTasksResult() │ │
│ │ │ │ │
│ │ V │ │
│ │ case COMMAND_LINK: │ │
│ │ │ │ │
│ │ ├──> watermark := packer.ParseInt32() │ │
│ │ ├──> data := packer.ParseBytes() │ │
│ │ │ │ │
│ │ V │ │
│ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │
│ │ │ TEAMSERVER │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ TsListenerInteralHandler(watermark, data) │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ ┌─────────────────────────────────────────────────────────────────┐ │ │ │
│ │ │ │ EXTENDER (Listener Plugin) │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ V │ │ │ │
│ │ │ │ ExtenderListener.InternalHandler(data) │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ ├──> parse AgentId and data │ │ │ │
│ │ │ │ ├──> TsAgentCreate(...) ←── Create child agent │ │ │ │
│ │ │ │ │ │ │ │ │
│ │ │ │ └──> return childAgentId │ │ │ │
│ │ │ │ │ │ │ │
│ │ │ └─────────────────────────────────────────────────────────────────┘ │ │ │
│ │ │ │ │ │ │
│ │ │ V │ │ │
│ │ │ TsPivotCreate(pivotId, parentAgentId, childAgentId) │ │ │
│ │ │ │ │ │
│ │ └───────────────────────────────────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────────┘