الأحد، 31 يوليو 2016

تعرف على مكتبة Scapy

مرحبا بالجميع في هذا الدليل الجد المتواضع حول مكتبة Scapy وهو دليل موجه للمبتدئين والذي لا علاقة لهم بهذا المكتبة لا من قريب ولا من بعيد لذلك لا داعي إلى القلق حول صعوية الدليل .
سنحناول جاهدين في الجزء الاول من هذا الدليل تعريف هذه المكتبة بالشكل البسيط ، من يقف وراءها ، تاريخها و .مجالات إستخدامها .
الفئة المستهدفة من هذا الدليل هم مهندسوا الشبكات و أمن المعلومات بالدرجة الأولى ولكن هذا لا يعني أن الفئات الأخرى ستكون مقصية بل على العكس الكل مرحب به
لماذا Scapy 
تعتبر مكتبة Scapy مكتبة تفاعلية قوية في مجالها وهو التعامل مع حزم الشبكات المختلفة حيث بإمكانها إعادة صياغة و فك شفرات الحزم لمجموعة واسعة من البروتوكولات المختلفة بعد ذلك تقوم بإرسالهم إلى الشبكة أو إلتقاطها ، القيام بعملية تطابق بين الطلبيات والردود والكثير من الأمور ، كما يمكن لهذه المكتبة القيام بمعظم عمليات الخاصة يالشبكات المختلفة مثل : المسح ، تتبع مسار الشبكة، فحص الوحدات، الهجوم أو إكتشاف الشبكات ،كما يمكن لها أن تقوم بما يقارب 85% من عمليات برنامج nmap،tcpdump والكثير من عمليات الهجوم المختلفة .
كما يمكن لهذه المكتبة القيام بعمليات محددة لا يمكن لمعظم البرامج القيام بها مثل : إرسال حزم غير صحيحة ، حقن الإيطار 802.11، فك تشفير voip على القنوات المشفرة ب WEP .
يبدوا أن الامر ممتع أليس كذلك ؟ لهذا قررت أن أكتب  دليل بسيط عن هذه المكتبة يكون مناسبا للمبتدئين يكون مرجع لي ولزوار الموقع المهتمين بتطوير برامج بهذه المكتبة الرائعة .
وقبل أن نبدأ أريد أن أعرج على أهم النقاط التي سنتناولها في هذا الدليل :
* تثبيت مكتبة سكابي (بالإضافة إلى ادوات أخرى مساعدة )
* إنشاء حزمة
* إرسال وإستقبال حزمة
* الأوامر اﻷساسية لمكتبة سكابي
* إلتقاط الحزمة المارة بالشبكة وتحليلها
* أمثلة متنوعة
أرجوا ان تكونو مستعدين للبدء في تثبيت مكتبة سكابي وإنشاء بعض الحزم .
تثبيت مكتبة سكابي 
سأتناول كيفية تثبيت سكابي على اوبنتو فقط وللإطلاع على كيفية تثبيتها على الأنظمة الاخرى يرجى زيارة الموقع التالي :
http://www.secdev.org/projects/scapy/doc/installation.html
ملاحظة : لمن يعمل على توزيعة كالي لينكس سيجد هذه المكتبة مثبتة مسبقا .
قد ترغب أيضا في تثبيت برنامج wireshark حتى نقوم بتحليل الحزم المنشأة (هذا الدليل لا يتضمن شرح wireshark)
الشرط الأساسي لتشغيل مكتبة سكابي هو :
* تثبيت نسخة بايثون 2.5
* تحميل وتثبيت مكتبة سكابي
* (إختياري) تثبيت بعض البرامج والأدوات المساعدة لتنفيذ بعض المزايا الجيدة
* تشغيل سكابي بصلاحيات الجذر
تثبيت بايثون 2.5
الوثائق الرسمية Scapy تنصح ببايثون 2.5 لتشغيل سكابي 2.x فأنا اعمل على بايثون 2.7 ولم تحدث معي أي مشاكل وإذا كنت تريد معرفة نسخة البايثون المثبتة على نظامك أكتب الامر التالي :
1
2
pyarab@ubuntu:~$ python -V
Python 2.7.3
وإذا كانت هناك نسخة أقل من 2.5 فأكتب الامر التالي لتثبيت بايثون :
1
pyarab@ubuntu:~$ sudo apt-get install python
تحميل وتثبيت Scapy
بمجرد حصولك على بايثون عليك الحصول علىscapy ولعمل ذلك توجد طريقتين ولكنني سأتكلم عن الطريقة التي إستخدمتها :
1
pyarab@ubuntu:~$ sudo apt-get install python-scapy
تثبيت برامج إضافية من أجل مميزات خاصة (إختياري )
بعد تثبيت مكتبة scapy يمكنك التأكد من نجاح العملية من خلال الأمر التالي :
1
2
3
4
5
6
7
8
pyarab@ubuntu:~$ sudo scapy
INFO: Can't import python gnuplot wrapper . Won't be able to plot.
INFO: Can't import PyX. Won't be able to use psdump() or pdfdump().
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
To exit out of Scapy, just type:
Welcome to Scapy (2.2.0)
>>> exit()
يمكنك الملاحظة أنه بمجرد تشغيلscapy قد تظهر بعض رسائل الأخطاء عن عدم وجود بعض المكونات ، مكتبةscapy يمكنها القيام بالعديد من الأمور المميزة منها توفير خرائط والرسوم البيانية ثلاثية الأبعاد ولكننا بحاجة إلى حزم إضافية لتوفير جميع تلك المميزات :
1
2
pyarab@ubuntu :~$ sudo apt-get install tcpdump graphviz imagemagick python-gnuplot python-
crypto python-pyx
تشغيل مكتبةscapy مع صلاحيات الجذر
هذه خطوة سهلة وربما قد تكون قد فعلتها :
1
~$ sudo scapy
وستكون النتيجة :
1
2
3
WARNING: No route found for IPv6 destination :: (no default route?)
Welcome to Scapy (2.2.0)
>>>
إلى هنا نكود قد إنتهينا من عملية تثبيت وتهيئة مكتبة scapy وسننتقل الان إلى ما هو أهم من هذه الخطوة وأي مشاكل تم مصادفتها في هذه الخطوة أرجوا إبلاغنا .
إنشاء حزمة
حان وقت الجد فدعونا نتلاعب قليلا ونقوم بإنشاء أول حزمة ، وربما تكون تتسأل الأن ألا يجب ان نتعرف علىscapy اولا ، ربما تكون على حق ولكن انا أرى أن التعلم يأتي بالعمل والتجريب وسأحاول ان أشرح كل مثال على حدى وكل ما صادفنا شيء جديد سنقوم بالتكلم عنه .
إذن الحزمة الأولى ستكون عبارة عن حزمة بروتوكول ICMP مع الرسالة المشهورة “مرحبا بالعالم ” .
ملاحظة : عنوان الانترنيت IP المستخدم في هذا الدرس ينتمي إلى الشبكة المحلية لذلك عليك أن تقوم بالتعديل مايناسب شبكك المحلية حتى تضمن وصول الحزمة إلى الجهاز المناسب.
1
2
3
4
5
Welcome to Scapy (2.2.0)
>>> send(IP(dst="192.168.1.100")/ICMP()/"HelloWorld")
.
Sent 1 packets.
>>>
دعونا الأن نقوم بشرح الامر السابق
  1. send هنا نقوم بإخبار Scapy أننا بصدد إرسال حزمة واحدة
  2. ip نوع الحزمة التي نريد وهذه الحالة نريد حزمة عنوان الأنترنيت
  3. (dst=”192.168.1.100”) عنوان المستقبل وفي حالتنا هو الراوتر
  4. /ICMP() تريد إنشاء حزمة icmp مع القيم الأفتراضية الخاصة ب Scapy
