Files
osmedeus/server/builder.go
T

157 lines
4.1 KiB
Go

package server
import (
"fmt"
"os"
"path"
"strings"
"github.com/gofiber/fiber/v2"
"github.com/j3ssie/osmedeus/libs"
"github.com/j3ssie/osmedeus/utils"
)
// UploadData data required in json form
type UploadData struct {
Data string `json:"data"`
Filename string `json:"filename"`
}
// Upload testing authenticated connection
func Upload(c *fiber.Ctx) error {
var uploadData UploadData
err := c.BodyParser(&uploadData)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "Cannot parse JSON",
})
}
if uploadData.Filename == "" {
uploadData.Filename = utils.RandomString(6)
}
tmpFile := path.Base(utils.NormalizePath(uploadData.Filename))
baseDir := fmt.Sprintf("/tmp/%v-input/", libs.BINARY)
if !utils.FolderExists(baseDir) {
os.MkdirAll(baseDir, 0755)
}
filename := path.Join(baseDir, tmpFile)
data := uploadData.Data
utils.WriteToFile(filename, data)
return c.JSON(ResponseHTTP{
Status: 200,
Data: fiber.Map{
"filepath": filename,
},
Type: "upload",
Message: "New Data Uploaded",
})
}
// SaveTargets save upload data to /tmp/osm-input/data-osm-xxx.txt
func SaveTargets(targets []string) string {
tmpFile := fmt.Sprintf("data-%v-%v-%v.txt", utils.GetTS(), libs.BINARY, utils.RandomString(6))
baseDir := fmt.Sprintf("/tmp/%v-input/", libs.BINARY)
if !utils.FolderExists(baseDir) {
os.MkdirAll(baseDir, 0755)
}
targetFile := path.Join(baseDir, tmpFile)
data := strings.Join(targets, "\n")
filename, err := utils.WriteToFile(targetFile, data)
if err != nil {
return ""
}
return filename
}
// CommandBuilder build core command from API
func CommandBuilder(taskData *TaskData) string {
binary := fmt.Sprintf("%s scan", libs.BINARY)
if taskData.Distributed {
binary = fmt.Sprintf("%s cloud", libs.BINARY)
if taskData.Chunk {
binary = fmt.Sprintf("%s cloud --chunk", libs.BINARY)
}
}
var command string
var workspace, concurrency, timeout, params, workflow, plugin, scanID string
if len(taskData.TargetsList) > 0 {
taskData.TargetsFile = SaveTargets(taskData.TargetsList)
taskData.Target = taskData.TargetsFile
utils.DebugF("Save targets list to: %v", taskData.TargetsFile)
}
// get workspace
if taskData.Workspace != "" {
taskData.Workspace = utils.CleanPath(taskData.Workspace)
workspace = fmt.Sprintf(" -w '%v'", taskData.Workspace)
}
// default workflow is general
if taskData.WorkFlow != "" {
workflow = fmt.Sprintf(" -f '%v'", taskData.WorkFlow)
}
// some mics options
if taskData.Timeout != "" {
timeout = fmt.Sprintf(" --timeout '%v'", taskData.Timeout)
}
if taskData.Concurrency > 0 {
concurrency = fmt.Sprintf(" -c %v", taskData.Concurrency)
}
if len(taskData.Params) > 0 {
for _, param := range taskData.Params {
// @NOTE replace ',' from request to ';;' first because corbra auto split ','
if strings.Contains(param, ",") {
param = strings.Replace(param, ",", ";;", -1)
}
if strings.HasPrefix(param, "'") && strings.HasSuffix(param, "'") {
params += fmt.Sprintf(" -p %s", param)
continue
}
params += fmt.Sprintf(" -p '%s'", param)
}
}
if taskData.ModuleName != "" {
plugin = fmt.Sprintf(" -m '%v'", taskData.ModuleName)
}
// override everything
if taskData.Command != "" {
return taskData.Command
}
// mean general scan
if taskData.ModuleName == "" {
command = fmt.Sprintf("%v %v -t %v %v%v%v%v", binary, workflow, taskData.Target, concurrency, timeout, workspace, params)
if taskData.TargetsFile != "" {
command = fmt.Sprintf("%v %v -T %v %v%v%v%v", binary, workflow, taskData.TargetsFile, concurrency, timeout, workspace, params)
}
command = strings.TrimSpace(command)
if taskData.Debug {
command = command + " --debug"
}
return command
}
command = fmt.Sprintf("%v %v -t %v %v %v%v%v%v", binary, plugin, taskData.Target, scanID, concurrency, timeout, workspace, params)
if taskData.TargetsFile != "" {
command = fmt.Sprintf("%v %v -t %v %v %v%v%v%v", binary, plugin, taskData.TargetsFile, scanID, concurrency, timeout, workspace, params)
}
command = strings.TrimSpace(command)
if taskData.Debug {
command = command + " --debug"
}
return command
}