Attack a whole network.
922 int max_hosts = 0, max_checks;
923 const char *hostlist;
924 openvas_host_t *
host;
925 int global_socket = -1;
927 int fork_retries = 0;
929 struct timeval then, now;
930 openvas_hosts_t *hosts;
932 const gchar *network_targets, *port_range;
933 gboolean network_phase = FALSE;
934 gboolean do_network_scan = FALSE;
936 gettimeofday (&then, NULL);
938 if (prefs_get_bool (
"network_scan"))
939 do_network_scan = TRUE;
941 do_network_scan = FALSE;
943 network_targets = prefs_get (
"network_targets");
944 if (network_targets != NULL)
945 arg_add_value (globals,
"network_targets", ARG_STRING,
946 (
char *) network_targets);
952 nss = network_scan_status (globals);
956 network_phase = FALSE;
960 network_phase = TRUE;
964 arg_add_value (globals,
"network_scan_status", ARG_STRING,
966 network_phase = TRUE;
973 global_socket = arg_get_value_int (globals,
"global_socket");
974 if (check_kb_access(global_socket))
978 hostlist = prefs_get (
"TARGET");
979 if (hostlist == NULL)
981 error_message_to_client (global_socket,
"Missing target hosts", NULL,
987 port_range = prefs_get (
"port_range");
988 if (validate_port_range (port_range))
990 error_message_to_client (global_socket,
"Invalid port range", NULL,
997 (prefs_get (
"plugin_set"), prefs_get_bool (
"auto_enable_dependencies"),
1005 if (network_targets == NULL)
1007 log_write (
"WARNING: In network phase, but without targets! Stopping.");
1014 log_write (
"Start a new scan. Target(s) : %s, " 1015 "in network phase with target %s",
1016 hostlist, network_targets);
1018 rc = kb_new (network_kb, prefs_get (
"kb_location"));
1021 report_kb_failure (global_socket, rc);
1025 kb_lnk_reset (*network_kb);
1030 log_write (
"Starts a new scan. Target(s) : %s, with max_hosts = %d and " 1031 "max_checks = %d", hostlist, max_hosts, max_checks);
1034 hosts = openvas_hosts_new (hostlist);
1036 apply_hosts_preferences (hosts);
1039 if (apply_source_iface_preference (global_socket) != 0)
1041 openvas_hosts_free (hosts);
1042 error_message_to_client
1043 (global_socket,
"Interface not authorized for scanning", NULL, NULL);
1046 host = openvas_hosts_next (hosts);
1055 while (
host && !scan_is_stopped () && !all_scans_are_stopped())
1062 host_str = openvas_host_value_str (
host);
1063 if (socketpair (AF_UNIX, SOCK_STREAM, 0, soc) < 0
1070 if (scan_is_stopped () || all_scans_are_stopped ())
1080 args.thread_socket = soc[0];
1081 args.parent_socket = soc[1];
1082 args.net_kb = network_kb;
1087 close (args.thread_socket);
1094 log_write (
"fork() failed - %s. %s won't be tested",
1095 strerror (errno), host_str);
1101 "sleeping %d seconds and trying again...",
1103 fork_sleep (fork_retries);
1108 log_write (
"Testing %s (network level) [%d]",
1109 network_targets, pid);
1114 arg_set_value (
globals,
"network_scan_status",
"done");
1117 host = openvas_hosts_next (hosts);
1130 files = arg_get_value (
globals,
"files_translation");
1132 g_hash_table_destroy (files);
1135 if (all_scans_are_stopped ())
1137 error_message_to_client
1138 (global_socket,
"The whole scan was stopped. " 1139 "Fatal Redis connection error.",
"", NULL);
1143 gettimeofday (&now, NULL);
1144 log_write (
"Total time to scan all hosts : %ld seconds",
1145 now.tv_sec - then.tv_sec);
1147 if (do_network_scan && network_phase &&
1148 !scan_is_stopped () && !all_scans_are_stopped ())
void(*)(int) openvas_signal(int signum, void(*handler)(int))
void log_write(const char *str,...)
Write into the logfile / syslog.
plugins_scheduler_t plugins_scheduler_init(const char *plugins_list, int autoload, int only_network)
void plugins_scheduler_free(plugins_scheduler_t sched)
void attack_network(struct arglist *globals, kb_t *network_kb)
Attack a whole network.
int hosts_new(struct arglist *globals, char *name, int soc)
int hosts_init(int soc, int max_hosts)
Host information, implemented as doubly linked list.
plugins_scheduler_t sched
int get_max_hosts_number(void)
void(* process_func_t)(void *)
int hosts_set_pid(char *name, pid_t pid)
int hosts_read(struct arglist *globals)
Returns -1 if client asked to stop all tests or connection was lost or error. 0 otherwise.
pid_t create_process(process_func_t function, void *argument)
Create a new process (fork).
int get_max_checks_number(void)