-
Notifications
You must be signed in to change notification settings - Fork 201
/
list_cmd.go
79 lines (71 loc) · 2.19 KB
/
list_cmd.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main
import (
"fmt"
"github.com/datadog/stratus-red-team/v2/pkg/stratus"
"github.com/datadog/stratus-red-team/v2/pkg/stratus/mitreattack"
"github.com/fatih/color"
"github.com/jedib0t/go-pretty/v6/table"
"github.com/spf13/cobra"
"log"
"strings"
)
var listPlatform string
var listMitreAttackTactic string
func buildListCmd() *cobra.Command {
listCmd := &cobra.Command{
Use: "list",
Short: "List attack techniques",
Example: strings.Join([]string{
"stratus list",
"stratus list --platform aws --mitre-attack-tactic persistence",
}, "\n"),
Run: func(cmd *cobra.Command, args []string) {
doListCmd(listMitreAttackTactic, listPlatform)
},
}
listCmd.Flags().StringVarP(&listPlatform, "platform", "", "", "Filter on specific platform")
listCmd.Flags().StringVarP(&listMitreAttackTactic, "mitre-attack-tactic", "", "", "Filter on a specific MITRE ATT&CK tactic.")
return listCmd
}
func doListCmd(mitreAttackTactic string, platform string) {
filter := stratus.AttackTechniqueFilter{}
if platform != "" {
platform, err := stratus.PlatformFromString(platform)
if err != nil {
log.Fatal(err)
}
filter.Platform = platform
}
if mitreAttackTactic != "" {
tactic, err := mitreattack.AttackTacticFromString(mitreAttackTactic)
if err != nil {
log.Fatal(err)
}
filter.Tactic = tactic
}
techniques := stratus.GetRegistry().GetAttackTechniques(&filter)
t := GetDisplayTable()
t.AppendHeader(table.Row{"Technique ID", "Technique name", "Platform", "MITRE ATT&CK Tactic"})
for i := range techniques {
displayName := techniques[i].ID
if friendlyName := techniques[i].FriendlyName; friendlyName != "" {
displayName = friendlyName
}
t.AppendRow(table.Row{
techniques[i].ID,
displayName,
techniques[i].Platform,
getTacticsString(techniques[i].MitreAttackTactics),
})
}
fmt.Println()
fmt.Println(color.CyanString("View the list of all available attack techniques at: https://stratus-red-team.cloud/attack-techniques/list/\n"))
t.Render()
}
func getTacticsString(tactics []mitreattack.Tactic) string {
var names []string
for i := range tactics {
names = append(names, mitreattack.AttackTacticToString(tactics[i]))
}
return strings.Join(names, "\n")
}