mirror of
https://github.com/MrAle98/sliver
synced 2026-06-08 11:54:46 +00:00
127 lines
3.4 KiB
Go
127 lines
3.4 KiB
Go
package alias
|
|
|
|
/*
|
|
Sliver Implant Framework
|
|
Copyright (C) 2021 Bishop Fox
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"strings"
|
|
|
|
"github.com/bishopfox/sliver/client/assets"
|
|
"github.com/bishopfox/sliver/client/command/settings"
|
|
"github.com/bishopfox/sliver/client/console"
|
|
"github.com/desertbit/grumble"
|
|
"github.com/jedib0t/go-pretty/v6/table"
|
|
"github.com/jedib0t/go-pretty/v6/text"
|
|
)
|
|
|
|
// AliasesCmd - The alias command
|
|
func AliasesCmd(ctx *grumble.Context, con *console.SliverConsoleClient) {
|
|
if 0 < len(loadedAliases) {
|
|
PrintAliases(con)
|
|
} else {
|
|
con.PrintInfof("No aliases installed, use the 'armory' command to automatically install some\n")
|
|
}
|
|
}
|
|
|
|
// PrintAliases - Print a list of loaded aliases
|
|
func PrintAliases(con *console.SliverConsoleClient) {
|
|
tw := table.NewWriter()
|
|
tw.SetStyle(settings.GetTableStyle(con))
|
|
tw.AppendHeader(table.Row{
|
|
"Name",
|
|
"Command Name",
|
|
"Platforms",
|
|
"Version",
|
|
"Installed",
|
|
".NET Assembly",
|
|
"Reflective",
|
|
"Tool Author",
|
|
"Repository",
|
|
})
|
|
tw.SortBy([]table.SortBy{
|
|
{Name: "Name", Mode: table.Asc},
|
|
})
|
|
tw.SetColumnConfigs([]table.ColumnConfig{
|
|
{Number: 5, Align: text.AlignCenter},
|
|
})
|
|
|
|
installedManifests := getInstalledManifests()
|
|
for _, aliasPkg := range loadedAliases {
|
|
installed := ""
|
|
if _, ok := installedManifests[aliasPkg.Manifest.CommandName]; ok {
|
|
installed = "✅"
|
|
}
|
|
tw.AppendRow(table.Row{
|
|
aliasPkg.Manifest.Name,
|
|
aliasPkg.Manifest.CommandName,
|
|
strings.Join(aliasPlatforms(aliasPkg.Manifest), ",\n"),
|
|
aliasPkg.Manifest.Version,
|
|
installed,
|
|
aliasPkg.Manifest.IsAssembly,
|
|
aliasPkg.Manifest.IsReflective,
|
|
aliasPkg.Manifest.OriginalAuthor,
|
|
aliasPkg.Manifest.RepoURL,
|
|
})
|
|
}
|
|
con.Println(tw.Render())
|
|
}
|
|
|
|
// AliasCommandNameCompleter - Completer for installed extensions command names
|
|
func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverConsoleClient) []string {
|
|
results := []string{}
|
|
for name := range loadedAliases {
|
|
if strings.HasPrefix(name, prefix) {
|
|
results = append(results, name)
|
|
}
|
|
}
|
|
return results
|
|
}
|
|
|
|
func aliasPlatforms(aliasPkg *AliasManifest) []string {
|
|
platforms := map[string]string{}
|
|
for _, entry := range aliasPkg.Files {
|
|
platforms[fmt.Sprintf("%s/%s", entry.OS, entry.Arch)] = ""
|
|
}
|
|
keys := []string{}
|
|
for key := range platforms {
|
|
keys = append(keys, key)
|
|
}
|
|
return keys
|
|
}
|
|
|
|
func getInstalledManifests() map[string]*AliasManifest {
|
|
manifestPaths := assets.GetInstalledAliasManifests()
|
|
installedManifests := map[string]*AliasManifest{}
|
|
for _, manifestPath := range manifestPaths {
|
|
data, err := ioutil.ReadFile(manifestPath)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
manifest := &AliasManifest{}
|
|
err = json.Unmarshal(data, manifest)
|
|
if err != nil {
|
|
continue
|
|
}
|
|
installedManifests[manifest.CommandName] = manifest
|
|
}
|
|
return installedManifests
|
|
}
|