1
0
mirror of https://github.com/nmap/nmap.git synced 2025-12-15 20:29:03 +00:00

Falls back to "getnameinfo" for truncated replies in reverse DNS resolver. Closes #434 and #400, fixes #364 and #103.

This commit is contained in:
abhishek
2016-07-19 08:33:01 +00:00
parent c521208999
commit 0c1d68d6de

View File

@@ -426,7 +426,7 @@ protected:
u16 DNS::Factory::progressiveId = get_random_u16();
static std::list<dns_server> servs;
static std::list<request *> new_reqs;
static std::list<request *> cname_reqs;
static std::list<request *> deferred_reqs;
static std::map<u16, info> records;
static int total_reqs;
static nsock_pool dnspool=NULL;
@@ -443,11 +443,11 @@ static ScanProgressMeter *SPM;
//------------------- Prototypes and macros ---------------------
static void read_evt_handler(nsock_pool, nsock_event, void *);
static void put_dns_packet_on_wire(request *req);
#define ACTION_FINISHED 0
#define ACTION_CNAME_LIST 1
#define ACTION_SYSTEM_RESOLVE 1
#define ACTION_TIMEOUT 2
//------------------- Misc code ---------------------
@@ -660,7 +660,7 @@ static int process_result(const sockaddr_storage &ip, const std::string &result,
if( !result.empty() && !sockaddr_storage_equal(&ip, tpreq->targ->TargetSockAddr()) )
return 0;
if (action == ACTION_CNAME_LIST || action == ACTION_FINISHED)
if (action == ACTION_SYSTEM_RESOLVE || action == ACTION_FINISHED)
{
server->capacity += CAPACITY_UP_STEP;
check_capacities(&*server);
@@ -677,7 +677,7 @@ static int process_result(const sockaddr_storage &ip, const std::string &result,
total_reqs--;
if (action == ACTION_CNAME_LIST) cname_reqs.push_back(tpreq);
if (action == ACTION_SYSTEM_RESOLVE) deferred_reqs.push_back(tpreq);
if (action == ACTION_FINISHED) delete tpreq;
}
else
@@ -755,11 +755,10 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
return;
}
// If there is no error and no answer stop processing the event
if(p.answers.empty()) return;
bool processing_successful = false;
for(std::list<DNS::Answer>::const_iterator it = p.answers.begin();
it != p.answers.end(); ++it )
it != p.answers.end() && !processing_successful; ++it )
{
const DNS::Answer &a = *it;
if(a.record_class == DNS::CLASS_IN)
@@ -772,7 +771,8 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
sockaddr_storage ip;
if(DNS::Factory::ptrToIp(a.name, ip))
if (process_result(ip, ptr->value, ACTION_FINISHED, p.id))
{
if ((processing_successful = process_result(ip, ptr->value, ACTION_FINISHED, p.id)))
{
if (o.debugging >= TRACE_DEBUG_LEVEL)
{
@@ -785,6 +785,7 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
output_summary();
stat_ok++;
}
}
break;
}
case DNS::CNAME:
@@ -798,7 +799,7 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
sockaddr_storage_iptop(&ip, ipstr);
log_write(LOG_STDOUT, "mass_rdns: CNAME found for <%s>\n", ipstr);
}
process_result(ip, "", ACTION_CNAME_LIST, p.id);
processing_successful = process_result(ip, "", ACTION_SYSTEM_RESOLVE, p.id);
}
break;
}
@@ -807,6 +808,18 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
}
}
}
if (!processing_successful) {
if (DNS_HAS_FLAG(f, DNS::TRUNCATED)) {
sockaddr_storage discard;
process_result(discard, "", ACTION_SYSTEM_RESOLVE, p.id);
}
else {
if (o.debugging >= TRACE_DEBUG_LEVEL) {
log_write(LOG_STDOUT, "mass_rdns: Unable to process the response\n");
}
}
}
}
@@ -1156,7 +1169,7 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
connect_dns_servers();
cname_reqs.clear();
deferred_reqs.clear();
read_timeout_index = MIN(sizeof(read_timeouts)/sizeof(read_timeouts[0]), servs.size()) - 1;
@@ -1183,20 +1196,20 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
nsock_pool_delete(dnspool);
if (cname_reqs.size() && o.debugging)
log_write(LOG_STDOUT, "Performing system-dns for %d domain names that use CNAMEs\n", (int) cname_reqs.size());
if (deferred_reqs.size() && o.debugging)
log_write(LOG_STDOUT, "Performing system-dns for %d domain names that were deferred\n", (int) deferred_reqs.size());
if (cname_reqs.size()) {
Snprintf(spmobuf, sizeof(spmobuf), "System CNAME DNS resolution of %u host%s.", (unsigned) cname_reqs.size(), cname_reqs.size()-1 ? "s" : "");
if (deferred_reqs.size()) {
Snprintf(spmobuf, sizeof(spmobuf), "System DNS resolution of %u host%s.", (unsigned) deferred_reqs.size(), deferred_reqs.size()-1 ? "s" : "");
SPM = new ScanProgressMeter(spmobuf);
for(i=0, reqI = cname_reqs.begin(); reqI != cname_reqs.end(); reqI++, i++) {
for(i=0, reqI = deferred_reqs.begin(); reqI != deferred_reqs.end(); reqI++, i++) {
struct sockaddr_storage ss;
size_t sslen;
char hostname[MAXHOSTNAMELEN + 1] = "";
if (keyWasPressed())
SPM->printStats((double) i / cname_reqs.size(), NULL);
SPM->printStats((double) i / deferred_reqs.size(), NULL);
tpreq = *reqI;
@@ -1218,7 +1231,7 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
delete SPM;
}
cname_reqs.clear();
deferred_reqs.clear();
}