Nmap Development mailing list archives
RFC Extend nmap_mass_rdns to support IPv6
From: Gioacchino Mazzurco <gmazzurco89 () gmail com>
Date: Mon, 20 Jul 2015 08:24:56 +0200
This is a request for comment on the work I have done to implement IPv6
support for nmap_mass_rdns (issue #51), the advantage of this function against
the one provided by the system is that it can handle multiple requests at
time, it works by sending all requests and then collecting the responses
and cache them, instead of doing a request and waiting for a response and then
do the next request and so no, this should dramatically improve rDNS
performances in massive scans like `nmap -A 10.0.0-255.1`.
DISCLAIMER: It is possible you feel some sarcasm reading this mail, I hope you
don't get offended, I don't mean to offend anyone, this is just my way to add
some fun to code commenting ;)
The whole architecture depends on the cache that was designed around IPv4 so
first of all I have reimplemented the cache, during this phase I have decided
to take advantage of C++ features (the code was C++ but written like it was C,
no class no objects and so on) so class HostElem is the cache element, I am
saying element and not line because a cache line (class HostCacheLine) can
contain more then one element to handle elements with same hash, because class
HostCache is a reverse resolution cache the key is the host IP (
sockaddr_storage ) while the value is the name associated to it ( std::string
).
<key, value> pairs are added with the add method while to get a cached record
a lookup method is provided, to avoid the cache be overpopulated (this would
cause bad performance) and HostCache does have aging this is almos invisible
to the class user and is handled by methods HostCache::{add, prune} and
HostElem::isTimeToClean
Other then the cache also the DNS requests sending and response parsing parts
were IPv4 specific I have generalized them creating a simple DNS implementation
inside the DNS namespace, inside this namespace first of all we encounter a
series of enums and constants with DNS specific values like the constants offset
of some DNS packet stuff or the wire number of record type CNAME (it's a bunch
of lines more then the old implementation but this way you don't get eye
cancer reading code like `if ((buf[2] & 0xFA) != 0x80)`), after we do
encounter the Factory class that provide some DNS low level parsing/writing
very useful statics method that are used all around the code, so if someone
discover that integers are not parsed well there is only one place were do we
have to fix it.
Then there is Record class and his derivatives, they are just used to parse
the records values from DNS responses, it seems to me those class doesn't need
to much introduction, but if you want some explanation just ask.
The same goes for Query and Answer classes.
Packet have a little more meat but in the end it's just a representation of a
DNS packet and delegate most of the parsing work to the classes I have
introduced before.
As the code i have written is big enough to introduce some bug, my mentor
suggested to me to write tests too, i have done it and thanks to them i
discovered some subtle bug that are already fixed in this RFC, moreover my
mentor have done tests with fuzzing and just one more bug was discovered and
fixed :)
If you are a git user i do suggest to you to checkout the code directly from
my sandbox on gitlab
git clone https://gitlab.com/g10h4ck/nmap-gsoc2015.git
git checkout hotfix/51
./configure && make && make dns_check
Otherwise I have also attached the whole ordered patch set, and for the lazier
there is squashed.diff that is equivalent to all of the patches.
Cheers!Attachment:
0001-Port-cache-and-etc-hosts-reading-to-ipv6.patch
Description:
Attachment:
0002-Add-human-readeable-DNS-ipv-packets-generation.patch
Description:
Attachment:
0003-Ported-DNS-answers-parsing-to-IPv6.patch
Description:
Attachment:
0004-Move-sockadd_storage-helpers-functions-to-appropriat.patch
Description:
Attachment:
0005-Fixed-error-handling-a-NXDomain-end-resolution-tenta.patch
Description:
Attachment:
0006-Try-to-process-also-truncated-DNS-packets.patch
Description:
Attachment:
0007-Initialize-DNS-request-id-to-random-number.patch
Description:
Attachment:
0008-Split-declarations-to-header.patch
Description:
Attachment:
0009-Add-tests-subdir-and-have-DNS-test-compile-and-run.patch
Description:
Attachment:
0010-Implemented-more-testing-fixed-some-subtle-bug-thank.patch
Description:
Attachment:
0011-Finer-tests-discovered-and-fixed-other-subtle-bug-th.patch
Description:
Attachment:
0012-Fixed-possible-stack-overflow-with-special-crafted-i.patch
Description:
Attachment:
0013-Use-nbase-u8-as-buffer-type.patch
Description:
Attachment:
squashed.diff
Description:
_______________________________________________ Sent through the dev mailing list https://nmap.org/mailman/listinfo/dev Archived at http://seclists.org/nmap-dev/
Current thread:
- RFC Extend nmap_mass_rdns to support IPv6 Gioacchino Mazzurco (Jul 19)
