package shodan import ( "context" "fmt" "strings" "github.com/ns3777k/go-shodan/v4/shodan" "git.supernets.org/perp/shogo/internal/utils" ) // Return host information func (s *Shodan) Host() { // Get results results, err := utils.Client.GetServicesForHost( context.Background(), s.Flags.Query, &shodan.HostServicesOptions{}, ) if err != nil { s.Results <- fmt.Sprintf("%s: %s", utils.Red("Error"), err.Error()) return } // Alternate between colors var alternate bool // 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", utils.Green("Hostnames"), utils.Blue(strings.Join(results.Hostnames, ",")), ) lines += fmt.Sprintf("%s: %s\n", utils.Blue("Organization"), utils.Green(results.Organization)) lines += fmt.Sprintf("%s: %s\n", utils.Green("Country"), utils.Blue(results.Country)) lines += fmt.Sprintf("%s: %s\n", utils.Blue("City"), utils.Green(results.City)) lines += fmt.Sprintf("%s: %s\n", utils.Green("Updated"), utils.Blue(results.LastUpdate)) lines += fmt.Sprintf("%s: %s\n", utils.Blue("Port count"), utils.Green(len(results.Ports))) lines += fmt.Sprintf("\n%s:\n", utils.Green("Ports")) // Go through data for index := range results.Data { // Alternate between colors // Find port & transport if alternate { alternate = false port = fmt.Sprintf( "\t%s/%s", utils.Blue(results.Data[index].Port), utils.Green(results.Data[index].Transport), ) } else if !alternate { alternate = true port = fmt.Sprintf( "\t%s/%s", utils.Green(results.Data[index].Port), utils.Blue(results.Data[index].Transport), ) } // Find each product if results.Data[index].Product != "" { if alternate { port = fmt.Sprintf("%s (%s)", port, utils.Green(results.Data[index].Product)) } else if !alternate { port = fmt.Sprintf("%s (%s)", port, utils.Blue(results.Data[index].Product)) } } lines += port + "\n" } // Remove empty newline // Send results lines = strings.TrimRight(lines, "\n") s.Results <- lines }