cache probe source code
This commit is contained in:
198
dns_prober.go
Normal file
198
dns_prober.go
Normal file
@@ -0,0 +1,198 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"encoding/binary"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
_ "net"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
"flag"
|
||||
|
||||
"github.com/miekg/dns"
|
||||
)
|
||||
|
||||
type Data struct {
|
||||
target string
|
||||
dict map[int]map[string]bool
|
||||
}
|
||||
|
||||
var dataset map[string]map[int][]string
|
||||
var input_file string
|
||||
var save_file string
|
||||
var id_stamp string
|
||||
|
||||
func send_query(addr string, dn string) (*dns.Msg, error) {
|
||||
var domain string
|
||||
if dn == "timestamp" {
|
||||
timestamp := strconv.FormatInt(time.Now().UnixMilli(), 10)
|
||||
domain = strings.Join([]string{timestamp, "-scan.echodns.xyz."}, "")
|
||||
} else {
|
||||
domain = strings.Join([]string{dn, ".echodns.xyz."}, "")
|
||||
}
|
||||
//fmt.Println(domain)
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion(domain, dns.TypeA)
|
||||
m.RecursionDesired = true
|
||||
|
||||
res, err := dns.Exchange(m, addr)
|
||||
return res, err
|
||||
}
|
||||
|
||||
func retrieve_ip(pool chan string, file_name string) {
|
||||
cnt := 0
|
||||
f, err := os.Open(file_name)
|
||||
if err != nil {
|
||||
fmt.Println("cannot open file")
|
||||
return
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
fmt.Println("sending msg ...")
|
||||
reader := bufio.NewReader(f)
|
||||
for {
|
||||
s, err := reader.ReadString('\n')
|
||||
if err == io.EOF {
|
||||
break
|
||||
}
|
||||
s = s[:(len(s) - 1)] //remove \n in linux | remove \r\n in windows
|
||||
//fmt.Println(s)
|
||||
pool <- s
|
||||
cnt++
|
||||
if cnt%1000 == 0 {
|
||||
fmt.Println(cnt)
|
||||
}
|
||||
}
|
||||
close(pool)
|
||||
}
|
||||
|
||||
func store_data(pool chan Data, wg *sync.WaitGroup) {
|
||||
wg.Add(1)
|
||||
for {
|
||||
temp := make(map[int][]string)
|
||||
if data, ok := <-pool; ok {
|
||||
if len(data.dict) > 0 {
|
||||
for tp := range data.dict {
|
||||
for rdns := range data.dict[tp] {
|
||||
temp[tp] = append(temp[tp], rdns)
|
||||
}
|
||||
}
|
||||
dataset[data.target] = temp
|
||||
}
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
wg.Done()
|
||||
}
|
||||
|
||||
func create_threads(n int, ip_pool chan string, data_pool chan Data, wg1 *sync.WaitGroup) {
|
||||
for i := 0; i < n; i++ {
|
||||
wg1.Add(1)
|
||||
go dns_query(ip_pool, data_pool, wg1)
|
||||
}
|
||||
}
|
||||
|
||||
func active_probe(n int, addr string) Data {
|
||||
var (
|
||||
rdns_ip string
|
||||
tp int
|
||||
)
|
||||
target_ip := addr[:len(addr)-3]
|
||||
data := Data{target_ip, make(map[int]map[string]bool)}
|
||||
stop := 0
|
||||
for i := 0; i < n; i++ {
|
||||
//fmt.Println(target_ip)
|
||||
subdomain := strings.Join([]string{strings.Replace(target_ip, ".", "-", -1), "fwd", strconv.Itoa(i), "240209"}, "-")
|
||||
res, err := send_query(addr, subdomain)
|
||||
//fmt.Println(err)
|
||||
if err == nil {
|
||||
if len(res.Answer) == 3 {
|
||||
if cname, ok := res.Answer[0].(*dns.CNAME); ok {
|
||||
rdns_ip = strings.Join(strings.Split(strings.Split(cname.Target, ".")[0], "-")[1:], ".")
|
||||
if a, ok := res.Answer[2].(*dns.A); ok {
|
||||
tp = int(binary.BigEndian.Uint32(a.A))
|
||||
//fmt.Println(rdns_ip)
|
||||
//fmt.Println(tp)
|
||||
if data.dict[tp] == nil {
|
||||
data.dict[tp] = make(map[string]bool)
|
||||
}
|
||||
data.dict[tp][rdns_ip] = true
|
||||
stop = 0
|
||||
} else {
|
||||
stop += 1
|
||||
}
|
||||
} else {
|
||||
stop += 1
|
||||
}
|
||||
} else {
|
||||
stop += 1
|
||||
}
|
||||
} else {
|
||||
stop += 1
|
||||
//fmt.Println(err)
|
||||
}
|
||||
if stop == 3 {
|
||||
return data
|
||||
}
|
||||
}
|
||||
return data
|
||||
}
|
||||
|
||||
func dns_query(pool chan string, data_pool chan Data, wg *sync.WaitGroup) {
|
||||
for {
|
||||
if s, ok := <-pool; ok {
|
||||
addr := s + ":53"
|
||||
//fmt.Println(addr)
|
||||
data := active_probe(20, addr)
|
||||
if data.dict != nil {
|
||||
data_pool <- data
|
||||
}
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
wg.Done()
|
||||
}
|
||||
|
||||
func save_to_file(filename string) {
|
||||
jsonstr, _ := json.Marshal(dataset)
|
||||
save_file, _ := os.Create(filename)
|
||||
if _, err := save_file.Write(jsonstr); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
save_file.Close()
|
||||
}
|
||||
|
||||
func main() {
|
||||
ip_pool := make(chan string, 1000)
|
||||
data_pool := make(chan Data, 400)
|
||||
var probe_tasks sync.WaitGroup
|
||||
var store_task sync.WaitGroup
|
||||
dataset = make(map[string]map[int][]string)
|
||||
//save_file := "output/global-cache-240209.json"
|
||||
|
||||
flag.StringVar(&input_file, "input", "", "input file")
|
||||
flag.StringVar(&save_file, "output", "", "output file")
|
||||
flag.StringVar(&id_stamp, "salt", "", "salt in domain")
|
||||
flag.Parse()
|
||||
if input_file == "" || save_file == "" || id_stamp == "" {
|
||||
panic("Please configure the task!\n")
|
||||
}
|
||||
|
||||
fmt.Println(time.Now())
|
||||
go retrieve_ip(ip_pool, input_file)
|
||||
create_threads(500, ip_pool, data_pool, &probe_tasks)
|
||||
go store_data(data_pool, &store_task)
|
||||
probe_tasks.Wait()
|
||||
close(data_pool)
|
||||
store_task.Wait()
|
||||
save_to_file(save_file)
|
||||
fmt.Println("All done!")
|
||||
fmt.Println(time.Now())
|
||||
}
|
||||
16
go.mod
Normal file
16
go.mod
Normal file
@@ -0,0 +1,16 @@
|
||||
module cache_prober
|
||||
|
||||
go 1.18
|
||||
|
||||
require (
|
||||
github.com/go-sql-driver/mysql v1.7.0
|
||||
github.com/miekg/dns v1.1.50
|
||||
)
|
||||
|
||||
require (
|
||||
golang.org/x/mod v0.4.2 // indirect
|
||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 // indirect
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
|
||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2 // indirect
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect
|
||||
)
|
||||
37
go.sum
Normal file
37
go.sum
Normal file
@@ -0,0 +1,37 @@
|
||||
github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
|
||||
github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
|
||||
github.com/miekg/dns v1.1.50 h1:DQUfb9uc6smULcREF09Uc+/Gd46YWqJd5DbpPE9xkcA=
|
||||
github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985 h1:4CSI6oo7cOjJKajidEljs9h+uP0rRZBPPPhcCbj5mw8=
|
||||
golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2 h1:BonxutuHCTL0rBDnZlKjpGIQFTjyUVTexFOdWkB6Fg0=
|
||||
golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
|
||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
Reference in New Issue
Block a user