diff --git a/src/main-conf.c b/src/main-conf.c index fa2980f2f339ed0c13f83de21f8b15203ce0ef88..ba939ad263111e0ed541f8b08a35dcdb0269ff4c 100644 --- a/src/main-conf.c +++ b/src/main-conf.c @@ -986,6 +986,20 @@ config_top_ports(struct Masscan *masscan, unsigned n) } } +int +isInteger(const char *value) +{ + size_t i; + + if (value == NULL) + return 0; + + for (i=0; value[i]; i++) + if (!isdigit(value[i]&0xFF)) + return 0; + return 1; +} + /*************************************************************************** * Called either from the "command-line" parser when it sees a --parm, * or from the "config-file" parser for normal options. @@ -1798,7 +1812,10 @@ masscan_set_parameter(struct Masscan *masscan, exit(1); } else if (EQUALS("top-ports", name)) { unsigned n = (unsigned)parseInt(value); - config_top_ports(masscan, n); + if (!isInteger(value)) + n = 100; + LOG(2, "top-ports = %u\n", n); + masscan->top_ports = n; } else if (EQUALS("traceroute", name)) { fprintf(stderr, "nmap(%s): unsupported\n", name); exit(1); @@ -1934,6 +1951,21 @@ masscan_command_line(struct Masscan *masscan, int argc, char *argv[]) if (argv[i][0] == '-' && argv[i][1] == '-') { if (strcmp(argv[i], "--help") == 0) { masscan_help(); + } else if (EQUALS("top-ports", argv[i]+2)) { + /* special handling here since the following parameter + * is optional */ + const char *value = "1000"; + unsigned n; + + /* Only consume the next parameter if it's a number, + * otherwise default to 10000 */ + if (i+1 < argc && isInteger(argv[i+1])) { + value = argv[++i]; + } + n = (unsigned)parseInt(value); + LOG(2, "top-ports = %u\n", n); + masscan->top_ports = n; + } else if (EQUALS("readscan", argv[i]+2)) { /* Read in a binary file instead of scanning the network*/ masscan->op = Operation_ReadScan; @@ -2269,6 +2301,21 @@ masscan_command_line(struct Masscan *masscan, int argc, char *argv[]) */ masscan_set_parameter(masscan, "range", argv[i]); } + + /* + * If no other "scan type" found, then default to TCP + */ + if (masscan->scan_type.udp == 0 && masscan->scan_type.sctp == 0 + && masscan->scan_type.ping == 0 && masscan->scan_type.arp == 0) + masscan->scan_type.tcp = 1; + + /* + * If "top-ports" specified, then add all those ports. This may be in + * addition to any other ports + */ + if (masscan->top_ports) { + config_top_ports(masscan, masscan->top_ports); + } } /*************************************************************************** diff --git a/src/masscan.h b/src/masscan.h index 234388e90101088fe5d89011a2ada556d41945c3..e9554eedb9083418980ef0f2e6dc3064b0249a4a 100644 --- a/src/masscan.h +++ b/src/masscan.h @@ -101,7 +101,13 @@ struct Masscan unsigned udp:1; unsigned sctp:1; unsigned ping:1; + unsigned arp:1; /*TODO*/ } scan_type; + + /** + * After scan type has been configured, add these ports + */ + unsigned top_ports; /** * One or more network adapters that we'll use for scanning. Each adapter