targets.cc

来自「Ubuntu packages of security software。 相」· CC 代码 · 共 616 行 · 第 1/2 页

CC
616
字号
      }    }    rewind(fExclude);  } /* If the exclude file was provided via command line, count the elements here */  else {    p_acBuf=strdup(szExclude);    pc=strtok(p_acBuf, ",");    while (NULL != pc) {      iListSz++;      pc=strtok(NULL, ",");    }    free(p_acBuf);    p_acBuf = NULL;  }  /* allocate enough TargetGroups to cover our entries, plus one that   * remains uninitialized so we know we reached the end */  excludelist = new TargetGroup[iListSz + 1];  /* don't use a for loop since the counter isn't incremented if the    * exclude entry isn't parsed   */  i=0;  if (1 == b_file) {    /* If we are parsing a file load the exclude list from that */    while ((char *)0 != fgets(acBuf, sizeof(acBuf), fExclude)) {      ++iLine;      if ((char *)0 == strchr(acBuf, '\n')) {        fatal("Exclude file line %d was too long to read.  Exiting.", iLine);      }        pc=strtok(acBuf, "\t\n ");	        while ((char *)0 != pc) {         if(excludelist[i].parse_expr(pc,o.af()) == 0) {           if (o.debugging > 1)             error("Loaded exclude target of: %s", pc);           ++i;         }          pc=strtok(NULL, "\t\n ");      }    }  }  else {    /* If we are parsing command line, load the exclude file from the string */    p_acBuf=strdup(szExclude);    pc=strtok(p_acBuf, ",");    while (NULL != pc) {      if(excludelist[i].parse_expr(pc,o.af()) == 0) {        if (o.debugging >1)          error("Loaded exclude target of: %s", pc);        ++i;      }       /* This is a totally cheezy hack, but since I can't use strtok_r...       * If you can think of a better way to do this, feel free to change.       * As for now, we will reset strtok each time we leave parse_expr */      {	int hack_i;	char *hack_c = strdup(szExclude);	pc=strtok(hack_c, ",");        for (hack_i = 0; hack_i < i; hack_i++)           pc=strtok(NULL, ",");	free(hack_c);      }    }   }  return excludelist;}/* A debug routine to dump some information to stdout.                  (mdmcl) * Invoked if debugging is set to 3 or higher * I had to make signigicant changes from wam's code. Although wam * displayed much more detail, alot of this is now hidden inside * of the Target Group Object. Rather than writing a bunch of methods * to return private attributes, which would only be used for  * debugging, I went for the method below. */int dumpExclude(TargetGroup *exclude_group) {  int i=0, debug_save=0, type=TargetGroup::TYPE_NONE;  unsigned int mask = 0;  struct sockaddr_storage ss;  struct sockaddr_in *sin = (struct sockaddr_in *) &ss;  size_t slen;  /* shut off debugging for now, this is a debug routine in itself,   * we don't want to see all the debug messages inside of the object */  debug_save = o.debugging;  o.debugging = 0;  while ((type = exclude_group[i].get_targets_type()) != TargetGroup::TYPE_NONE)  {    switch (type) {       case TargetGroup::IPV4_NETMASK:         exclude_group[i].get_next_host(&ss, &slen);         mask = exclude_group[i].get_mask();         error("exclude host group %d is %s/%d", i, inet_ntoa(sin->sin_addr), mask);         break;       case TargetGroup::IPV4_RANGES:         while (exclude_group[i].get_next_host(&ss, &slen) == 0)            error("exclude host group %d is %s", i, inet_ntoa(sin->sin_addr));         break;       case TargetGroup::IPV6_ADDRESS:	 fatal("IPV6 addresses are not supported in the exclude file\n");         break;       default:	 fatal("Unknown target type in exclude file.\n");    }    exclude_group[i++].rewind();  }  /* return debugging to what it was */  o.debugging = debug_save;   return 1;} static void massping(Target *hostbatch[], int num_hosts, int pingtype) {  static struct timeout_info group_to = { 0, 0, 0 };  static char prev_device_name[16] = "";  const char *device_name;  std::vector<Target *> targets;  int i;  /* Get the name of the interface used to send to this group. We assume the     device used to send to the first target is used to send to all of them. */  device_name = NULL;  if (num_hosts > 0)    device_name = hostbatch[0]->deviceName();  if (device_name == NULL)    device_name = "";  /* group_to is a static variable that keeps track of group timeout values     between invocations of this function. We reuse timeouts as long as this     invocation uses the same device as the previous one. Otherwise we     reinitialize the timeouts. */  if (group_to.srtt == 0 || group_to.rttvar == 0 || group_to.timeout == 0    || strcmp(prev_device_name, device_name) != 0) {    initialize_timeout_info(&group_to);    Strncpy(prev_device_name, device_name, sizeof(prev_device_name));  }  for (i = 0; i < num_hosts; i++) {    initialize_timeout_info(&hostbatch[i]->to);    targets.push_back(hostbatch[i]);  }  /* ultra_scan gets pingtype from o.pingtype. */  ultra_scan(targets, NULL, PING_SCAN, &group_to);}Target *nexthost(HostGroupState *hs, TargetGroup *exclude_group,			    struct scan_lists *ports, int pingtype) {int hidx = 0;int i;struct sockaddr_storage ss;size_t sslen;struct intf_entry *ifentry; u32 ifbuf[200] ; struct route_nfo rnfo; bool arpping_done = false; struct timeval now; ifentry = (struct intf_entry *) ifbuf;  ifentry->intf_len = sizeof(ifbuf); // TODO: May want to use a larger buffer if interface aliases prove important.if (hs->next_batch_no < hs->current_batch_sz) {  /* Woop!  This is easy -- we just pass back the next host struct */  return hs->hostbatch[hs->next_batch_no++];}/* Doh, we need to refresh our array *//* for(i=0; i < hs->max_batch_sz; i++) hs->hostbatch[i] = new Target(); */hs->current_batch_sz = hs->next_batch_no = 0;do {  /* Grab anything we have in our current_expression */  while (hs->current_batch_sz < hs->max_batch_sz && 	 hs->current_expression.get_next_host(&ss, &sslen) == 0)    {      if (hostInExclude((struct sockaddr *)&ss, sslen, exclude_group)) {	continue; /* Skip any hosts the user asked to exclude */      }      hidx = hs->current_batch_sz;      hs->hostbatch[hidx] = new Target();      hs->hostbatch[hidx]->setTargetSockAddr(&ss, sslen);      /* We figure out the source IP/device IFF	 1) We are r00t AND	 2) We are doing tcp or udp pingscan OR	 3) We are doing a raw-mode portscan or osscan OR	 4) We are on windows and doing ICMP ping */      if (o.isr00t && o.af() == AF_INET && 	  ((pingtype & (PINGTYPE_TCP|PINGTYPE_UDP|PINGTYPE_PROTO|PINGTYPE_ARP)) || o.RawScan()#ifdef WIN32	   || (pingtype & (PINGTYPE_ICMP_PING|PINGTYPE_ICMP_MASK|PINGTYPE_ICMP_TS))#endif // WIN32	   )) {	hs->hostbatch[hidx]->TargetSockAddr(&ss, &sslen);	if (!route_dst(&ss, &rnfo)) {	  fatal("%s: failed to determine route to %s", __func__, hs->hostbatch[hidx]->NameIP());	}	if (rnfo.direct_connect) {	  hs->hostbatch[hidx]->setDirectlyConnected(true);	} else {	  hs->hostbatch[hidx]->setDirectlyConnected(false);	  hs->hostbatch[hidx]->setNextHop(&rnfo.nexthop, 					  sizeof(rnfo.nexthop));	}	hs->hostbatch[hidx]->setIfType(rnfo.ii.device_type);	if (rnfo.ii.device_type == devt_ethernet) {	  if (o.spoofMACAddress())	    hs->hostbatch[hidx]->setSrcMACAddress(o.spoofMACAddress());	  else hs->hostbatch[hidx]->setSrcMACAddress(rnfo.ii.mac);	}	hs->hostbatch[hidx]->setSourceSockAddr(&rnfo.srcaddr, sizeof(rnfo.srcaddr));	if (hidx == 0) /* Because later ones can have different src addy and be cut off group */	  o.decoys[o.decoyturn] = hs->hostbatch[hidx]->v4source();	hs->hostbatch[hidx]->setDeviceNames(rnfo.ii.devname, rnfo.ii.devfullname);	//	  printf("Target %s %s directly connected, goes through local iface %s, which %s ethernet\n", hs->hostbatch[hidx]->NameIP(), hs->hostbatch[hidx]->directlyConnected()? "IS" : "IS NOT", hs->hostbatch[hidx]->deviceName(), (hs->hostbatch[hidx]->ifType() == devt_ethernet)? "IS" : "IS NOT");      }            /* In some cases, we can only allow hosts that use the same	 device in a group.  Similarly, we don't mix	 directly-connected boxes with those that aren't */      if (o.af() == AF_INET && o.isr00t && hidx > 0 && 	  hs->hostbatch[hidx]->deviceName() && 	  (hs->hostbatch[hidx]->v4source().s_addr != hs->hostbatch[0]->v4source().s_addr || 	   strcmp(hs->hostbatch[0]->deviceName(), 		  hs->hostbatch[hidx]->deviceName()) != 0 	  || hs->hostbatch[hidx]->directlyConnected() != hs->hostbatch[0]->directlyConnected())) {	/* Cancel everything!  This guy must go in the next group and we are	   out of here */	hs->current_expression.return_last_host();	delete hs->hostbatch[hidx];	goto batchfull;      }      hs->current_batch_sz++;}  if (hs->current_batch_sz < hs->max_batch_sz &&      hs->next_expression < hs->num_expressions) {    /* We are going to have to pop in another expression. */    while(hs->current_expression.parse_expr(hs->target_expressions[hs->next_expression++], o.af()) != 0)       if (hs->next_expression >= hs->num_expressions)	break;  } else break;} while(1); batchfull: if (hs->current_batch_sz == 0)  return NULL;/* OK, now we have our complete batch of entries.  The next step is to   randomize them (if requested) */if (hs->randomize) {  hoststructfry(hs->hostbatch, hs->current_batch_sz);}/* First I'll do the ARP ping if all of the machines in the group are   directly connected over ethernet.  I may need the MAC addresses   later anyway. */ if (hs->hostbatch[0]->ifType() == devt_ethernet &&      hs->hostbatch[0]->directlyConnected() &&      o.sendpref != PACKET_SEND_IP_STRONG) {   arpping(hs->hostbatch, hs->current_batch_sz);   arpping_done = true; }  gettimeofday(&now, NULL); if ((o.sendpref & PACKET_SEND_ETH) &&      hs->hostbatch[0]->ifType() == devt_ethernet) {   for(i=0; i < hs->current_batch_sz; i++)     if (!(hs->hostbatch[i]->flags & HOST_DOWN) && 	 !hs->hostbatch[i]->timedOut(&now))       if (!setTargetNextHopMAC(hs->hostbatch[i]))	 fatal("%s: Failed to determine dst MAC address for target %s", 	       __func__, hs->hostbatch[i]->NameIP()); } /* TODO: Maybe I should allow real ping scan of directly connected    ethernet hosts? */ /* Then we do the mass ping (if required - IP-level pings) */ if ((pingtype == PINGTYPE_NONE && !arpping_done) || hs->hostbatch[0]->ifType() == devt_loopback) {   for(i=0; i < hs->current_batch_sz; i++)  {     if (!hs->hostbatch[i]->timedOut(&now)) {       initialize_timeout_info(&hs->hostbatch[i]->to);       hs->hostbatch[i]->flags |= HOST_UP; /*hostbatch[i].up = 1;*/	   hs->hostbatch[i]->reason.reason_id = ER_LOCALHOST;     }   } } else if (!arpping_done)   if (pingtype & PINGTYPE_ARP) /* A host that we can't arp scan ... maybe localhost */     massping(hs->hostbatch, hs->current_batch_sz, DEFAULT_PING_TYPES);   else     massping(hs->hostbatch, hs->current_batch_sz, pingtype);  if (!o.noresolve) nmap_mass_rdns(hs->hostbatch, hs->current_batch_sz);  return hs->hostbatch[hs->next_batch_no++];}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?