mirror of
https://github.com/Ed1s0nZ/CyberStrikeAI.git
synced 2026-05-15 12:58:01 +02:00
105 lines
3.1 KiB
Go
105 lines
3.1 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
|
|
"cyberstrike-ai/internal/c2"
|
|
"cyberstrike-ai/internal/config"
|
|
"cyberstrike-ai/internal/database"
|
|
"cyberstrike-ai/internal/handler"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
// setupC2Runtime 创建 C2 Manager、看门狗与取消函数;不注册 MCP 工具(由 Apply 统一 ClearTools 后注册)。
|
|
func setupC2Runtime(
|
|
cfg *config.Config,
|
|
db *database.DB,
|
|
agentHandler *handler.AgentHandler,
|
|
logger *zap.Logger,
|
|
) (*c2.Manager, *c2.SessionWatchdog, context.CancelFunc) {
|
|
if !cfg.C2.EnabledEffective() {
|
|
return nil, nil, nil
|
|
}
|
|
c2Manager := c2.NewManager(db, logger, "tmp/c2")
|
|
c2Manager.Registry().Register(string(c2.ListenerTypeTCPReverse), c2.NewTCPReverseListener)
|
|
c2Manager.Registry().Register(string(c2.ListenerTypeHTTPBeacon), c2.NewHTTPBeaconListener)
|
|
c2Manager.Registry().Register(string(c2.ListenerTypeHTTPSBeacon), c2.NewHTTPSBeaconListener)
|
|
c2Manager.Registry().Register(string(c2.ListenerTypeWebSocket), c2.NewWebSocketListener)
|
|
c2HITLBridge := NewC2HITLBridge(db, logger)
|
|
c2Manager.SetHITLBridge(c2HITLBridge)
|
|
c2Manager.SetHITLDangerousGate(func(conversationID, toolName string) bool {
|
|
return agentHandler.HITLNeedsToolApproval(conversationID, toolName)
|
|
})
|
|
c2Hooks := SetupC2Hooks(&C2HooksConfig{
|
|
DB: db,
|
|
Logger: logger,
|
|
AttackChainRecord: func(session *database.C2Session, phase string, description string) {
|
|
logger.Info("C2 Attack Chain",
|
|
zap.String("session_id", session.ID),
|
|
zap.String("phase", phase),
|
|
zap.String("desc", description),
|
|
)
|
|
},
|
|
VulnRecord: func(session *database.C2Session, title string, severity string) {
|
|
logger.Info("C2 Vulnerability",
|
|
zap.String("session_id", session.ID),
|
|
zap.String("title", title),
|
|
zap.String("severity", severity),
|
|
)
|
|
},
|
|
})
|
|
c2Manager.SetHooks(c2Hooks)
|
|
c2Manager.RestoreRunningListeners()
|
|
c2Watchdog := c2.NewSessionWatchdog(c2Manager)
|
|
watchdogCtx, watchdogCancel := context.WithCancel(context.Background())
|
|
go c2Watchdog.Run(watchdogCtx)
|
|
return c2Manager, c2Watchdog, watchdogCancel
|
|
}
|
|
|
|
// ReconcileC2AfterConfigApply 根据当前内存配置启停 C2(不写盘;在 Apply 中 ClearTools 之前调用)。
|
|
func (a *App) ReconcileC2AfterConfigApply() error {
|
|
if !a.config.C2.EnabledEffective() {
|
|
a.shutdownC2()
|
|
return nil
|
|
}
|
|
if a.c2Manager != nil {
|
|
return nil
|
|
}
|
|
if a.db == nil || a.agentHandler == nil {
|
|
return nil
|
|
}
|
|
m, wd, cancel := setupC2Runtime(a.config, a.db, a.agentHandler, a.logger.Logger)
|
|
if m == nil {
|
|
return nil
|
|
}
|
|
a.c2Manager = m
|
|
a.c2Watchdog = wd
|
|
a.c2WatchdogCancel = cancel
|
|
if a.c2Handler != nil {
|
|
a.c2Handler.SetManager(m)
|
|
}
|
|
a.logger.Info("C2 子系统已按配置启动")
|
|
return nil
|
|
}
|
|
|
|
// shutdownC2 停止看门狗与所有监听器,并断开 Handler 引用。
|
|
func (a *App) shutdownC2() {
|
|
had := a.c2WatchdogCancel != nil || a.c2Manager != nil
|
|
if a.c2WatchdogCancel != nil {
|
|
a.c2WatchdogCancel()
|
|
a.c2WatchdogCancel = nil
|
|
}
|
|
a.c2Watchdog = nil
|
|
if a.c2Manager != nil {
|
|
a.c2Manager.Close()
|
|
a.c2Manager = nil
|
|
}
|
|
if a.c2Handler != nil {
|
|
a.c2Handler.SetManager(nil)
|
|
}
|
|
if had {
|
|
a.logger.Info("C2 子系统已关闭")
|
|
}
|
|
}
|