
Pig (والتي يمكن فهمها على أنها Packet intruder generator) هي أداة لصياغة الحزم تعمل على Linux.
يمكنك استخدام Pig لاختبار أنظمة IDS/IPS الخاصة بك إلى جانب أشياء أخرى.
يجلب Pig مجموعة من توقيعات الهجوم المعروفة جاهزة للاستخدام ويمكنك توسيع هذه المجموعة بأشياء أكثر تحديدًا وفقًا لمتطلباتك.
حتى الآن، يمكن إنشاء توقيعات IPv4 مع طبقة نقل تعتمد على TCP و UDP و ICMP. يمكنك أيضًا إنشاء توقيعات بناءً على بروتوكول ARP، بالإضافة إلى بناء الحزمة بدءًا من إطار Ethernet الخاص بها.
إذا وصلت إلى هنا من خلال مقالتي في 2600 من عدد SPRING 2016 العدد فاستمر في قراءة أقسام التوثيق التالية لأن هذا Pig الصغير قد تطور منذ ذلك الحين.
الأمر بسيط جدًا:
[email protected]:~/src# git clone https://github.com/rafael-santiago/pig pig
[email protected]:~/src# cd pig
[email protected]:~/src/pig# git submodule update --init
تحتاج إلى استخدام Hefesto لبناء pig. بعد اتباع الخطوات لتشغيل Hefesto على نظامك. انتقل إلى الدليل الفرعي pig المسمى src وقم بتشغيل الأمر التالي:
[email protected]:~/src/pig/src# hefesto
بعد هذا الأمر، يجب أن تجد الملف الثنائي pig ضمن المسار src/bin. يمكنك استخدام الملف الثنائي نسبيًا من src/bin أو تثبيته.
إذا كنت تواجه مشاكل في البناء لسبب ما، فيجب عليك محاولة قراءة بعض الملاحظات الموجودة في BUILD.md.
للتثبيت، يجب أن تكون داخل الدليل الفرعي src واستدعاء:
[email protected]:~/src/pig/src# hefesto --install
لإلغاء التثبيت، كونك داخل الدليل الفرعي src يجب عليك استدعاء:
[email protected]:~/src/pig/src# hefesto --uninstall
ملفات Pigsty هي ملفات نصية عادية يمكنك من خلالها تحديد مجموعة من توقيعات الحزم. هناك بناء جملة محدد يجب اتباعه. انظر إلى مثال لملف pigsty:
[ signature = "Hello",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 192.30.70.10,
ip.dst = 192.30.70.3,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Hello!!" ]
بشكل أساسي، يجب أن تكون جميع بيانات التوقيع بين قوسين مربعين: [ ... ].
داخل هذه المنطقة، يتم توفير المعلومة بواسطة المخطط field = data.
إذا كانت لديك بعض الخبرة في شبكات الحاسوب، فبالتأكيد أن غالبية الحقول المدرجة في الجدول 1 لها معنى قوي بالنسبة لك. يجب عليك استخدام هذه الحقول لإنشاء توقيعاتك المستقبلية.
الجدول 1: حقول توقيع pig.
عند إنشاء توقيع، لا تحتاج إلى تحديد جميع البيانات. إذا قمت بتحديد الأجزاء الأكثر صلة فقط من الحزمة، فسيتم ملء الأجزاء المتبقية بقيم افتراضية. يتم دائمًا إعادة حساب المجاميع الاختبارية.
نصيحة: ألقِ نظرة على الدليل الفرعي pigsty. ستجد الكثير من ملفات التوقيع وسترى أنه من السهل جدًا تعريف ملفات جديدة.
نعم، هذا ممكن. لاستخدام هذه الميزة، تحتاج فقط إلى تحديد القيم المدرجة في الجدول 2 في حقول من نوع ip adddress.
الجدول 2: عناوين IP حسب المنطقة الجغرافية.
| القيمة المراد استخدامها |
|---|
يجب عليك في أي حقل من نوع ip address استخدام user-defined-ip كقيمة. لاحظ أنك تحتاج إلى استخدام خيار سطر الأوامر --targets في هذه الحالة. راجع قسم استخدام pig لمزيد من المعلومات.
إذا قمت بإنشاء ملفات pigsty التي ترى أنها ذات صلة تتجاوز بيئتك الخاصة، فافتح طلب سحب (pull request) لتضمين هذه الملفات المفيدة هنا. شكرًا لك مقدمًا!
استخدام Pig بسيط جدًا حيث يلزم توفير أربعة خيارات أساسية وهي:
--signatures--gateway--net-mask--lo-ifaceهل تريد معرفة المزيد عن كل خيار، هاه؟... إذن هيا بنا:
--signatures يستقبل قائمة بمسارات الملفات إلى ملفات pigsty.--gateway هو المكان الذي تحدده لعنوان البوابة. كن على علم بأن pig يقوم بإنشاء أو على الأقل محاولة إنشاء إطارات الإيثرنت أيضًا. ولهذا، فإن عنوان البوابة مهم جدًا لتكوين بيانات الطبقة 1 بشكل صحيح.--net-mask يتعلق بقضايا التوجيه ويجب أن يستقبل قناع الشبكة الخاص بك.--lo-iface هو المكان الذي يجب أن تخبر فيه باسم واجهة الشبكة المحلية التي ستستخدمها "لتصريف" الحزم المُنشأة.--no-gateway يشير إلى أنه لن يتم إرسال أي حزمة خارج الشبكة.بافتراض أننا نريد توليد حركة مرور تعتمد على DDos:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0 --lo-iface=eth0
الآن نريد العبث بكل شيء:
[email protected]:~# pig --signatures=pigsty/ddos.pigsty,pigsty/attackresponses.pigsty,\
> pigsty/badtraffic.pigsty,pigsty/backdoors.pigsty\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
لذلك استخدم الخيار --timeout=<millisecs>
استخدم الخيار --no-echo.
استخدم الخيار --targets. يمكنك تحديد قائمة بناءً على عناوين IP محددة، وأقنعة IP، و CIDRs.
انظر هذا:
[email protected]:~# pig --signatures=pigsty/local-mess.pigsty\
> --targets=192.30.70.3,192.30.70.*,192.30.70.0/9\
> --gateway=10.0.2.2\
> --net-mask=255.255.255.0\
> --lo-iface=eth0
هذا مفيد عندما لا ترسل التوقيعات المحملة بيانات خارج الشبكة الحالية. لتحديد ذلك، تحتاج إلى استخدام الخيار --no-gateway. عند استخدام الخيار --no-gateway، لا تحتاج إلى تحديد عنوان البوابة لأن الحزم لن تتدفق خارج القطاع الحالي. ونتيجة لذلك، يصبح إعلام قناع الشبكة غير ذي صلة أيضًا.
على سبيل المثال:
[email protected]:~# pig --signatures=pigsty/local_traffic.pigsty --no-gateway --lo-iface=eth2
في المثال أعلاه، لن يكون إطار الإيثرنت مسؤولية pig بعد الآن. لهذا السبب، لن يشتكي pig من غياب خيار --gateway و --net-mask.
الخيار --no-gateway مفيد جدًا في الحالات التي تحتاج فيها إلى توليد حركة مرور ARP. ألقِ نظرة على هذا المستند الآخر الذي يشرح كيفية تنفيذ انتحال ARP باستخدام pig.
ربما تحتاج إلى إرسال توقيع واحد فقط ثم العودة للمتصل للتحقق مما حدث بعد ذلك. هذا النوع من المتطلبات شائع عند استخدام هذا التطبيق كدعم لـ اختبارات النظام أو اختبارات الوحدة. لذلك، إذا كنت بحاجة إلى القيام بذلك، فيجب عليك محاولة استخدام الخيار --single-test:
[email protected]:~# pig --signature=pigsty/syn-scan.pigsty --targets=127.0.0.1 --single-test\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
بعد تشغيل هذا الأمر، سيختار pig توقيعًا واحدًا فقط من ملف syn-scan.pigsty ويحاول إرساله ثم يخرج. في حالة حدوث خطأ أثناء العملية، سيخرج pig برمز خروج يساوي 1، وإلا سيخرج pig برمز خروج يساوي 0.
وضع التشغيل الأساسي لـ pig هو عبارة عن حلقة لا نهائية تقذف أطنانًا من الحزم إلى الشبكة مع احترام مهلة زمنية محددة مسبقًا.
يمكنك تحديد كيفية تنقل pig بين الحزم المحملة لإرسالها باستخدام الخيار --loop=<mode>. حتى الآن، هناك وضعان: random (الوضع الافتراضي) و sequential.
الوضع sequential سيعيد تكرار التوقيعات عندما يصل إلى نهاية قائمة توقيعات الحزم المحملة.
المهام الفرعية هي مهام صغيرة مفيدة تتعلق بصياغة الحزم، وهي مدمجة في pig لمساعدتك في جلسة الصياغة الخاصة بك. يمكن الوصول إلى هذه المهام باستخدام الخيار --sub-task=<task-name>.
نظرًا لكونها عمليًا برامج فرعية، فإن للمهام الفرعية خصائصها الخاصة، ولهذا السبب تتبع التفاصيل الخاصة بها في دليلها الخاص. ألقِ نظرة على الجدول 3 لمتابعتها.
الجدول 3: المهام الفرعية لـ pig.
حتى الآن، يمكنك بناء حزم تعتمد على IPv4 مع UDP أو TCP في طبقة النقل الخاصة بها. يمكنك أيضًا بناء حزم ARP.
ومع ذلك، لا يزال بإمكانك بناء الحزم بدءًا من إطار Ethernet. الشيء الجميل في ذلك هو إمكانية بناء أي شيء فوق حمولة Ethernet افتراضيًا.
على سبيل المثال، على الرغم من أن pig حتى الآن لا يقدم دعمًا لبناء IPv6 المطبوخ، إلا أنه لا يزال بإمكانك بناؤه باستخدام pigsty خام يعتمد على Ethernet. انظر:
[ eth.hwdst = "5C:AC:4C:AA:F5:B5",
eth.hwsrc = "08:95:2A:AD:D6:4F",
eth.type = 0x86DD,
eth.payload = "\x60\x00\x00\x00\x00\x20\x3a\xff\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\xfe\x80\x00\x00\x00\x00\x00\x00\x55\x51\x00\xc2\x18\x0f\xdb\x46\x88\x00\x32\x01\xe0\x00\x00\x00\xfe\x80\x00\x00\x00\x00\x00\x00\x0a\x95\x2a\xff\xfe\xad\xd6\x4f\x02\x01\x08\x95\x2a\xad\xd6\x4f",
signature = "IPv6 from Sparta" ]
مع الأخذ في الاعتبار أن تضمين عنواني MAC الوجهة والمصدر داخل "pigsty إيثرنت" اختياري، يمكننا إنجاز المهمة حتى بدون استخدام أي حقل إضافي.
هذا جيد عندما تحتاج إلى اختبار بروتوكولات جديدة على بيئتك من بين أشياء أخرى ممتعة وشاذة. بهذه الطريقة الخام، يمكن أن يظل pig مفيدًا لك.
احفظ البيانات التالية كملف "oink.pigsty":
[ signature = "oink",
ip.version = 4,
ip.ihl = 5,
ip.tos = 0,
ip.src = 127.0.0.1,
ip.dst = user-defined-ip,
ip.protocol = 17,
udp.dst = 1008,
udp.src = 32000,
udp.payload = "Oink!!\n" ]
على محطة طرفية أخرى tty، شغل netcat في وضع UDP للاستماع على المنفذ 1008:
[email protected]:~# nc -u -l -p 1008
الآن شغل pig باستخدام ملف "oink.pigsty"، مع تحديد الهدف كـ loopback:
[email protected]:~# pig --signatures=oink.pigsty --targets=127.0.0.1\
> --gateway=10.0.2.2 --net-mask=255.255.255.0 --lo-iface=eth0
يجب أن يبدأ netcat في استقبال عدة oinks و... نعم، تهانينا!! أصبح pig قيد التشغيل على نظامك! ;)
حاول تجسس شبكتك للحصول على مزيد من المعلومات حول حزم UDP هذه التي تتدفق عبر واجهاتك...
استمتع!
| الحقل | يدل على | البروتوكول | نوع البيانات | تعريف عينة |
|---|
signature | اسم التوقيع | - | سلسلة نصية | signature = "Udp flood" |
eth.hwdst | عنوان MAC الوجهة للإيثرنت | Ethernet | MAC | eth.hwdst = "00:de:ad:be:ef:00" |
eth.hwsrc | عنوان MAC المصدر للإيثرنت | Ethernet | MAC | eth.hwsrc = "00:de:ad:be:ef:00" |
eth.type | نوع الإيثر | Ethernet | رقم | eth.type = 0x0800 |
eth.payload | حمولة الإيثرنت | Ethernet | سلسلة نصية | eth.payload = "f\x00ob\x04r" |
ip.version | إصدار IP | IP | رقم | ip.version = 4 |
ip.ihl | طول رأس الإنترنت | IP | رقم | ip.ihl = 5 |
ip.tos | نوع الخدمة | IP | رقم | ip.tos = 0 |
ip.tlen | الطول الكلي | IP | رقم | ip.tlen = 20 |
ip.id | معرف الحزمة | IP | رقم | ip.id = 0xbeef |
ip.flags | أعلام IP | IP | رقم | ip.flags = 4 |
ip.offset | إزاحة التجزئة | IP | رقم | ip.offset = 0 |
ip.ttl | زمن البقاء | IP | رقم | ip.ttl = 64 |
ip.protocol | البروتوكول | IP | رقم | ip.protocol = 6 |
ip.checksum | المجموع الاختباري | IP | رقم | ip.checksum = 0 |
ip.src | عنوان المصدر | IP | عنوان IP | ip.src = 192.30.70.3 |
ip.dst | عنوان الوجهة | IP | عنوان IP | ip.dst = 192.30.70.3 |
ip.payload | حمولة IP الخام | IP | سلسلة نصية | ip.payload = "\x01\x02" |
tcp.src | منفذ المصدر | TCP | رقم | tcp.src = 80 |
tcp.dst | منفذ الوجهة | TCP | رقم | tcp.dst = 21 |
tcp.seqno | رقم التسلسل | TCP | رقم | tcp.seqno = 10202 |
tcp.ackno | رقم الإقرار | TCP | رقم | tcp.ackno = 10200 |
tcp.size | طول TCP | TCP | رقم | tcp.size = 4 |
tcp.reserv | حقل احتياطي TCP | TCP | رقم | tcp.reserv = 0 |
tcp.urg | علم الاستعجال TCP | TCP | بت | tcp.urg = 0 |
tcp.ack | علم الإقرار TCP | TCP | بت | tcp.ack = 1 |
tcp.psh | علم الدفع TCP | TCP | بت | tcp.psh = 0 |
tcp.rst | علم إعادة التعيين TCP | TCP | بت | tcp.rst = 0 |
tcp.syn | علم المزامنة TCP | TCP | بت | tcp.syn = 0 |
tcp.fin | علم النهاية TCP | TCP | بت | tcp.fin = 0 |
tcp.wsize | حجم نافذة TCP | TCP | رقم | tcp.wsize = 0 |
tcp.checksum | المجموع الاختباري | TCP | رقم | tcp.checksum = 0 |
tcp.urgp | مؤشر الاستعجال | TCP | رقم | tcp.urgp = 0 |
tcp.payload | الحمولة | TCP | سلسلة نصية | tcp.payload = "\x01abc" |
udp.src | منفذ المصدر | UDP | رقم | udp.src = 53 |
udp.dst | منفذ الوجهة | UDP | رقم | udp.dst = 7 |
udp.size | طول UDP | UDP | رقم | udp.size = 8 |
udp.checksum | المجموع الاختباري | UDP | رقم | udp.checksum = 0 |
udp.payload | الحمولة | UDP | رقم | udp.payload = "boo!" |
icmp.type | نوع ICMP | ICMP | رقم | icmp.type = 0 |
icmp.code | كود ICMP | ICMP | رقم | icmp.code = 0 |
icmp.checksum | المجموع الاختباري | ICMP | رقم | icmp.checksum = 0 |
icmp.payload | الحمولة | ICMP | سلسلة نصية | icmp.payload = "ping!" |
arp.hwtype | نوع الأجهزة ARP | ARP | رقم | arp.hwtype = 0x1 |
arp.ptype | نوع البروتوكول ARP | ARP | رقم | arp.ptype = 0x0800 |
arp.hwlen | طول الأجهزة ARP | ARP | رقم | arp.hwlen = 6 |
arp.opcode | كود العملية ARP | ARP | رقم | arp.opcode = 2 |
arp.hwsrc | عنوان الأجهزة المصدر ARP | ARP | MAC | arp.hwsrc = "de:ad:be:ef:0:0" |
arp.psrc | عنوان البروتوكول المصدر ARP | ARP | عنوان IP | arp.psrc = 192.30.70.3 |
arp.hwdst | عنوان الأجهزة الوجهة ARP | ARP | MAC | arp.hwdst = "de:ad:be:ef:0:0" |
arp.pdst | عنوان البروتوكول الوجهة ARP | ARP | عنوان IP | arp.pdst = 192.30.70.3 |
| يدل على |
|---|
north-american-ip | عناوين IP من أمريكا الشمالية |
south-american-ip | عناوين IP من أمريكا الجنوبية |
asian-ip | عناوين IP من آسيا |
european-ip | عناوين IP من أوروبا |
| المهمة الفرعية | ما الذي تقوم به؟ | الدليل |
|---|
pcap-import | يستورد حزمة من ملف PCAP إلى ملف pigsty | cat doc/pcap-import.md |
shell | ينفذ pig في وضع تفاعلي | cat doc/shell.md |