|
NETWORK ATTACKS FRAMEWORK
1.0.0
A NETwork Attacks framework. Making network attacks impact evaluation easier!
|
#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <sys/stat.h>#include <linux/sockios.h>#include <linux/wireless.h>#include <getopt.h>#include <ctype.h>#include "defs.h"#include "debug.h"#include "timer_queue.h"#include "MA_params.h"#include "MA_aodv_socket.h"#include "MA_aodv_timeout.h"#include "k_route.h"#include "MA_routing_table.h"#include "MA_aodv_hello.h"#include "MA_nl.h"Go to the source code of this file.
Classes | |
| struct | callback |
Defines | |
| #define | CALLBACK_FUNCS 5 |
Functions | |
| void | usage (int status) |
| int | set_kernel_options () |
| int | find_default_gw (void) |
| struct sockaddr_in * | get_if_info (char *ifname, int type) |
| int | attach_callback_func (int fd, callback_func_t func) |
| void | load_modules (char *ifname) |
| void | remove_modules (void) |
| void | host_init (char *ifname) |
| void | signal_handler (int type) |
| int | main (int argc, char **argv) |
Variables | |
| int | log_to_file = 0 |
| int | rt_log_interval = 0 |
| int | unidir_hack = 0 |
| int | rreq_gratuitous = 0 |
| int | expanding_ring_search = 1 |
| int | internet_gw_mode = 0 |
| int | local_repair = 0 |
| int | receive_n_hellos = 0 |
| int | hello_jittering = 1 |
| int | optimized_hellos = 0 |
| int | ratelimit = 1 |
| char * | progname |
| int | wait_on_reboot = 1 |
| int | qual_threshold = 0 |
| int | llfeedback = 0 |
| int | gw_prefix = 1 |
| struct timer | worb_timer |
| int | active_route_timeout = ACTIVE_ROUTE_TIMEOUT_HELLO |
| int | ttl_start = TTL_START_HELLO |
| int | delete_period = DELETE_PERIOD_HELLO |
| struct option | longopts [] |
| #define CALLBACK_FUNCS 5 |
| int attach_callback_func | ( | int | fd, |
| callback_func_t | func | ||
| ) |
Definition at line 285 of file main.c.
{
if (nr_callbacks >= CALLBACK_FUNCS) {
fprintf(stderr, "callback attach limit reached!!\n");
exit(-1);
}
callbacks[nr_callbacks].fd = fd;
callbacks[nr_callbacks].func = func;
nr_callbacks++;
return 0;
}
| int find_default_gw | ( | void | ) |
Definition at line 220 of file main.c.
{
FILE *route;
char buf[100], *l;
route = fopen("/proc/net/route", "r");
if (route == NULL) {
perror("open /proc/net/route");
exit(-1);
}
while (fgets(buf, sizeof(buf), route)) {
l = strtok(buf, " \t");
l = strtok(NULL, " \t");
if (l != NULL) {
if (strcmp("00000000", l) == 0) {
l = strtok(NULL, " \t");
l = strtok(NULL, " \t");
if (strcmp("0003", l) == 0) {
fclose(route);
return 1;
}
}
}
}
fclose(route);
return 0;
}
| struct sockaddr_in* get_if_info | ( | char * | ifname, |
| int | type | ||
| ) | [read] |
Definition at line 253 of file main.c.
{
int skfd;
struct sockaddr_in *ina;
static struct ifreq ifr;
/* Get address of interface... */
skfd = socket(AF_INET, SOCK_DGRAM, 0);
strcpy(ifr.ifr_name, ifname);
if (ioctl(skfd, type, &ifr) < 0) {
alog(LOG_ERR, errno, __FUNCTION__,
"Could not get address of %s ", ifname);
close(skfd);
return NULL;
} else {
ina = (struct sockaddr_in *) &ifr.ifr_addr;
close(skfd);
return ina;
}
}
| void host_init | ( | char * | ifname | ) |
Definition at line 348 of file main.c.
{
struct sockaddr_in *ina;
char buf[1024], tmp_ifname[IFNAMSIZ],
ifnames[(IFNAMSIZ + 1) * MAX_NR_INTERFACES], *iface;
struct ifconf ifc;
struct ifreq ifreq, *ifr;
int i, iw_sock, if_sock = 0;
memset(&this_host, 0, sizeof(struct host_info));
memset(dev_indices, 0, sizeof(unsigned int) * MAX_NR_INTERFACES);
if (!ifname) {
/* No interface was given... search for first wireless. */
iw_sock = socket(PF_INET, SOCK_DGRAM, 0);
ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
if (ioctl(iw_sock, SIOCGIFCONF, &ifc) < 0) {
fprintf(stderr, "Could not get wireless info\n");
exit(-1);
}
ifr = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); i >= 0; i--, ifr++) {
struct iwreq req;
strcpy(req.ifr_name, ifr->ifr_name);
if (ioctl(iw_sock, SIOCGIWNAME, &req) >= 0) {
strcpy(tmp_ifname, ifr->ifr_name);
break;
}
}
/* Did we find a wireless interface? */
if (!strlen(tmp_ifname)) {
fprintf(stderr, "\nCould not find a wireless interface!\n");
fprintf(stderr, "Use -i <interface> to override...\n\n");
exit(-1);
}
strcpy(ifreq.ifr_name, tmp_ifname);
if (ioctl(iw_sock, SIOCGIFINDEX, &ifreq) < 0) {
alog(LOG_ERR, errno, __FUNCTION__,
"Could not get index of %s", tmp_ifname);
close(if_sock);
exit(-1);
}
close(iw_sock);
ifname = tmp_ifname;
alog(LOG_NOTICE, 0, __FUNCTION__,
"Attaching to %s, override with -i <if1,if2,...>.", tmp_ifname);
}
strcpy(ifnames, ifname);
/* Intitialize the local sequence number an rreq_id to zero */
this_host.seqno = 1;
this_host.rreq_id = 0;
/* Zero interfaces enabled so far... */
this_host.nif = 0;
gettimeofday(&this_host.bcast_time, NULL);
/* Find the indices of all interfaces to broadcast on... */
if_sock = socket(AF_INET, SOCK_DGRAM, 0);
iface = strtok(ifname, ",");
/* OK, now lookup interface information, and store it... */
do {
strcpy(ifreq.ifr_name, iface);
if (ioctl(if_sock, SIOCGIFINDEX, &ifreq) < 0) {
alog(LOG_ERR, errno, __FUNCTION__, "Could not get index of %s",
iface);
close(if_sock);
exit(-1);
}
this_host.devs[this_host.nif].ifindex = ifreq.ifr_ifindex;
dev_indices[this_host.nif++] = ifreq.ifr_ifindex;
strcpy(DEV_IFINDEX(ifreq.ifr_ifindex).ifname, iface);
/* Get IP-address of interface... */
ina = get_if_info(iface, SIOCGIFADDR);
if (ina == NULL)
exit(-1);
DEV_IFINDEX(ifreq.ifr_ifindex).ipaddr = ina->sin_addr;
/* Get netmask of interface... */
ina = get_if_info(iface, SIOCGIFNETMASK);
if (ina == NULL)
exit(-1);
DEV_IFINDEX(ifreq.ifr_ifindex).netmask = ina->sin_addr;
ina = get_if_info(iface, SIOCGIFBRDADDR);
if (ina == NULL)
exit(-1);
DEV_IFINDEX(ifreq.ifr_ifindex).broadcast = ina->sin_addr;
DEV_IFINDEX(ifreq.ifr_ifindex).enabled = 1;
if (this_host.nif >= MAX_NR_INTERFACES)
break;
} while ((iface = strtok(NULL, ",")));
close(if_sock);
/* Load kernel modules */
load_modules(ifnames);
/* Enable IP forwarding and set other kernel options... */
if (set_kernel_options() < 0) {
fprintf(stderr, "Could not set kernel options!\n");
exit(-1);
}
}
| void load_modules | ( | char * | ifname | ) |
Definition at line 301 of file main.c.
{
struct stat st;
char buf[1024], *l = NULL;
int found = 0;
FILE *m;
memset(buf, '\0', 64);
if (stat("./kaodv.ko", &st) == 0)
sprintf(buf, "/sbin/insmod kaodv.ko ifname=%s &>/dev/null", ifname);
else if (stat("./kaodv.o", &st) == 0)
sprintf(buf, "/sbin/insmod kaodv.o ifname=%s &>/dev/null", ifname);
else
sprintf(buf, "/sbin/modprobe kaodv ifname=%s &>/dev/null", ifname);
system(buf);
usleep(100000);
/* Check result */
m = fopen("/proc/modules", "r");
while (fgets(buf, sizeof(buf), m)) {
l = strtok(buf, " \t");
if (!strcmp(l, "kaodv"))
found++;
if (!strcmp(l, "ipchains")) {
fprintf(stderr,
"The ipchains kernel module is loaded and prevents AODV-UU from functioning properly.\n");
exit(-1);
}
}
fclose(m);
if (found < 1) {
fprintf(stderr,
"A kernel module could not be loaded, check your installation... %d\n",
found);
exit(-1);
}
}
| int main | ( | int | argc, |
| char ** | argv | ||
| ) |
Definition at line 486 of file main.c.
{
static char *ifname = NULL; /* Name of interface to attach to */
fd_set rfds, readers;
int n, nfds = 0, i;
int daemonize = 0;
struct timeval *timeout;
/* Remember the name of the executable... */
progname = strrchr(argv[0], '/');
if (progname)
progname++;
else
progname = argv[0];
/* Use debug output as default */
debug = 1;
/* Parse command line: */
while (1) {
int opt;
opt = getopt_long(argc, argv, "i:fjln:dghoq:r:s:uwxDLRV", longopts, 0);
if (opt == EOF)
break;
switch (opt) {
case 0:
break;
case 'd':
debug = 0;
daemonize = 1;
break;
case 'f':
llfeedback = 1;
active_route_timeout = ACTIVE_ROUTE_TIMEOUT_LLF;
break;
case 'g':
rreq_gratuitous = !rreq_gratuitous;
break;
case 'i':
ifname = optarg;
break;
case 'j':
hello_jittering = !hello_jittering;
break;
case 'l':
log_to_file = !log_to_file;
break;
case 'n':
if (optarg && isdigit(*optarg)) {
receive_n_hellos = atoi(optarg);
if (receive_n_hellos < 2) {
fprintf(stderr, "-n should be at least 2!\n");
exit(-1);
}
}
break;
case 'o':
optimized_hellos = !optimized_hellos;
break;
case 'q':
if (optarg && isdigit(*optarg))
qual_threshold = atoi(optarg);
break;
case 'r':
if (optarg && isdigit(*optarg))
rt_log_interval = atof(optarg) * 1000;
break;
case 'u':
unidir_hack = !unidir_hack;
break;
case 'w':
internet_gw_mode = !internet_gw_mode;
break;
case 'x':
expanding_ring_search = !expanding_ring_search;
break;
case 'L':
local_repair = !local_repair;
break;
case 'D':
wait_on_reboot = !wait_on_reboot;
break;
case 'R':
ratelimit = !ratelimit;
break;
case 'V':
printf
("\nAODV-UU v%s, %s © Uppsala University & Ericsson AB.\nAuthor: Erik Nordström, <erik.nordstrom@it.uu.se>\n\n",
AODV_UU_VERSION, DRAFT_VERSION);
exit(0);
break;
case '?':
case ':':
exit(0);
default:
usage(0);
}
}
/* Check that we are running as root */
if (geteuid() != 0) {
fprintf(stderr, "must be root\n");
exit(1);
}
/* Detach from terminal */
if (daemonize) {
if (fork() != 0)
exit(0);
/* Close stdin, stdout and stderr... */
/* close(0); */
close(1);
close(2);
setsid();
}
/* Make sure we cleanup at exit... */
atexit((void *) &cleanup);
/* Initialize data structures and services... */
rt_table_init();
log_init();
/* packet_queue_init(); */
host_init(ifname);
/* packet_input_init(); */
nl_init();
nl_send_conf_msg();
aodv_socket_init();
#ifdef LLFEEDBACK
if (llfeedback) {
llf_init();
}
#endif
/* Catch SIGHUP, SIGINT and SIGTERM type signals */
signal(SIGHUP, signal_handler);
signal(SIGINT, signal_handler);
signal(SIGTERM, signal_handler);
/* Only capture segmentation faults when we are not debugging... */
#ifndef DEBUG
signal(SIGSEGV, signal_handler);
#endif
/* Set sockets to watch... */
FD_ZERO(&readers);
for (i = 0; i < nr_callbacks; i++) {
FD_SET(callbacks[i].fd, &readers);
if (callbacks[i].fd >= nfds)
nfds = callbacks[i].fd + 1;
}
/* Set the wait on reboot timer... */
if (wait_on_reboot) {
timer_init(&worb_timer, wait_on_reboot_timeout, &wait_on_reboot);
timer_set_timeout(&worb_timer, DELETE_PERIOD);
alog(LOG_NOTICE, 0, __FUNCTION__,
"In wait on reboot for %d milliseconds. Disable with \"-D\".",
DELETE_PERIOD);
}
/* Schedule the first Hello */
if (!optimized_hellos && !llfeedback)
hello_start();
if (rt_log_interval)
log_rt_table_init();
while (1) {
memcpy((char *) &rfds, (char *) &readers, sizeof(rfds));
timeout = timer_age_queue();
if ((n = select(nfds, &rfds, NULL, NULL, timeout)) < 0) {
if (errno != EINTR)
alog(LOG_WARNING, errno, __FUNCTION__,
"Failed select (main loop)");
continue;
}
if (n > 0) {
for (i = 0; i < nr_callbacks; i++) {
if (FD_ISSET(callbacks[i].fd, &rfds)) {
/* We don't want any timer SIGALRM's while executing the
callback functions, therefore we block the timer... */
(*callbacks[i].func) (callbacks[i].fd);
}
}
}
} /* Main loop */
return 0;
}
| void remove_modules | ( | void | ) |
| int set_kernel_options | ( | ) |
Definition at line 131 of file main.c.
{
int i, fd = -1;
char on = '1';
char off = '0';
char command[64];
if ((fd = open("/proc/sys/net/ipv4/ip_forward", O_WRONLY)) < 0)
return -1;
if (write(fd, &on, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
if ((fd = open("/proc/sys/net/ipv4/route/max_delay", O_WRONLY)) < 0)
return -1;
if (write(fd, &off, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
if ((fd = open("/proc/sys/net/ipv4/route/min_delay", O_WRONLY)) < 0)
return -1;
if (write(fd, &off, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
/* Disable ICMP redirects on all interfaces: */
for (i = 0; i < MAX_NR_INTERFACES; i++) {
if (!DEV_NR(i).enabled)
continue;
memset(command, '\0', 64);
sprintf(command, "/proc/sys/net/ipv4/conf/%s/send_redirects",
DEV_NR(i).ifname);
if ((fd = open(command, O_WRONLY)) < 0)
return -1;
if (write(fd, &off, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
memset(command, '\0', 64);
sprintf(command, "/proc/sys/net/ipv4/conf/%s/accept_redirects",
DEV_NR(i).ifname);
if ((fd = open(command, O_WRONLY)) < 0)
return -1;
if (write(fd, &off, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
}
memset(command, '\0', 64);
sprintf(command, "/proc/sys/net/ipv4/conf/all/send_redirects");
if ((fd = open(command, O_WRONLY)) < 0)
return -1;
if (write(fd, &off, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
memset(command, '\0', 64);
sprintf(command, "/proc/sys/net/ipv4/conf/all/accept_redirects");
if ((fd = open(command, O_WRONLY)) < 0)
return -1;
if (write(fd, &off, sizeof(char)) < 0)
{
close(fd);
return -1;
}
close(fd);
return 0;
}
| void signal_handler | ( | int | type | ) |
| void usage | ( | int | status | ) |
Definition at line 97 of file main.c.
{
if (status != 0) {
fprintf(stderr, "Try `%s --help' for more information.\n", progname);
exit(status);
}
printf
("\nUsage: %s [-dghjlouwxLDRV] [-i if0,if1,..] [-r N] [-n N] [-q THR]\n\n"
"-d, --daemon Daemon mode, i.e. detach from the console.\n"
"-g, --force-gratuitous Force the gratuitous flag to be set on all RREQ's.\n"
"-h, --help This information.\n"
"-i, --interface Network interfaces to attach to. Defaults to first\n"
" wireless interface.\n"
"-j, --hello-jitter Toggle hello jittering (default ON).\n"
"-l, --log Log debug output to %s.\n"
"-o, --opt-hellos Send HELLOs only when forwarding data (experimental).\n"
"-r, --log-rt-table Log routing table to %s every N secs.\n"
"-n, --n-hellos Receive N hellos from host before treating as neighbor.\n"
"-u, --unidir-hack Detect and avoid unidirectional links (experimental).\n"
"-w, --gateway-mode Enable experimental Internet gateway support.\n"
"-x, --no-expanding-ring Disable expanding ring search for RREQs.\n"
"-D, --no-worb Disable 15 seconds wait on reboot delay.\n"
"-L, --local-repair Enable local repair.\n"
"-f, --llfeedback Enable link layer feedback.\n"
"-R, --rate-limit Toggle rate limiting of RREQs and RERRs (default ON).\n"
"-q, --quality-threshold Set a minimum signal quality threshold for control packets.\n"
"-V, --version Show version.\n\n"
"Erik Nordström, <erik.nordstrom@it.uu.se>\n\n",
progname, AODV_LOG_PATH, AODV_RT_LOG_PATH);
exit(status);
}
| int expanding_ring_search = 1 |
| int hello_jittering = 1 |
| int internet_gw_mode = 0 |
| int llfeedback = 0 |
| int local_repair = 0 |
| int log_to_file = 0 |
| struct option longopts[] |
{
{"interface", required_argument, NULL, 'i'},
{"hello-jitter", no_argument, NULL, 'j'},
{"log", no_argument, NULL, 'l'},
{"n-hellos", required_argument, NULL, 'n'},
{"daemon", no_argument, NULL, 'd'},
{"force-gratuitous", no_argument, NULL, 'g'},
{"opt-hellos", no_argument, NULL, 'o'},
{"quality-threshold", required_argument, NULL, 'q'},
{"log-rt-table", required_argument, NULL, 'r'},
{"unidir_hack", no_argument, NULL, 'u'},
{"gateway-mode", no_argument, NULL, 'w'},
{"help", no_argument, NULL, 'h'},
{"no-expanding-ring", no_argument, NULL, 'x'},
{"no-worb", no_argument, NULL, 'D'},
{"local-repair", no_argument, NULL, 'L'},
{"rate-limit", no_argument, NULL, 'R'},
{"version", no_argument, NULL, 'V'},
{"llfeedback", no_argument, NULL, 'f'},
{0}
}
| int optimized_hellos = 0 |
| int qual_threshold = 0 |
| int receive_n_hellos = 0 |
| int rreq_gratuitous = 0 |
| int rt_log_interval = 0 |
| int ttl_start = TTL_START_HELLO |
| int unidir_hack = 0 |
| int wait_on_reboot = 1 |
| struct timer worb_timer |