💥 Remade all commands

Remade all commands for the pool.
This commit is contained in:
perp 2023-08-03 23:48:39 +01:00
parent c4cc1950b9
commit c47bec5f76
14 changed files with 221 additions and 146 deletions

View File

@ -3,36 +3,48 @@ package alert
import ( import (
"context" "context"
"fmt" "fmt"
"strings"
"git.tcp.direct/perp/shogo/internal/utils" "git.tcp.direct/perp/shogo/internal/utils"
) )
// Clear all alerts // Clear all alerts
func Clear() { func (a *Alert) Clear() {
// Get results // Get results
results, err := utils.Client.GetAlerts(context.Background()) results, err := utils.Client.GetAlerts(context.Background())
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
utils.Title.Println("Clearing alerts...") // Store lines
var lines string
// Add lines
lines += utils.Title.Sprintln("Clearing alerts...")
for index := range results { for index := range results {
// Set results // Set results
result, err := utils.Client.DeleteAlert(context.Background(), results[index].ID) result, err := utils.Client.DeleteAlert(context.Background(), results[index].ID)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Add lines
if result { if result {
fmt.Printf("%s: %s\n", utils.Green("Deleted alert"), utils.Blue(results[index].ID)) lines += fmt.Sprintf(
"%s: %s\n",
utils.Green("Deleted alert"),
utils.Blue(results[index].ID),
)
} else { } else {
fmt.Printf("%s: %s\n", utils.Red("Error"), "failed deleting an alert") lines += fmt.Sprintf("%s: %s\n", utils.Red("Error"), "failed deleting an alert")
} }
} }
}
// Todo: Make this threaded // Remove empty newline
lines = strings.TrimRight(lines, "\n")
// Send results
a.Results <- lines
}

View File

@ -8,17 +8,23 @@ import (
) )
// Create an alert // Create an alert
func Create(name, ip string) { func (a *Alert) Create() {
host := []string{ip} host := []string{a.IP}
// Get results // Get results
results, err := utils.Client.CreateAlert(context.Background(), name, host, 0) results, err := utils.Client.CreateAlert(context.Background(), a.Name, host, 0)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store lines
utils.Title.Println("Successfully created alert!") var lines string
fmt.Printf("%s: %s\n", utils.Green("Alert ID"), utils.Blue(results.ID))
// Add lines
lines += utils.Title.Sprintln("Successfully created alert!")
lines += fmt.Sprintf("%s: %s", utils.Green("Alert ID"), utils.Blue(results.ID))
// Send result
a.Results <- lines
} }

View File

@ -8,18 +8,18 @@ import (
) )
// Delete an alert // Delete an alert
func Delete(id string) { func (a *Alert) Delete() {
// Set results // Set results
results, err := utils.Client.DeleteAlert(context.Background(), id) results, err := utils.Client.DeleteAlert(context.Background(), a.ID)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Send result
if results { if results {
utils.Title.Println("Successfully deleted alert!") a.Results <- utils.Title.Sprintf("Successfully deleted alert!")
} else { } else {
fmt.Printf("%s: %s\n", utils.Red("Error"), "alert does not exist") a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), "alert does not exist")
} }
} }

View File

@ -9,21 +9,27 @@ import (
) )
// Return alert information // Return alert information
func Info(id string) { func (a *Alert) Info() {
// Get results // Get results
results, err := utils.Client.GetAlert(context.Background(), id) results, err := utils.Client.GetAlert(context.Background(), a.ID)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store lines
utils.Title.Printf("Alert %s\n", id) var lines string
fmt.Printf("%s: %s\n", utils.Green("Name"), utils.Blue(results.Name))
fmt.Printf( // Add lines
lines += utils.Title.Sprintf("Alert %s\n", a.ID)
lines += fmt.Sprintf("%s: %s\n", utils.Green("Name"), utils.Blue(results.Name))
lines += fmt.Sprintf(
"%s: %s\n", "%s: %s\n",
utils.Blue("Network"), utils.Blue("Network"),
utils.Green(strings.Join(results.Filters.IP, ",")), utils.Green(strings.Join(results.Filters.IP, ",")),
) )
fmt.Printf("%s: %s\n", utils.Green("Created"), utils.Blue(results.Created)) lines += fmt.Sprintf("%s: %s", utils.Green("Created"), utils.Blue(results.Created))
// Send results
a.Results <- lines
} }

