void init_iflist(void) { if (ifblock) { free(ifblock); ifblock_size = 0; } free(iflist); /* get iflist block from kernel */ get_iflist(&ifblock, &ifblock_size); /* make list of pointers to each if_msghdr */ parse_iflist(&iflist, ifblock, ifblock_size); }
void set_secondary(char *iface) { GBL_OPTIONS->secondary = parse_iflist(iface); }
void parse_options(int argc, char **argv) { int c; static struct option long_options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, 'v' }, { "update", no_argument, NULL, 'U' }, { "iface", required_argument, NULL, 'i' }, { "lifaces", no_argument, NULL, 'I' }, { "netmask", required_argument, NULL, 'n' }, { "address", required_argument, NULL, 'A' }, { "write", required_argument, NULL, 'w' }, { "read", required_argument, NULL, 'r' }, { "pcapfilter", required_argument, NULL, 'f' }, { "reversed", no_argument, NULL, 'R' }, { "proto", required_argument, NULL, 't' }, { "plugin", required_argument, NULL, 'P' }, { "filter", required_argument, NULL, 'F' }, { "superquiet", no_argument, NULL, 'Q' }, { "quiet", no_argument, NULL, 'q' }, { "script", required_argument, NULL, 's' }, { "silent", no_argument, NULL, 'z' }, { "unoffensive", no_argument, NULL, 'u' }, { "nosslmitm", no_argument, NULL, 'S' }, { "load-hosts", required_argument, NULL, 'j' }, { "save-hosts", required_argument, NULL, 'k' }, { "wep-key", required_argument, NULL, 'W' }, { "config", required_argument, NULL, 'a' }, { "dns", no_argument, NULL, 'd' }, { "regex", required_argument, NULL, 'e' }, { "visual", required_argument, NULL, 'V' }, { "ext-headers", no_argument, NULL, 'E' }, { "log", required_argument, NULL, 'L' }, { "log-info", required_argument, NULL, 'l' }, { "log-msg", required_argument, NULL, 'm' }, { "compress", no_argument, NULL, 'c' }, { "text", no_argument, NULL, 'T' }, { "curses", no_argument, NULL, 'C' }, { "daemon", no_argument, NULL, 'D' }, { "gtk", no_argument, NULL, 'G' }, { "mitm", required_argument, NULL, 'M' }, { "only-mitm", no_argument, NULL, 'o' }, { "bridge", required_argument, NULL, 'B' }, { "broadcast", required_argument, NULL, 'b' }, { "promisc", no_argument, NULL, 'p' }, { "gateway", required_argument, NULL, 'Y' }, { "certificate", required_argument, NULL, 0 }, { "private-key", required_argument, NULL, 0 }, { 0 , 0 , 0 , 0} }; for (c = 0; c < argc; c++) DEBUG_MSG("parse_options -- [%d] [%s]", c, argv[c]); /* OPTIONS INITIALIZATION */ GBL_PCAP->promisc = 1; GBL_FORMAT = &ascii_format; GBL_OPTIONS->ssl_mitm = 1; GBL_OPTIONS->broadcast = 0; GBL_OPTIONS->ssl_cert = NULL; GBL_OPTIONS->ssl_pkey = NULL; /* OPTIONS INITIALIZED */ optind = 0; int option_index = 0; while ((c = getopt_long (argc, argv, "A:a:bB:CchDdEe:F:f:GhIi:j:k:L:l:M:m:n:oP:pQqiRr:s:STt:UuV:vW:w:Y:z", long_options, &option_index)) != EOF) { /* used for parsing arguments */ char *opt_end = optarg; while (opt_end && *opt_end) opt_end++; /* enable a loaded filter script? */ uint8_t f_enabled = 1; switch (c) { case 'M': GBL_OPTIONS->mitm = 1; if (mitm_set(optarg) != ESUCCESS) FATAL_ERROR("MITM method '%s' not supported...\n", optarg); break; case 'o': GBL_OPTIONS->only_mitm = 1; //select_text_interface(); break; case 'b': GBL_OPTIONS->broadcast = 1; break; case 'B': GBL_OPTIONS->iface_bridge = strdup(optarg); set_bridge_sniff(); break; case 'p': GBL_PCAP->promisc = 0; break; case 'T': select_text_interface(); break; case 'C': select_curses_interface(); break; case 'G': select_gtk_interface(); break; case 'D': select_daemon_interface(); break; case 'R': GBL_OPTIONS->reversed = 1; break; case 't': GBL_OPTIONS->proto = strdup(optarg); break; case 'P': /* user has requested the list */ if (!strcasecmp(optarg, "list")) { plugin_list(); clean_exit(0); } /* else set the plugin */ GBL_OPTIONS->plugin = strdup(optarg); break; case 'i': GBL_OPTIONS->iface = strdup(optarg); break; case 'I': /* this option is only useful in the text interface */ select_text_interface(); GBL_OPTIONS->lifaces = 1; break; case 'Y': GBL_OPTIONS->secondary = parse_iflist(optarg); break; case 'n': GBL_OPTIONS->netmask = strdup(optarg); break; case 'A': GBL_OPTIONS->address = strdup(optarg); break; case 'r': /* we don't want to scan the lan while reading from file */ GBL_OPTIONS->silent = 1; GBL_OPTIONS->read = 1; GBL_OPTIONS->pcapfile_in = strdup(optarg); break; case 'w': GBL_OPTIONS->write = 1; GBL_OPTIONS->pcapfile_out = strdup(optarg); break; case 'f': GBL_PCAP->filter = strdup(optarg); break; case 'F': /* is there a :0 or :1 appended to the filename? */ if ( (opt_end-optarg >=2) && *(opt_end-2) == ':' ) { *(opt_end-2) = '\0'; f_enabled = !( *(opt_end-1) == '0' ); } if (filter_load_file(optarg, GBL_FILTERS, f_enabled) != ESUCCESS) FATAL_ERROR("Cannot load filter file \"%s\"", optarg); break; case 'L': if (set_loglevel(LOG_PACKET, optarg) == -EFATAL) clean_exit(-EFATAL); break; case 'l': if (set_loglevel(LOG_INFO, optarg) == -EFATAL) clean_exit(-EFATAL); break; case 'm': if (set_msg_loglevel(LOG_TRUE, optarg) == -EFATAL) clean_exit(-EFATAL); break; case 'c': GBL_OPTIONS->compress = 1; break; case 'e': if (set_regex(optarg) == -EFATAL) clean_exit(-EFATAL); break; case 'Q': GBL_OPTIONS->superquiet = 1; /* no break, quiet must be enabled */ case 'q': GBL_OPTIONS->quiet = 1; break; case 's': GBL_OPTIONS->script = strdup(optarg); break; case 'z': GBL_OPTIONS->silent = 1; break; case 'u': GBL_OPTIONS->unoffensive = 1; break; case 'S': GBL_OPTIONS->ssl_mitm = 0; break; case 'd': GBL_OPTIONS->resolve = 1; break; case 'j': GBL_OPTIONS->silent = 1; GBL_OPTIONS->load_hosts = 1; GBL_OPTIONS->hostsfile = strdup(optarg); break; case 'k': GBL_OPTIONS->save_hosts = 1; GBL_OPTIONS->hostsfile = strdup(optarg); break; case 'V': if (set_format(optarg) != ESUCCESS) clean_exit(-EFATAL); break; case 'E': GBL_OPTIONS->ext_headers = 1; break; case 'W': set_wep_key(optarg); break; case 'a': GBL_CONF->file = strdup(optarg); break; case 'U': /* load the conf for the connect timeout value */ load_conf(); global_update(); /* NOT REACHED */ break; case 'h': ec_usage(); break; case 'v': printf("%s %s\n", GBL_PROGRAM, GBL_VERSION); clean_exit(0); break; /* Certificate and private key options */ case 0: if (!strcmp(long_options[option_index].name, "certificate")) { GBL_OPTIONS->ssl_cert = strdup(optarg); } else if (!strcmp(long_options[option_index].name, "private-key")) { GBL_OPTIONS->ssl_pkey = strdup(optarg); } else { fprintf(stdout, "\nTry `%s --help' for more options.\n\n", GBL_PROGRAM); clean_exit(-1); } break; case ':': // missing parameter fprintf(stdout, "\nTry `%s --help' for more options.\n\n", GBL_PROGRAM); clean_exit(-1); break; case '?': // unknown option fprintf(stdout, "\nTry `%s --help' for more options.\n\n", GBL_PROGRAM); clean_exit(-1); break; } } DEBUG_MSG("parse_options: options parsed"); /* TARGET1 and TARGET2 parsing */ if (argv[optind]) { GBL_OPTIONS->target1 = strdup(argv[optind]); DEBUG_MSG("TARGET1: %s", GBL_OPTIONS->target1); if (argv[optind+1]) { GBL_OPTIONS->target2 = strdup(argv[optind+1]); DEBUG_MSG("TARGET2: %s", GBL_OPTIONS->target2); } } /* create the list form the TARGET format (MAC/IPrange/PORTrange) */ compile_display_filter(); DEBUG_MSG("parse_options: targets parsed"); /* check for other options */ if (GBL_SNIFF->start == NULL) set_unified_sniff(); if (GBL_OPTIONS->read && GBL_PCAP->filter) FATAL_ERROR("Cannot read from file and set a filter on interface"); if (GBL_OPTIONS->read && GBL_SNIFF->type != SM_UNIFIED ) FATAL_ERROR("You can read from a file ONLY in unified sniffing mode !"); if (GBL_OPTIONS->mitm && GBL_SNIFF->type != SM_UNIFIED ) FATAL_ERROR("You can't do mitm attacks in bridged sniffing mode !"); if (GBL_SNIFF->type == SM_BRIDGED && GBL_PCAP->promisc == 0) FATAL_ERROR("During bridged sniffing the iface must be in promisc mode !"); if (GBL_OPTIONS->quiet && GBL_UI->type != UI_TEXT) FATAL_ERROR("The quiet option is useful only with text only UI"); if (GBL_OPTIONS->load_hosts && GBL_OPTIONS->save_hosts) FATAL_ERROR("Cannot load and save at the same time the hosts list..."); if (GBL_OPTIONS->unoffensive && GBL_OPTIONS->mitm) FATAL_ERROR("Cannot use mitm attacks in unoffensive mode"); if (GBL_OPTIONS->read && GBL_OPTIONS->mitm) FATAL_ERROR("Cannot use mitm attacks while reading from file"); if (GBL_UI->init == NULL) FATAL_ERROR("Please select an User Interface"); /* force text interface for only mitm attack */ /* Do not select text interface for only MiTM mode if (GBL_OPTIONS->only_mitm) { if (GBL_OPTIONS->mitm) select_text_interface(); else FATAL_ERROR("Only mitm requires at least one mitm method"); } */ DEBUG_MSG("parse_options: options combination looks good"); return; }