ويمكننا رؤية الحزمة المرسلة و الرد الخاص يها بواسطة برنامج  tcpdump
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
pyarab@ubuntu:~$ sudo tcpdump -i wlan0 -nnvvXSs 0 -c2 icmp
tcpdump: listening on wlan0, link-type EN10MB (Ethernet), capture size 65535 bytes
18:02:21.822237 IP (tos 0x0, ttl 64, id 1, offset 0, flags [none], proto ICMP (1), length 50)
192.168.1.100 > 192.168.1.1: ICMP echo request, id 0, seq 0, length 30
0x0000: 4500 0032 0001 0000 4001 f714 c0a8 0164 E..2....@......d
0x0010: c0a8 0101 0800 5834 0000 0000 5468 6973 ......X4....This
0x0020: 2069 7320 616e 2049 434d 5020 7061 636b .is.an.ICMP.pack
0x0030: 6574 et
18:02:21.823074 IP (tos 0x0, ttl 254, id 49099, offset 0, flags [none], proto ICMP (1), length 50)
192.168.1.1 > 192.168.1.100: ICMP echo reply, id 0, seq 0, length 30
0x0000: 4500 0032 bfcb 0000 fe01 7949 c0a8 0101 E..2......yI....
0x0010: c0a8 0164 0000 6034 0000 0000 5468 6973 ...d..`4....This
0x0020: 2069 7320 616e 2049 434d 5020 7061 636b .is.an.ICMP.pack
0x0030: 6574 et
2 packets captured
2 packets received by filter
0 packets dropped by kernel
من خلال برنامج tcpdump يمكننا أن نرى ان الحزمة أرسلت من العنوان 192.168.1.100 لتتجه إلى العنوان 192.168.1.1 وهو طلب ICMP يحتوي على البيانات التالية ‘Hello world’
إرسال وإستقبال الحزم
سنقوم الأن بإرسال وإستقبال بعض الحزم من خلال Scapy .
هناك ثلاثة دالات أساسية للقيام بهذه المهمة :
  • sr() دالة لإرسال الحزم وإستقبال الردود المستقبلة من طرف المرسل إلية وحتى الردود الغير المستقبلة وهي تعمل على الطبقة الثالثة
  • sr1() تقوم هذه الدالة بعرض حزمة واحدة و التي تم الرد عليها ولا تقوم بعرض الرسالات الغير المجابة وهي تعمل على الطبقة الثالثة.
ملاحظة src() وsrc1() يجب أن يتم إستخدامهم في الطبقة الثالثة من طبقات osi (IP, ARP, etc.)
  • srp() تقوم هذه الدالة بنفس العمل ولكن على الطبقة الثانية من طبقات osi
مثال عن الدالة SR1
ستقوم بإرسال حزمة TCP إلى المنفذ 80
1
2
3
4
5
>>> h=sr1(IP(dst="192.168.1.100")/TCP(dport=80))
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
  1. 192.168.1.100 عنوان المستقبل
  2. حزمة TCP خاصة بالمنفذ 80
  3. حصلنا على حزمتين في الرد
سنقوم الأن بإكتشاف على ما تحتوي حزمة الرد
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
>>> h.show()
###[ IP ]###
version= 4L
ihl= 5L
tos= 0x0
len= 44
id= 5055
flags=
frag= 0L
ttl= 254
proto= tcp
chksum= 0x2557
src= 192.168.1.1
dst= 192.168.1.100
\options\
###[ TCP ]###
sport= http
dport= ftp_data
seq= 4081483776L
ack= 1
dataofs= 6L
reserved= 0L
flags= SA
window= 2800
chksum= 0x9600
urgptr= 0
options= [('MSS', 1400)]
###[ Padding ]###
load= 'A\x10'
<pre>
تقوم دالة Show على المتغير H بعرض هيكل الحزمة التي تلقيناها من المستقبل للحزمة التي أرسلناها وكما شاهدتم إنها حزمة IP وعنوان المصدر والمستقبل هو 192.168.1.100و 192.168.1.1 على التوالي .
قام المستقبل بالرد بإستخدام المنفذ 80 أما المصدر قام بإستقبال الرد عبر المنفذ 20 ftp_data .
كما يمكننا الملاحظة أن الأعلام SYN(S) و ACK(A) تم تعيينهم أيضا في الرد  وتعني (flags= SA) أن المنفذ 80 مفتوح.
مثال عن الدالة SR
سنقوم بإرسال حزمة TCP إلى المنفذ 80
1
2
3
4
5
>>>> ans,unans = sr(IP(dst="192.168.1.1")/TCP(dport=80))
Begin emission:
....Finished to send 1 packets.
*
Received 5 packets, got 1 answers, remaining 0 packets
تم إستقبال 5 حزم ورد واحد .
وكا سبق لنا و أن ذكرنا فإن الدالة SR تقوم بإرجاع كل من الحزم التي الرد عليها و التي لم يرد عليها يمكننا تخزينهم في متغيرين ans و unans.
حسنا دعونا نطلع على مايحتويه الرد من معلومات :
1
2
3
4
>>> ans
<Results: TCP:1 UDP:0 ICMP:0 Other:0>
>>> ans.summary()
IP / TCP 192.168.1.102:ftp_data > 192.168.1.1:http S ==> IP / TCP 192.168.1.1:http > 192.168.1.102:ftp_data SA / Padding
عند كتابة إسم المتغيير الأول ans يقوم بإعطائنا نتائج رد الحزمة المستقبل والتي تحتوي على معلومات من بينها أن الرد يحتوي على حزمة TCP واحدة تم إستقبالها ولمزيد من التفاصيل نقوم بإستخدام summary()
ملاحظة : الدالة show لا تعمل مع الدالة SR
 تعيين Timeout للحزم
timeout يستخدم لتحديد عدد الثواني لإنتضار الرد، قم بنخيل سينارويو بحيث نقوم بإرسال حزمة TCP على المنفذ80 إلى جهاز غير متصل بالشبكة وعدم تعيينا لTimeout ، في هذه الحالة سنقوم بالإنتظار ولتجنب هذه الحالة سنقوم بتعيين timeout .
قم بإرسال حزمة TCP على المنفذ 80 إلى جهاز لا يمكن الوصول إليه وبدون نحديد قيمة Timeout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> ans,unans = sr(IP(dst="10.0.0.99")/TCP(dport=80))
Begin emission:
WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
...........................................................^C
Received 6 packets, got 0 answers, remaining 1 packets
>>> ans,unans = sr(IP(dst="10.0.0.99")/TCP(dport=80),timeout=10)
Begin emission:
.....WARNING: Mac address to reach destination not found. Using broadcast.
Finished to send 1 packets.
...
Received 8 packets, got 0 answers, remaining 1 packets
<
إستخدام scapy داخل برنامج بايثون
يمكننا أيضا إستعمال مكتبة scapy داخل برامج بايثون وليس فقط على الطرفية وذلك عبر إستدعاء المكتبة داخل البرنامج
1
2
3
4
5
6
#! /usr/bin/python
from scapy.all import *
ans,unans = sr(IP(dst="10.0.0.1")/TCP(dport=80))
ans.summary()
إلى هنا أكون قد إنتهيت من هذا الدليل والذي سيتبعه دروس أخرى حول هذه المكتبة أرجوا لكم الإستفادة .
رسالة أحدث
السابق
هذا آخر موضوع.
اعلان 1
اعلان 2

1 التعليقات :

عربي باي