Skip to content

Commit 9734653

Browse files
committed
update: multi
1. update service subcommands 2. add feature of pods PTR record scan
1 parent cf3263b commit 9734653

10 files changed

Lines changed: 228 additions & 75 deletions

File tree

Makefile

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ default: build build-static check-size
99
build:
1010
go build -o $(BUILD_DIR)/$(MAIN_PROGRAM_NAME) main.go
1111

12+
test: build
13+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) all --help
14+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) axfr --help
15+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dns --help
16+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dnssd --help
17+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dnssd ptr --help
18+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) dnssd srv --help
19+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) metric --help
20+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) neighbor --help
21+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) neighbor pod --help
22+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) neighbor svc --help
23+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) whereisdns --help
24+
$(BUILD_DIR)/$(MAIN_PROGRAM_NAME) wild --help
25+
1226
build-static:
1327
GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o $(BUILD_DIR)/$(MAIN_PROGRAM_NAME)-linux-static main.go
1428
upx --lzma --brute $(BUILD_DIR)/$(MAIN_PROGRAM_NAME)-linux-static

cmd/all/all.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package all
22

33
import (
44
"net"
5+
"strings"
56

67
command "github.com/esonhugh/k8spider/cmd"
78
"github.com/esonhugh/k8spider/define"
@@ -42,38 +43,51 @@ var AllCmd = &cobra.Command{
4243
} else {
4344
log.Errorf("Transfer failed: %v", err)
4445
}
46+
4547
// Service Discovery
4648
ipNets, err := pkg.ParseStringToIPNet(command.Opts.Cidr)
4749
if err != nil {
4850
log.Warnf("ParseStringToIPNet failed: %v", err)
4951
return
5052
}
53+
podNets, err := pkg.ParseStringToIPNet(command.Opts.PodCidr)
54+
if err != nil {
55+
log.Warnf("ParseStringToIPNet failed: %v", err)
56+
return
57+
}
5158

5259
var finalRecord define.Records
5360
if command.Opts.MultiThreadingMode {
54-
finalRecord = RunMultiThread(ipNets, command.Opts.ThreadingNum)
61+
finalRecord = RunMultiThread(ipNets, podNets, command.Opts.ThreadingNum)
5562
} else {
56-
finalRecord = Run(ipNets)
63+
finalRecord = Run(ipNets, podNets)
5764
}
5865
printer.PrintResult(finalRecord, command.Opts.OutputFile)
5966

6067
PostRun(finalRecord)
6168
},
6269
}
6370

