v0.0.2.34

This commit is contained in:
its-a-feature
2024-01-18 08:52:26 -06:00
parent a23ef50ec5
commit 65778fbeb5
18 changed files with 122 additions and 121 deletions
+10 -2
View File
@@ -1,8 +1,11 @@
package cmd
import (
"github.com/MythicMeta/Mythic_CLI/cmd/config"
"github.com/MythicMeta/Mythic_CLI/cmd/internal"
"github.com/MythicMeta/Mythic_CLI/cmd/utils"
"github.com/spf13/cobra"
"log"
)
// configCmd represents the config command
@@ -19,7 +22,12 @@ func init() {
}
func addDockerCompose(cmd *cobra.Command, args []string) {
if err := internal.Add3rdPartyService(args[0], make(map[string]interface{})); err != nil {
if utils.StringInSlice(args[0], config.MythicPossibleServices) {
internal.AddMythicService(args[0])
return
}
err := internal.Add3rdPartyService(args[0], make(map[string]interface{}))
if err != nil {
log.Printf("[-] Failed to add service")
}
}
+8 -8
View File
@@ -106,17 +106,17 @@ func setMythicConfigDefaultValues() {
mythicEnv.SetDefault("nginx_use_ssl", true)
mythicEnv.SetDefault("nginx_use_ipv4", true)
mythicEnv.SetDefault("nginx_use_ipv6", true)
mythicEnv.SetDefault("nginx_bind_local_mount", true)
mythicEnv.SetDefault("nginx_bind_use_volume", false)
// mythic react UI configuration
mythicEnv.SetDefault("mythic_react_host", "mythic_react")
mythicEnv.SetDefault("mythic_react_port", 3000)
mythicEnv.SetDefault("mythic_react_bind_localhost_only", true)
mythicEnv.SetDefault("mythic_react_local_mount", true)
mythicEnv.SetDefault("mythic_react_use_volume", false)
// documentation configuration
mythicEnv.SetDefault("documentation_host", "mythic_documentation")
mythicEnv.SetDefault("documentation_port", 8090)
mythicEnv.SetDefault("documentation_bind_localhost_only", true)
mythicEnv.SetDefault("documentation_bind_local_mount", true)
mythicEnv.SetDefault("documentation_bind_use_volume", false)
// mythic server configuration
mythicEnv.SetDefault("mythic_debug_agent_message", false)
mythicEnv.SetDefault("mythic_server_port", 17443)
@@ -127,7 +127,7 @@ func setMythicConfigDefaultValues() {
mythicEnv.SetDefault("mythic_server_mem_limit", "")
mythicEnv.SetDefault("mythic_server_dynamic_ports", "7000-7010")
mythicEnv.SetDefault("mythic_server_dynamic_ports_bind_localhost_only", false)
mythicEnv.SetDefault("mythic_server_bind_local_mount", true)
mythicEnv.SetDefault("mythic_server_bind_use_volume", false)
mythicEnv.SetDefault("mythic_server_command", "")
mythicEnv.SetDefault("mythic_sync_cpus", "2")
mythicEnv.SetDefault("mythic_sync_mem_limit", "")
@@ -140,7 +140,7 @@ func setMythicConfigDefaultValues() {
mythicEnv.SetDefault("postgres_password", utils.GenerateRandomPassword(30))
mythicEnv.SetDefault("postgres_cpus", "2")
mythicEnv.SetDefault("postgres_mem_limit", "")
mythicEnv.SetDefault("postgres_bind_local_mount", true)
mythicEnv.SetDefault("postgres_bind_use_volume", false)
// rabbitmq configuration
mythicEnv.SetDefault("rabbitmq_host", "mythic_rabbitmq")
mythicEnv.SetDefault("rabbitmq_port", 5672)
@@ -150,7 +150,7 @@ func setMythicConfigDefaultValues() {
mythicEnv.SetDefault("rabbitmq_vhost", "mythic_vhost")
mythicEnv.SetDefault("rabbitmq_cpus", "2")
mythicEnv.SetDefault("rabbitmq_mem_limit", "")
mythicEnv.SetDefault("rabbitmq_bind_local_mount", true)
mythicEnv.SetDefault("rabbitmq_bind_use_volume", false)
// jwt configuration
mythicEnv.SetDefault("jwt_secret", utils.GenerateRandomPassword(30))
// hasura configuration
@@ -160,7 +160,7 @@ func setMythicConfigDefaultValues() {
mythicEnv.SetDefault("hasura_secret", utils.GenerateRandomPassword(30))
mythicEnv.SetDefault("hasura_cpus", "2")
mythicEnv.SetDefault("hasura_mem_limit", "2gb")
mythicEnv.SetDefault("hasura_bind_local_mount", true)
mythicEnv.SetDefault("hasura_bind_use_volume", false)
// docker-compose configuration
mythicEnv.SetDefault("COMPOSE_PROJECT_NAME", "mythic")
mythicEnv.SetDefault("REBUILD_ON_START", true)
@@ -178,7 +178,7 @@ func setMythicConfigDefaultValues() {
mythicEnv.SetDefault("jupyter_cpus", "2")
mythicEnv.SetDefault("jupyter_mem_limit", "")
mythicEnv.SetDefault("jupyter_bind_localhost_only", true)
mythicEnv.SetDefault("jupyter_bind_local_mount", true)
mythicEnv.SetDefault("jupyter_bind_use_volume", false)
// debugging help
mythicEnv.SetDefault("postgres_debug", false)
mythicEnv.SetDefault("mythic_react_debug", false)
@@ -156,7 +156,7 @@ func InstallFolder(installPath string, overWrite bool) error {
for _, f := range files {
if f.IsDir() {
log.Printf("[*] Processing Documentation for %s\n", f.Name())
if config.GetMythicEnv().GetBool("documentation_bind_local_mount") {
if !config.GetMythicEnv().GetBool("documentation_bind_use_volume") {
if utils.DirExists(filepath.Join(workingPath, "documentation-docker", "content", "Agents", f.Name())) {
if overWrite || config.AskConfirm("[*] "+f.Name()+" documentation already exists. Replace current version? ") {
log.Printf("[*] Removing current version\n")
@@ -206,7 +206,7 @@ func InstallFolder(installPath string, overWrite bool) error {
for _, f := range files {
if f.IsDir() {
log.Printf("[*] Processing Documentation for %s\n", f.Name())
if config.GetMythicEnv().GetBool("document_bind_local_mount") {
if !config.GetMythicEnv().GetBool("document_bind_use_volume") {
if utils.DirExists(filepath.Join(workingPath, "documentation-docker", "content", "C2 Profiles", f.Name())) {
if overWrite || config.AskConfirm("[*] "+f.Name()+" documentation already exists. Replace current version? ") {
log.Printf("[*] Removing current version\n")
@@ -459,6 +459,7 @@ func InstallMythicSyncFolder(installPath string) error {
AddMythicService(service)
log.Printf("[+] Successfully installed mythic_sync!\n")
if manager.GetManager().IsServiceRunning("mythic_server") {
log.Printf("[*] Starting mythic_sync")
err = ServiceStart([]string{strings.ToLower(service)})
if err != nil {
log.Printf("[-] Failed to start mythic_sync: %v\n", err)
@@ -483,10 +484,10 @@ func InstallMythicSync(url string, branch string) error {
}
if branch == "" {
log.Printf("[*] Cloning %s\n", url)
err = runGitClone([]string{"-c", "http.sslVerify=false", "clone", "--recurse-submodules", "--single-branch", url, filepath.Join(workingPath, "tmp")})
err = runGitClone([]string{"-c", "http.sslVerify=false", "clone", "--depth 1", "--recurse-submodules", "--single-branch", url, filepath.Join(workingPath, "tmp")})
} else {
log.Printf("[*] Cloning branch \"%s\" from %s\n", branch, url)
err = runGitClone([]string{"-c", "http.sslVerify=false", "clone", "--recurse-submodules", "--single-branch", "--branch", branch, url, filepath.Join(workingPath, "tmp")})
err = runGitClone([]string{"-c", "http.sslVerify=false", "clone", "--depth 1", "--recurse-submodules", "--single-branch", "--branch", branch, url, filepath.Join(workingPath, "tmp")})
}
if err != nil {
log.Printf("[-] Failed to clone down repository: %v\n", err)
+1 -1
View File
@@ -13,7 +13,7 @@ func DatabaseReset() {
if confirm {
log.Printf("[*] Stopping Mythic\n")
manager.GetManager().StopServices([]string{}, config.GetMythicEnv().GetBool("REBUILD_ON_START"))
manager.GetManager().ResetDatabase(config.GetMythicEnv().GetBool("postgres_bind_local_mount"))
manager.GetManager().ResetDatabase(config.GetMythicEnv().GetBool("postgres_bind_use_volume"))
log.Printf("[*] Removing database files\n")
}
}
@@ -19,7 +19,7 @@ func ServiceStart(containers []string) error {
if err != nil {
return err
}
dockerComposeContainers, err := manager.GetManager().GetAllExistingNonMythicServiceNames()
dockerComposeContainers, err := manager.GetManager().GetAllInstalled3rdPartyServiceNames()
if err != nil {
return err
}
@@ -72,7 +72,7 @@ func ServiceStart(containers []string) error {
AddMythicService(service)
}
}
manager.GetManager().TestPorts()
manager.GetManager().TestPorts(finalContainers)
err = manager.GetManager().StartServices(finalContainers, config.GetMythicEnv().GetBool("REBUILD_ON_START"))
err = manager.GetManager().RemoveImages()
if err != nil {
@@ -134,7 +134,7 @@ func DockerBuildReactUI() error {
// Docker Volume commands
func VolumesList() {
manager.GetManager().ListVolumes()
manager.GetManager().PrintVolumeInformation()
}
func DockerRemoveVolume(volumeName string) error {
return manager.GetManager().RemoveVolume(volumeName)
+14 -13
View File
@@ -49,7 +49,7 @@ func AddMythicService(service string) {
} else {
pStruct["environment"] = environment
}
if mythicEnv.GetBool("postgres_bind_local_mount") {
if !mythicEnv.GetBool("postgres_bind_use_volume") {
pStruct["volumes"] = []string{
"./postgres-docker/database:/var/lib/postgresql/data",
"./postgres-docker/postgres.conf:/etc/postgresql.conf",
@@ -83,7 +83,7 @@ func AddMythicService(service string) {
pStruct["environment"] = []string{
"DOCUMENTATION_PORT=${DOCUMENTATION_PORT}",
}
if mythicEnv.GetBool("documentation_bind_local_mount") {
if !mythicEnv.GetBool("documentation_bind_use_volume") {
pStruct["volumes"] = []string{
"./documentation-docker/:/src",
}
@@ -135,7 +135,7 @@ func AddMythicService(service string) {
"${HASURA_PORT}:${HASURA_PORT}",
}
}
if mythicEnv.GetBool("hasura_bind_local_mount") {
if !mythicEnv.GetBool("hasura_bind_use_volume") {
pStruct["volumes"] = []string{
"./hasura-docker/metadata:/metadata",
}
@@ -202,7 +202,7 @@ func AddMythicService(service string) {
"${NGINX_PORT}:${NGINX_PORT}",
}
}
if mythicEnv.GetBool("nginx_bind_local_mount") {
if !mythicEnv.GetBool("nginx_bind_use_volume") {
pStruct["volumes"] = []string{
"./nginx-docker/ssl:/etc/ssl/private",
"./nginx-docker/config:/etc/nginx",
@@ -260,7 +260,7 @@ func AddMythicService(service string) {
}
}
pStruct["environment"] = finalRabbitEnv
if mythicEnv.GetBool("rabbitmq_bind_local_mount") {
if !mythicEnv.GetBool("rabbitmq_bind_use_volume") {
pStruct["volumes"] = []string{
"./rabbitmq-docker/storage:/var/lib/rabbitmq",
"./rabbitmq-docker/generate_config.sh:/generate_config.sh",
@@ -294,7 +294,7 @@ func AddMythicService(service string) {
"context": "./mythic-react-docker",
"args": config.GetBuildArguments(),
}
if mythicEnv.GetBool("mythic_react_bind_local_mount") {
if !mythicEnv.GetBool("mythic_react_bind_use_volume") {
pStruct["volumes"] = []string{
"./mythic-react-docker/config:/etc/nginx",
"./mythic-react-docker/mythic/public:/mythic/new",
@@ -354,7 +354,7 @@ func AddMythicService(service string) {
}
*/
if mythicEnv.GetBool("jupyter_bind_local_mount") {
if !mythicEnv.GetBool("jupyter_bind_use_volume") {
pStruct["volumes"] = []string{
"./jupyter-docker/jupyter:/projects",
}
@@ -425,7 +425,7 @@ func AddMythicService(service string) {
} else {
pStruct["environment"] = environment
}
if mythicEnv.GetBool("mythic_server_bind_local_mount") {
if !mythicEnv.GetBool("mythic_server_bind_use_volume") {
pStruct["volumes"] = []string{
"./mythic-docker/src:/usr/src/app",
}
@@ -508,7 +508,7 @@ func Add3rdPartyService(service string, additionalConfigs map[string]interface{}
pStruct[key] = element
}
pStruct["build"] = map[string]interface{}{
"context": manager.GetManager().GetPathTo3rdPartyServicesOnDisk(),
"context": filepath.Join(manager.GetManager().GetPathTo3rdPartyServicesOnDisk(), service),
"args": config.GetBuildArguments(),
}
pStruct["network_mode"] = "host"
@@ -542,7 +542,7 @@ func Add3rdPartyService(service string, additionalConfigs map[string]interface{}
// only add in volumes if some aren't already listed
if _, ok := pStruct["volumes"]; !ok {
pStruct["volumes"] = []string{
manager.GetManager().GetPathTo3rdPartyServicesOnDisk() + ":/Mythic/",
filepath.Join(manager.GetManager().GetPathTo3rdPartyServicesOnDisk(), service) + ":/Mythic/",
}
}
return manager.GetManager().SetServiceConfiguration(service, pStruct)
@@ -552,13 +552,14 @@ func RemoveService(service string) error {
}
func Initialize() {
if !manager.GetManager().CheckRequiredManagerVersion() {
log.Fatalf("[-] Bad %s version\n", manager.GetManager().GetManagerName())
}
manager.GetManager().GenerateRequiredConfig()
// based on .env, find out which mythic services are supposed to be running and add them to docker compose
intendedMythicContainers, _ := config.GetIntendedMythicServiceNames()
for _, container := range intendedMythicContainers {
AddMythicService(container)
}
if !manager.GetManager().CheckRequiredManagerVersion() {
log.Fatalf("[-] Bad %s version\n", manager.GetManager().GetManagerName())
}
}
+6 -5
View File
@@ -58,7 +58,7 @@ func TestMythicConnection() {
log.Printf(" If there is an issue with Mythic server, use 'mythic-cli logs mythic_server' to view potential errors\n")
Status(false)
log.Printf("[*] Fetching logs from mythic_server now:\n")
GetLogs("mythic_server", "500")
GetLogs("mythic_server", "500", false)
os.Exit(1)
}
func TestMythicRabbitmqConnection() {
@@ -102,7 +102,8 @@ func TestMythicRabbitmqConnection() {
}
}
func TestPorts() error {
manager.GetManager().TestPorts()
intendedServices, _ := config.GetIntendedMythicServiceNames()
manager.GetManager().TestPorts(intendedServices)
return nil
}
@@ -131,13 +132,13 @@ func Status(verbose bool) {
log.Printf("[*] If you are using a remote PayloadType or C2Profile, they will need certain environment variables to properly connect to Mythic.\n")
log.Printf(" Use 'sudo ./mythic-cli config service' for configs for these services.\n")
}
func GetLogs(containerName string, numLogs string) {
func GetLogs(containerName string, numLogs string, follow bool) {
logCount, err := strconv.Atoi(numLogs)
if err != nil {
log.Fatalf("[-] Bad log count: %v\n", err)
}
manager.GetManager().GetLogs(containerName, logCount)
manager.GetManager().GetLogs(containerName, logCount, follow)
}
func ListServices() {
manager.GetManager().ListServices()
manager.GetManager().PrintAllServices()
}
+1 -1
View File
@@ -110,7 +110,7 @@ func updateNginxBlockLists() {
outputString += fmt.Sprintf("allow %s;\n", ip)
}
outputString += "deny all;"
if config.GetMythicEnv().GetBool("nginx_bind_local_mount") {
if !config.GetMythicEnv().GetBool("nginx_bind_use_volume") {
ipFilePath := filepath.Join(utils.GetCwdFromExe(), "nginx-docker", "config", "blockips.conf")
if err := os.WriteFile(ipFilePath, []byte(outputString), 0600); err != nil {
log.Fatalf("[-] Failed to write out block list file: %v\n", err)
+13 -2
View File
@@ -16,9 +16,20 @@ var logsCmd = &cobra.Command{
func init() {
rootCmd.AddCommand(logsCmd)
logsCmd.Flags().StringP("lines", "l", "500", "Number of lines to display")
logsCmd.Flags().StringP("lines", "l", "200", "Number of lines to display")
logsCmd.Flags().BoolP(
"follow",
"f",
false,
`Follow a constant stream of logs from the specified container.`,
)
}
func getLogs(cmd *cobra.Command, args []string) {
internal.GetLogs(args[0], cmd.Flag("lines").Value.String())
if cmd.Flag("follow").Value.String() == "true" {
internal.GetLogs(args[0], cmd.Flag("lines").Value.String(), true)
} else {
internal.GetLogs(args[0], cmd.Flag("lines").Value.String(), false)
}
}
@@ -8,6 +8,7 @@ import (
"fmt"
"github.com/MythicMeta/Mythic_CLI/cmd/config"
"github.com/MythicMeta/Mythic_CLI/cmd/utils"
"github.com/creack/pty"
"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/volume"
"github.com/docker/docker/client"
@@ -323,7 +324,7 @@ func (d *DockerComposeManager) GetPathTo3rdPartyServicesOnDisk() string {
// StopServices stops certain containers that are running and optionally deletes the backing images
func (d *DockerComposeManager) StopServices(services []string, deleteImages bool) error {
dockerComposeContainers, err := d.GetAllExistingNonMythicServiceNames()
dockerComposeContainers, err := d.GetAllInstalled3rdPartyServiceNames()
if err != nil {
return err
}
@@ -363,14 +364,12 @@ func (d *DockerComposeManager) RemoveServices(services []string) error {
if key == "services" {
allServices := allConfigValues["services"].(map[string]interface{})
for _, service := range services {
if !utils.StringInSlice(service, config.MythicPossibleServices) {
if d.IsServiceRunning(service) {
_ = d.StopServices([]string{strings.ToLower(service)}, true)
if d.IsServiceRunning(service) {
_ = d.StopServices([]string{strings.ToLower(service)}, true)
}
delete(allServices, strings.ToLower(service))
log.Printf("[+] Removed %s from docker-compose\n", strings.ToLower(service))
}
delete(allServices, strings.ToLower(service))
log.Printf("[+] Removed %s from docker-compose\n", strings.ToLower(service))
}
}
}
@@ -477,7 +476,7 @@ func (d *DockerComposeManager) BuildUI() error {
return err
}
func (d *DockerComposeManager) GetLogs(service string, logCount int) {
func (d *DockerComposeManager) GetLogs(service string, logCount int, follow bool) {
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Fatalf("Failed to get client in GetLogs: %v", err)
@@ -494,6 +493,7 @@ func (d *DockerComposeManager) GetLogs(service string, logCount int) {
reader, err := cli.ContainerLogs(context.Background(), container.ID, types.ContainerLogsOptions{
ShowStdout: true,
ShowStderr: true,
Follow: follow,
Tail: fmt.Sprintf("%d", logCount),
})
if err != nil {
@@ -519,7 +519,7 @@ func (d *DockerComposeManager) GetLogs(service string, logCount int) {
}
}
func (d *DockerComposeManager) TestPorts() {
func (d *DockerComposeManager) TestPorts(services []string) {
// go through the different services in mythicEnv and check to make sure their ports aren't already used by trying to open them
//MYTHIC_SERVER_HOST:MYTHIC_SERVER_PORT
//POSTGRES_HOST:POSTGRES_PORT
@@ -565,19 +565,23 @@ func (d *DockerComposeManager) TestPorts() {
var removeServices []string
mythicEnv := config.GetMythicEnv()
for key, val := range portChecks {
if mythicEnv.GetString(key) == val[1] || mythicEnv.GetString(key) == "127.0.0.1" {
addServices = append(addServices, val[1])
p, err := net.Listen("tcp", ":"+strconv.Itoa(mythicEnv.GetInt(val[0])))
if err != nil {
log.Fatalf("[-] Port %d, from variable %s, appears to already be in use: %v\n", mythicEnv.GetInt(val[0]), key, err)
// only check ports for services we're about to start
if utils.StringInSlice(val[1], services) {
if mythicEnv.GetString(key) == val[1] || mythicEnv.GetString(key) == "127.0.0.1" {
addServices = append(addServices, val[1])
p, err := net.Listen("tcp", ":"+strconv.Itoa(mythicEnv.GetInt(val[0])))
if err != nil {
log.Fatalf("[-] Port %d, from variable %s, appears to already be in use: %v\n", mythicEnv.GetInt(val[0]), key, err)
}
err = p.Close()
if err != nil {
log.Printf("[-] Failed to close connection: %v\n", err)
}
} else {
removeServices = append(removeServices, val[1])
}
err = p.Close()
if err != nil {
log.Printf("[-] Failed to close connection: %v\n", err)
}
} else {
removeServices = append(removeServices, val[1])
}
}
}
@@ -662,7 +666,7 @@ func (d *DockerComposeManager) Status(verbose bool) {
if err != nil {
log.Fatalf("[-] Failed to get list of installed services on disk: %v\n", err)
}
elementsInCompose, err := d.GetAllExistingNonMythicServiceNames()
elementsInCompose, err := d.GetAllInstalled3rdPartyServiceNames()
if err != nil {
log.Fatalf("[-] Failed to get list of installed services in docker-compose: %v\n", err)
}
@@ -710,12 +714,11 @@ func (d *DockerComposeManager) Status(verbose bool) {
} else {
info += mnt.Name
}
found = true
}
}
if !found {
info += "local"
info += "N/A"
}
info += "\t"
info = info + portString
@@ -769,7 +772,7 @@ func (d *DockerComposeManager) Status(verbose bool) {
w.Flush()
}
func (d *DockerComposeManager) ListServices() {
func (d *DockerComposeManager) PrintAllServices() {
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
log.Fatalf("[-] Failed to get client in List Services: %v", err)
@@ -790,7 +793,7 @@ func (d *DockerComposeManager) ListServices() {
if err != nil {
log.Fatalf("[-] Failed to get list of installed services on disk: %v\n", err)
}
elementsInCompose, err := d.GetAllExistingNonMythicServiceNames()
elementsInCompose, err := d.GetAllInstalled3rdPartyServiceNames()
if err != nil {
log.Fatalf("[-] Failed to get list of installed services in docker-compose: %v\n", err)
}
@@ -829,24 +832,24 @@ func (d *DockerComposeManager) ListServices() {
w.Flush()
}
func (d *DockerComposeManager) ResetDatabase(localMount bool) {
if localMount {
func (d *DockerComposeManager) ResetDatabase(useVolume bool) {
if !useVolume {
workingPath := utils.GetCwdFromExe()
err := os.RemoveAll(filepath.Join(workingPath, "postgres-docker", "database"))
if err != nil {
log.Printf("[-] Failed to remove database files\n%v\n", err)
log.Fatalf("[-] Failed to remove database files\n%v\n", err)
} else {
log.Printf("[+] Successfully reset datbase files\n")
}
} else {
d.RemoveContainers([]string{"mythic_postgres"})
_ = d.RemoveContainers([]string{"mythic_postgres"})
err := d.RemoveVolume("mythic_postgres_volume")
if err != nil {
log.Printf("[-] Failed to remove database:\n%v\n", err)
}
}
}
func (d *DockerComposeManager) ListVolumes() {
func (d *DockerComposeManager) PrintVolumeInformation() {
ctx := context.Background()
cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation())
if err != nil {
@@ -1094,43 +1097,11 @@ func (d *DockerComposeManager) runDockerCompose(args []string) error {
command := exec.Command(lookPath, args...)
command.Dir = exePath
command.Env = d.getMythicEnvList()
stdout, err := command.StdoutPipe()
f, err := pty.Start(command)
if err != nil {
log.Fatalf("[-] Failed to get stdout pipe for running docker-compose\n")
}
stderr, err := command.StderrPipe()
if err != nil {
log.Fatalf("[-] Failed to get stderr pipe for running docker-compose\n")
}
stdoutScanner := bufio.NewScanner(stdout)
stderrScanner := bufio.NewScanner(stderr)
wg := sync.WaitGroup{}
wg.Add(2)
go func() {
for stdoutScanner.Scan() {
fmt.Printf("%s\n", stdoutScanner.Text())
}
wg.Done()
}()
go func() {
for stderrScanner.Scan() {
fmt.Printf("%s\n", stderrScanner.Text())
}
wg.Done()
}()
err = command.Start()
if err != nil {
log.Fatalf("[-] Error trying to start docker-compose: %v\n", err)
}
wg.Wait()
err = command.Wait()
if err != nil {
log.Printf("[-] Error from docker-compose: %v\n", err)
log.Printf("[*] Docker compose command: %v\n", args)
return err
log.Fatalf("[-] Failed to run docker command: %v\n", err)
}
io.Copy(os.Stdout, f)
return nil
}
func (d *DockerComposeManager) setDockerComposeDefaultsAndWrite(curConfig map[string]interface{}) error {
@@ -1201,8 +1172,7 @@ func (d *DockerComposeManager) ensureVolume(volumeName string) error {
return errors.New(fmt.Sprintf("failed to find container, %s, for volume, %s", containerName, volumeName))
}
// GetAllExistingNonMythicServiceNames from reading in the docker-compose file, not necessarily what's running
func (d *DockerComposeManager) GetAllExistingNonMythicServiceNames() ([]string, error) {
func (d *DockerComposeManager) GetAllInstalled3rdPartyServiceNames() ([]string, error) {
// get all services that exist within the loaded config
groupNameConfig := viper.New()
groupNameConfig.SetConfigName("docker-compose")
@@ -44,7 +44,7 @@ type CLIManager interface {
// GetInstalled3rdPartyServicesOnDisk returns the names of the installed services on disk
GetInstalled3rdPartyServicesOnDisk() ([]string, error)
// GetAllExistingNonMythicServiceNames reads current configuration and returns all non-mythic services
GetAllExistingNonMythicServiceNames() ([]string, error)
GetAllInstalled3rdPartyServiceNames() ([]string, error)
// GetCurrentMythicServiceNames reads current configuration and returns all mythic services
GetCurrentMythicServiceNames() ([]string, error)
// GetPathTo3rdPartyServicesOnDisk returns the path where a 3rd party services Dockerfile lives on disk
@@ -54,19 +54,19 @@ type CLIManager interface {
// BuildUI a new instance of the Mythic React UI and save it in the mythic-react-docker folder
BuildUI() error
// GetLogs fetches logCount of the most recent logs from the service container
GetLogs(service string, logCount int)
GetLogs(service string, logCount int, follow bool)
// TestPorts check to make sure all ports are available for services to use
TestPorts()
TestPorts(services []string)
// PrintConnectionInfo lists out connection information for the various services (web endpoints, open ports, etc)
PrintConnectionInfo()
// Status prints out the current status of all the containers and volumes in use
Status(verbose bool)
// ListServices prints out all the 3rd party services on disk and currently installed
ListServices()
PrintAllServices()
// ResetDatabase deletes the current database or volume
ResetDatabase(localMount bool)
ResetDatabase(useVolume bool)
// ListVolumes prints out all of the volumes in use by Mythic
ListVolumes()
PrintVolumeInformation()
// RemoveVolume removes the named volume
RemoveVolume(volumeName string) error
// CopyIntoVolume copies from a source io.Reader to the destination filename on the destination volume
+2 -1
View File
@@ -2,6 +2,7 @@ package cmd
import (
"github.com/spf13/cobra"
"log"
)
// installCmd represents the config command
@@ -17,5 +18,5 @@ func init() {
}
func mythicSync(cmd *cobra.Command, args []string) {
log.Fatalf("[-] Must specify install/uninstall")
}
+2 -1
View File
@@ -2,6 +2,7 @@ package cmd
import (
"github.com/spf13/cobra"
"log"
)
// installCmd represents the config command
@@ -18,5 +19,5 @@ func init() {
}
func installMythicSync(cmd *cobra.Command, args []string) {
log.Fatalf("[-] Must specify github or folder")
}
@@ -23,7 +23,7 @@ func init() {
"force",
"f",
false,
`Force installing from GitHub and don't prompt to overwrite files if an older version is already installed'`,
`Force installing from GitHub and don't prompt to overwrite files if an older version is already installed`,
)
installMythicSyncGitHubCmd.Flags().StringVarP(
&branch,
+6 -2
View File
@@ -3,6 +3,7 @@ package cmd
import (
"github.com/MythicMeta/Mythic_CLI/cmd/internal"
"github.com/spf13/cobra"
"log"
)
// configCmd represents the config command
@@ -19,7 +20,10 @@ func init() {
}
func removeDockerCompose(cmd *cobra.Command, args []string) {
if err := internal.RemoveService(args[0]); err != nil {
err := internal.RemoveService(args[0])
if err != nil {
log.Printf("[-] Failed to remove service")
return
}
log.Printf("[+] Successfully removed service")
}
+1
View File
@@ -12,6 +12,7 @@ require (
require (
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/creack/pty v1.1.21 // indirect
github.com/distribution/reference v0.5.0 // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
github.com/docker/go-connections v0.4.0 // indirect
+2
View File
@@ -51,6 +51,8 @@ github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnht
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/creack/pty v1.1.21 h1:1/QdRyBaHHJP61QkWMXlOIBfsgdDeeKfK8SYVUWJKf0=
github.com/creack/pty v1.1.21/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+4 -4
View File
@@ -1,8 +1,8 @@
#!/bin/bash
#!/bin/sh
if [ "$NGINX_USE_SSL" == "ssl" ]
if [ "$NGINX_USE_SSL" = "ssl" ]
then
curl -k https://127.0.0.1:${NGINX_PORT:-7443}/new/login
curl -k https://127.0.0.1:"${NGINX_PORT:-7443}"/new/login
else
curl -k http://127.0.0.1:${NGINX_PORT:-7443}/new/login
curl -k http://127.0.0.1:"${NGINX_PORT:-7443}"/new/login
fi