84 lines
2.1 KiB
Go
84 lines
2.1 KiB
Go
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
|
|
}
|