Skip to content

Commit

Permalink
update: multi
Browse files Browse the repository at this point in the history
1. update service subcommands
2. add feature of pods PTR record scan
  • Loading branch information
Esonhugh committed Jan 3, 2025
1 parent cf3263b commit 9734653
Show file tree
Hide file tree
Showing 10 changed files with 228 additions and 75 deletions.
14 changes: 14 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,20 @@ default: build build-static check-size
build:
go build -o $(BUILD_DIR)/$(MAIN_PROGRAM_NAME) main.go

test: build
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) all --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) axfr --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dns --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dnssd --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dnssd ptr --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dnssd srv --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) metric --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) neighbor --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) neighbor pod --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) neighbor svc --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) whereisdns --help
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) wild --help

build-static:
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o $(BUILD_DIR)/$(MAIN_PROGRAM_NAME)-linux-static main.go
upx --lzma --brute $(BUILD_DIR)/$(MAIN_PROGRAM_NAME)-linux-static
Expand Down
29 changes: 24 additions & 5 deletions cmd/all/all.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package all

import (
"net"
"strings"

command "github.com/esonhugh/k8spider/cmd"
"github.com/esonhugh/k8spider/define"
Expand Down Expand Up @@ -42,38 +43,51 @@ var AllCmd = &cobra.Command{
} else {
log.Errorf("Transfer failed: %v", err)
}

// Service Discovery
ipNets, err := pkg.ParseStringToIPNet(command.Opts.Cidr)
if err != nil {
log.Warnf("ParseStringToIPNet failed: %v", err)
return
}
podNets, err := pkg.ParseStringToIPNet(command.Opts.PodCidr)
if err != nil {
log.Warnf("ParseStringToIPNet failed: %v", err)
return
}

var finalRecord define.Records
if command.Opts.MultiThreadingMode {
finalRecord = RunMultiThread(ipNets, command.Opts.ThreadingNum)
finalRecord = RunMultiThread(ipNets, podNets, command.Opts.ThreadingNum)
} else {
finalRecord = Run(ipNets)
finalRecord = Run(ipNets, podNets)
}
printer.PrintResult(finalRecord, command.Opts.OutputFile)

PostRun(finalRecord)
},
}

