mirror of
https://github.com/shadow1ng/fscan.git
synced 2026-09-22 03:10:42 +08:00
47 lines
1.2 KiB
Go
47 lines
1.2 KiB
Go
//go:build plugin_dns || plugin_dnstcp || plugin_modbus || !plugin_selective
|
|
|
|
package services
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/binary"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
func randomUint16() uint16 {
|
|
var b [2]byte
|
|
if _, err := rand.Read(b[:]); err == nil {
|
|
return binary.BigEndian.Uint16(b[:])
|
|
}
|
|
return uint16(time.Now().UnixNano())
|
|
}
|
|
|
|
func buildDNSRootNSQuery(id uint16) []byte {
|
|
query := make([]byte, 17)
|
|
binary.BigEndian.PutUint16(query[0:2], id)
|
|
binary.BigEndian.PutUint16(query[2:4], 0x0100)
|
|
binary.BigEndian.PutUint16(query[4:6], 1)
|
|
query[12] = 0x00
|
|
binary.BigEndian.PutUint16(query[13:15], 2)
|
|
binary.BigEndian.PutUint16(query[15:17], 1)
|
|
return query
|
|
}
|
|
|
|
func parseDNSResponse(data []byte, id uint16) (string, bool) {
|
|
if len(data) < 12 || binary.BigEndian.Uint16(data[0:2]) != id {
|
|
return "", false
|
|
}
|
|
flags := binary.BigEndian.Uint16(data[2:4])
|
|
if flags&0x8000 == 0 {
|
|
return "", false
|
|
}
|
|
|
|
rcode := flags & 0x000f
|
|
qd := binary.BigEndian.Uint16(data[4:6])
|
|
an := binary.BigEndian.Uint16(data[6:8])
|
|
ns := binary.BigEndian.Uint16(data[8:10])
|
|
ar := binary.BigEndian.Uint16(data[10:12])
|
|
return fmt.Sprintf("DNS response rcode=%d qd=%d an=%d ns=%d ar=%d", rcode, qd, an, ns, ar), true
|
|
}
|