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:
49
nmap_dns.cc
49
nmap_dns.cc
@@ -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();
|
||||
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user