mirror of
https://github.com/nmap/nmap.git
synced 2025-12-06 04:31:29 +00:00
Ensure we can connect to DNS servers with requested source address
This commit is contained in:
27
nmap_dns.cc
27
nmap_dns.cc
@@ -933,6 +933,12 @@ static void connect_evt_handler(nsock_pool nsp, nsock_event evt, void *srv_v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void add_dns_server(const struct sockaddr_storage *addr, size_t addr_len, const char *hostname) {
|
static void add_dns_server(const struct sockaddr_storage *addr, size_t addr_len, const char *hostname) {
|
||||||
|
const sockaddr_storage *ss = o.SourceSockAddr();
|
||||||
|
if (o.spoofsource && ss && ss->ss_family != addr->ss_family) {
|
||||||
|
// Can't connect to this address family using the specified source (-S)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
std::list<dns_server>::iterator servI;
|
std::list<dns_server>::iterator servI;
|
||||||
for(servI = servs.begin(); servI != servs.end(); servI++) {
|
for(servI = servs.begin(); servI != servs.end(); servI++) {
|
||||||
// Already added!
|
// Already added!
|
||||||
@@ -974,14 +980,27 @@ static void add_dns_server(char *ipaddrs) {
|
|||||||
// Creates a new nsi for each DNS server
|
// Creates a new nsi for each DNS server
|
||||||
static void connect_dns_servers() {
|
static void connect_dns_servers() {
|
||||||
std::list<dns_server>::iterator serverI;
|
std::list<dns_server>::iterator serverI;
|
||||||
|
struct sockaddr_storage ss, ss2;
|
||||||
|
size_t sslen = 0, ss2len = 0;
|
||||||
|
if (o.SourceSockAddr()) {
|
||||||
|
o.SourceSockAddr(&ss, &sslen);
|
||||||
|
// Source addr can be set by -e, so unless user specifically asked to
|
||||||
|
// spoof, also grab the source for the other address family.
|
||||||
|
if (!o.spoofsource && *o.device) {
|
||||||
|
int af = ss.ss_family == AF_INET ? AF_INET6 : AF_INET;
|
||||||
|
if (-1 != devname2ipaddr(o.device, af, &ss2)) {
|
||||||
|
ss2len = sizeof(ss2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
for(serverI = servs.begin(); serverI != servs.end(); serverI++) {
|
for(serverI = servs.begin(); serverI != servs.end(); serverI++) {
|
||||||
serverI->nsd = nsock_iod_new(dnspool, NULL);
|
serverI->nsd = nsock_iod_new(dnspool, NULL);
|
||||||
if (o.spoofsource) {
|
if (sslen > 0 && ss.ss_family == serverI->addr.ss_family) {
|
||||||
struct sockaddr_storage ss;
|
|
||||||
size_t sslen;
|
|
||||||
o.SourceSockAddr(&ss, &sslen);
|
|
||||||
nsock_iod_set_localaddr(serverI->nsd, &ss, sslen);
|
nsock_iod_set_localaddr(serverI->nsd, &ss, sslen);
|
||||||
}
|
}
|
||||||
|
else if (ss2len > 0 && ss2.ss_family == serverI->addr.ss_family) {
|
||||||
|
nsock_iod_set_localaddr(serverI->nsd, &ss2, ss2len);
|
||||||
|
}
|
||||||
if (o.ipoptionslen)
|
if (o.ipoptionslen)
|
||||||
nsock_iod_set_ipoptions(serverI->nsd, o.ipoptions, o.ipoptionslen);
|
nsock_iod_set_ipoptions(serverI->nsd, o.ipoptions, o.ipoptionslen);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user