64-
func Run(net *net.IPNet) (finalRecord define.Records) {
71+
func Run(net, pod *net.IPNet) (finalRecord define.Records) {
6572
var records define.Records = scanner.ScanSubnet(net)
6673
if records == nil || len(records) == 0 {
6774
log.Warnf("ScanSubnet Found Nothing")
6875
return
6976
}
7077
records = scanner.ScanSvcForPorts(records)
78+
for r := range mutli.ScanNeighborSvc(pod, 1) {
79+
finalRecord = append(finalRecord, r...)
80+
}
7181
return records
7282
}
7383

74-
func RunMultiThread(net *net.IPNet, count int) (finalRecord define.Records) {
84+
func RunMultiThread(net, pod *net.IPNet, count int) (finalRecord define.Records) {
7585
scan := mutli.ScanAll(net, count)
76-
for r := range scan {
86+
scan2 := mutli.ScanNeighborSvc(pod, count)
87+
select {
88+
case r := <-scan:
89+
finalRecord = append(finalRecord, r...)
90+
case r := <-scan2:
7791
finalRecord = append(finalRecord, r...)
7892
}
7993
return
@@ -93,4 +107,9 @@ func PostRun(finalRecord define.Records) {
93107
for _, svc := range list {
94108
log.Infof("Service: %s", svc)
95109
}
110+
log.Info("Possible Pod and service ip maps")
111+
maps := post.PodServiceMap(finalRecord)
112+
for svc, ips := range maps {
113+
log.Infof("service %s has ips %s", svc, strings.Join(ips, ","))
114+
}
96115
}

cmd/neighbor/neighbor.go

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ package neighbor
22

33
import (
44
"bufio"
5-
"fmt"
65
"net"
76
"os"
8-
"strings"
97

108
cmdx "github.com/esonhugh/k8spider/cmd"
119
"github.com/esonhugh/k8spider/define"
@@ -19,34 +17,40 @@ import (
1917
var Opts = struct {
2018
NamespaceWordlist string
2119
NamespaceList []string
22-
PodCidr string
2320
}{}
2421

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

32-
func defaultPodCidr() string {
33-
interfaces, _ := net.Interfaces()
34-
for _, i := range interfaces {
35-
if i.Name == "eth0" {
36-
addrs, _ := i.Addrs()
37-
if addrs != nil || len(addrs) > 0 {
38-
ip := strings.Split(addrs[0].String(), "/")[0]
39-
return fmt.Sprintf("%v/16", ip)
40-
}
29+
var NeighborCmd = &cobra.Command{
30+
Use: "neighbor",
31+
Short: "neighbor is a tool to discover k8s neighbor pods",
32+
Run: func(cmd *cobra.Command, args []string) {
33+
cmd.Help()
34+
},
35+
}
36+
37+
var NeighborSvcCmd = &cobra.Command{
38+
Use: "svc",
39+
Short: "neighbor is a tool to discover k8s neighbor pod with services",
40+
Run: func(cmd *cobra.Command, args []string) {
41+
ipNets, err := pkg.ParseStringToIPNet(cmdx.Opts.PodCidr)
42+
if err != nil {
43+
log.Warnf("ParseStringToIPNet failed: %v", err)
44+
return
4145
}
42-
}
43-
return "10.0.0.1/16"
46+
r := RunSvc(ipNets, cmdx.Opts.ThreadingNum)
47+
printer.PrintResult(r, cmdx.Opts.OutputFile)
48+
},
4449
}
4550

46-
var NeighborCmd = &cobra.Command{
47-
Use: "neighbor",
48-
Short: "neighbor is a tool to discover k8s pod and available ip in subnet (require k8s coredns with pod verified config)",
49-
Aliases: []string{"n", "nei"},
51+
var NeighborPodCmd = &cobra.Command{
52+
Use: "pod",
53+
Short: "neighbor is a tool to discover k8s pod and available ip in subnet (require k8s coredns with pod verified config)",
5054
Run: func(cmd *cobra.Command, args []string) {
5155
if !pkg.CheckPodVerified() {
5256
log.Fatalf("k8s coredns with pod verified config could not be set")
@@ -64,17 +68,17 @@ var NeighborCmd = &cobra.Command{
6468
}
6569
}
6670
log.Tracef("namespace list: %v", Opts.NamespaceList)
67-
ipNets, err := pkg.ParseStringToIPNet(Opts.PodCidr)
71+
ipNets, err := pkg.ParseStringToIPNet(cmdx.Opts.PodCidr)
6872
if err != nil {
6973
log.Warnf("ParseStringToIPNet failed: %v", err)
7074
return
7175
}
72-
r := RunMultiThread(Opts.NamespaceList, ipNets, cmdx.Opts.ThreadingNum)
76+
r := RunPod(Opts.NamespaceList, ipNets, cmdx.Opts.ThreadingNum)
7377
printer.PrintResult(r, cmdx.Opts.OutputFile)
7478
},
7579
}
7680

77-
func RunMultiThread(ns []string, net *net.IPNet, num int) (finalRecord define.Records) {
81+
func RunPod(ns []string, net *net.IPNet, num int) (finalRecord define.Records) {
7882
scan := mutli.ScanNeighbor(ns, net, num)
7983
for r := range scan {
8084
finalRecord = append(finalRecord, r...)
@@ -85,3 +89,15 @@ func RunMultiThread(ns []string, net *net.IPNet, num int) (finalRecord define.Re
8589
}
8690
return
8791
}
92+
93+
func RunSvc(net *net.IPNet, num int) (finalRecord define.Records) {
94+
scan := mutli.ScanNeighborSvc(net, num)
95+
for r := range scan {
96+
finalRecord = append(finalRecord, r...)
97+
}
98+
if len(finalRecord) == 0 {
99+
log.Warn("ScanSubnet Found Nothing")
100+
return
101+
}
102+
return
103+
}

cmd/service/service.go

Lines changed: 0 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1 @@
11
package service
2-
3-
import (
4-
"fmt"
5-
6-
command "github.com/esonhugh/k8spider/cmd"
7-
"github.com/esonhugh/k8spider/define"
8-
"github.com/esonhugh/k8spider/pkg/printer"
9-
"github.com/esonhugh/k8spider/pkg/scanner"
10-
log "github.com/sirupsen/logrus"
11-
"github.com/spf13/cobra"
12-
)
13-
14-
var Opts struct {
15-
SvcDomains []string
16-
}
17-
18-
func init() {
19-
ServiceCmd.PersistentFlags().StringSliceVarP(&Opts.SvcDomains, "svc-domains", "s", []string{}, "service domains, like: kubernetes.default,etcd.default don't add zone like svc.cluster.local")
20-
command.RootCmd.AddCommand(ServiceCmd)
21-
}
22-
23-
var ServiceCmd = &cobra.Command{
24-
Use: "service",
25-
Aliases: []string{
26-
"srv",
27-
},
28-
Short: "service is a tool to discover k8s services ports",
29-
Run: func(cmd *cobra.Command, args []string) {
30-
if command.Opts.Zone == "" || Opts.SvcDomains == nil || len(Opts.SvcDomains) == 0 {
31-
log.Warn("zone can't empty and svc-domains can't empty")
32-
return
33-
}
34-
var records define.Records
35-
for _, domain := range Opts.SvcDomains {
36-
records = append(records, define.Record{SvcDomain: fmt.Sprintf("%s.svc.%s", domain, command.Opts.Zone)})
37-
}
38-
records = scanner.ScanSvcForPorts(records)
39-
printer.PrintResult(records, command.Opts.OutputFile)
40-
},
41-
}
Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
package subnet
1+
package service
22

33
import (
4+
"fmt"
45
"net"
56

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

1617
func init() {
17-
command.RootCmd.AddCommand(SubNetCmd)
18+
command.RootCmd.AddCommand(DNSSDCmd)
19+
DNSSDCmd.AddCommand(SubNetCmd, ServiceCmd)
20+
ServiceCmd.PersistentFlags().StringSliceVarP(&Opts.SvcDomains, "svc-domains", "s", []string{}, "service domains, like: kubernetes.default,etcd.default don't add zone like svc.cluster.local")
21+
}
22+
23+
var DNSSDCmd = &cobra.Command{
24+
Use: "dnssd",
25+
Aliases: []string{
26+
"sd",
27+
},
28+
Short: "dnssd is a subcommand to discover k8s dns-sd technique",
29+
Run: func(cmd *cobra.Command, args []string) {
30+
cmd.Help()
31+
},
1832
}
1933

2034
var SubNetCmd = &cobra.Command{
21-
Use: "subnet",
35+
Use: "ptr",
2236
Aliases: []string{
2337
"sub",
2438
"s",
@@ -64,3 +78,27 @@ func RunMultiThread(net *net.IPNet, num int) (finalRecord define.Records) {
6478
}
6579
return
6680
}
81+
82+
var Opts struct {
83+
SvcDomains []string
84+
}
85+
86+
var ServiceCmd = &cobra.Command{
87+
Use: "srv",
88+
Aliases: []string{
89+
"service",
90+
},
91+
Short: "service is a tool to discover k8s services ports",
92+
Run: func(cmd *cobra.Command, args []string) {
93+
if command.Opts.Zone == "" || Opts.SvcDomains == nil || len(Opts.SvcDomains) == 0 {
94+
log.Warn("zone can't empty and svc-domains can't empty")
95+
return
96+
}
97+
var records define.Records
98+
for _, domain := range Opts.SvcDomains {
99+
records = append(records, define.Record{SvcDomain: fmt.Sprintf("%s.svc.%s", domain, command.Opts.Zone)})
100+
}
101+
records = scanner.ScanSvcForPorts(records)
102+
printer.PrintResult(records, command.Opts.OutputFile)
103+
},
104+
}

main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
_ "github.com/esonhugh/k8spider/cmd/metrics"
99
_ "github.com/esonhugh/k8spider/cmd/neighbor"
1010
_ "github.com/esonhugh/k8spider/cmd/service"
11-
_ "github.com/esonhugh/k8spider/cmd/subnet"
1211
_ "github.com/esonhugh/k8spider/cmd/whereisdns"
1312
_ "github.com/esonhugh/k8spider/cmd/wildcard"
1413
)

pkg/mutli/executor.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,14 @@ func ScanAll(subnet *net.IPNet, num int) (result <-chan []define.Record) {
1313
}
1414

1515
func ScanNeighbor(namespace []string, subnet *net.IPNet, num int) <-chan []define.Record {
16-
subs := NewNeighborScanner(num)
16+
subs := NewNeighborScanner(ScanPods, num)
1717
if len(namespace) == 1 {
1818
return subs.ScanSingleNeighbor(namespace[0], subnet)
1919
}
2020
return subs.ScanMultiNeighbor(namespace, subnet)
2121
}
22+
23+
func ScanNeighborSvc(subnet *net.IPNet, num int) <-chan []define.Record {
24+
subs := NewNeighborScanner(ScanSvc, num)
25+
return ScanServiceWithChan(subs.ScanSvcNeighbor(subnet))
26+
}

0 commit comments

Comments
 (0)