|
NETWORK ATTACKS FRAMEWORK
1.0.0
A NETwork Attacks framework. Making network attacks impact evaluation easier!
|
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/time.h>#include <unistd.h>#include <errno.h>#include <sys/types.h>#include <sys/socket.h>#include <asm/types.h>#include <linux/netlink.h>#include <sys/select.h>#include <netinet/in.h>#include <arpa/inet.h>#include <linux/rtnetlink.h>#include "defs.h"#include "lnx/kaodv-netlink.h"#include "debug.h"#include "NA_aodv_rreq.h"#include "NA_aodv_timeout.h"#include "NA_routing_table.h"#include "NA_aodv_hello.h"#include "NA_params.h"#include "NA_aodv_socket.h"#include "NA_aodv_rerr.h"Go to the source code of this file.
Classes | |
| struct | nlsock |
Defines | |
| #define | BUFLEN 256 |
| #define | ATTR_BUFLEN 512 |
Functions | |
| void | nl_init (void) |
| void | nl_cleanup (void) |
| int | prefix_length (int family, void *nm) |
| int | addattr (struct nlmsghdr *n, int type, void *data, int alen) |
| int | nl_send (struct nlsock *nl, struct nlmsghdr *n) |
| int | nl_kern_route (int action, int flags, int family, int index, struct in_addr *dst, struct in_addr *gw, struct in_addr *nm, int metric) |
| int | nl_send_add_route_msg (struct in_addr dest, struct in_addr next_hop, int metric, u_int32_t lifetime, int rt_flags, int ifindex) |
| int | nl_send_no_route_found_msg (struct in_addr dest) |
| int | nl_send_del_route_msg (struct in_addr dest, struct in_addr next_hop, int metric) |
| int | nl_send_conf_msg (void) |
Variables | |
| struct sockaddr_nl | peer = { AF_NETLINK, 0, 0, 0 } |
| struct nlsock | aodvnl |
| struct nlsock | rtnl |
| int | llfeedback |
| int | active_route_timeout |
| int | qual_threshold |
| int | internet_gw_mode |
| int | wait_on_reboot |
| struct timer | worb_timer |
| #define ATTR_BUFLEN 512 |
| int addattr | ( | struct nlmsghdr * | n, |
| int | type, | ||
| void * | data, | ||
| int | alen | ||
| ) |
| void nl_cleanup | ( | void | ) |
| void nl_init | ( | void | ) |
Definition at line 73 of file NA_nl.c.
{
int status;
unsigned int addrlen;
memset(&peer, 0, sizeof(struct sockaddr_nl));
peer.nl_family = AF_NETLINK;
peer.nl_pid = 0;
peer.nl_groups = 0;
memset(&aodvnl, 0, sizeof(struct nlsock));
aodvnl.seq = 0;
aodvnl.local.nl_family = AF_NETLINK;
aodvnl.local.nl_groups = AODVGRP_NOTIFY;
aodvnl.local.nl_pid = getpid();
/* This is the AODV specific socket to communicate with the
AODV kernel module */
aodvnl.sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_AODV);
if (aodvnl.sock < 0) {
perror("Unable to create AODV netlink socket");
exit(-1);
}
status = bind(aodvnl.sock, (struct sockaddr *) &aodvnl.local,
sizeof(aodvnl.local));
if (status == -1) {
perror("Bind for AODV netlink socket failed");
exit(-1);
}
addrlen = sizeof(aodvnl.local);
if (getsockname
(aodvnl.sock, (struct sockaddr *) &aodvnl.local, &addrlen) < 0) {
perror("Getsockname failed ");
exit(-1);
}
if (attach_callback_func(aodvnl.sock, nl_kaodv_callback) < 0) {
alog(LOG_ERR, 0, __FUNCTION__, "Could not attach callback.");
}
/* This socket is the generic routing socket for adding and
removing kernel routing table entries */
memset(&rtnl, 0, sizeof(struct nlsock));
rtnl.seq = 0;
rtnl.local.nl_family = AF_NETLINK;
rtnl.local.nl_groups =
RTMGRP_NOTIFY | RTMGRP_IPV4_IFADDR | RTMGRP_IPV4_ROUTE;
rtnl.local.nl_pid = getpid();
rtnl.sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
if (rtnl.sock < 0) {
perror("Unable to create RT netlink socket");
exit(-1);
}
addrlen = sizeof(rtnl.local);
status = bind(rtnl.sock, (struct sockaddr *) &rtnl.local, addrlen);
if (status == -1) {
perror("Bind for RT netlink socket failed");
exit(-1);
}
if (getsockname(rtnl.sock, (struct sockaddr *) &rtnl.local, &addrlen) <
0) {
perror("Getsockname failed ");
exit(-1);
}
if (attach_callback_func(rtnl.sock, nl_rt_callback) < 0) {
alog(LOG_ERR, 0, __FUNCTION__, "Could not attach callback.");
}
}
| int nl_kern_route | ( | int | action, |
| int | flags, | ||
| int | family, | ||
| int | index, | ||
| struct in_addr * | dst, | ||
| struct in_addr * | gw, | ||
| struct in_addr * | nm, | ||
| int | metric | ||
| ) |
Definition at line 441 of file NA_nl.c.
{
struct {
struct nlmsghdr nlh;
struct rtmsg rtm;
char attrbuf[1024];
} req;
if (!dst || !gw)
return -1;
req.nlh.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
req.nlh.nlmsg_type = action;
req.nlh.nlmsg_flags = NLM_F_REQUEST | flags;
req.nlh.nlmsg_pid = 0;
req.rtm.rtm_family = family;
if (!nm)
req.rtm.rtm_dst_len = sizeof(struct in_addr) * 8;
else
req.rtm.rtm_dst_len = prefix_length(AF_INET, nm);
req.rtm.rtm_src_len = 0;
req.rtm.rtm_tos = 0;
req.rtm.rtm_table = RT_TABLE_MAIN;
req.rtm.rtm_protocol = 100;
req.rtm.rtm_scope = RT_SCOPE_LINK;
req.rtm.rtm_type = RTN_UNICAST;
req.rtm.rtm_flags = 0;
addattr(&req.nlh, RTA_DST, dst, sizeof(struct in_addr));
if (memcmp(dst, gw, sizeof(struct in_addr)) != 0) {
req.rtm.rtm_scope = RT_SCOPE_UNIVERSE;
addattr(&req.nlh, RTA_GATEWAY, gw, sizeof(struct in_addr));
}
if (index > 0)
addattr(&req.nlh, RTA_OIF, &index, sizeof(index));
addattr(&req.nlh, RTA_PRIORITY, &metric, sizeof(metric));
return nl_send(&rtnl, &req.nlh);
}
Definition at line 412 of file NA_nl.c.
{
int res;
struct iovec iov = { (void *) n, n->nlmsg_len };
struct msghdr msg =
{ (void *) &peer, sizeof(peer), &iov, 1, NULL, 0, 0 };
// int flags = 0;
if (!nl)
return -1;
n->nlmsg_seq = ++nl->seq;
n->nlmsg_pid = nl->local.nl_pid;
/* Request an acknowledgement by setting NLM_F_ACK */
n->nlmsg_flags |= NLM_F_ACK;
/* Send message to netlink interface. */
res = sendmsg(nl->sock, &msg, 0);
if (res < 0) {
fprintf(stderr, "error: %s\n", strerror(errno));
return -1;
}
return 0;
}
| int nl_send_add_route_msg | ( | struct in_addr | dest, |
| struct in_addr | next_hop, | ||
| int | metric, | ||
| u_int32_t | lifetime, | ||
| int | rt_flags, | ||
| int | ifindex | ||
| ) |
Definition at line 489 of file NA_nl.c.
{
struct {
struct nlmsghdr n;
struct kaodv_rt_msg m;
} areq;
DEBUG(LOG_DEBUG, 0, "ADD/UPDATE: %s:%s ifindex=%d",
ip_to_str(dest), ip_to_str(next_hop), ifindex);
memset(&areq, 0, sizeof(areq));
areq.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct kaodv_rt_msg));
areq.n.nlmsg_type = KAODVM_ADDROUTE;
areq.n.nlmsg_flags = NLM_F_REQUEST;
areq.m.dst = dest.s_addr;
areq.m.nhop = next_hop.s_addr;
areq.m.time = lifetime;
areq.m.ifindex = ifindex;
if (rt_flags & RT_INET_DEST) {
areq.m.flags |= KAODV_RT_GW_ENCAP;
}
if (rt_flags & RT_REPAIR)
areq.m.flags |= KAODV_RT_REPAIR;
if (nl_send(&aodvnl, &areq.n) < 0) {
DEBUG(LOG_DEBUG, 0, "Failed to send netlink message");
return -1;
}
#ifdef DEBUG_NETLINK
DEBUG(LOG_DEBUG, 0, "Sending add route");
#endif
return nl_kern_route(RTM_NEWROUTE, NLM_F_CREATE,
AF_INET, ifindex, &dest, &next_hop, NULL, metric);
}
| int nl_send_conf_msg | ( | void | ) |
Definition at line 583 of file NA_nl.c.
{
struct {
struct nlmsghdr n;
kaodv_conf_msg_t cm;
} areq;
memset(&areq, 0, sizeof(areq));
areq.n.nlmsg_len = NLMSG_LENGTH(sizeof(kaodv_conf_msg_t));
areq.n.nlmsg_type = KAODVM_CONFIG;
areq.n.nlmsg_flags = NLM_F_REQUEST;
areq.cm.qual_th = qual_threshold;
areq.cm.active_route_timeout = active_route_timeout;
areq.cm.is_gateway = internet_gw_mode;
#ifdef DEBUG_NETLINK
DEBUG(LOG_DEBUG, 0, "Sending aodv conf msg");
#endif
return nl_send(&aodvnl, &areq.n);
}
| int nl_send_del_route_msg | ( | struct in_addr | dest, |
| struct in_addr | next_hop, | ||
| int | metric | ||
| ) |
Definition at line 551 of file NA_nl.c.
{
int index = -1;
struct {
struct nlmsghdr n;
struct kaodv_rt_msg m;
} areq;
DEBUG(LOG_DEBUG, 0, "Send DEL_ROUTE to kernel: %s", ip_to_str(dest));
memset(&areq, 0, sizeof(areq));
areq.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct kaodv_rt_msg));
areq.n.nlmsg_type = KAODVM_DELROUTE;
areq.n.nlmsg_flags = NLM_F_REQUEST;
areq.m.dst = dest.s_addr;
areq.m.nhop = next_hop.s_addr;
areq.m.time = 0;
areq.m.flags = 0;
if (nl_send(&aodvnl, &areq.n) < 0) {
DEBUG(LOG_DEBUG, 0, "Failed to send netlink message");
return -1;
}
#ifdef DEBUG_NETLINK
DEBUG(LOG_DEBUG, 0, "Sending del route");
#endif
return nl_kern_route(RTM_DELROUTE, 0, AF_INET, index, &dest, &next_hop,
NULL, metric);
}
| int nl_send_no_route_found_msg | ( | struct in_addr | dest | ) |
Definition at line 530 of file NA_nl.c.
{
struct {
struct nlmsghdr n;
kaodv_rt_msg_t m;
} areq;
memset(&areq, 0, sizeof(areq));
areq.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct kaodv_rt_msg));
areq.n.nlmsg_type = KAODVM_NOROUTE_FOUND;
areq.n.nlmsg_flags = NLM_F_REQUEST;
areq.m.dst = dest.s_addr;
DEBUG(LOG_DEBUG, 0, "Send NOROUTE_FOUND to kernel: %s",
ip_to_str(dest));
return nl_send(&aodvnl, &areq.n);
}
| int prefix_length | ( | int | family, |
| void * | nm | ||
| ) |
| int internet_gw_mode |
| int llfeedback |
| int qual_threshold |
| int wait_on_reboot |
| struct timer worb_timer |