func Run(net *net.IPNet) (finalRecord define.Records) {
func Run(net, pod *net.IPNet) (finalRecord define.Records) {
var records define.Records = scanner.ScanSubnet(net)
if records == nil || len(records) == 0 {
log.Warnf("ScanSubnet Found Nothing")
return
}
records = scanner.ScanSvcForPorts(records)
for r := range mutli.ScanNeighborSvc(pod, 1) {
finalRecord = append(finalRecord, r...)
}
return records
}

func RunMultiThread(net *net.IPNet, count int) (finalRecord define.Records) {
func RunMultiThread(net, pod *net.IPNet, count int) (finalRecord define.Records) {
scan := mutli.ScanAll(net, count)
for r := range scan {
scan2 := mutli.ScanNeighborSvc(pod, count)
select {
case r := <-scan:
finalRecord = append(finalRecord, r...)
case r := <-scan2:
finalRecord = append(finalRecord, r...)
}
return
Expand All @@ -93,4 +107,9 @@ func PostRun(finalRecord define.Records) {
for _, svc := range list {
log.Infof("Service: %s", svc)
}
log.Info("Possible Pod and service ip maps")
maps := post.PodServiceMap(finalRecord)
for svc, ips := range maps {
log.Infof("service %s has ips %s", svc, strings.Join(ips, ","))
}
}
64 changes: 40 additions & 24 deletions cmd/neighbor/neighbor.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,8 @@ package neighbor

import (
"bufio"
"fmt"
"net"
"os"
"strings"

cmdx "github.com/esonhugh/k8spider/cmd"
"github.com/esonhugh/k8spider/define"
Expand All @@ -19,34 +17,40 @@ import (
var Opts = struct {
NamespaceWordlist string
NamespaceList []string
PodCidr string
}{}

func init() {
NeighborCmd.AddCommand(NeighborSvcCmd, NeighborPodCmd)
cmdx.RootCmd.AddCommand(NeighborCmd)
NeighborCmd.Flags().StringVar(&Opts.NamespaceWordlist, "ns-file", "", "namespace wordlist file")
NeighborCmd.Flags().StringSliceVar(&Opts.NamespaceList, "ns", []string{}, "namespace list")
NeighborCmd.Flags().StringVarP(&Opts.PodCidr, "pod-cidr", "p", defaultPodCidr(), "pod cidr list, watch out for the network interface name, default is eth0")
NeighborPodCmd.Flags().StringVar(&Opts.NamespaceWordlist, "ns-file", "", "namespace wordlist file")
NeighborPodCmd.Flags().StringSliceVar(&Opts.NamespaceList, "ns", []string{}, "namespace list")
}

func defaultPodCidr() string {
interfaces, _ := net.Interfaces()
for _, i := range interfaces {
if i.Name == "eth0" {
addrs, _ := i.Addrs()
if addrs != nil || len(addrs) > 0 {
ip := strings.Split(addrs[0].String(), "/")[0]
return fmt.Sprintf("%v/16", ip)
}
var NeighborCmd = &cobra.Command{
Use: "neighbor",
Short: "neighbor is a tool to discover k8s neighbor pods",
Run: func(cmd *cobra.Command, args []string) {
cmd.Help()
},
}

var NeighborSvcCmd = &cobra.Command{
Use: "svc",
Short: "neighbor is a tool to discover k8s neighbor pod with services",
Run: func(cmd *cobra.Command, args []string) {
ipNets, err := pkg.ParseStringToIPNet(cmdx.Opts.PodCidr)
if err != nil {
log.Warnf("ParseStringToIPNet failed: %v", err)
return
}
}
return "10.0.0.1/16"
r := RunSvc(ipNets, cmdx.Opts.ThreadingNum)
printer.PrintResult(r, cmdx.Opts.OutputFile)
},
}

var NeighborCmd = &cobra.Command{
Use: "neighbor",
Short: "neighbor is a tool to discover k8s pod and available ip in subnet (require k8s coredns with pod verified config)",
Aliases: []string{"n", "nei"},
var NeighborPodCmd = &cobra.Command{
Use: "pod",
Short: "neighbor is a tool to discover k8s pod and available ip in subnet (require k8s coredns with pod verified config)",
Run: func(cmd *cobra.Command, args []string) {
if !pkg.CheckPodVerified() {
log.Fatalf("k8s coredns with pod verified config could not be set")
Expand All @@ -64,17 +68,17 @@ var NeighborCmd = &cobra.Command{
}
}
log.Tracef("namespace list: %v", Opts.NamespaceList)
ipNets, err := pkg.ParseStringToIPNet(Opts.PodCidr)
ipNets, err := pkg.ParseStringToIPNet(cmdx.Opts.PodCidr)
if err != nil {
log.Warnf("ParseStringToIPNet failed: %v", err)
return
}
r := RunMultiThread(Opts.NamespaceList, ipNets, cmdx.Opts.ThreadingNum)
r := RunPod(Opts.NamespaceList, ipNets, cmdx.Opts.ThreadingNum)
printer.PrintResult(r, cmdx.Opts.OutputFile)
},
}

func RunMultiThread(ns []string, net *net.IPNet, num int) (finalRecord define.Records) {
func RunPod(ns []string, net *net.IPNet, num int) (finalRecord define.Records) {
scan := mutli.ScanNeighbor(ns, net, num)
for r := range scan {
finalRecord = append(finalRecord, r...)
Expand All @@ -85,3 +89,15 @@ func RunMultiThread(ns []string, net *net.IPNet, num int) (finalRecord define.Re
}
return
}

func RunSvc(net *net.IPNet, num int) (finalRecord define.Records) {
scan := mutli.ScanNeighborSvc(net, num)
for r := range scan {
finalRecord = append(finalRecord, r...)
}
if len(finalRecord) == 0 {
log.Warn("ScanSubnet Found Nothing")
return
}
return
}
40 changes: 0 additions & 40 deletions cmd/service/service.go
Original file line number Diff line number Diff line change
@@ -1,41 +1 @@
package service

import (
"fmt"

command "github.com/esonhugh/k8spider/cmd"
"github.com/esonhugh/k8spider/define"
"github.com/esonhugh/k8spider/pkg/printer"
"github.com/esonhugh/k8spider/pkg/scanner"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)

var Opts struct {
SvcDomains []string
}

func init() {
ServiceCmd.PersistentFlags().StringSliceVarP(&Opts.SvcDomains, "svc-domains", "s", []string{}, "service domains, like: kubernetes.default,etcd.default don't add zone like svc.cluster.local")
command.RootCmd.AddCommand(ServiceCmd)
}

var ServiceCmd = &cobra.Command{
Use: "service",
Aliases: []string{
"srv",
},
Short: "service is a tool to discover k8s services ports",
Run: func(cmd *cobra.Command, args []string) {
if command.Opts.Zone == "" || Opts.SvcDomains == nil || len(Opts.SvcDomains) == 0 {
log.Warn("zone can't empty and svc-domains can't empty")
return
}
var records define.Records
for _, domain := range Opts.SvcDomains {
records = append(records, define.Record{SvcDomain: fmt.Sprintf("%s.svc.%s", domain, command.Opts.Zone)})
}
records = scanner.ScanSvcForPorts(records)
printer.PrintResult(records, command.Opts.OutputFile)
},
}
44 changes: 41 additions & 3 deletions cmd/subnet/subnet.go → cmd/service/subnet.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package subnet
package service

import (
"fmt"
"net"

command "github.com/esonhugh/k8spider/cmd"
Expand All @@ -14,11 +15,24 @@ import (
)

func init() {
command.RootCmd.AddCommand(SubNetCmd)
command.RootCmd.AddCommand(DNSSDCmd)
DNSSDCmd.AddCommand(SubNetCmd, ServiceCmd)
ServiceCmd.PersistentFlags().StringSliceVarP(&Opts.SvcDomains, "svc-domains", "s", []string{}, "service domains, like: kubernetes.default,etcd.default don't add zone like svc.cluster.local")
}

var DNSSDCmd = &cobra.Command{
Use: "dnssd",
Aliases: []string{
"sd",
},
Short: "dnssd is a subcommand to discover k8s dns-sd technique",
Run: func(cmd *cobra.Command, args []string) {
cmd.Help()
},
}

var SubNetCmd = &cobra.Command{
Use: "subnet",
Use: "ptr",
Aliases: []string{
"sub",
"s",
Expand Down Expand Up @@ -64,3 +78,27 @@ func RunMultiThread(net *net.IPNet, num int) (finalRecord define.Records) {
}
return
}

var Opts struct {
SvcDomains []string
}

var ServiceCmd = &cobra.Command{
Use: "srv",
Aliases: []string{
"service",
},
Short: "service is a tool to discover k8s services ports",
Run: func(cmd *cobra.Command, args []string) {
if command.Opts.Zone == "" || Opts.SvcDomains == nil || len(Opts.SvcDomains) == 0 {
log.Warn("zone can't empty and svc-domains can't empty")
return
}
var records define.Records
for _, domain := range Opts.SvcDomains {
records = append(records, define.Record{SvcDomain: fmt.Sprintf("%s.svc.%s", domain, command.Opts.Zone)})
}
records = scanner.ScanSvcForPorts(records)
printer.PrintResult(records, command.Opts.OutputFile)
},
}
1 change: 0 additions & 1 deletion main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import (
_ "github.com/esonhugh/k8spider/cmd/metrics"
_ "github.com/esonhugh/k8spider/cmd/neighbor"
_ "github.com/esonhugh/k8spider/cmd/service"
_ "github.com/esonhugh/k8spider/cmd/subnet"
_ "github.com/esonhugh/k8spider/cmd/whereisdns"
_ "github.com/esonhugh/k8spider/cmd/wildcard"
)
Expand Down
7 changes: 6 additions & 1 deletion pkg/mutli/executor.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,14 @@ func ScanAll(subnet *net.IPNet, num int) (result <-chan []define.Record) {
}

func ScanNeighbor(namespace []string, subnet *net.IPNet, num int) <-chan []define.Record {
subs := NewNeighborScanner(num)
subs := NewNeighborScanner(ScanPods, num)
if len(namespace) == 1 {
return subs.ScanSingleNeighbor(namespace[0], subnet)
}
return subs.ScanMultiNeighbor(namespace, subnet)
}

func ScanNeighborSvc(subnet *net.IPNet, num int) <-chan []define.Record {
subs := NewNeighborScanner(ScanSvc, num)
return ScanServiceWithChan(subs.ScanSvcNeighbor(subnet))
}
Loading

0 comments on commit 9734653

Please sign in to comment.