commit 4b8110b6b018b41ffbddce4dfd3c4af16bd80ba4 Author: MDK Date: Mon Jun 3 19:22:35 2024 +0800 gfw test diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..59262e7 --- /dev/null +++ b/go.mod @@ -0,0 +1,15 @@ +module gfw_test + +go 1.20 + +require github.com/miekg/dns v1.1.55 + +require ( + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/rs/zerolog v1.29.1 // indirect + golang.org/x/mod v0.7.0 // indirect + golang.org/x/net v0.2.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/tools v0.3.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..4fb7281 --- /dev/null +++ b/go.sum @@ -0,0 +1,30 @@ +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/miekg/dns v1.1.55 h1:GoQ4hpsj0nFLYe+bWiCToyrBEJXkQfOOIvFGFy0lEgo= +github.com/miekg/dns v1.1.55/go.mod h1:uInx36IzPl7FYnDcMeVWxj9byh7DutNykX4G9Sj60FY= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc= +github.com/rs/zerolog v1.29.1/go.mod h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU= +golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA= +golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/tools v0.3.0 h1:SrNbZl6ECOS1qFzgTdQfWXZM9XBkiA6tkFrH9YSTPHM= +golang.org/x/tools v0.3.0/go.mod h1:/rWhSS2+zyEVwoJf8YAX6L2f0ntZ7Kn/mGgAWcipA5k= diff --git a/injection_probe.go b/injection_probe.go new file mode 100644 index 0000000..44ae277 --- /dev/null +++ b/injection_probe.go @@ -0,0 +1,121 @@ +package main + +import ( + "flag" + "fmt" + "strconv" + "strings" + "sync" + "time" + + "github.com/miekg/dns" + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" +) + +func dnsQuery(ip, domain string) (*dns.Msg, error) { + domain = dns.Fqdn(domain) + addr := ip + ":53" + m := new(dns.Msg) + m.SetQuestion(domain, dns.TypeA) + m.RecursionDesired = true + res, err := dns.Exchange(m, addr) + return res, err +} + +func main() { + domain := flag.String("domain", "", "Target domain") + targetIP := flag.String("server", "", "server IP address") + packetsPerSecond := flag.Int("speed", 0, "Packets per second") + packetNum := flag.Int("num", 1000, "total packets") + expectedResult := flag.String("truth", "", "Expected result") + random_flag := flag.Bool("random", false, "random subdomain") + flag.Parse() + + if *domain == "" || *targetIP == "" || *packetsPerSecond == 0 { + flag.Usage() + return + } + + currentTime := strconv.FormatInt(time.Now().Unix(), 10) + totalRequests := *packetNum + responseTimes := make([]int64, 0, totalRequests) + successfulRequests := 0 + validResponses := 0 + + zerolog.TimeFieldFormat = zerolog.TimeFormatUnix + + var query_tasks sync.WaitGroup + fmt.Println("testing......") + for i := 0; i < totalRequests; i++ { + query_tasks.Add(1) + go func() { + var prefix string + start := time.Now() + if *random_flag { + prefix = strings.Join([]string{currentTime, strconv.Itoa(i), ""}, "-") + } else { + prefix = "" + } + query_dn := prefix + (*domain) + res, err := dnsQuery(*targetIP, query_dn) + elapsed := time.Since(start).Microseconds() + if err == nil { + successfulRequests += 1 + log.Log().Msg("gfw worked!") + responseTimes = append(responseTimes, elapsed) + if *expectedResult == "" { + if *random_flag { + if (len(res.Answer) != 1) || (res.MsgHdr.Rcode != dns.RcodeSuccess) { + validResponses += 1 + log.Log().Msg("gfw escaped!") + //fmt.Printf("answer: %d rcode: %d\n", len(res.Answer), res.MsgHdr.Rcode) + } + } else { + if len(res.Answer) > 1 { + validResponses += 1 + log.Log().Msg("gfw escaped!") + //fmt.Println(elapsed) + } + } + } else { + if a, ok := res.Answer[0].(*dns.A); ok { + //fmt.Println(a.A.String()) + if a.A.String() == *expectedResult { + validResponses += 1 + log.Log().Msg("gfw escaped!") + //fmt.Println(elapsed) + } + } + } + } + + query_tasks.Done() + }() + time.Sleep(time.Second / time.Duration(*packetsPerSecond)) + } + + query_tasks.Wait() + + var sum_rtt int64 + var max_rtt int64 + var min_rtt int64 + sum_rtt = 0 + max_rtt = 0 + min_rtt = 3000000 + for _, rtt := range responseTimes { + sum_rtt += rtt + if rtt < min_rtt { + min_rtt = rtt + } + if rtt > max_rtt { + max_rtt = rtt + } + } + avg_rtt := float64(sum_rtt) / float64(len(responseTimes)) + + valid_rate := float64(validResponses) / float64(successfulRequests) + + fmt.Println(avg_rtt, max_rtt, min_rtt, successfulRequests, validResponses, valid_rate) + +}