gfw test
This commit is contained in:
15
go.mod
Normal file
15
go.mod
Normal file
@@ -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
|
||||
)
|
||||
30
go.sum
Normal file
30
go.sum
Normal file
@@ -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=
|
||||
121
injection_probe.go
Normal file
121
injection_probe.go
Normal file
@@ -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)
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user