View File

@ -9,23 +9,31 @@ import (
) )
// Return all the active alerts // Return all the active alerts
func List() { func (a *Alert) List() {
// Get results // Get results
results, err := utils.Client.GetAlerts(context.Background()) results, err := utils.Client.GetAlerts(context.Background())
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) a.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store lines
utils.Title.Printf("%s%13s%28s\n", "Alert ID", "Name", "IP/Network") var lines string
// Add lines
lines += utils.Title.Sprintf("%s%13s%28s\n", "Alert ID", "Name", "IP/Network")
for index := range results { for index := range results {
fmt.Printf( lines += fmt.Sprintf(
"%-14s %-24s %24s\n", "%-14s %-24s %24s\n",
utils.Green(results[index].ID), utils.Green(results[index].ID),
utils.Blue(results[index].Name), utils.Blue(results[index].Name),
utils.Green(strings.Join(results[index].Filters.IP, ",")), utils.Green(strings.Join(results[index].Filters.IP, ",")),
) )
} }
// Remove empty newline
// Send results
lines = strings.TrimRight(lines, "\n")
a.Results <- lines
} }

View File

@ -3,7 +3,6 @@ package shodan
import ( import (
"context" "context"
"fmt" "fmt"
"os"
"github.com/ns3777k/go-shodan/v4/shodan" "github.com/ns3777k/go-shodan/v4/shodan"
@ -11,20 +10,19 @@ import (
) )
// Return your query result count // Return your query result count
func Count(query string) { func (s *Shodan) Count() {
// Setup query // Setup query
options := &shodan.HostQueryOptions{ options := &shodan.HostQueryOptions{
Query: query, Query: s.Flags.Query,
} }
// Get results // Get results
results, err := utils.Client.GetHostsCountForQuery(context.Background(), options) results, err := utils.Client.GetHostsCountForQuery(context.Background(), options)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
os.Exit(1) return
} }
// Print results // Send result
utils.Title.Printf("Count: %s\n", query) s.Results <- utils.Title.Sprintf("Count: %s\n", s.Flags.Query) + fmt.Sprintf("%s", utils.Blue(results.Total))
fmt.Printf("%s\n", utils.Blue(results.Total))
} }

View File

@ -3,41 +3,27 @@ package shodan
import ( import (
"context" "context"
"fmt" "fmt"
"net"
"github.com/ns3777k/go-shodan/v4/shodan"
"git.tcp.direct/perp/shogo/internal/utils" "git.tcp.direct/perp/shogo/internal/utils"
) )
// Return domain information // Return domain information
func Domain(host string) { func Domain(domain string) {
// Parse IP
ips, err := net.LookupIP(host)
if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error())
return
}
// Get results // Get results
results, err := utils.Client.GetServicesForHost( results, err := utils.Client.GetDomain(context.Background(), domain)
context.Background(),
ips[0].To4().String(),
&shodan.HostServicesOptions{},
)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error())
return return
} }
// Print results // Print results
utils.Title.Printf("Domain: %s", host) utils.Title.Printf("Domain: %s", domain)
fmt.Printf("\n\n") fmt.Printf("\n\n")
for index := range results.Data { for index := range results.Data {
fmt.Println(results.Data[index].Domains) fmt.Println(results.Data[index])
} }
} }
// Todo: Find domain records // Todo: Find domain records, add padding, add to pool

View File

