From 5582f77221fce912badb19a0cde3cfdf9ac49a88 Mon Sep 17 00:00:00 2001 From: Pin Date: Sun, 8 May 2022 00:23:12 -0400 Subject: [PATCH] Initial Commit --- .gitignore | 1 + README.md | 4 +++ client/client.go | 88 ++++++++++++++++++++++++++++++++++++++++++++++++ client/go.mod | 7 ++++ server/server.go | 44 ++++++++++++++++++++++++ 5 files changed, 144 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 client/client.go create mode 100644 client/go.mod create mode 100644 server/server.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d822865 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +**/go.sum diff --git a/README.md b/README.md new file mode 100644 index 0000000..c1d7eb6 --- /dev/null +++ b/README.md @@ -0,0 +1,4 @@ +# Simple Discovery Service + +Client utilizes packet capture to listen to response to bypass host firewalls. + diff --git a/client/client.go b/client/client.go new file mode 100644 index 0000000..1419e6c --- /dev/null +++ b/client/client.go @@ -0,0 +1,88 @@ +package main + +import ( + "encoding/binary" + "errors" + "fmt" + "net" + "time" + + "github.com/google/gopacket" + "github.com/google/gopacket/pcap" +) + +func errCheck(err error) { + if err != nil { + panic(err) + } + return +} + +func listenDiscoverResponse() { + handle, err := pcap.OpenLive("any", int32(1600), true, pcap.BlockForever) + errCheck(err) + + handle.SetBPFFilter("udp and port 8850") + + packets := gopacket.NewPacketSource(handle, handle.LinkType()).Packets() + + for pkt := range packets { + fmt.Printf("%s\n", pkt.NetworkLayer().NetworkFlow().Src()) + } + + return +} + +func toMaxHost(n *net.IPNet) (net.IP, error) { + if n.IP.To4() == nil { + return net.IP{}, errors.New("IP address is not IPv4") + } + + ip := make(net.IP, len(n.IP.To4())) + binary.BigEndian.PutUint32(ip, + binary.BigEndian.Uint32(n.IP.To4())|^binary.BigEndian.Uint32(net.IP(n.Mask).To4())) + + return ip, nil +} + +func bcastAddresses() ([]string) { + var addrs []string = nil + interfaceInfo, _ := net.Interfaces() + for i := 0; i < len(interfaceInfo); i++ { + addr, err := interfaceInfo[i].Addrs() + errCheck(err) + for j := 0; j < len(addr); j++ { + _, ipNet, _ := net.ParseCIDR(addr[j].String()) + bcast, err := toMaxHost(ipNet) + + if err != nil { + } else { + addrs = append(addrs, bcast.String()) + } + } + } + + return addrs +} + +func main() { + sendAddrs := bcastAddresses() + + go listenDiscoverResponse() + + time.Sleep(1 * time.Second) + + for i := 0; i < len(sendAddrs); i++ { + remoteAddr := sendAddrs[i] + ":8888" + remote, err := net.ResolveUDPAddr("udp4", remoteAddr) + errCheck(err) + conn, err := net.DialUDP("udp4", nil, remote) + errCheck(err) + defer conn.Close() + + _, err = conn.Write([]byte(conn.LocalAddr().String())) + errCheck(err) + } + time.Sleep(30 * time.Second) +} + diff --git a/client/go.mod b/client/go.mod new file mode 100644 index 0000000..6d94347 --- /dev/null +++ b/client/go.mod @@ -0,0 +1,7 @@ +module client + +go 1.18 + +require github.com/google/gopacket v1.1.19 + +require golang.org/x/sys v0.0.0-20190412213103-97732733099d // indirect diff --git a/server/server.go b/server/server.go new file mode 100644 index 0000000..edda35a --- /dev/null +++ b/server/server.go @@ -0,0 +1,44 @@ +package main + +import ( + "fmt" + "net" + "strings" +) + +func main() { + serv, err := net.ListenPacket("udp4", ":8888") + + if err != nil { + panic(err) + } + + defer serv.Close() + + buff := make([]byte, 2048) + + for { + + n, addr, err := serv.ReadFrom(buff) + if err != nil { + panic(err) + } + + remoteAddr := strings.Split(addr.String(), ":") + + remote, err := net.ResolveUDPAddr("udp4", remoteAddr[0] + ":8850") + + if err != nil { + panic(err) + } + + conn, _ := net.DialUDP("udp4", nil, remote) + defer conn.Close() + + conn.Write([]byte("Hello")) + conn.Close() + + fmt.Printf("%s sent this: %s\n", addr, buff[:n]) + + } +}