
مجموعة أدوات هجوم IPv6
THC-IPV6-ATTACK-TOOLKIT (c) 2005-2022 [email protected] https://github.com/vanhauser-thc/thc-ipv6
مرخص بموجب AGPLv3 (انظر ملف الترخيص)
تم إلهام هذا الكود عندما تعرفت على 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 مع الكثير من أدوات الهجوم الفعالة:
فقط قم بتشغيل الأدوات بدون خيارات وستعطيك المساعدة وتظهر خيارات سطر الأوامر.
المكتبة 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 عند الأخطاء أو هيكل malloced عند النجاح. حرره بـ 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 - الإزاحة التي يجب كتابة البيانات عندها (ملاحظة: ضع موقع الإزاحة بالبايت هنا، ليس بأوكتيت البايت) (int) more_frags - اضبط على 0 إذا كانت هذه هي التجزئة الأخيرة، 1 في جميع الأخرى (int) id - معرف للحزمة (نفسه لجميع التجزئات) _dst: أضف رأس خيارات الوجهة (char) buf - مخزن مؤقت char. يجب أن تتحكم في هذا المخزن بنفسك بما تريد كتابته فيه. (int) buflen - طول buf _hopbyhop: أضف رأس قفزة بقفزة (char*) buf - مخزن مؤقت char. يجب أن تتحكم في هذا المخزن بنفسك بما تريد كتابته فيه. (int) buflen - طول buf _nonxt: حدد أنه لن تكون هناك رؤوس تالية على الإطلاق (int) hdropt - هذا الخيار يتم تجاهله حاليًا _misc: حدد رأسًا متنوعًا. استخدم هذا إذا كنت تريد تصميم رأس تمديد غير صالح أو غير موجود. (int) type - معرف النوع لتحديد الرأس (int) len - الطول للإعلان عن الرأس (اختياري - -1 يضبط هذا على القيمة الصحيحة) (char*) buf - مخزن مؤقت char. يجب أن تتحكم في هذا المخزن بنفسك بما تريد كتابته فيه. (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 - مخزن مؤقت char. يجب أن تتحكم في هذا المخزن بنفسك بما تريد كتابته فيه. (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: معرف البروتوكول (char*) buf - مخزن مؤقت char. يجب أن تتحكم في هذا المخزن بنفسك بما تريد كتابته فيه. (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); أو مجمعة في دالة واحدة: 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 المصدر لاستخدامه (بتنسيق الشبكة) (اختياري، يستخدم mac الحقيقي إذا كان NULL) (unsigned char*) dstmac - عنوان mac الوجهة لاستخدامه (بتنسيق الشبكة) (اختياري، يتم البحث عن mac الحقيقي إذا كان NULL) وظائف 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. استخدم هذا لـ dst6 في thc_create_ipv6_extended(). يجب تحرير النتيجة بـ free عندما لا تعود بحاجة إليها. thc_inverse_packet(my_ipv6_packet, &my_ipv6_packet_len); تقوم هذه الوظيفة الذكية بتبديل عنوان المصدر والوجهة، وتتبادل نوع رأس ICMP (طلب صدى -> رد صدى إلخ) وتعيد حساب المجموع الاختباري. إذا لم تكن لديك فكرة عن ما قد يكون هذا مفيدًا له، اذهب والعب مع xbox الخاص بك :-)
إذا كنت تريد القيام بذلك بسرعة كبيرة، فهناك بعض وظائف منشئ ICMPv6 المحددة مسبقًا والتي ترسل حزم impc6 في سطر واحد فقط من الكود: thc_ping6(interface, src, dst, size, count); thc_neighboradv6(interface, src, dst, srcmac, dstmac, flags, target); thc_neighborsol6(interface, src, dst, target, srcmac, dstmac); thc_routeradv6(interface, src, dst, srcmac, default_ttl, managed, prefix, prefixlen, mtu, lifetime); thc_routersol6(interface, src, dst, srcmac, dstmac); thc_toobig6(interface, src, srcmac, dstmac, mtu, my_ipv6_packet, my_ipv6_packet_len); thc_paramprob6(interface, src, srcmac, dstmac, code, pointer, my_ipv6_packet, my_ipv6_packet_len); thc_unreach6(interface, src, srcmac, dstmac, icmpcode, my_ipv6_packet, my_ipv6_packet_len); thc_redir6(interface, src, srcmac, dstmac, newrouter, newroutermac, my_ipv6_packet, my_ipv6_packet_len); thc_send_as_fragment6(interface, src, dst, type, buf, buflen, frag_len); تقوم هذه بما تتوقعه منها، لذا أنا كسول^H^H^H^H^Hمشغول لوصفها بتفاصيل أكثر.
تخصص الوظائف التالية ذاكرة لمؤشر النتيجة، لذا تذكر تحرير مؤشرات النتيجة من هذه الوظائف بمجرد عدم حاجتك إليها بعد الآن: thc_ipv6_dummymac() thc_ipv62notation() thc_ipv62string() thc_string2ipv6() thc_string2notation() thc_resolve6() thc_get_own_ipv6() thc_get_own_mac() thc_get_multicast_mac() thc_get_mac() thc_lookup_ipv6_mac() thc_look_neighborcache() thc_generate_key() thc_generate_cga() thc_generate_rsa()
يساعد كثيرًا إذا ألقيت نظرة على أمثلة الاستخدام. أفضل الأمثلة هي الأدوات من حزمة thc-ipv6، خاصة implementation6.c و fake_*6.c - استمتع، وأعد إرسال الكود، حتى يتمكن المجتمع من البناء عليه.
يمكن اكتشاف معظم الأدوات بسهولة بواسطة نظام كشف التسلل (IDS) أو برنامج كشف متخصص. يتم ذلك عن قصد لتسهيل اكتشاف الاستخدام الضار. تحدد الأدوات إما توقيع حزمة ثابت، أو تقوم بالشم العام للحزم (على سبيل المثال، وبالتالي الرد أيضًا على طلبات جوار ICMPv6 التي يتم إرسالها إلى mac غير موجود، وبالتالي يسهل اكتشافها جدًا). إذا كنت لا تريد ذلك، قم بتغيير الكود.
أرسلها إلى vh (at) thc (dot) org (وأضف "antispam" إلى سطر الموضوع) أو قدم عبر github: https://github.com/vanhauser-thc/thc-ipv6
استمتع!