mirror of
https://github.com/SEPPDROID/JellyCAT.git
synced 2025-10-21 23:44:20 +00:00
78 lines
1.8 KiB
Go
78 lines
1.8 KiB
Go
// /\_/|
|
|
// { ' ' } JellyCAT
|
|
// \____\
|
|
|
|
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
func dnsResolver() {
|
|
server := &dns.Server{Addr: ":53", Net: "udp"}
|
|
dns.HandleFunc(".", handleDNSRequest)
|
|
|
|
go func() {
|
|
if err := server.ListenAndServe(); err != nil {
|
|
fmt.Println("DNS.SERVER-ERR: Failed to start DNS server:", err)
|
|
os.Exit(1)
|
|
}
|
|
}()
|
|
|
|
fmt.Println("DNS.SERVER-LOG: DNS server is ready and listening on *:53")
|
|
}
|
|
|
|
func handleDNSRequest(w dns.ResponseWriter, r *dns.Msg) {
|
|
m := new(dns.Msg)
|
|
m.SetReply(r)
|
|
m.Compress = false
|
|
|
|
for _, q := range r.Question {
|
|
if shouldHijack(q.Name, q.Qtype) {
|
|
handleHijackedRequest(q.Name)
|
|
addHijackedAnswer(m, q.Name)
|
|
} else {
|
|
forwardRequest(m, r)
|
|
}
|
|
}
|
|
|
|
err := w.WriteMsg(m)
|
|
if err != nil {
|
|
fmt.Print("\033[A\r")
|
|
fmt.Println("DNS.SERVER-ERR: Error writing response:", err)
|
|
resetCommand()
|
|
}
|
|
}
|
|
|
|
func shouldHijack(name string, qtype uint16) bool {
|
|
return (name == config.HijackApp || name == config.HijackImg || name == "jcathost.dns." || name == "jellyfin.dns.") && (qtype == dns.TypeA || qtype == dns.TypeAAAA)
|
|
}
|
|
|
|
func handleHijackedRequest(name string) {
|
|
fmt.Print("\033[A\r")
|
|
fmt.Println("DNS.SERVER-LOG: DNS LOOKUP Hijacked for", name)
|
|
resetCommand()
|
|
}
|
|
|
|
func addHijackedAnswer(m *dns.Msg, name string) {
|
|
rr, err := dns.NewRR(fmt.Sprintf("%s IN A %s", name, config.HijackIP))
|
|
if err == nil {
|
|
m.Answer = append(m.Answer, rr)
|
|
}
|
|
}
|
|
|
|
func forwardRequest(m *dns.Msg, r *dns.Msg) {
|
|
resolver := &dns.Client{}
|
|
resp, _, err := resolver.Exchange(r, net.JoinHostPort(config.ForwardIP, config.ForwardPort))
|
|
if err == nil {
|
|
m.Answer = append(m.Answer, resp.Answer...)
|
|
}
|
|
fmt.Print("\033[A\r")
|
|
fmt.Println("DNS.SERVER-LOG: DNS LOOKUP forwarded for", r.Question[0].Name, "| uninterested")
|
|
resetCommand()
|
|
}
|