
IPv6攻撃ツールキット
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
Licensed under AGPLv3 (see LICENSE file)
このコードは、私がIPv6に触れ、その知識を深めるにつれて、その周辺で遊ぶ(読む:「ハックする」)ツールが全く見つからなかったことから生まれました。最初はlibnetを使って実装しようと試みましたが、IPv6の実装が部分的でしかなく、しかも質が悪いことがわかりました。不足しているコードを追加しようとしましたが、なかなか容易ではなく、時間を節約して独自のライブラリを素早く作成することにしました。
このコードは現在、以下の環境でのみ動作します:
ツールをビルドするには、libpcap-dev がインストールされている必要があります。 さらに libssl-dev と libnetfilter-queue-dev も推奨されます。
これらは以下のコマンドでインストールできます(Kali、Debian、Ubuntu): sudo apt-get install libpcap-dev libssl-dev libnetfilter-queue-dev
ツールは以下を実行してビルドできます: make all
ツールと既存のマニュアルページは以下を実行してインストールできます: make install
THC IPV6 ATTACK TOOLKIT には、多数の効果的な攻撃ツールがすでに含まれています:
ツールをオプションなしで実行すると、ヘルプが表示され、コマンドラインオプションが示されます。
ライブラリ thc-ipv6-lib.c はすべてのツールの心臓部であり、あなたが書くかもしれないツールの基盤です。 実装は非常に単純で、通常は2〜4行で、任意の内容を持つ完全な IPv6/ICMPv6 パケットを作成できます。
使用する基本構造は (thc_ipv6_hdr *) 例: thc_ipv6_hdr *my_ipv6_packet; int my_ipv6_packet_len; であり、そのオプション/フィールドを操作する必要はありません。
IPv6 パケットを構築したいときは、次のように記述するだけです: my_ipv6_packet = thc_create_ipv6_extended(interface, prefer, &my_ipv6_packet_len, src6, dst6, ttl, length, label, class, version); 何かが失敗した場合、NULL を返します(my_ipv6_packet_len または dst6 が存在しないか、malloc が失敗した場合のみ)。 thc_create_ipv6_extended のオプションは以下の通りです: (char*) interface - パケットを送信するインターフェース (int) prefer - PREFER_LINK(リンクローカルアドレスを使用)、PREFER_HOST(ホスト IPv6 アドレスを使用)、PREFER_GLOBAL(パブリック(インターネット)IP6 アドレスを使用)(デフォルト) (int ) &my_ipv6_packet_len - 作成されるパケットのサイズ (unsigned char) src6 - 送信元 IP6(オプション:NULL の場合は自動選択) (unsigned char*) dst6 - 宛先 IP6(ネットワーク形式、16バイト長)。通常は thc_resolve6("ipv6.google.com"); の結果。 (int) ttl - パケットの TTL(オプション:0 の場合は 255 に設定) (int) length - ヘッダーに設定される長さ(オプション:0 の場合は実際の長さ) (int) label - フローラベル(0 で問題ありません) (int) class - パケットのクラス(0 で問題ありません) (int) version - IP6 バージョン(オプション:0 の場合はバージョン 6 に設定) エラー時には NULL を返し、成功時には malloc された構造体を返します。 使い終わったら free() してください。
これに拡張ヘッダーを追加できます: thc_add_hdr_route(my_ipv6_packet, &my_ipv6_packet_len, routers, routerptr); thc_add_hdr_fragment(my_ipv6_packet, &my_ipv6_packet_len, offset, more_frags, id); thc_add_hdr_dst(my_ipv6_packet, &my_ipv6_packet_len, buf, buflen); thc_add_hdr_hopbyhop(my_ipv6_packet, &my_ipv6_packet_len, buf, buflen); thc_add_hdr_nonxt(my_ipv6_packet, &my_ipv6_packet_len, hdropt); thc_add_hdr_misc(my_ipv6_packet, &my_ipv6_packet_len, type, len, buf, buflen); 各関数の説明: _route: ルーティング転送ヘッダーを追加します(IPソースルーティングと同様) (int) routers - routerptr 内のルーターの数 (char**) routerptr - ネットワーク形式のルーター宛先を持つ char[routers + 1] 構造体。例として alive6.c を参照してください。 _fragment: フラグメントヘッダーを追加します (int) offset - データが書き込まれるオフセット(注:ここではバイト単位でオフセット位置を指定します。8オクテット単位ではありません) (int) more_frags - 最後のフラグメントの場合は 0、それ以外の場合は 1 (int) id - パケットの ID(すべてのフラグメントで同一) _dst: 宛先オプションヘッダーを追加します (char) buf - 文字バッファ。このバッファは自分で管理する必要があります。 (int) buflen - buf の長さ _hopbyhop: ホップバイホップオプションヘッダーを追加します (char*) buf - 文字バッファ。このバッファは自分で管理する必要があります。 (int) buflen - buf の長さ _nonxt: 後続のヘッダーが一切ないことを指定します (int) hdropt - このオプションは現在無視されています _misc: その他のヘッダーを指定します。無効または存在しない拡張ヘッダーを設計したい場合に使用します。 (int) type - ヘッダーのタイプ ID (int) len - ヘッダーの長さとして通知する値(オプション:-1 の場合は正しい値に設定) (char*) buf - 文字バッファ。このバッファは自分で管理する必要があります。 (int) buflen - buf の長さ これらの関数は成功時に (int) 0 を、エラー時に -1 を返します。
最後に、ストリームまたはデータグラムヘッダーを追加できます。 thc_add_icmp6(my_ipv6_packet, &my_ipv6_packet_len, type, code, flags, buf, buflen, checksum); thc_add_tcp(my_ipv6_packet, &my_ipv6_packet_len, source_port, destination_port, sequence_number, ack_number, flags, window_size urgent_pointer, options, optione_length, data, data_length); thc_add_udp(my_ipv6_packet, &my_ipv6_packet_len, source_port, destination_port, checksum, data, data_length); thc_add_data6(my_ipv6_packet, &my_ipv6_packet_len, type, buf, buflen); _icmp6: ICMP6 パケットヘッダーを追加します (int) type: ICMP6 タイプ (int) code: ICMP6 コード (int) flags: ICMP6 フラグ (char*) buf - 文字バッファ。このバッファは自分で管理する必要があります。 (int) buflen - buf の長さ _tcp|_udp: TCP または UDP ヘッダーを追加します (ushort) source_port: 送信元ポート (ushort) destination_port: 宛先ポート (uint) sequence_number: TCP シーケンス番号 (uint) ack_number: TCP 確認応答番号 (ushort) checksum: UDP チェックサム、0 の場合はチェックサムを生成(TCP のチェックサムは常に計算されます) (uchar) flags: TCP フラグ: TCP_SYN、TCP_ACK、TCP_FIN、TCP_RST、TCP_PSH、... (uint) window_size: TCP ウィンドウサイズ (uint) urgent_pointer: TCP 緊急ポインタ(通常は 0) (char*) options: TCP オプションバッファ、NULL 可 (uint) options_length: TCP オプションバッファの長さ (char*) data: プロトコルが運ぶデータ (uint) data_length: データバッファの長さ _data6: その他のヘッダーを追加します (int) type: プロトコル ID (char*) buf - 文字バッファ。このバッファは自分で管理する必要があります。 (int) buflen - buf の長さ これらの関数は成功時に (int) 0 を、エラー時に -1 を返します。
完了したら、パケットを作成して送信します。 thc_generate_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len); thc_send_pkt(interface, my_ipv6_packet, &my_ipv6_packet_len); または、1つの関数にまとめます: thc_generate_and_send_pkt(interface, srcmac, dstmac, my_ipv6_packet, &my_ipv6_packet_len);
thc_generate_and_send_pkt: 実際の最終的な IPv6 パケットを生成し、送信します。 (char*) interface - パケットを送信するインターフェース (unsigned char*) srcmac - 使用する送信元 MAC(ネットワーク形式)(オプション:NULL の場合は実際の MAC が使用されます) (unsigned char*) dstmac - 使用する宛先 MAC(ネットワーク形式)(オプション:NULL の場合は実際の MAC が検索されます) thc_generate_pkt と thc_send_pkt を組み合わせると、同じ機能を提供します。 通常は、次のようなことを行う場合にのみ使用します: thc_generate_pkt(...); while(1) thc_send_pkt(...); これらの関数は成功時に (int) 0 を、エラー時に -1 を返します。
使用後は、以下でメモリを解放します: thc_destroy_packet(my_ipv6_packet);
必要になる重要なヘルパー関数がいくつかあります: thc_resolve6(destinationstring); IPv6 アドレスまたは DNS 名を IPv6 ネットワークアドレスに解決します。 thc_create_ipv6_extended() の dst6 に使用します。結果は不要になったら free() する必要があります。 thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); この巧妙な関数は、送信元と宛先のアドレスを入れ替え、ICMP ヘッダータイプを交換し(ECHO REQUEST -> ECHO REPLY など)、チェックサムを再計算します。これが何に役立つか思いつかないなら、Xbox で遊んでください :-)