mirror of
https://github.com/nmap/nmap.git
synced 2025-12-14 19:59:02 +00:00
Add more record types to dns-zone-transfer
New types: MD, MF, MB, MG, MR, WKS, HINFO, MINFO, RP, AFSDB, X25, ISDN, RT, NAPTR. Several of these are obsolete/experimental. RP, AFSDB, and NAPTR can be tested against zonetransfer.me. WKS (Well Known Services) is very interesting, but little used, and not tested.
This commit is contained in:
@@ -207,7 +207,7 @@ end
|
|||||||
function parse_domain(data, offset)
|
function parse_domain(data, offset)
|
||||||
local offset, domain = dns.decStr(data, offset)
|
local offset, domain = dns.decStr(data, offset)
|
||||||
domain = domain or "<parse error>"
|
domain = domain or "<parse error>"
|
||||||
return offset, domain
|
return offset, string.format("%s.", domain)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Build RFC 1035 root domain name from the name of the DNS server
|
--- Build RFC 1035 root domain name from the name of the DNS server
|
||||||
@@ -242,13 +242,29 @@ function build_domain(host)
|
|||||||
return strbuf.dump(buf)
|
return strbuf.dump(buf)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function parse_num_domain(data, offset)
|
||||||
|
local number, domain
|
||||||
|
number = bto16(data, offset)
|
||||||
|
offset, domain = parse_domain(data, offset+2)
|
||||||
|
return offset, string.format("%d %s", number, domain)
|
||||||
|
end
|
||||||
|
|
||||||
|
local function parse_txt(data, offset)
|
||||||
|
local field, len
|
||||||
|
len = string.byte(data, offset)
|
||||||
|
offset = offset + 1
|
||||||
|
offset, field = bin.unpack("A" .. len, data, offset)
|
||||||
|
return offset, string.format('"%s"', field)
|
||||||
|
end
|
||||||
|
|
||||||
--- Retrieve type specific data (rdata) from dns packets
|
--- Retrieve type specific data (rdata) from dns packets
|
||||||
local RD = {
|
local RD = {
|
||||||
A = function(data, offset)
|
A = function(data, offset)
|
||||||
return offset+4, packet.toip(data:sub(offset, offset+3))
|
return offset+4, packet.toip(data:sub(offset, offset+3))
|
||||||
end,
|
end,
|
||||||
NS = parse_domain,
|
NS = parse_domain,
|
||||||
-- MD, MF,
|
MD = parse_domain, -- obsolete per rfc1035, use MX
|
||||||
|
MF = parse_domain, -- obsolete per rfc1035, use MX
|
||||||
CNAME = parse_domain,
|
CNAME = parse_domain,
|
||||||
SOA = function(data, offset)
|
SOA = function(data, offset)
|
||||||
local field, info
|
local field, info
|
||||||
@@ -263,24 +279,58 @@ local RD = {
|
|||||||
offset = offset + 20
|
offset = offset + 20
|
||||||
return offset, strbuf.dump(info, ' ')
|
return offset, strbuf.dump(info, ' ')
|
||||||
end,
|
end,
|
||||||
-- MB, MG, MR, NULL, WKS,
|
MB = parse_domain, -- experimental per RFC 1035
|
||||||
|
MG = parse_domain, -- experimental per RFC 1035
|
||||||
|
MR = parse_domain, -- experimental per RFC 1035
|
||||||
|
--NULL -- RFC 1035 says anything can go in this field. Hex dump is good.
|
||||||
|
WKS = function(data, offset) -- RFC 1035, but untested!
|
||||||
|
local len, ip, proto, svcs
|
||||||
|
len = bto16(data, offset-2) - 5 -- length of bit field
|
||||||
|
ip = packet.toip(data:sub(offset, offset+3))
|
||||||
|
proto = string.byte(data, offset+4)
|
||||||
|
svcs = {}
|
||||||
|
local p = 0
|
||||||
|
for i=1, len do
|
||||||
|
local n = string.byte(data, offset + i)
|
||||||
|
for j=0, 7 do
|
||||||
|
if bit.band(128, n) then table.insert(svcs, p) end
|
||||||
|
p = p + 1
|
||||||
|
n = bit.lshift(n, 1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return offset + len, string.format("%s %d (%s)", ip, proto, table.concat(svcs, ","))
|
||||||
|
end,
|
||||||
PTR = parse_domain,
|
PTR = parse_domain,
|
||||||
-- HINFO, MINFO
|
HINFO = function(data, offset)
|
||||||
MX = function(data, offset)
|
local cpu, os -- See RFC 1010 for standard values for these
|
||||||
local field
|
offset, cpu = parse_txt(data, offset)
|
||||||
-- mail server
|
offset, os = parse_txt(data, offset)
|
||||||
offset = offset + 2
|
return offset, string.format("%s %s", cpu, os)
|
||||||
offset, field = parse_domain(data, offset)
|
|
||||||
return offset, field
|
|
||||||
end,
|
end,
|
||||||
TXT = function(data, offset)
|
MINFO = function(data, offset)
|
||||||
local field, len
|
local rmailbx, emailbx
|
||||||
len = string.byte(data, offset)
|
offset, rmailbx = parse_domain(data, offset)
|
||||||
offset = offset + 1
|
offset, emailbx = parse_domain(data, offset)
|
||||||
offset, field = bin.unpack("A" .. len, data, offset)
|
return offset, string.format("%s %s", rmailbx, emailbx)
|
||||||
return offset, field
|
|
||||||
end,
|
end,
|
||||||
--RP AFSDB X25 ISDN RT NSAP NSAP-PTR SIG KEY PX GPOS
|
MX = parse_num_domain,
|
||||||
|
TXT = parse_txt,
|
||||||
|
RP = function(data, offset)
|
||||||
|
local mbox_dname, txt_dname
|
||||||
|
offset, mbox_dname = parse_domain(data, offset)
|
||||||
|
offset, txt_dname = parse_domain(data, offset)
|
||||||
|
return offset, string.format("%s %s", mbox_dname, txt_dname)
|
||||||
|
end,
|
||||||
|
AFSDB = parse_num_domain,
|
||||||
|
X25 = parse_txt,
|
||||||
|
ISDN = function(data, offset)
|
||||||
|
local addr, sa
|
||||||
|
offset, addr = parse_txt(data, offset)
|
||||||
|
offset, sa = parse_txt(data, offset)
|
||||||
|
return offset, string.format("%s %s", addr, sa)
|
||||||
|
end,
|
||||||
|
RT = parse_num_domain,
|
||||||
|
--NSAP NSAP-PTR SIG KEY PX GPOS
|
||||||
AAAA = function(data, offset)
|
AAAA = function(data, offset)
|
||||||
return offset+16, packet.toipv6(data:sub(offset, offset+15))
|
return offset+16, packet.toipv6(data:sub(offset, offset+15))
|
||||||
end,
|
end,
|
||||||
@@ -321,7 +371,19 @@ local RD = {
|
|||||||
offset, info = parse_domain(data, offset)
|
offset, info = parse_domain(data, offset)
|
||||||
return offset, string.format("%d %d %d %s", priority, weight, port, info)
|
return offset, string.format("%d %d %d %s", priority, weight, port, info)
|
||||||
end,
|
end,
|
||||||
--ATMA NAPTR KX CERT A6 DNAME SINK OPT TSIG IXFR AXFR MAILB MAILA ANY ZXFR
|
--ATMA
|
||||||
|
NAPTR = function(data, offset)
|
||||||
|
local order, preference, flags, service, regexp, replacement
|
||||||
|
order = bto16(data, offset)
|
||||||
|
preference = bto16(data, offset+2)
|
||||||
|
offset, flags = parse_txt(data, offset+4)
|
||||||
|
offset, service = parse_txt(data, offset)
|
||||||
|
offset, regexp = parse_txt(data, offset)
|
||||||
|
offset, replacement = parse_domain(data, offset)
|
||||||
|
return offset, string.format('%d %d %s %s %s %s',
|
||||||
|
order, preference, flags, service, regexp, replacement)
|
||||||
|
end,
|
||||||
|
--KX CERT A6 DNAME SINK OPT TSIG IXFR AXFR MAILB MAILA ANY ZXFR
|
||||||
}
|
}
|
||||||
|
|
||||||
function get_rdata(data, offset, ttype)
|
function get_rdata(data, offset, ttype)
|
||||||
|
|||||||
Reference in New Issue
Block a user