@ -11,49 +11,53 @@ import (
) )
// Return host information // Return host information
func Host(ip string) { func (s *Shodan) Host() {
// Get results // Get results
results, err := utils.Client.GetServicesForHost( results, err := utils.Client.GetServicesForHost(
context.Background(), context.Background(),
ip, s.Flags.Query,
&shodan.HostServicesOptions{}, &shodan.HostServicesOptions{},
) )
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Alternate between colors
utils.Title.Printf("Host: %s\n", ip) var alternate bool
fmt.Printf( // Store lines
var lines string
// Store port/protocol/service
var port string
// Add lines
lines += utils.Title.Sprintf("Host: %s\n", s.Flags.Query)
lines += fmt.Sprintf(
"%s: %s\n", "%s: %s\n",
utils.Green("Hostnames"), utils.Green("Hostnames"),
utils.Blue(strings.Join(results.Hostnames, ",")), utils.Blue(strings.Join(results.Hostnames, ",")),
) )
fmt.Printf("%s: %s\n", utils.Blue("Organization"), utils.Green(results.Organization)) lines += fmt.Sprintf("%s: %s\n", utils.Blue("Organization"), utils.Green(results.Organization))
fmt.Printf("%s: %s\n", utils.Green("Country"), utils.Blue(results.Country)) lines += fmt.Sprintf("%s: %s\n", utils.Green("Country"), utils.Blue(results.Country))
fmt.Printf("%s: %s\n", utils.Blue("City"), utils.Green(results.City)) lines += fmt.Sprintf("%s: %s\n", utils.Blue("City"), utils.Green(results.City))
fmt.Printf("%s: %s\n", utils.Green("Updated"), utils.Blue(results.LastUpdate)) lines += fmt.Sprintf("%s: %s\n", utils.Green("Updated"), utils.Blue(results.LastUpdate))
fmt.Printf("%s: %s\n", utils.Blue("Port count"), utils.Green(len(results.Ports))) lines += fmt.Sprintf("%s: %s\n", utils.Blue("Port count"), utils.Green(len(results.Ports)))
fmt.Printf("\n%s:\n", utils.Green("Ports")) lines += fmt.Sprintf("\n%s:\n", utils.Green("Ports"))
// Color alternator & current line
var alternate bool
var line string
// Go through data
for index := range results.Data { for index := range results.Data {
// Alternate between colors // Alternate between colors
// Find each port & transport // Find port & transport
if alternate { if alternate {
alternate = false alternate = false
line = fmt.Sprintf( port = fmt.Sprintf(
"\t%s/%s", "\t%s/%s",
utils.Blue(results.Data[index].Port), utils.Blue(results.Data[index].Port),
utils.Green(results.Data[index].Transport), utils.Green(results.Data[index].Transport),
) )
} else if !alternate { } else if !alternate {
alternate = true alternate = true
line = fmt.Sprintf( port = fmt.Sprintf(
"\t%s/%s", "\t%s/%s",
utils.Green(results.Data[index].Port), utils.Green(results.Data[index].Port),
utils.Blue(results.Data[index].Transport), utils.Blue(results.Data[index].Transport),
@ -63,13 +67,17 @@ func Host(ip string) {
// Find each product // Find each product
if results.Data[index].Product != "" { if results.Data[index].Product != "" {
if alternate { if alternate {
line = fmt.Sprintf("%s (%s)", line, utils.Green(results.Data[index].Product)) port = fmt.Sprintf("%s (%s)", port, utils.Green(results.Data[index].Product))
} else if !alternate { } else if !alternate {
line = fmt.Sprintf("%s (%s)", line, utils.Blue(results.Data[index].Product)) port = fmt.Sprintf("%s (%s)", port, utils.Blue(results.Data[index].Product))
} }
} }
// Print results lines += port + "\n"
fmt.Println(line)
} }
// Remove empty newline
// Send results
lines = strings.TrimRight(lines, "\n")
s.Results <- lines
} }

View File

@ -8,34 +8,37 @@ import (
) )
// Return your account information // Return your account information
func Info(profile_enabled bool) { func (s *Shodan) Info() {
// Fetch API information // Fetch API information
results, err := utils.Client.GetAPIInfo(context.Background()) results, err := utils.Client.GetAPIInfo(context.Background())
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store lines
utils.Title.Println("API") var lines string
fmt.Printf("%s: %s\n", utils.Green("Plan"), utils.Blue(results.Plan)) // Store profile name
fmt.Printf("%s: %s\n", utils.Blue("Query credits"), utils.Green(results.QueryCredits)) var name string
fmt.Printf("%s: %s\n", utils.Green("Scan credits"), utils.Blue(results.ScanCredits))
fmt.Printf("%s: %s\n", utils.Blue("Telnet"), utils.Green(results.Telnet))
fmt.Printf("%s: %s\n", utils.Green("HTTPS"), utils.Blue(results.HTTPS))
fmt.Printf("%s: %s\n", utils.Blue("Unlocked"), utils.Green(results.Unlocked))
// Fetch profile information // Add lines
if profile_enabled { lines += utils.Title.Sprintln("API")
lines += fmt.Sprintf("%s: %s\n", utils.Green("Plan"), utils.Blue(results.Plan))
lines += fmt.Sprintf("%s: %s\n", utils.Blue("Query credits"), utils.Green(results.QueryCredits))
lines += fmt.Sprintf("%s: %s\n", utils.Green("Scan credits"), utils.Blue(results.ScanCredits))
lines += fmt.Sprintf("%s: %s\n", utils.Blue("Telnet"), utils.Green(results.Telnet))
lines += fmt.Sprintf("%s: %s\n", utils.Green("HTTPS"), utils.Blue(results.HTTPS))
lines += fmt.Sprintf("%s: %s", utils.Blue("Unlocked"), utils.Green(results.Unlocked))
// Profile enabled
if s.Flags.Profile {
// Fetch profile information
results, err := utils.Client.GetAccountProfile(context.Background()) results, err := utils.Client.GetAccountProfile(context.Background())
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Profile name
var name string
// Empty name // Empty name
if results.Name == "" { if results.Name == "" {
name = "?" name = "?"
@ -43,13 +46,18 @@ func Info(profile_enabled bool) {
name = results.Name name = results.Name
} }
// Print results // Add lines
fmt.Println("") lines += "\n\n"
lines += utils.Title.Sprintln("Profile")
lines += fmt.Sprintf("%s: %s\n", utils.Green("Name"), utils.Blue(name))
lines += fmt.Sprintf("%s: %s\n", utils.Blue("Member"), utils.Green(results.Member))
lines += fmt.Sprintf("%s: %s\n", utils.Green("Credits"), utils.Blue(results.Credits))
lines += fmt.Sprintf("%s: %s", utils.Blue("Created"), utils.Green(results.Created))
utils.Title.Println("Profile") // Send results
fmt.Printf("%s: %s\n", utils.Green("Name"), utils.Blue(name)) s.Results <- lines
fmt.Printf("%s: %s\n", utils.Blue("Member"), utils.Green(results.Member))
fmt.Printf("%s: %s\n", utils.Green("Credits"), utils.Blue(results.Credits))
fmt.Printf("%s: %s\n", utils.Blue("Created"), utils.Green(results.Created))
} }
// Send results
s.Results <- lines
} }

View File

@ -8,14 +8,14 @@ import (
) )
// Return your IP address // Return your IP address
func MyIp() { func (s *Shodan) MyIp() {
// Fetch IP address // Fetch IP address
results, err := utils.Client.GetMyIP(context.Background()) results, err := utils.Client.GetMyIP(context.Background())
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Send line
fmt.Printf("%s\n", utils.Blue(results.String())) s.Results <- fmt.Sprintf("%s", utils.Blue(results.String()))
} }

View File

@ -9,18 +9,21 @@ import (
) )
// Submit an internet scan // Submit an internet scan
func Internet(port int, protocol string) { func (s *Scan) Internet() {
// Get results // Get results
results, err := utils.Client.ScanInternet(context.Background(), port, protocol) results, err := utils.Client.ScanInternet(context.Background(), s.Port, s.Protocol)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store lines
utils.Title.Printf("Scanning internet for %d %s\n", port, protocol) var lines string
fmt.Printf("%s: %s\n", utils.Green("ID"), utils.Blue(results)) // Print results
lines += utils.Title.Sprintf("Scanning internet for %d %s\n", s.Port, s.Protocol)
lines += fmt.Sprintf("%s: %s\n", utils.Green("ID"), utils.Blue(results))
for { for {
time.Sleep(time.Second * 3) time.Sleep(time.Second * 3)
@ -28,14 +31,15 @@ func Internet(port int, protocol string) {
// Get results // Get results
results, err := utils.Client.GetScanStatus(context.Background(), results) results, err := utils.Client.GetScanStatus(context.Background(), results)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s\n", utils.Red("Error"), err.Error())
return return
} }
// Get status // Get status
switch results.Status { switch results.Status {
case "DONE": case "DONE":
fmt.Printf("%s: %s\n", utils.Blue("Status"), utils.Green(results.Status)) lines += fmt.Sprintf("%s: %s", utils.Blue("Status"), utils.Green(results.Status))
s.Results <- lines
return return
} }
} }

View File

@ -3,23 +3,32 @@ package scan
import ( import (
"context" "context"
"fmt" "fmt"
"strings"
"git.tcp.direct/perp/shogo/internal/utils" "git.tcp.direct/perp/shogo/internal/utils"
) )
// Return protocols to scan // Return protocols to scan
func Protocols() { func (s *Scan) Protocols() {
// Get results // Get results
results, err := utils.Client.GetProtocols(context.Background()) results, err := utils.Client.GetProtocols(context.Background())
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store liens
utils.Title.Println("Protocols") var lines string
// Add lines
lines += utils.Title.Sprintln("Protocols")
for key, value := range results { for key, value := range results {
fmt.Printf("%-36s %s\n", utils.Green(key), utils.Blue(value)) lines += fmt.Sprintf("%-36s %s\n", utils.Green(key), utils.Blue(value))
} }
// Remove empty newline
lines = strings.TrimRight(lines, "\n")
// Send results
s.Results <- lines
} }

View File

@ -9,18 +9,21 @@ import (
) )
// Submit a scan // Submit a scan
func Submit(ips []string) { func (s *Scan) Submit() {
// Get results // Get results
results, err := utils.Client.Scan(context.Background(), ips) results, err := utils.Client.Scan(context.Background(), s.IPs)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Print results // Store lines
utils.Title.Printf("Starting scan for %s\n", ips) var lines string
fmt.Printf( // Add lines
lines += utils.Title.Sprintf("Starting scan for %s\n", s.IPs)
lines += fmt.Sprintf(
"%s: %s\n%s: %s\n%s: %s\n", "%s: %s\n%s: %s\n%s: %s\n",
utils.Green("ID"), utils.Green("ID"),
utils.Blue(results.ID), utils.Blue(results.ID),
@ -36,14 +39,15 @@ func Submit(ips []string) {
// Get results // Get results
results, err := utils.Client.GetScanStatus(context.Background(), results.ID) results, err := utils.Client.GetScanStatus(context.Background(), results.ID)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
return return
} }
// Get status // Get status
switch results.Status { switch results.Status {
case "DONE": case "DONE":
fmt.Printf("%s: %s\n", utils.Blue("Status"), utils.Green(results.Status)) lines += fmt.Sprintf("%s: %s", utils.Blue("Status"), utils.Green(results.Status))
s.Results <- lines
return return
} }
} }

View File

@ -3,6 +3,7 @@ package shodan
import ( import (
"context" "context"
"fmt" "fmt"
"strings"
"github.com/ns3777k/go-shodan/v4/shodan" "github.com/ns3777k/go-shodan/v4/shodan"
@ -17,27 +18,52 @@ type Stats struct {
} }
// Return facet stats on a search // Return facet stats on a search
func (s *Stats) Stats() { func (s *Shodan) Stats() {
// Setup options // Setup options
options := &shodan.HostQueryOptions{ options := &shodan.HostQueryOptions{
Query: s.Query, Query: s.Flags.Query,
Facets: "US", Facets: s.Flags.Facets,
Page: s.Page, Page: 1,
} }
// Get results // Get results
results, err := utils.Client.GetHostsForQuery(context.Background(), options) results, err := utils.Client.GetHostsForQuery(context.Background(), options)
if err != nil { if err != nil {
fmt.Printf("%s: %s\n", utils.Red("Error"), err.Error()) s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error())
s.Results <- ""
return return
} }
// Print results // Store lines
for host := range results.Matches { var lines string
fmt.Println(results.Matches[host])
}
s.Results <- ""
}
// Todo: Fix this // Split facets
splitted := strings.Split(s.Flags.Facets, ",")
// Go through splitted
for split := range splitted {
// Get facet & count
facet := strings.Split(splitted[split], ":")
// Add lines
lines += utils.Title.Sprintf(
"\nTop %s results for %s query with %s facet\n",
facet[1],
s.Flags.Query,
facet[0],
)
for index := range results.Facets[facet[0]] {
lines += fmt.Sprintf(
"%s: %s\n",
utils.Green(results.Facets[facet[0]][index].Value),
utils.Blue(results.Facets[facet[0]][index].Count),
)
}
}
// Remove empty newline(s)
// Send results
lines = strings.Replace(lines, "\n", "", 1)
lines = strings.TrimRight(lines, "\n")
s.Results <- lines
}