mirror of
https://github.com/nmap/nmap.git
synced 2025-12-17 13:09:02 +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:
49
nmap_dns.cc
49
nmap_dns.cc
@@ -426,7 +426,7 @@ protected:
|
|||||||
u16 DNS::Factory::progressiveId = get_random_u16();
|
u16 DNS::Factory::progressiveId = get_random_u16();
|
||||||
static std::list<dns_server> servs;
|
static std::list<dns_server> servs;
|
||||||
static std::list<request *> new_reqs;
|
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 std::map<u16, info> records;
|
||||||
static int total_reqs;
|
static int total_reqs;
|
||||||
static nsock_pool dnspool=NULL;
|
static nsock_pool dnspool=NULL;
|
||||||
@@ -443,11 +443,11 @@ static ScanProgressMeter *SPM;
|
|||||||
|
|
||||||
|
|
||||||
//------------------- Prototypes and macros ---------------------
|
//------------------- Prototypes and macros ---------------------
|
||||||
|
static void read_evt_handler(nsock_pool, nsock_event, void *);
|
||||||
static void put_dns_packet_on_wire(request *req);
|
static void put_dns_packet_on_wire(request *req);
|
||||||
|
|
||||||
#define ACTION_FINISHED 0
|
#define ACTION_FINISHED 0
|
||||||
#define ACTION_CNAME_LIST 1
|
#define ACTION_SYSTEM_RESOLVE 1
|
||||||
#define ACTION_TIMEOUT 2
|
#define ACTION_TIMEOUT 2
|
||||||
|
|
||||||
//------------------- Misc code ---------------------
|
//------------------- 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()) )
|
if( !result.empty() && !sockaddr_storage_equal(&ip, tpreq->targ->TargetSockAddr()) )
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (action == ACTION_CNAME_LIST || action == ACTION_FINISHED)
|
if (action == ACTION_SYSTEM_RESOLVE || action == ACTION_FINISHED)
|
||||||
{
|
{
|
||||||
server->capacity += CAPACITY_UP_STEP;
|
server->capacity += CAPACITY_UP_STEP;
|
||||||
check_capacities(&*server);
|
check_capacities(&*server);
|
||||||
@@ -677,7 +677,7 @@ static int process_result(const sockaddr_storage &ip, const std::string &result,
|
|||||||
|
|
||||||
total_reqs--;
|
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;
|
if (action == ACTION_FINISHED) delete tpreq;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -755,11 +755,10 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If there is no error and no answer stop processing the event
|
bool processing_successful = false;
|
||||||
if(p.answers.empty()) return;
|
|
||||||
|
|
||||||
for(std::list<DNS::Answer>::const_iterator it = p.answers.begin();
|
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;
|
const DNS::Answer &a = *it;
|
||||||
if(a.record_class == DNS::CLASS_IN)
|
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;
|
sockaddr_storage ip;
|
||||||
if(DNS::Factory::ptrToIp(a.name, 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)
|
if (o.debugging >= TRACE_DEBUG_LEVEL)
|
||||||
{
|
{
|
||||||
@@ -785,6 +785,7 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
|
|||||||
output_summary();
|
output_summary();
|
||||||
stat_ok++;
|
stat_ok++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case DNS::CNAME:
|
case DNS::CNAME:
|
||||||
@@ -798,7 +799,7 @@ static void read_evt_handler(nsock_pool nsp, nsock_event evt, void *) {
|
|||||||
sockaddr_storage_iptop(&ip, ipstr);
|
sockaddr_storage_iptop(&ip, ipstr);
|
||||||
log_write(LOG_STDOUT, "mass_rdns: CNAME found for <%s>\n", 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;
|
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();
|
connect_dns_servers();
|
||||||
|
|
||||||
cname_reqs.clear();
|
deferred_reqs.clear();
|
||||||
|
|
||||||
read_timeout_index = MIN(sizeof(read_timeouts)/sizeof(read_timeouts[0]), servs.size()) - 1;
|
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);
|
nsock_pool_delete(dnspool);
|
||||||
|
|
||||||
if (cname_reqs.size() && o.debugging)
|
if (deferred_reqs.size() && o.debugging)
|
||||||
log_write(LOG_STDOUT, "Performing system-dns for %d domain names that use CNAMEs\n", (int) cname_reqs.size());
|
log_write(LOG_STDOUT, "Performing system-dns for %d domain names that were deferred\n", (int) deferred_reqs.size());
|
||||||
|
|
||||||
if (cname_reqs.size()) {
|
if (deferred_reqs.size()) {
|
||||||
Snprintf(spmobuf, sizeof(spmobuf), "System CNAME DNS resolution of %u host%s.", (unsigned) cname_reqs.size(), cname_reqs.size()-1 ? "s" : "");
|
Snprintf(spmobuf, sizeof(spmobuf), "System DNS resolution of %u host%s.", (unsigned) deferred_reqs.size(), deferred_reqs.size()-1 ? "s" : "");
|
||||||
SPM = new ScanProgressMeter(spmobuf);
|
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;
|
struct sockaddr_storage ss;
|
||||||
size_t sslen;
|
size_t sslen;
|
||||||
char hostname[MAXHOSTNAMELEN + 1] = "";
|
char hostname[MAXHOSTNAMELEN + 1] = "";
|
||||||
|
|
||||||
if (keyWasPressed())
|
if (keyWasPressed())
|
||||||
SPM->printStats((double) i / cname_reqs.size(), NULL);
|
SPM->printStats((double) i / deferred_reqs.size(), NULL);
|
||||||
|
|
||||||
tpreq = *reqI;
|
tpreq = *reqI;
|
||||||
|
|
||||||
@@ -1218,7 +1231,7 @@ static void nmap_mass_rdns_core(Target **targets, int num_targets) {
|
|||||||
delete SPM;
|
delete SPM;
|
||||||
}
|
}
|
||||||
|
|
||||||
cname_reqs.clear();
|
deferred_reqs.clear();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user