Scapy_
طيب. سلام عليكم يا شباب، إن شاء الله تكونوا كويسين وبخير وطبعاً بتستعدوا للعملي. الفيديو النهاردة إن شاء الله هيبقى لامم الـ two labs بتوع الـ Scapy module اللي هما آخر two labs، يعني ممكن نقول عليهم technically هو lab وحتة لأن الـ lab التاني مكنش فيه حاجات كتيرة.
بس ما علينا فهيبقى لامم يعني إيه الـ general Scapy module وإن شاء الله يعنى هحاول أختصر وما أخدش وقت عشان يبقى سريع وإنجاز. طيب. أول حاجة إيه اللى هنجيب سيرته فى الـ Scapy؟ هنتكلم إيه هو الـ Scapy؟ إيه هى الـ features بتاع الـ Scapy؟ بعد كدا هنشوف إزاى بقدر إن أنا أعمل يعنى هو من الـ features بتاعة الـ Scapy إن أنا بقدر إن أنا أ create packets بالـ Scapy اصلا
وده اللي إحنا شبه هنتطرق ليه وبعد كده هنشوف إيه قصة الـ contribution protocols أو الـ contrib module ده بما فيهم إزاي بقى نستخدم الـ MQTT والـ CoAP وآخر حاجة إزاي أقرأ و أ parse الـ pcap files زي ما كنا بنعمل في الـ Wireshark وكده
طيب لو جينا نسترجع الذكريات نـ overview بقى كل اللي اتقال في الـ labs so far يعني القصة بتاعتنا بدأت بإيه؟ القصة بتاعتنا بدأت في الأول إن إحنا حبينا وخدنا abstract و overview كدا عن الـ IoT environment عموماً وإيه الـ IoT devices، الـ sensors والـ simple devices وإزاي بيحصل communication وإن هما بيتوصلوا مع بعض إزاي والكلام ده.
وابتدينا إن إحنا نطبق ده عملي وشوفنا بإيدينا على الـ Packet Tracer إن إحنا عملنا IoT environment بسيطة وعملنا rules ربطناهم ببعض وشوفنا إن أنا كان عندي الـ Home Gateway أو whatever الـ Server الـ remote server بتحكم فيهم إزاي و register الـ devices والكلام ده. طيب، بعد كدا يعني كانت حاجة من اللي شوفناها إن الـ IoT devices بتبقى متصلة مع بعضيها على network أو الـ internet.
فمعنى إن هي متصلة بـ network فعشان يتواصلوا مع بعض الـ messages اللي بيبعتوها لبعض دي بتبقى في صورة Internet packets، فكان لازم يعني فدخلنا الـ step التانية إن إحنا دخلنا على الـ Wireshark إن إحنا إزاي شوفنا عن طريق الـ Wireshark عشان هو network sniffer، network traffic analyzer whatever you will call it يعني، فقدرنا ان احنا عن طريق الـ Wireshark نشوف إزاي أصلاً إن أنا أقدر أـ capture، إزاي إن اقدر انا أعمل analyze، إزاي إن أنا اقدر أـ log وأـ save الـ traffics اللي ماشية دي.
لـ packets والكلام ده وأشوف الدنيا إزاي لو في communication بين 2 devices الـ packet والـ structure بيبقى شكلها عامل إزاي. ده كان الـ Wireshark، النهاردة بقى وده أخيراً زي ما شوفنا إن أنا في الـ Wireshark أنا شغال كنت شغال passively إن أنا مجرد بـ watch الـ traffic وأعمل عليه sniffing يعني already آه أنا بعمل
االـ DPI process بتاعتي اللي هي Deep Packet Inspection وأقدر إن أنا أـ dissect الـ packet بالـ headers بالـ layers كلها وأقدر أـ search على specific value والكلام ده، ولكن كل ده passively أنا بـ capture الـ packet passively أنا واقف على جنب كدا بتفرج على الـ packets whatever عملت لها capture وسيفتها أو بتفرج عليها live وبـ search فيها بالـ filters. طبعا يعني الـ Wireshark كـ analysis tool فيه حاجات تانية غير الـ filters اللي احنا خدناها بس يعني ايه الـ basic functionality او من الحاجات الـ strong اللي فيه حتت
الـ filters. فطب لو إحنا حابين بقى إن إحنا نـ craft بقى packet بنفسينا فده هو قصة النهاردة، النهاردة اللي هو هنتكلم على الـ Python Scapy module اللي هو عن طريقه ممكن أـ create، أـ send أو أعمل sniff لـ packets وأـ verify الـ behavior باستخدام الـ Wireshark يعني أنا
مش مجرد إن أنا بـ create و أـ send مثلاً بـ private environment ولا sandbox ولا الكلام ده، أنا بـ create و أـ send packets live على الـ network وبقدر إن أنا verify فعلاً إن الـ packet اتبعتت وجالي responses عليها والكلام ده عن طريق الـ Wireshark عادي لأن هو هـ capture traffic. تمام؟ طيب، without further ado نشوف إيه بقى هو الـ Scapy. طيب، الـ Scapy زي ما قلنا، الـ Scapy ده هو عبارة عن Python module.
بيتيح للـ user بيخليني إن أنا أقدر عن طريقه، الـ basic بقى يعني لو هنقارن باللي فات فأن أقدر عن طريقه زي الـ Wireshark أعمل sniffing للـ packets أو sniffing للـ traffic. مش بس بعمل sniffing أنا بقدر الـ packets اللي saved عندي دي مش زي الـ Wireshark إن أنا أقرأها وأعمل analyze بس، لا أنا آخد الـ packets اللي أنا عملت لها sniff دي ممكن آخد منها packets أعمل لها sending تاني.
يعني ممكن أـ send وأـ receive تمام؟ بعيداً بقى عن الكلام ده ممكن قبل ما أـ send، أـ send الـ packet زي ما هي على بعضها أو إن أنا أبتدي إن أنا أـ modify في الـ packets أعدل شوية fields، أعدل حاجات في الـ payload وأبعتها تاني أو أصلاً الجديدة بقى إن أنا ممكن أعمل forging لـ packet من الأول وجديد، يعني أمسك أنا بقى أخترع packet من عندي من الأول وجديد وأبعتها على
الـ network وأستقبل كمان الـ response بتاعها تمام؟ فدي من الـ capabilities بتاعته، طبعاً أنا ممكن أستفيد بالكلام ده إزاي؟ ممكن إن أنا يعني أـ pipe الكلام ده بقى مع tools تانية أدخلها في framework، مثلاً أـ capture packets أو أبعت packets وآخد الـ response أبعتها لـ framework أو script يعمل أياً كان
الـ Functionality أو whatever اللي هيعمله يعني، ممكن أستخدم الكلام ده بقى maliciously، ممكن أعمل scan على الـ network، أـ attack، أعمل probe أو scan على الـ network ports والكلام ده، وأعمل forged packets أـ launch بيها attacks أصلاً so on and so forth. طيب، فالـ Scapy زي ما هو زي ما قلنا، هو عن طريقه بقدر إن أنا أـ forge و أـ decode الـ packets
لكذا protocol يعني زي ما هنشوف هو في supported protocols natively في main module في supported protocols بنشتغل عليها وفي كمان الـ contrib protocols اللي ايه دي الـ auxiliary بقى الحاجات الزيادة الـ protocols اللي هي uncommon ومش مستخدمة والكلام ده تمام مش مجرد بقى ان انا أـ forge packet او ان انا أـ edit packet لا انا اقدر كمان اعمل لهم sending live و
أقدر إن أنا أعمل زي list كدا بتـ match الـ packets بالـ responses بتاعتها وأعمل إن أنا مثلاً أعمل list فيها الـ packets الـ unmatched والكلام ده. طبعاً مش هنتطرق لكل هذه التفاصيل، إحنا basically هنشوف الـ structure إزاي إن أنا أـ forge packet وأبعتها، وإزاي أـ parse على الـ packets يعني. طيب، علشان أـ install الـ Scapy فأن عندي فعلياً طريقتين
أسهل طريقة إن أنا أعمل pip install scapy ودي أبسط حاجة في الـ Python environment اللي عندي، أو إن أنا أروح أـ clone الـ repository بتاعت Scapy. تمام؟ فـ whatever suits you ممكن تستخدم Scapy بالطريقة اللي تريحك، بس لو عملت cloning للـ repository فأنت لما تيجي تـ launch الـ Scapy هتـ launchـه بطريقة مختلفة سيكا إنما لما تعمل pip install فهو كدا كدا بقى already installed في الـ environment وتقدر تستخدمه عادي.
طيب، الـ Features. إيه بقى الـ features اللي في Scapy؟ يعني إحنا شبه غطينا الـ features وإحنا بنـ define؛ إن أنا عن طريقه بقدر يعني أحدد شوية packets whatever أنا قاريهم من log file أو whatever إن أنا عملت لهم create أو عامل لهم capture live يعني وممكن أبعتهم
وأستقبل الـ answers بتاعتهم زي ما هنشوف، وزي ما قلنا أعمل coupling لـ الـ request والـ answers في list معينة و list في الـ unmatched والكلام ده اللي إحنا قلنا فيه. الميزة بقى الزيادة إن أنا مش مجرد إن أنا بـ create packet أو بـ capture packet، أنا عن طريق الـ Scapy بقدر إن أنا أـ modify الـ fields. طيب، الـ modify ده هيبقى لحد ايه؟ إيه المدى بتاعي ان انا modification؟ لأن طبعاً معظم
الـ networking tools اللي موجودة التانية أنت ما تقدرش تـ create أو تـ modify out of the scope اللي هو الـ author متخيله، يعني أنا كـ author عشان تبعت الـ packet بالمنظر الفلاني فأنا already ببقى حاطط الـ restrictions بتاعتي فأنت ما تقدرش تعمل حاجة براها، إنما الـ Scapy ممكن الـ modification بتاعي يخليني إن أنا أعمل invalid frames أصلاً. تمام؟
وأبعتها whatever بقى هي هتوصل هيتعمل لها interpretation هتتفهم مش هتتفهم whatever فعادي، فممكن أعدل أـ spoof يعني مثلاً أنا طالع ببعت packet من عندي فالمفروض المنطقي الـ source يبقى الـ IP بتاعي لا أنا ممكن أغير الـ field بتاع الـ source وأطلع أـ spoof الـ packet وأطلعها من source IP تاني بحيث إن هي توصل كأنها مش موجودة أـ spoof الـ MAC address whatever فممكن أعمل
أغير الـ packet وأعمل الـ frame بالمنظر اللي أنا عايزه ممكن أعمل invalid frame أصلاً ميتفهمش ميتعملوش parsing وبعد كدا الـ frames أو الـ packets الـ malicious اللي أنا عملتها دي أعمل لها injection في الـ network عندي whatever هي wireless او الـ يعني wired ولا wireless اللي هي .11 frames و
و whatever بقى أـ launch بيها الـ attack بتاعي أـ test بيها حاجة يعني أنا ممكن أعمل الكلام ده بهدف إن أنا ممكن أـ test أنا محتاج إن أنا مثلاً بـ design protocol جديد فمحتاج إن أنا عايز أـ testـه على الـ network فابتدي إن أنا أعمل الـ frame بالشكل أو بالـ fields اللي موجودة وكدا كدا الـ devices اللي هتشتغل protocol هي اللي هتعرف تـ parse وتفهم الكلام ده.
فـ استخداماته متعددة مش شرط إن هي تبقى maliciously ممكن أستخدمه في الـ monitoring ممكن أستخدمه في الـ testing ممكن أستخدمه في إن أنا أـ verify الـ network بتاعتي شغالة كويس وابتدي إن أنا مثلاً عملت create لـ protocol فابتدي إن أنا أشوفه in deployment أجربه والكلام ده. طيب، ممكن Scapy علشان أشتغل بيه أعمل له invoke
كـ stand-alone framework كدا على الـ CMD أو إن أنا أحطه في Python code. طيب، لو جينا نعمله كـ stand-alone CMD فبعد طبعاً ما انا اكون عامل install هقوم كاتب scapy هو بيبتدي يـ invoke الـ Scapy framework تمام؟ أقدر بقى أدخل الـ functions بتاعتي عندي function help مثلاً تمام هو المفروض إن help دي بتبقى
بين القوسين helpدي دي هتحتاجها على طول، بين القوسين بتديها اسم الـ function اللي أنت عايزها وليكن مثلاً send، function send اللي بنبعت بيها، فبيبتدي إنه هو يطلعلك التفاصيل إيه function send والـ parameters ومش عارف إيه والكلام ده، تمام؟ عندك الـ lsc() function دي بتـ list الـ available functions اللي عندك، دي كل الـ functions اللي أنت تقدر تستخدمها، طبعاً مش هنتكلم على كل ده specifically.
طبيعي عشان الرقم كبير. أحنا هناخد شوية حاجات منهم اللي إحنا عايزينها تمام؟ يعني من الـ functions of interest اللي عندنا أو نخلينا ننزلها بس عشان يبقى باين، الـ ls() function. الـ ls() function دي بديها object معين من الـ protocols زي ما هشوف وعن طريق الـ object ده بيطلعلي كل الـ fields اللي available إن أنا أقدر أعدلها علشان
وأنا بـ create الـ object إيه الـ available fields اللي أعدلها تمام؟ عندي sniff لو أنا بعمل public traffic sniffing، sr و sr1 وعندنا srp و srp1 و send و sendp وعندنا الـ traceroute. يعني هنتكلم عن الكلام ده، المهم long story short أنا عندي إن أنا ممكن أـ invoke الـ Scapy framework direct على الـ CMD طبعاً أكون عامل له install في الـ environment وأكتب scapy
وأعمل كل اللي أنا عايزه، أو إن أنا أستخدمه جوه الـ code بالمنظر ده، أعمله جوه Python code، أـ import بس الـ libraries والـ packages اللي أنا محتاجها علشان أقدر أستخدمه وأبتدي إن أنا أعمله. يعني مثلاً لو جينا نجرب الـ code بتاع الـ sniffing، نسيبنا من الكلام ده، دلوقتي أنا عملت import أهو scapy from
scapy.all  عملت import تمام؟ الـ .all دي بتـ import يعني مش بتـ import كل حاجة في الـ Scapy علشان متتلخبطوش، الـ .all دي يعني في الغالب تقريباً بتـ import most modules أو packages اللي المستخدمة يعني الـ common تمام؟ مش كله، يعني أنت ممكن تحتاج إن أنت تـ import حاجات زيادة manual.
تمام؟ طيب فلو جينا نعمل مثلاً عندي هنا variable اسمه result هنسميه وهنديله الـ function اللي هي اسمها sniff. تمام؟ طيب الـ sniff علشان تـ sniff كدا هتـ sniff infinitely. فعشان لو بصينا هنا لو أنا عايزها تقف عند رقم معين هخليها مثلاً عند count=10. فلو عملنا هنا count
count=10 تمام كدا أنا هـ sniff 10 packets بس تمام؟ فلو هنا هـ sniff 10 packets، طيب أنا عايز أعرض الكلام ده فالـ result اللي بالنسبة لي ده بقى list of packets، list of objects. فلو عايز أعرض في شوية options عندي ممكن نعمل ايه؟ show أو هنا مستخدم nsummary
عشان ما يبقاش، الـ show دي في الغالب بتبقى في الـ object الواحد آهه، هنا مثلاً nsummary تمام؟ وهيعرض لي في البتاع في الـ console command line. لو عملنا run فهو كدا بيعمل إيه؟ هيعمل المفروض sniff لـ 10 packets و
هيعرض الـ packets بتاعتي أهه بغض النظر عن الـ errors فهو المفروض إنه كدا دلوقتي عمل sniff لـ 10 packets live عندي والـ object ده بقى فيه الـ 10 packets. طيب أنا ممكن أعمل فيهم أي حاجة، ممكن أـ parse عليهم ممكن أغير فيهم، ولكن مثلاً basic function من الـ functions إن أنا أعمل nsummary فبيطلعي summary للـ 10 packets اللي هو إيه
مسكهم دلوقتي، الـ summary زي ما كنا بنشوفها على الـ tshark أو الـ Wireshark. تمام؟ نـ clear الكلام ده. طيب، ده مثلاً لو جينا نجربه هنا لو جينا نبص إن أنا هنا مثلاً عايز أعمل نفس الحاجة هعمل result() = sniff واديها
count=10 تمام، هيـ sniff بس أنا هنا بشتغل line by line يعني هنا الـ line بيتعمله execution. طيب بعد كدا بنعمل بقى result.nsummary() زي ما عملنا هناك، هيعرض لي نفس الحاجة. فـ أنا ممكن أعمله
على الـ CMD هنا، أو إن أنا أعمله جوه code بس طبعاً الـ code أنا هنا هكتب الـ logic بتاعي وهيـ run كله مرة واحدة إنما أنا هنا هـ execute line by line، يعني هـ execute أول الـ sniffing function وبعد كده هـ execute whatever أنا هعمل إيه تمام؟ طيب ده كان بدايتنا إن أنا إزاي أستخدم
الـ Scapy. طيب من بقى الـ functions اللي إحنا محتاجينها هنتكلم عليها، عندي function الـ lsc() دي اللي أنا عملتلها run قدامكم وشوفتوها، دي بتقولي إيه الـ available functions. آه ممكن الـ functions  زي دي أعملها execute هنا برضو أعمل هنا lsc() و أـ run، بس طبعاً دي مش حاجة efficient يعني أنت لو عايز تـ execute حاجة زي كده
مش هتعمل code معين وتـ comment الباقي عشان تـ execute بس هي viable هتشتغل معاك، فلو أنت مثلاً عايز حاجة زي كده عايز تعمل ls() أو lsc() أو تعمل help على حاجة فمثلاً تقوم فاتح الـ CMD أسهل لك تفتح الـ Scapy وتبتدي إن أنت تـ execute تشوف الدنيا وتخش تكمل الـ code بتاعك، مثلاً whatever suits you يعني ده اقتراح وكل واحد بـ اللي يريحه
فـ أول حاجة الـ lsc() بتـ list الـ available functions، تاني حاجة الـ help زي ما شفنا، دي بتديني بتطلعلي الـ help menu وممكن كمان أديها help وأديها اسم function فتقوم مطلعالي الـ details زي ما شفنا. طيب بعد كده عندي send و sendp دول مع بعض، وعندي sr و srp دول مع بعض، و sr1 و srp1 دول مع بعض
مع بعض، الـ Sniff دي شفناها، خلاص الـ Sniff أنا بـ sniff live packets على حسب الـ parameters هيقف امتى والكلام ده، وبرجع الـ packets اللي أنا عملتلها sniffing في list. الـ list دي لازم استقبلها في object وأعمل فيها اللي أنا عايزه. الـ traceroute، تمام؟ الـ traceroute بينفذ الـ traceroute command.
اللي هو direct بيبعت TCP للـ traceroute command، packet TCP. ده الـ default. طب لو أنا عايز أبعت Scapy packet؟ بحدد فيه option من الـ options بكتبه يعني بـ value معينة، وساعتها هبعت Scapy packet بدل ما أبعت normal TCP packet الـ default. طيب، الـ traceroute ده نفسه كنت بعمل إيه؟ قالي علشان أنا أعرف
الـ packet بتاعتي احنا عارفين إن الـ packet مثلاً ادي هنعتبر إن دي ده الـ source وهنا الـ destination، فعلشان الـ packet توصل من الـ source للـ destination هي مش هتروح direct، يعني logically أنا بكتب إن الـ destination بتاعي كدا فـ logically أنا رايح direct تمام؟ ده logically.
طيب بس إيه اللي بيحصل فعلياً؟ اللي بيحصل إن أنا، أنا دلوقتي دي local network تمام؟ أنا في الـ local network اللي عندي في البيت، فالـ local network دي، فكرة الإنترنت إن أنا عندي شوية networks
متوزعين متوصلين ببعض، هما دول اللي بنسميهم الـ internet. هو الـ internet هو عبارة عن شوية networks متوصلين. فـ أنا اللي بيحصل عشان أوصل هنا بيبقى في route، طبعاً الـ protocol المسؤول إن هو يحدد الـ route والكلام ده هو الـ IP protocol تمام؟ طيب، فـ أيه اللي بيحصل، قالي إن أنا الـ packet بتاعتي آه هو معروف إن أنا هوصل من الـ source للـ destination، طب بعد كده بمسك بشوف، طب أنا عشان أوصل للـ destination الـ route بتاعي إيه؟ العنوان اللي هوصل له أو الطريق؟ فيقولك أنت هتطلع من هنا
لهنا، فالـ packet بتاعتي هتطلع من network A لـ network B. طيب يعني ده كلام زيادة تمام؟ فـ network B هتروح لـ device معين، بعد كده هتروح هنا لـ device معين في network تانية، لـ device معين، ممكن جوا الـ network نفسها تقوم منقولة هنا لـ device تاني، وبعد كده تروح على device معين وبعد كده لحد ما توصل لـ الـ
للـ destination تمام؟ يعني long story short أنا بمر على كذا hop، أياً كان الـ hop دي، كدا كدا أنا بطلع من networks، بتنقل بين الـ networks، تمام؟ فبروح على كذا hop، ممكن الـ hop هيبقى hop واحدة في الـ network وأطلع على network تانية، ممكن كذا hop في نفس الـ network، whatever، فالمهم إن أنا إيه؟ بعدي على steps، ادي مثلاً 1، 2، 3، 4.
5 ووصلت للـ destination عندي في 6. جميل؟ طيب، الـ traceroute بقى بيطلعلي إيه الـ IPهات بتاعة الـ hops دي، يعني أنا في الأول أنا دلوقتي اللي طالع من الـ packet نفسها، ادي الـ packet، ما بيبقاش فيها غير الـ source والـ dest تمام؟ الـ source ده بتاعنا والـ destination بتاعي، فأنا عايز أعرف إيه الـ route اللي الـ packet خدته، فبستخدم الـ traceroute، طب الـ traceroute ده بيعمل إيه
قالي بيده عن طريقه لما بعمل بقى traceroute ده كدا، الـ result بتاعتي بيقولي أنت أول حاجة عديت على مثلاً 192 blah blah blah، طب اهه تاني حاجة عديت على 1، وبيقولك في كام milli-second، وبعد كده عديت على 1 مثلاً 1 6 8 و whatever، طبعاً ده مش subnet صح يعني بس ما علينا.
بعد كده طلعت على 20 dot مش عارف إيه، لحد ما توصل فين للـ destination بتاعتك. جميل؟ طيب، الـ traceroute بقى بيحسب القصة بتاعته دي كلها إزاي؟ قالي بحاجة بسيطة، قالي أنا في الـ packet في الـ IP header عندي في field اسمه الـ TTL اللي هو Time To Live ده بيبقى فيه
integer number ده بيعدد إيه عدد الـ hops. عدد الـ hops اللي أنا أعملها يعني أنا من هنا لهنا دي كده اسمها hop، وهنا لهنا hop فـ هو بيحدد لي عدد الـ hops. الـ default بتاعه في الـ traceroute بيبقى 30 تقريباً على ما أتذكر بس ما علينا. فهو بيقول لي بيحدد عدد الـ hops. ده الـ maximum صح maximum TTL.
طيب، ايه اللي بيحصل بقى؟ فالـ traceroute بتعمل إيه؟ ببدأ ببعت packet، TCP packet أول حاجة TTL=1. فإيه اللي هيحصل؟ هروح هنا، فأنا عشان أبعت الـ packet للي بعدي بمسك الـ TTL أعمل -1، بـعمل - 1 وأبعتها. طيب لو أنا وأنا بعمل -1 لقيتها هتبقى 0، فساعتها بعمل discard
للـ packet طب حلو أنا بعمل discard، أنا برضو عرفت منين هي وصلت فين؟ قالي ما هو الـ TCP أنا ببعتها علشان لما بعمل discard بيتبعتلي message تاني هنا اسمها TTL, Time To Live Exceeded. فـ already الـ Host اللي الـ packet بيتعملها discard عنده بيبعت message للـ Source يقوله لا أنا كدا عندي الـ TTL Time To Live Exceeded.
عندي. فعن طريقها بيحصل إيه؟ فساعتها بقى الـ Traceroute mechanism بياخد الـ IP اللي بعتله ده يسجله عنده، يبقى ده كدا IP 1. طيب بعد كده إيه؟ يخلي الـ TTL 2 ويبعت، فتعدي على دي وتروح على اللي بعديه، ده برضو هيقوله Time To Limit Exceed وهيبعتله، فده يبقى إيه رقم 2. و and so on لحد ما أوصل للـ Destination.
بتاعتي أطلعلّك بقى إيه؟ أنا بـ save ده عندي أهو مفيش حاجة بتـ save أنا باخد بيبعتلي الـ IP بيبعتلي الـ packet وأنا بـ save . فـ يبعتلي، الـ بعد ما بيبعتلي بسجل بقى الـ IPs في listـة وأقولك يا باشا ده الـ Route اللي هي خدته. طيب الـ Default values طبعاً إن أنا الـ Maximum بتاعي بيبقى 30 تقريباً الـ Default، لو أنا حبيت أغيره 30 hop يعني.
فـ whatever فهي recursive operation، ده باختصار الـ traceroute ودي حاجة تقريباً irrelevant لينا بس أنا حبيت أحكيها. طيب تمام، فنمسح بقى إيه الكلام ده. طيب، نيجي بقى إيه للـ send والـ sendp والـ sr والـ srp والـ sr1 والـ sr1
p. طيب الـ send والـ sendp قالي الاتنين دول بيبعتوا packet بس، ببعت بس، تمام؟ الـ sr والـ srp ده ببعت وأستقبل. طيب يعني إيه ببعت وأستقبل؟ يعني أنا لو بعت بس مش هستقبل على الـ Network؟ لا لو بعت بس عادي وفي response جه للـ packet هيجيلي على الـ net-
الـ Network عادي بس أنا مش هشوفه. لو أنا عايز أستقبل الـ packets اللي جاية دي جوه الـ code بستخدم sr فهي بتبعت، واللي بيجيلي على الـ Network تاني الـ Response ليها بستقبله جوه الـ code في object ببتدي إن أنا أستخدمه براحتي يعني. تمام؟ طيب الـ sr1 والـ srp1 هما هما يعتبروا الـ sr والـ srp، ببعت وأستقبل
ولكن أول packet بس، one packet. يعني هنا ببعت وأستقبل packets عادي، هنا ببعت وأستقبل first packet. فلو قالك عايز أبعت وأستقبل packet فبستخدم sr1 و sr1 او الـ sr1p. طيب إيه الفرق بقى بين الـ send والـ p، يعني الـ p دي بتختصر لإيه؟ قالي يا باشا أنا عشان الـ Scapy أـ send packet إحنا بنبتدي إن إحنا نـ stack شوية objects مع بعض، إيه الـ objects دي؟ الـ protocols، كل protocol
يعني ده بالنسبالي protocol بتاع مثلاً layer، عارفين إن أنا بشتغل بـ layers فكل layer بيشتغل فيها set of protocols، فأنا بعمل إيه؟ بشوف الـ layer الأولانية الـ protocol بتاعها بعمل منه object وبعد كده بـ stack فوقيه protocol تاني، بـ stack فوقيه protocol تاني بتاع كل layers لحد ما أوصل
لـ الـ payload بتاعتي. تمام؟ بعمل لها stacking فوق أول protocol. طبعاً الترتيب لازم يبقى مظبوط، لأن أنا بـ create بيه الـ frame اللي هيتبعت، فلو الترتيب غلط مش هيتعمل لها parsing ومش هتتفهم ومش هتوصل أصلاً ممكن ما تتعملهاش routing. طيب، فالـ send والـ sendp قالي إن أنا الـ send ببتدي الـ control بتاعي على الـ packet من أول layer 3، اللي هي layer 3 بالنسبالنا
اللي هي الـ network، الـ net layer. اللي هي باختصار بيشتغل فيها الـ IP أو الـ IPv6 protocol. تمام؟ طيب، ابتداءً من الـ layer 3 ببتدي الـ control بتاعي. ببتدي أول حاجة بتحكم فيها هو الـ IP بقى، الـ IP object بتـ
عي، إنما ما قبل ذلك اللي قبليه بقى اللي هو الـ L2 والـ data link layer قالي أنا الـ automatic الـ module بيعمله encapsulation automatic وبيضبط الدنيا بقى هو بيجيب الـ frames بيضبط الـ frame ويعمله encapsulation ويبعت الدنيا. فأنا مليش يعني ما بوجعش دماغي بالقصة دي. طب قالك لا لو أنا عايز أتحكم، التحكم بتاعي يبتدي من أول layer 2 من أول الـ data link layer عايز أتحكم في الـ
في الـ ethernet أو أحدد الـ interface اللي هبعت منه، عايز إن أنا احدد الـ interface عايز إن أنا أغير أـ spoof الـ MAC address أو whatever، فساعتها ببتدي أبعت بالـ sendp، فكده البداية التحكم بتاعتي من الـ data link تاني نعتبر ان ده خط حلو يعني فمن الـ data link
link layer. تمام؟ ده الفرق بينهم. فـ mostly generally وإحنا بنتكلم مش هنتطرق إحنا مش هنتحكم في layer 2 في حاجة فإحنا هنبتدي من أول layer 3. layer 3 في ما فوق، فأنا أول حاجة هخبطها في layer 3 في الـ network يا إما IP يا إما IPv6 whatever الـ protocol أو الـ ARP. الـ ARP برضو ده network layer. فـ whatever الـ protocol اللي هشتغل بيه. فوق بقى الـ ARP ببتدي ان انا أـ  stack باقي الـ protocols بتاعت الـ layers. طيب
لـ sr زي ما قلنا والـ srp ببعت و receive دي بتبعت بس، هنا ببعت و receive جوه الـ code، بس هنا بتبقى بدايتي برضو هنا لو عايز أتحكم من layer 3 فهبتدي بـ sr العادية، srp من أول layer 2. نفس الفكرة sr1 و srp1. فكلهم نفس الفكرة. تمام؟ طيب.
ماشي، أعتقد تمام. طيب، قالي إن أنا أصلاً معنى إن أنا ببدأ من layer 3 فأنا كدا كدا protocols layer 2 supported، protocols layer 3 supported، الـ layer 4 اللي هي الـ transport supported، ما علينا
دول supported، اللي مش supported عندي شوية يعني شوية بس من الـ application layer هما اللي بيبقوا supported. طب وبقية الـ protocols؟ لا مش natively supported. وهنشوف إحنا هنحل الموضوع ده إزاي أو الموضوع ده محلول إزاي. بس خلينا متفقين إن layer 3 protocols و layer 4 protocols supported عادي اللي هما IP، TCP، UDP والكلام ده، ودول اللي بنستخدمهم.
ووما فوقيهم بقى من الـ application layer مش كلهم supported تمام؟ بس ليهم طريقة إن أنا ممكن أبعت الـ packet برضو ببتدي إن أنا أحط الـ payload بالـ headers بالشكل بتاعها زي ما أنا عايز بالطريقة الصح، يعني بحط الـ payload بالـ headers بكل حاجة بطريقتي أنا اللي بحط الكلام ده في object واحد وا بتدي إن أنا أـ stackـه فوقيه
تمام؟ هنشوف، هنشوف. طيب، لو عايزين نجرب حاجة زي كده، مثلاً عايز نـ send IP نـ send ICMP packet لـ الـ ping. طب الـ ICMP ده monitoring اللي هو internet control message protocol، ده protocol بستخدمه علشان أعمل controlling على بعمل بيه controlling على
الـ Network تمام؟ طيب يعني إيه controlling؟ Controlling بعمل بيه monitoring، هو أصلاً generally في error codes كتيرة، messages كتيرة، فبناءً على الـ message ببتدي إن أنا أشوف آه المشكلة في إيه والكلام ده وأعرف القصة، بس مش هنتطرق ليها. الـ default بتاعي هو خاصية الـ Ping. لما باجي أكتب ping
لحاجة بـ ID أو Address معين، الـ Ping بيعمل إيه؟ simply بيبعت ICMP Echo Request وبيجيله Echo Reply. تمام؟ Simply فـالـ basic functionality للـ ICMP اللي إحنا بنشوفها كلنا حتة الـ Ping لما تفتح الـ CMD تكتب Ping
فكده بيبعت Echo Request و Echo Reply. يعني لو جينا نبص عليها هنا احنا نـ cancel لو عملنا هنا Ping 1, 2, 3, 4 أهو، كده بيعمل إيه؟ أهو، ده كدا Reply from هو كده عمل إيه؟ بعت Echo Request ودي الـ Echo Reply، بعت Echo Request وجايله Echo Reply، علشان يـ test الـ latency والكلام
تمام؟ طيب لو إحنا بقى حبينا نعمل الكلام ده بنفسنا فـ هنعمل ICMP Packet عادي. طيب عشان أعمل ICMP Packet، generally فأنا كده هتحكم أولاً هنبدأ من أول layer 3، دي layer 3، فإحنا مش هنتحكم في حاجة في layer 2 ولا فارق معايا الـ interface ولا الـ MAC Address والكلام ده خليه هو يـ encapsulate الـ Frame بنفـ
نفسه. طيب لو جينا layer 3 فأول حاجة هخبط فيها هو الـ IP protocol فقالي إن لكل protocols الـ supported ليها object جاهز، الـ object ده بيسهلي عملية إن أنا أستخدمه، ليه؟ لأن هو الـ object ده بيبقى defined فيه إيه الـ fields الموجودة فأنا ببتدي إن أنا أـ specify، بيبقى كمان defined فيه fields بالـ default values بتاعتها لو أنا مغيرتهاش، يعني انا لو غيرت انا هنا
خلينا نـ clear، أنا هنا مغير الـ Destination بس، فـ أنا كده إيه؟ غيرت الـ Destination. طب بقية الحاجة؟ الـ Source هياخد الـ Source الـ Default إنه ياخد الـ Source بتاع الجهاز. الـ Flags هياخد الـ Default Flags تمام؟ فاللي أنا بغيره هنا بس ده اللي أنا محتاجه، يعني أنا مش لازم أغير كل حاجة، أنا بغير اللي أنا محتاج أو اللي أنا عايز أغيره أو مش عايزه يبقى الـ Default
تمام؟ فدي ميزة إن هو supported فـ ليه protocol، يعني بيبقى ليه أصلاً object جاهز، فمعظم يعني الـ IP ليه object عشان ده layer 3 والـ IPv6 وعندك الـ ICMP و الـ TCP و الـ UDP and so on تمام؟ تقريبا اه IPv6 ما علينا
طيب فعايزين بقى نعمل كده فأنا حرفياً ببتدي إن أنا أـ build الـ Packet، يعني ادي الـ Packet بتاعتي. هنعتبر دي الـ Packet. فهي عبارة عن إيه؟ هنعتبر إن ده، خلينا نمشي على الـ TCP/IP model إن إحنا عندنا 4 layers، layer 1، layer 2، layer 3. هنعتبر إن دي layer 1 اللي هي الـ Data Link layer
اللي هي layer 1 اللي هي كانت عامله mix أو عملوا encapsulate مع الـ Physical والـ Data Link تمام؟ و layer 2 اللي هي الـ Network layer، بس هي layer 3 بالنسبالنا على الـ OSI إنما إحنا هنا بنتكلم على الـ TCP، بس عشان التصفية ده هنا إيه ده TCP/IP model.
تمام؟ فهنا الـ layer فوق الـ layer 3 كانت الـ Transport يعني نعتبرها بالـ TCP والـ layer 4 الـ Application، يعني ده تبسيطاً للموضوع. طيب أنا كده تحكمي مش هيبقى من هنا خلاص أنا مش عايز ده، أنا هعمل send فأنا تحكمي هيبدأ من أول هنا إيه؟ عند الـ IP، تمام؟ طب علشان أـ build الـ Packet فـ أنا لازم علشان أـ build الـ Packet يبقى فيها
الـ IP protocol، الـ Header بتاعه، وفيها الـ TCP أو الـ UDP بتاعي، وفيها آخر حاجة الـ Application layer بتاعي بقى أياً كان اللي أنا هستخدمه. تمام؟ فأنا عشان أـ build الـ Packet أنا بعمل كده بالظبط، كأني بجيب شوية objects أحطهم فوق بعض. فأنا عشان أبعت ICMP packet فأنا الـ ICMP ده مش transport layer ده auxiliary، ممكن نقول عليه auxiliary protocol للـ IP
هو يعتبر في الغالب بيتعمل له categorization على إنه  ايه layer 3 برضو أصلاً. بس لازم عشان يشتغل يبقى فوق الـ IP، مينفعش يشتغل لوحده، مش زي الـ ARP يعني. تمام؟ فده مش TCP مش layer 4. فعلشان تبعت الـ Packet بتاعتك لازم تحط الترتيب. إحنا كده قلنا خلاص إن الجزء بتاع الـ Ethernet والكلام ده
already موجود، فاللي هيجي بعديه إيه؟ الـ IP protocol. تمام؟ فوقيه بحط الـ Protocol اللي هستخدمه في الـ Transport. هنا إحنا مش هنستخدم حاجة فهحط فوقيه الـ ICMP. فدي حاجة اللي بنـ stack الـ Objects بتاعتي فوق بعض. أنا عارف إن ممكن يكون الموضوع تاه بس لما نشوف أمثلة أكتر هيبان. فالفكرة إن أنا دلوقتي وأنا بـ create الـ Packet بـ stack شوية objects
فوق بعض. فأول حاجة عندي الـ IP object، هيبقى المفروض اللي فوقيه الـ Header اللي عليه الدور في الـ Packet، اللي هو الـ Object بتاع الـ ICMP تمام؟ طيب لو جينا نجرب ده بإيدينا، لو جينا مثلاً نعمل هنا أهو send وندي اسم، هنعمل object من الـ IP. تمام؟ وهنخلي الـ dest
equal اللي هي 4 تمانيات، 8.8.8.8، تمام؟ مش هغير فيها حاجة تاني، وهـ stack فوقيها ICMP objects. تمام؟ طيب، يعني علشان تشيل الكلام ده لازم تعرف الـ interpreter والكلام ده يعني هو already شبه بيعمل auto complete إن أنت ممكن
من الـ settings هنا تيجي عند الـ interpreter... كانت فين يا ربي؟ فمن الـ settings هنا نبص على الـ Project نفسك، الـ Python interpreter، فالمفروض إن هو عشان يـ auto complete تلاقي إن هنا موجود الـ Scapy
ده هيسهل عليك يعني الموضوع على حسب الـ environment وأنت عاملها setup إزاي يعني، تمام؟ عشان لو أنت عندك multiple environments فـ هتختار إيه الـ interpreter اللي أنت هتستخدمه. فالمفروض إن أنت لو لقيت هنا الـ Scapy، which is مثلاً مش لاقيه مش موجود، فـ ساعتها بتعمل add وتكتب scapy، تـ search على الـ Scapy هنا
هيطلع لك فـ أن أنت تــ ايه؟ تعمله install package تمام؟ ده هيـ auto complete معاك شوية. بس ما علينا مش عايزين نـ auto complete عادي ده كده كده مش مشكلة. فأنا عايز أعمل send تمام؟ خلينا نـ clear all. تمام؟ ومش هعمل حاجة تاني. طب علشان أتأكد هي الـ send دي اتبعتت ولا لأ محتاج إن أنا أـ listen على الـ Network فـ
هنفتح الـ Network بتاعتي أـ listen على الـ Ethernet، ده كده الـ Live network اللي رايح واللي جاي، فكده خلاص هو بـ capture live. فلو جيت عملت send قالي إيه؟ sent 1 packet. تمام؟ طيب، فعشان أعرف هي sent ولا لأ فـ المفروض إن أنا أعمل إيه؟
هعمل هنا ممكن أعمل filter بالـ ICMP أو الأسهل إن أنا أعمل filter ip.addr == 8.8.8.8. هلاقي فعلاً أدي الـ
دول اللي أنا بعتّه... ده هو. بعت... ادي الـ Packet اللي اتبعتت وادي الـ Response بتاعتها. الـ Response... الـ Packet والـ Response تمام؟ طيب... ما هذا الهراء؟ ما علينا... Echo
أدي الـ Echo Request بتاعتي أهي، وأدي الـ Echo Reply، تمام؟ Okay، فكده أنا عملت Send للـ Packet، طيب ده Simply إزاي أعمل الـ ping اللي هي ICMP، فلو بصينا علشان هنا دي Filtered أكتر علشان
تبص هنا، فهنلاقي إيه، نشيل الـ Pointer Options، هنلاقي أهي، أدي الـ Echo Request اللي طالع وأدي الـ Echo Reply. طيب أنا ممكن أتحكم بقى ايه أحط TTL علشان أتحكم، يعني أنا ممكن مثلاً، طيب، فأنا برضه علشان أتحكم فيها أكتر ممكن أغير مثلاً الـ TTL أخليه 5
ونعمل Send، عمل Send لـ One Packet، فلو جينا أهو هنلاقي إن أنا بعت Echo Request أهو وأتبعت لي ICMP من IP مختلف Time To Live Exceeded، Time To Live Exceeded in Transit أهو، ولو نبص هنا هنلاقي إن أنا أصلاً الـ Packet بتاعتي كان الـ TTL بتاعي 5، تمام؟ دي وضحت أكتر
طيب أنا عملت كده الـ Objects وبعتها Direct، طب أنا ممكن أعمل الكلام ده بشكل تاني؟ قال لي آه، ممكن أعمل إيه؟ قال لي ممكن كده كده أعمل مثلاً IP أعمل هنا ايه؟ IP Object، Variable Object عادي من الـ IP، ده الـ Initialization بتاعي، أنا لو محطيتش حاجة في الـ Initialization فهيعمل الـ Default، وبعد كدة أغير فيه
طيب خلينا مثلاً نحط هنا الـ Default بتاعي الـ Destination = 1 2 3 4 أهو، تمام؟ طب عايز أغير حاجة تاني؟ خلاص ما هو Object Dot وهديله مثلاً الـ TTL بتاعتي = الخمسة اللي أنا حطيتها، تمام؟ وكده كده الـ IC مش محتاج أعمل فيه حاجة، هعمل ICMP
object. أهم حاجة بس أكتب الـ syntax بتاع الـ object صح، كده أنا عملت initialization من الـ ICMP Object، بعد كده أعمل إيه؟ أعمل IP فوقيه الـ ICMP. تمام؟ ولو عملت Send، هيـ already send الـ packet، طبعاً كدة كدة أنا جالي Time To Live Exceeded، فيجيلي Time To Live Exceeded تاني.
Okay؟ طيب، ده لو أنا عملت، فده ياخدنا إن أنا أـ control الـ packets بتاعتي إزاي، فـ simply لو أنا دلوقتي عندي شوية fields اللي إحنا عمالين نغير فيها اللي أنا عملت الـ Destination ممكن أعمل الـ IP الـ Object Direct بالمنظر ده أبعته جوا الـ object بالـ initialization، أو لو أنا عايز أغير حاجة أو معايا object محتاج إن أنا أغير فيه، فابتدي إن أنا عن طريق إن أنا الـ object نفسه أعمل Dot وأديله اسم الـ field وأغير فيه.
عادي مفيش مشكلة، طب أنا أسماء الـ Fields عايز أعرفها، قال لي هستخدم Function الـ LS، LS بديها الـ Object وهو بيطلع لي الـ Fields، فلو عملنا كده جوا الـ Scapy أسهل على الـ CMD وعملت LS وأديته الـ IP هيطلع لي إيه الـ Fields اللي أنا في الـ Header اللي أنا بغيرها، الـ Version الـ TOS الـ Len
ngth الـ TTL الـ Source الـ Destination ودي الـ Options set of options والكلام ده، فدي الـ Fields وبيقول لي كل واحدة دي 4 bits دي 4 bits and so on، تمام؟ فده لو أنا خلاص، فأنا عايز أعرف اسم الـ Field اللي هغيره، بعمل LS أشوف اسم الـ Field اللي أنا عايز أغيره هنا أهو، حددت اسم الـ Field ببتدي أغير بقى إيه الـ Field اللي أنا أكتبه في الـ Syntax بتاعي.
أياً كان بقى Dot أو أكتبه في الـ initialization، سبت الـ initialization فاضية هو بيعمل الـ Default وممكن أغيرها كده عادي زي ما عمل هنا، تمام؟ وبعد كده بحط الـ objects فوق بعض، دي نسميها بنـ stack الـ objects، فلو رحنا لحتة الـ stacking أهي، إيه اللي بيحصل؟ إن أنا الـ operator slash ده بستخدمه علشان أعمل composition بين شوية objects مع بعض أكون بيهم الـ packet، يعني الـ packet بالنسبة لي ده object 1
وأدي object 2، object 3، object 4، تمام؟ فأنا الـ Packet إيه؟ الـ Packet هو عبارة عن مجموعة من الـ objects دي، فابتدي إن أنا أحط الـ object الأولاني في مكانه، فوقيه الـ object التاني في مكانه اللي هو الheader بتاع الـ protocol، الـ object التالت بالترتيب، وهنا آخر حاجة الـ object الرابع، عملت بقى هو بياخد الـ objects دي
يعملها encapsulation في frame، والـ Scapy بيعمل الكلام ده ويبعتها على الـ network بتاعتي، تمام؟ فهي دي فكرة الـ obj فكرة الـ building، فأنا بعمل الكلام ده إزاي بالـ operator ده، بعمل شوية objects، أدي Object 1 / Object 2 / Object 3 and so on، طبعاً مع مراعاة
إن انا أخلي بالي وأنا بعمل الـكلام ده إننا أحطهم بالـترتيب. يعني ده object IP فـ الـ IP قبل الـ TCP مش بعده. يعني ماحطش TCP وبعديه IP أنا كده بعمل frame غلط لو أنا قاصد أعملها براحتي. لو أنا مثلاً عايز أحط Ethernet فـ الـ Ethernet مكانه قبل الـ IP
والـ TCP قبل الـ IP مش بعد الـ IP فـ الـ Ethernet و بعديه الـ IP و بعديه الـ TCP اللي هو الـترتيب الـطبيعي للـ objects بتاعة الـ layers. ليه؟ لأن هو بياخد الـ objects دي already دي الـ headers بتاعة الـ frame بتاع الـ packet. ما  هي الـ packet بتبقى عبارة عن إيه؟ الـ payload وعليها شوية headers. الـ headers بتاعة الـ layers صح؟ ده بتحصلها في الـ encapsulation وأنا ببعت الـ packet من الـ application هو بيحط الـ headers دي لوحده. فأنا already أنا بقا اللي بـ create الـ packet فأنا لازم أحطله الـ headers بالـترتيب.
علشان لما يروح يعمل decapsulation هناك هو كل layer هتشيل الـ header بتاعها. فلو الـ headers محطوطة غلط هو مش هيعرف يعملها الـ decapsulation و parsing تمام؟ فأنا بـ stack الـ objects فوق بعض تمام؟ بس وهنا لو رجعنا هنا ده الـ object ده الـطريقة الـ example بتاع الـ Time to Live وده already عملناه. طيب لو حبينا بقى نبعت شوية packets
بيقولي مثلاً لما يجيلي سؤال بقا زي كدا فـ أول حاجة لازم أحددها أنا هبعت إزاي. هل أنا هبعت بس؟ هبعت وأستقبل؟ ولو هبعت وأستقبل فهبعت وأستقبل عدد ولا هبعت وأستقبل واحدة؟ فلو هبعت بس يبقى send. تمام أو sendp على حسب أنا هتحكم إيه لو قالك بقا غير الـ MAC address والـكلام
ده الـ layer 2. طيب تاني حاجة لو أنا هبعت وأستقبل يبقى sr. عندي حاجة من اتنين. يا sr الـعادية لو أنا هبعت وأستقبل مثلاً packets جمع يعني packets خليها كدة packets. لو أنا هبعت وأستقبل packet واحدة فهتبقى sr
r1. تمام؟ على حسب اشوف فانا أول حاجة بمسك الـسؤال، هايجيلي السؤال أشوف إيه هو عايز إيه. فهو بيقولك send a DNS packet وما قلكش في الآخر receive فخلاص. أنا هـ send بس، فهنا هستخدم الـ send. طيب، فهو عايز DNS packet، أقسمها واحدة واحدة. فهو عايز DNS packet يبقى كده أنا شغال الـ application layer protocol بتاعي الـ DNS طيب الـ DNS
Luckily, supported فليه object جاهز. طيب مع الـ destination فبيقولي، DNS packet، بيقولي الـ destination port بتاعتي 53 طب الـ destination port ده فين؟ في الـ transport تمام؟ تمام؟ فده الـ transport layer بغير فيه الـ destination. والـ Qname طبعاً ده في الـ application layer. طيب لو جينا نبص على الكلام ده انا محتاج اعمل ايه
فـ دلوقتي الـ packet بتاعتي هتبقى عاملة إزاي؟ إحنا هنبعت بـ send. فإحنا هنبتدي نـ control من أول layer 3، تمام؟ اللي هي L3. فالـ L3 عندي هيبقى بالنسبة لي إيه؟ IP. تمام؟
فوقيه الـ transport، الـ transport قال إن الـ DNS بيشتغل UDP خلاص يبقى أنا هشتغل UDP. آخر حاجة الـ application layer بتاعي هيبقى الـ DNS. ده اترتيب الـ headers الـطبيعي بتاعي تمام؟ يبقى layer 3, layer 4, و هنا layer 7 أو whatever يعني هنعملها بالـ OSI model ولا لأ يعني لو عملناها
بالـ TCP/IP model يبقى layer 2 وهنا دي layer 3 ودي layer 4، whatever whatever هتترجمها إزاي مش فارقة الاثنين واحد. طيب، فأول حاجة خبطت فيها الـ IP فوقيه الـ UDP فوقيه الـ DNS. دي الـ objects الأساسية اللي هعملها. همسك بقى كل object أشوف أنا هعدل فيه إيه. مبدئياً، أنا packet هبعتها لمكان، فأنا لازم already هغير حاجة ثابتة وهي الـ destination. لأن أنا انا لو سبتها default فـ على حسب الـ version بتاع الـ Scapy
يا إما هيحطها بـ zeros يا إما هيحطها الـ loopback اللي هو 127.0.0.1 اللي هو هبعت الـ packet للجهاز نفسه، فمش هتوصل. فأنا أول حاجة بغيرها generally في معظم الأحيان أو على طول حتة الـ destination، أنا هبعت الـ packet دي فين؟ أو whatever الـغاية بتاعتي. تمام؟ فالـ destination، هو بيقول أنا عايز أبعت الـ packet دي
دي DNS packet، فهبعتها لـ DNS server، فمثلاً يا إما أربع وحايد بتاع Cloudflare أو الأربع تمانيات بتاع Google اللي احنا لسه باعتين عليه، تمام؟ فأدي كدا الـ destination IP خلاص. هعدل حاجة تاني في الـ IP؟ معنديش source مقاليش غير حاجة في الـ flags بتاعه فخلاص كدا الـ I
P تمام. طيب، بعد كدا الـ UDP. قال لي الـ UDP أنا عايز أمسك الـ UDP ده أعدل فيه الـ port، هو حدد لي destination port معين، فأنا عشان أبعت الـ destination port معين لو سبته default ممكن يروح على port تاني، فالـ destination port هعدل هنا الـ dport.
خلاص؟ طيب، هل قال لي اعدل الـ source port ولا حاجة؟ لأ خلاص، يبقى اسيبه ياخد أي available source port من عندي الـ default، فأدي كدا الـ UDP خلاص. ناقص حاجة في الـ DNS؟ قال لك في الـ DNS أنا عايز أـ query على الموقع ده أو whatever الموقع، فدي اللي هي الـ qname تمام؟ هحط اسم الـ qname
وفي الـ RD flag ده بتاع recursively عشان دي حاجة ليها علاقة بالـ DNS لما بييجي يعمل lookup على الـ domain بتاعك يعملها recursively ولا لأ، whatever يعني. فخلاص، بس الأساس عندي حتة الـ qname مفيهاش مشكلة، فأنا كدا عدلت له الـ qname. يبقى تاني لما يجيلي السؤال أول حاجة هحدد إيه نوع الـ
الطريقة اللي هبعت بيها، محتاج أحدد الـ function، هل أنا هبعت وأستقبل ولا هبعت بس؟ طب هبعت بس تمام؟ الـ level of control بتاعي هل من layer 3 اللي أنا هبدأ من أول الـ IP والكلام ده ولا محتاج أغير حاجة بقى في الـ MAC address والـ Ethernet؟ Layer 3 في الغالب هيبقى في الـ layer 3 بس عموماً، فهو كـ layer 3 وهبعت بس فـ send.
طب layer 3 وهبعت وأستقبل فكده عندي احتمالين، أركز بقى في الألفاظ، بيقول لك receive send receive a packet فكده هتبقى sr1، طب send و receive packets فهتبقى sr تمام؟ عشان أبقى واخد بالي أنا هبعت وأستقبل من إيه. طيب بعد ما حددت طريقة البعت على الـ function، أبتدي أمسك الـ packet بتاعتي أشوف كل layer هيبقى فيها إيه، أدي هنا الـ application layer DNS
الـ destination layer UDP الـ transport layer UDP، وكده كده أنا شغال IP version 4 فهيبقى IP protocol تمام؟ بعد ما احدده، أمسك كل object فيهم أشوف أنا هغير فيه إيه. الـ IP كده كده لازم هنغير الـ destination إلا إذا قال هو على حاجة تاني، فهو هيبقى يقوللك الـ destination. الـ UDP يعني هو لما ماسك DNS packet فأنا هكلم DNS server فانا لازم أحط الـ IP بتاع الـ DNS
الـ UDP لو هو قال لي بقى غير الـ transport، لو قال لي غير destination port، source port، الكلام ده. الـ DNS اللي هو الـ application layer أشوف إيه الـ values اللي هو عايزني أحطها في الـ fields. طب أنا عطلت وماعرفش أسماء الـ fields؟ مثلاً الـ DNS يا باشا عندك ls أكتب له الـ DNS الجميلة هيطلع لي أسماء الـ fields.
اللي عنده أهي، عندي length ID Opcode معرفش إيه، arcount dcount dcode والكلام ده، وأشوف إيه الـ field اللي أنا عايز أعمله وأبتدي إن أنا أعدل فيه. تمام؟ تمام. طيب نـ erase نشوف الـ result، أسهل بقى خلاص يعني شفنا إزاي نبعت ونعمل فـ
أشوف، فهو هنا أهو، الـ DNS عمل IP object IP عمل destination، فوقيه حط الـ UDP عدل الـ destination port وادي الـ DNS object عدل، عمل بس الـ rd ده flag للـ recursive زي ما قلنا ده حاجة للـ DNS، والـ qd عدل الـ DNS qr وحط الـ qname تمام؟ بس، وبعد كده بعت
بـ sr whatever هو بقى المفروض هنا عادي لو عملنا send عادي مفيش مشكلة يعني، وبعت الرسالة وادي الـ verbose ده option بيتحط الـ level of verbosity اللي تظهر لك، يعني هل أنت محتاج details تظهر لك بقى ان هو sent والكلام ده ولا أنت مش عايز؟ 0 ده اللي هو أنا مش عايز حاجة، ابعت وخلاص من سكات والكلام ده، اللي هو يظهر لك يعني في الـ command line أو يتعمل لك layout
طيب تاني حاجة الـ HTTP. طيب الـ HTTP natively مش supported، فأنا محتاج أـ craft الـ payload بإيدي بالـ headers بتاعت الـ HTTP يعني مفيش object HTTP جاهز أقدر إن أنا أعدل فيه الـ fields زي ما بنعمل و احط الـ headers. فلا، قال لك هو مش supported ليه؟ لأن كده كده مش عارف السبب بالظبط بس الـ HTTP ماشي هيحط لك الـ method والـ version ومش عارف إيه
بس يعني في حاجات برضه الـ headers بتاعته مش static أوي، فما علينا ما علينا بالسبب، هو مش natively supported فساعتها بحتاج إن أنا أعمل الـ payload بالمنظر ده، زي ما هي على بعضها كده بالمنظر ده وأبتدي إن أنا إيه أعمل لها stacking عادي بالترتيب. يبقى layer 3، layer 4 وأجي عند مكان بقى الـ application layer أنا كده كده مش هحط الـ headers بقى، ما الـ object ده بقى فيه الـ header
والمفروض لو payload بحطها بعديه، تمام؟ يعني لو بصينا المفروض إن هنا يبقى IP ده في العادي يعني، وهنا TCP مثلاً، وهنا application protocol whatever هو إيه، لو أنا بقى دول الـ headers بتاعتي بتوع الـ encapsulation، طب لو أنا في payload بحط الـ payload بعديها، هنا الـ payload بالطريقة بالشكل اللي هي تتفهم
بيه تمام؟ فقال لك أنا معنديش الـ headers بتاعت الـ HTTP، فبعمل إيه؟ أنا بـ encapsulate أو بكتب الـ payload بالـ headers بتاعتها بالمنظر ده وأحطها بعد الـ TCP. تمام؟ فنمسك بقى السؤال، بيقول لي أنا عايز أبعت HTTP request لـ الـ site ده ومديني الـ source port ده ومش مديني أي حاجة. فادي أول حاجة، ده بالنسبة لي ده الـ destination.
ممكن أكتب الـ destination كـ IP وممكن أكتب الـ destination كـ FQDN، تمام؟ اللي هو domain name يعني، وكده كده الـ domain name هيتعمل له resolve مش مشكلة. طيب بعد كده، فكده إحنا طبعاً هنبدأ من layer 3، فأنا محتاج IP وهنا اشتغل TCP
وقال لك إن إحنا معندناش HTTP فأنا هعمل الـ payload بتاعت الـ HTTP بالـ headers بتاعتها بالكلام ده على بعضها هنا أهو. طيب الـ IP هغير فيه إيه؟ هغير فيه الـ destination. الـ TCP هغير فيه الـ source port، تمام؟ وهغير فيه الـ destination port. طيب هو already مش معروف، يعني هو مش متترجم الـ default بتاعه إن الـ destination port بتاع الـ HTTP 80، فانا لما أروح أكلم
على port مثلاً 9000، الـ 9000 ده مش عليه الـ HTTP service فمش هيتفهِم. فلازم أحدد برضه الـ port بنفسي الـ destination في حاجات كده protocols اللي شغالة عليها الـ service دي. تمام؟ طيب، لو جينا نبص هلاقي أدي الـ IP غير الـ destination، أدي الـ TCP عمل الـ destination port 80 عشان أكلم service الـ HTTP أو whatever الـ port هم مشغلين الـ service على أنهي port
وادي الـ source port اللي هو قالهولي. بعد كده حطيت الـ body بتاع الـ HTTP الـ header بالـ payload وابتديت إن أنا عملت لهم stacking فوق بعض مفيش مشكلة بالترتيب. زي ما قلنا هو بيترجم وبيكمل الكلام ده كـ frame ويبعته. طيب، بعد كده بيقول لي عايز أـ simulate الـ TCP handshake إن أنا أبعت syn packet. طيب، أنا عشان أعمل handshake فبنعمل 3 steps: syn
syn-ack وآخر حاجة ack، تمام؟ عشان أـ establish الـ connection. معوقة خالص الـ connection دي. طيب، فهو مأدانيش destination هو في الغالب لو جالكم سؤال في الامتحان هيبقى مديك الـ destination يقول لك ابعت للـ destination ده. فأنا كده محتاج إيه؟ محتاج إيه؟ هبدأ كده كده هبدأ من layer
من layer 3، فأنا كده محتاج أول حاجة الـ IP صح؟ والـ TCP ده فوقيه. خلاص، يبقى أنا كده حددت إيه الـ layers بتاعتي. طيب الـ IP هغير فيه إيه؟ هغير فيه الـ dest. كده كده هو مش قايلها بس أنا هبعتها، ما أنا هبعت syn flag لمين؟ تمام؟ هو هيبقى قايلها في الامتحان يعني. طيب الـ TCP
قال لك الـ TCP هغير فيه إيه؟ هغير فيه الـ flags بتاعتي وأخليها S. بس، لو جينا نبص على الكلام ده، أدي الـ IP غيرت الـ destination وأدي الـ TCP هعمل flags. طب هو هنا ليه حط الـ destination port؟ برضه أنا لما باجي أعمل initialization
على connection على port على service معينة فلازم بعمل initialization على port، لأن الـ port ده بيفضل occupied لحد ما الـ connection أو الـ session تخلص ويتعمل له release تمام؟ فبـ initialize على port معين، فأنا لازم أـ define port، وهو محطليش port معين فأنا احط أي port. أنا عايز يا عم أـ initialize الـ syn communication بتاعي على port
1000، تمام؟ فهو حط هنا 80 مثلاً عايز يـ initialize على HTTP service. Whatever أهم حاجة عندي الـ flags وأن هو حط الـ syn flag بس، وبعد كده عمل send عادي. طيب، عايز أبعت arp request، الـ arp ده بالنسبة لي L3 أو network layer protocol، فأنا مش هستخدم
مش هستخدم فيه الـ Layer 2، يعني مش هستخدم قصدي الـ IP، أنا بستخدم الـ ARP direct. طب الـ ARP ده بيعمل إيه؟ ده بيبقى في الـ local network لما تيجي توصل الـ device بتاعك في أي local network لو جيت تبص على الـ traffic هتلاقي إن في شوية ARP requestات وresponses بتتعمل، broadcast وكده. طب بيعمل إيه؟ قال لي بجيب عن طريقه ببقى معايا IP
وابقى عايز الـ MAC. تمام؟ ما هو أنا أصلاً logically إحنا بنـ communicate على الـ IP، بس physically لما باجي أتواصل لازم أتواصل بالـ MAC. فأنا لما بخش على الـ network أنا معايا الـ IP وعايز الـ MAC، فبحط الكلام ده عندي في table كده عندي على الجهاز اسمه الـ ARP table.
تمام؟ يعني ده باختصار يعني. طيب فالـ ARP بقى protocol بيعمل إيه؟ هو اللي مسؤول إنه يملالي الـ ARP table، يقول لي IP 1 عند MAC address كذا، IP 2 عند MAC address كذا، and so on. جميل. طيب فهو دلوقتي أنا عايز أبعت عشان هو بس متتلخبطوش إنه بيقول لك عايز يبعت request عشان يـ resolve الـ MAC address of a specified IP، لأ هو ماشي هو ده وظيفة الـ ARP.
تمام؟ فالـ ARP الـ request بتاعه الـ broadcast الأساسية بيبقى فيها إيه؟ بيبقى فيها IP. بيرجعلك الـ return بتاعك الـ MAC. فأنت لما بيجيلك بتقول مثلاً: Who has الـ IP كذا؟ فواحد هيرد عليك: آه، بيقول لك الـ IP كذا is at ويديك الـ MAC. فأنت بتعمل إيه كـ ARP بقى؟ الجهاز بيقوم واخد الـ IP ده
مع الـ MAC address ده يقوم حاططهم في الـ table، فخلاص لما يجي يبعتله بعد كده مش هيسأل عليه تاني، أنا معايا بقى الـ IP كذا مع الـ MAC ده كذا، أقوم باعت عليه.  تمام؟ لو جينا نبص، فهو الـ ARP ده already ده layer 3، فانا هبعته على طول، بيبقى فيه أنا عايز أسأل على الـ destination IP، عايز الـ MAC بتاعه، فهو طالما هو كدة كدة في الامتحان هيحددلك I
IP، ما حددش IP، أحط أي IP عشوائي تمام؟ فأنا عايز الـ back address بتاع الـ IP ده وأبتدي إن أنا أبعتها. ده simply put يعني. طيب، آخر حاجة أو مش آخر حاجة، بيقول لي إن أنا عايز أبعت packet، ping packet, ping هي هنا بس مش مكتوبة، مع fake source IP address. طيب الـ ping إحنا قلنا إيه؟ زي ما عملناها كانت IP
وICMP تمام؟ طيب أدي الـ IP وأدي الـ ICMP. إيه اللي هغيره؟ كدة كدة في الـ IP احنا في الـ ICMP بنسيبه default عشان أبعت echo request. طب أنا بغير إيه؟ بغير هنا الـ destination اللي هبعتلها، هو زيادة قال لي أنا عايز fake source IP، فمن مميزات الـ Scapy إن أنا ممكن أغير الـ sour
source برضه. فلو جينا نبص على الكلام ده، نمسح عشان يبقى باين، أهو، أدي الـ IP، أنا في العادي بغير الـ destination، هو مقاليش destination، فعادي أحط أي destination. وأدي الـ ICMP مفيهاش حاجة، الزيادة المرة دي إن أنا غيرت الـ source بتاعي. فكدة لما تروح على الـ destination هيبص إن الـ source جايله من الـ IP ده اللي هو أنا جايلي بتاع من 1.2.3.4، أه فالموضوع إيه كدة كدة الـ packet ممكن
كـ security measures يعني متعديش وتتعملها discard وكلام ده، بس ما علينا يعني، الفكرة إن أنا قدرت إن أنا أـ spoof الـ IP. ده هنا simple IP source، ممكن أحط الـ IP بتاع device تاني عندي في الـ network عشان يبقى واخد باله إني أعتقد إني بكلمه وقصص كدة. تمام؟ وبعد كدة بـ stack الـ objects اللي هو عاملهم stacking وببتدي إن أنا أبعتلها، أبعت
اعمل send. طيب، آخر حاجة أنا عايز أـ send packet، ICMP echo، وأستقبل الـ response بتاعتها جوه الـ code، فساعتها كنا بنستخدم الـ sr1، وأنا عايز أستقدم reply واحدة بس، فأنا عايز أستقبل أول packet، فادي الـ sr
sr1 عشان أستقبل مرة واحدة، لو عايز أستقبل list فـ هأستقبل بالـ sr، وادي الـ send ICMP بتاعتي. والـ packet اللي استقبلتها دي هبتدي إن أنا إيه أستخدمها بقى، أعملها أي حاجة dot show dot nsummary، أو أخش على الـ objects بتاعتها، الـ fields مثلاً dot source وأعرضه، وwhatever أنا هعمل إيه. طيب، ده كان في الـ basic structure إزاي أعمل
أعمل packet، يعني إزاي أـ craft الـ packet وإزاي أـ construct الـ packet بتاعتي بالـ layers والكلام ده. طيب، نيجي بقى عايزين بقى ندخل معانا بقى layers الـ IoT بقى، عايزين نخش بقى ايه MQTT وCoAP والكلام اللي إحنا عمالين هرينا فيه في الـ Wireshark. طيب، قال لي إن الـ MQTT والـ CoAP برضه دول مش natively supported في الـ Scapy
فعشان يحلوا القصة دي، يعني مثلاً protocol مش مستخدم كتير فمش معموله support أو مش موجود native، protocol جديد أنت بتعمله عايز تـ test-ه، عايز تعمله fields، عايز تعمله object والكلام ده، فقال لك هم عملوا إيه؟ قال لك عندي حاجة جوه الـ Scapy directory كدة أو ممكن نقول module عليها اللي هي contrib
اللي هي contribution يعني، فقالك دي بيبقى فيها إيه؟ بيبقى فيها الـ protocols اللي مش supported. مين اللي بيعملها؟ الـ users هما ممكن يعملولها filling أو بيعملوا يعني create-و الـ objects و يـ support-و protocols أو الـ developers نفسهم بيعملوا support عشان ما يعدلوش في الـ basic
Basic code أو الـ basic module أساسي بتاع الـ Scapy مش عايزين كل شوية يقعدوا يعدلوا فيه والكلام ده، فالـ basic عندي ثابت وده auxiliary ليه كده أقدر إني إيه أعمله extend وأستخدم الـ protocols دي عادي برضه يبقى supported معايا والكلام ده. فطبعاً أنا محتاج ممكن أـ install بعد ما بـ install الـ Scapy whatever بس محتاج زي ما قلنا dash all mk Scapy .dot
دي مش بتـ cover كل الـ modules دي بتـ common directories أو packages اللي أنا محتاجها فمش منهم الـ contrib فعلشان أستخدم مثلاً الـ MQTT لازم manually أعمل scapy.contrib.mqtt و أـ import لكل اللي جواها، وهنا برضه contrib .coap. وأعمل import لكل اللي جواها manually ما اعتمدش إن أنا عامل هنا dot all ومش شغالة لا dot all هنا
مش بتـ import كل حاجة. تمام؟ طيب. بعد كده نعمل بقى شوية manipulation على الـ MQTT. لو نفتكر ده كان شكل الـ header بتاعي بتاع الـ MQTT protocol كان عندي نصين الـ fixed header والـ variable length header. طيب كان الـ fixed header كان أول byte بالنسبة لي تعتبر أهم byte اللي هي اللي بنسميها الـ control
Header دي بنسميها الـ control header. عذراً، دي بنسميها الـ control header. طيب الـ control header دي بقى كان بيبقى فيها أول أربعة bits بيحدد لي نوع الـ message وبعد كده الـ duplication flag والـ QoS level والـ retain flag زي ما كنا اتكلمنا عنه. طيب
الـ duplication أو الـ message type إحنا عارفين إن أنا لما باجي أبعت كـ MQTT بيبقى فيه أنواع مختلفة من الـ messages، في publish في connect في ConnAck في PubAck PubRec حاجات كتير أوي ما اتكلمناش عنها بس الحاجات المشهورة publish
subscribe، connect و disconnect، تمام؟ Based على message type بيبقى فيه بقى شوية headers زيادة و payload والكلام ده. فده الـ اللي هنتكلم فيه، أنا بقول كده ليه دقيقة واحدة وهنعرف دلوقتي إيه السبب، فالمهم إن أنا عندي message type فالمهم عندي إن أنا أعرفها منين عن طريق الـ field اللي اسمه message type
طيب. لو أنا عايز أشوف بقى الـ headers بتاعتي دي الـ syntax بتاعها شكله إزاي جوه الـ Scapy بالـ function الجميلة بتاعتنا ls MQTT هيطلعلي أهه الـ type، الـ duplication، الـ QoS، الـ retain، الـ length والكلام ده. تمام؟ طيب. زي ما قلنا أي protocol أو أي object أنا عطلان فيه، ls أشوف إيه الـ fields بتاعتي أشوف الـ syntax وأكتبه عشان حتة الـ auto complete لو إنت مش مظبط الـ interpreter والـ parser بتاعك كويس
يعني الموضوع بيبقى رخم بس عادي هو بيشتغل عادي. تمام؟ طيب. قالك بقى عشان أعمل message فالـ stacking بتاعي إن أنا بيبقى IP فوقيه TCP، الـ MQTT شغال على الـ TCP فوقيه الـ MQTT object بتاعي. طيب. عادةً أنا لو مثلاً جيت عملنا clear هنا أنا طبعاً مش هينفع أـ send علشان الـ
ما عندناش MQTT broker وما عندناش MQ- أنا دلوقتي عامل أهه scapy.contrib mqtt import وممكن كمان إيه منظر يعني نعمل هنا مش MQTT نعمل CoAP تمام؟ الـ import. طيب أنا عادي لو أنا عشان عايز أعمل مثلاً عايز أـ send packet أو أعمل مثلاً الـ packet بتاعتي فهنا
الـ PK بتساوي الـ IP فوقيه الـ TCP فوقيه الـ MQTT. تمام؟ ده الطبيعي. حلو؟ الـ IP بقى هعدل فيه الـ destination والكلام ده أنا بتكلم على الـ basic بس structure. فقالك الـ MQTT أنا أول حاجة محتاج أحدد الـ message
كان قاعد بيبص عالـ syntax مثلاً الـ type، كان اسمها type. عايزين نحدد الـ type بتاعي و equal ونشوف إيه الـ whatever الـ type اللي أنا هكتبه تمام؟ وشوية بقى الـ QoS وماعرفش إيه والقصص دي. طيب بعد كده
الحاجات الزيادة يعني أنا موجود عندي ده الـ fixed header يعني الـ object فيه الـ fixed headers اللي عندي. طيب الحاجات الزيادة؟ قال لي أنا بقى ببتدي أـ stack فوق الـ MQTT بقية الحاجات الزيادة اللي عندي اللي هي مثلاً أنا بـ encode بقى إيه انا عايز أحط topic عايز أحط مثلاً message عايز أحط الكلام ده فبـ encodeـهم بطريقة معينة
علشان تتفهم وبحطهم بـ stacking بيهم ده الـ payload بتاعتي. وزي ما قلنا إن أنا فوق الـ headers بحط الـ payload تمام؟ فده الطبيعي. طيب هو علشان أنا عندي messages كتيرة فقالك Scapy أو هم لما جم يعملوا support لـ الـ MQTT قالك خلاص إحنا هتعمل sub هنعمل type specific layer هنعمل زي sub
objects لكل نوع من الـ message. فإيه الفرق في الـ sub objects؟ قال لي مثلاً عندي object اسمه MQTT.MQTT Connect، فإيه الفكرة؟ الـ MQTT Connect ده جواه الـ fields اللي connect محتاجاها بدل ما أنا أقعد أعملها encoding بنفسي كده وأقعد أعملها في payload والكلام ده لا هو MQTT Connect جواه
Field اللي هو الـ username والـ password والقصص دي. طب MQTT Publish؟ جواها الـ topic والـ field اللي هما already originally مش موجودين في الـ fixed header، هما في الـ variable length تمام؟ فهما عاملين sub layers كده أقدر أستخدمها direct علشان تسهل عليا الدنيا بتاعتي. فساعتها لما أجي أـ build الـ packet بقى كده بعـ
بعد القصة دي بدل ما أحدد الـ type ممكن أحط الـ basic header بتاعي كده وأقوم قايله MQTT Connect أهيه. تمام؟ وأبتدي إن انا أعدل بقى، اقوله مش هقوله بقى الـ type، هو كدة كدة already معروف MQTT Connect فالـ type بتاعها جاهز والحاجات الأساسية جاهزة، لو أنا طبعاً عايز أعدل الـ QoS والكلام ده أبتدي أعدل هنا بقى ايه مثلاً الـ username
تمام؟ بيساوي والـ password بيساوي والكلام ده. فبدل ما كان الـ control بتاعي بقى كل حاجة بعملها manual بعد الـ fixed header، قالك خلاص إحنا هنعملك sub types يا عم لكل نوع message تبتدي إن إنت تستخدمه على طول. كده viable أستخدمه بل زيادة بقى الحلو إن أنا ممكن أشيل دي خالص وأبعت كده
على طول. مش لازم أحط الـ basic MQTT. لو عملت IP و TCP و MQTT كده هتتبعت معايا وهتشتغل عادي. تمام؟ يبقى كدة كدة IP TCP MQTT لو أنا هعمله manual أو لو أنا طبعاً هستسهـ يعني بالنسبة لي أسهل عشان يبقى الـ control fields موجودة بدل ما أعملها بإيدي وأغلط في الـ encoding والكلام ده، فـ أستخدم إيه نوع الـ message اللي عندي أشوفها connect، publish
ConnAck والكلام ده وأبتدي إن أنا ايه؟ أعملهم هنا. طيب. قالك هنا نعمل سؤال، قالك عايز أـ send connect command MQTT يبقى أنا كدة عرفت نوع الشغل اللي هي نوع الـ packet بتاعتي إيه MQTT
Connect. تمام؟ يبقى كدة إيه؟ أدي إيه عرفت نوع الـ message. طيب. نكمل. قال لي عايز أبعته لـ broker بالـ IP كذا، بالـ destination port كذا، والـ source port كذا، والـ client ID لازم يبقى كذا، والـ packet لازم تبقى MQTT version 5. طيب you should receive a packet back
طيب. إحنا قلنا زي ما قلت في أول حاجة لازم أـايه؟ أفصص السؤال. فأول حاجة أنا هبعت وأستقبل ولا هبعت بس؟ قالك 'you should receive a packet back' فأنا هبعت وأستقبل. هستقبل كام واحدة؟ يبقى أنا كدة هستخدم sr1. فأخد بالي من الفاظي يبقى أنا كدة خلاص كدة عرفت هبعت إزاي. طيب نبتدي الـ stack بتاعنا. هو عايز MQTT connect. طب الـ basic بتاعي إيه؟
IP هو ما حددليش حاجة في الـ Ethernet ولا الـ MAC ولا الـ Layer 2 فخلاص هنبتدي من Layer 3 هستخدم sr مش srp. IP فوقيه TCP فوقيه الـ MQTT. طيب بدل ما أحط الـ MQTT بس فـ أنا already هستخدم ايه؟ هو قال لي أنا عايز connect command فـ هحط MQTT Connect
تمام؟ طيب يبقى ده الـ basic structure بتاعي. نمسك بقى كل جزء نعدل فيه. قالك الـ IP أنا عايز أعدل الـ broker أنا هبعت لي مش من، لي يعني الـ destination بتاعتي كذا فأنا هغير هنا الـ dest. طيب. وقال لي الـ destination port كذا والـ source port كذا. فخلاص يبقى أنا هغير الـ sport والـ
الـ dport. طيب. حاجة تاني flags ولا لا؟ لا. طيب. بعد كدة قال لي في الـ MQTT Connect أنا عايز أغير الـ client ID وعايز أغير الـ MQTT version. طيب أنا مش عارف الـ syntax بتاع الـ client ID. نروح لـ ls صديقتنا ونكتب
MQTT Connect. أه هو هنا بيقولي مش defined لأن أنا محتاج إن أنا أعمله إيه؟ from Scapy.contrib أعمله برضه هنا import برضه وأبتدي إن أنا هعمل MQTT Connect هيطلع. برضه حتى في الـ command line كويس إن أنا عملت كدة، ممكن ما تشتغلش معاك الحاجات اللي هي في الـ contrib
مش هتشتغل direct فلازم إيه إن إنت إيه تعملها import. تمام؟ طيب. فهنا هنلاقي إحنا عايزين نعدل إيه؟ الـ protocol level، الـ protocol level أهو. ده بيبقى فيه رقم. الـ b دي معناها إن ده byte منتظر byte string، يعني الـ string ده byte string مش string عادي
فإحنا هنا عايزين نغير الـ client ID، فـ اسمها إيه؟ نشوف أدي الـ client ID خلاص عرفنا اسمها الـ client ID، وبرضه مستني byte number فهديله في string و احطله وهو هيحولها بقى byte string. وعايز يغير ايه؟ الـ version. الـ version بتحكم فيه عن طريق الـ protocol
level. طيب الـ protocol level ده بياخد رقم. الرقم ده بتعامل معاه إزاي؟ لو إديته 3 يبقى أنا هشتغل بـ version 3.1، إديته 4 هشتغل بـ version 3.1.1، إديته 5 هشتغل بـ version 5. الـ default بتاعي 5 اللي هو هيشتغل بـ version 5 فأنا already كده كده هشتغل فلو سبتها default تمام بس طالما متحددة في السؤال لازم برضه أحدد
ما أعتمدش على الـ default، specifically أنا هشتغل بـ version كام. يبقى أنا كدة هعمل protocol level 5، وهعمل الـ client ID بالـ client ID اللي مديهاني. تمام؟ نمسح بقى العبث ده ونشوف الكلام ده. أدي شكل البروتوكول، أدي شكل، أول حاجة أدي الـ IP هو حطها في variable وأدي الـ port
الـ dport عمل الـ destination، عمل الـ destination port وعمل الـ source port وأدي الـ client ID وأدي الـ protocol level. بعد كدة عمل stacking للـ packet للـ objects فوق بعض وعمل sr. تمام؟ ده الـ CoAP برضه دي الـ headers بتاعتي، الـ version، الـ type، الـ token length والكلام ده والـ message ID. اللي يهمني إن أنا أفرق بين الـ CoAP code والـ type. الـ CoAP code ده الـ method
الـ method اللي أنا بستخدمها. يعني لو قال لي أنا عايز CoAP message get، put، post، delete، من الـ code. خلي بالي من النقطة دي كويس أوي يبقى ان أنا بعدل في الـ code. ده اللي بيحدد إيه الـ method اللي أنا بعملها. طيب الـ type ده إحنا ما اتكلمناش عليها، يعني في أنواع من الـ messages اللي هي confirmable، non-confirmable، كلام ده مش مشكلة، فده في الـ type مش قصتنا
قصتنا إيه؟ إن أنا لو قال لي عايز مثلاً get packet أو post packet فـ ده بغير في الـ code فقط، عشان ما أجيش أغير في الـ type وتبقى اهي كدة الموضوع غلط خالص. طب لو جينا نبص على الكلام ده encode بقى على برضه الكلام ده الـ syntax بتاعه إزاي، ls CoAP أبص ألاقي إيه ده الـ syntax بتاع الـ message ID، token، الـ option
الـ pay mark، الـ type، إحنا مش هنشتغل بقى في الـ type إحنا شغالين في إيه في الـ code اللي إحنا قلنا عليه لو أنا عايز أغير الـ method. تمام؟ طيب الـ CoAP مش زي الـ MQTT فـ مش عامل sub objects والكلام ده فهو object واحد وأبتدي إن أنا أغير فيه manual بإيدي وأعمل اللي أنا عايزه. طيب الـ layers بتاعتي ما أنساش دي مش حاجة هتتقال إن أنا الـ CoAP
و ممكن ما تتقالش يعني، الـ CoAP بيشتغل UDP، الـ MQTT بيشتغل TCP. CoAP UDP، MQTT TCP. تمام؟ طيب قالي باستخدام sr1 هو خلاص حددها direct، هـ build CoAP packet يبقى أنا كدة عرفت إيه إن أنا أول حاجة عندي الـ application layer
CoAP. ببني عليه إن أنا كدة عارف إن الـ CoAP بيشتغل UDP. تمام؟ وفوقيه كدة كدة الـ IP. يبقى أنا كدة حددت الـ stack أو الـ headers اللي أنا هعملها. طيب فـ بيقول لي إن هي هتبقى sent لـ الـ destination address كذا، تمام؟ والـ source والـ IP address، آخد بالي أيوه الـ source والـ IP الاتنين نفس الـ value فـ أنا الـ source و الـ IP الـ source والـ destination هغيرهم
وبيقول لي إن أنا عايز الـ request بتاعي get وأي arbitrary message ID، يبقى أي message ID. طيب نمسك بقى الحاجات اللي هنغيرها. فـ أنا أول حاجة هنا هغير الـ destination باللي هو قايلهولي هنا. تمام؟ طيب الـ UDP الـ transport قال لي هغير الـ S والـ Port الـ source والـ destination po
port اه. الاتنين هيبقوا نفس الرقم ده. بعد كدة الـ CoAP نفسه هغير فيه إيه؟ قال لي الـ message ID هحط أي message ID من عندي طالما كدة مثلاً أحطله 1 2 3 4 whatever. الـ CoAP request بتاعي عايز إنه يبقى get request فساعتها أغير إيه الـ code equal
1. الـ get بتاعي كان بـ 1 زي ما عملته في الـ Wireshark وشفت يعني. فلو جينا نبص على الـ code أهو، في الـ IP مغيرش غير الـ destination، sport والـ destination port، وبعد كدة الـ code 1 والـ message ID بتاعي بأي حاجة ID.تمام؟ هـ stack الكلام ده وأبتدي إن انا أستخدم sr1. طب هو هنا محددش قال أنا ممكن تكملة للسؤال أقولك طب الـ message sr1
والـ message اللي هتجيلك عدل فيها مثلاً الـ code خليه الـ code equal 2. فـ هعمل إيه؟ فأنا already لو جينا بقى نعمل الكلام ده، فالمفروض إن أنا مثلاً مثلاً نعتبر إن دي الـ packet بتاعتي بتاعت الـ CoAP يعني هنا الـ CoAP
تمام؟ هي كانت كلها capital أو okay C capital. والكلام ده. ماشي. أدي الـ CoAP، هنعمل هنا مثلاً الـ code equal 1. تمام؟ طيب. مفروض إن أنا مثلاً هعمل sr فالمفروض إن الـ result هترجعلي هنا هتبقى sr1
وأديها الـ packet بتاعتي. تمام؟ طيب هو قال لي بقى، هو ما قاليش هنا مثلاً قال لي خلاص ابعت، فقال لي لو إنت مثلاً قالك الـ packet اللي جاية عدل فيها الـ code فـ هتبقى result الـ packet اللي جاية dot code وأساوي الـ code أخليه whatever الرقم اللي هو عايزه. تمام؟ يبقى result اللي جاية ببتدي إن انا access الـ fields اللي فيها بإن أنا بقى بدوس dot زي ما شفنا وإحنا بنعمل، وأقوله إيه الـ field اللي أنا عايز أغيره. already بقت bpacket، packet زي دي بالظبط، نفس الـ objects وكل حاجة فبقوله إيه
dot code. لا dot code دي مش هتنفع direct، ليه؟ طيب نعتبر إن حد قال إن هي ما علينا. طيب ليه؟ الـ result دي عبارة عن إيه؟ الـ structure بتاعها لو نيجي هنا نفضي دي، نرسم
الـ structure بتاعها، أدي الـ packet. دي كانت الـ PK صح؟ فكانت عبارة عن إيه؟ object بالنسبة لنا بالبداية اللي إحنا هنعرف نتكلم عليها يعني IP اللي إحنا شفناه لكن كدة كدة فيه Ethernet تحت. طيب. و object UDP
و object CoAP صح؟ كل واحد فيهم فيه الـ values بتاعته. طب لما أنا جالي result، الـ result دي شكلها عامل إزاي؟ ما هي نفس الفكرة برضه، هتبقى IP و UDP و CoAP. الـ result بتاعتي نفس الـ structure صح؟ طب أنا عايز
أو whatever الـ result اللي جيالي فـ أنا علشان أحدد أـ access حاجة معينة ولا لا لازم أـ access الـ object بتاعها نفسه. فـ أنا مثلاً هنا في الـ PK عايز أـ access الـ code من هنا فعلشان أـ access الـ code، الـ PK بتاعتي بعمل إيه؟ لازم أـ access الـ object اللي هو بالنسبة لي
الـ CoAP. يبقى أنا كدة بقوله أنا ماشي أنا دلوقتي ده object فهو بيشاور على شوية objects أصلاً جواه فـ أنا محتاج أقوله عايز الـ object بتاع الـ CoAP هاتلي الـ code بتاعي بيساوي كذا. طيب ده viable أعتقد و syntax ليه بس
إن أنا ممكن أعمل PK dot CoAP dot code مثلاً equal كذا. يعني ممكن square بس بـ square brackets أضمن يعني. كدة أو كدة، لأنها في الغالب كلها pointers بتشاور على بعض، objects و pointers بتشاور على بعض. تمام؟ فلو عايز يعدل مثلاً الـ code فساعتها إيه whatever شكل الـ result اللي جاية فلازم
أكون محددله أول حاجة دي الـ result دي الـ packet كلها فـ أنا عايز أـ access ايه؟ الـ CoAP object، تمام؟ أعمل فيه إيه؟ أقوله dot هات الـ code. واخدين بالكم من الحتة دي؟ بس كدة دي بقى هتنقلنا
للنقطة الجاية إن أنا وأنا بعمل parsing للـ pcap files. زيه زي ما قلنا أنا ممكن أـ sniff online ممكن أقرأ offline عن طريق function اسمها rdpcap، تمام؟ rdpcap بعملها وبكتب r وبديله اسم الفايل. طبعاً أنا ممكن أدي اسم الفايل direct لو أنا الـ path بتاعه defined في الـ path variable بتاع الـ environment
والقصة دي أو أنا أحط الـ path بتاع الفايل whatever يعني أنا هشتغل إيه. المهم إن rdpcap هتقرأ الـ packets كلها اللي في الفايل وترجعلي إيه list of packets، تمام؟ دي list. طيب الـ list of packets دي الـ element الواحد شكله عامل إزاي؟ عبارة عن packet، صح؟
للي هي بالنسبة لي الـ packet دي عبارة عن إيه؟ زي ما شفنا فوق، شوية layers موجودة مع بعض، مثلاً IP، TCP، DNS مثلاً أو whatever IP دي packet، تمام؟ اللي هي شوية layers. فـ أنا علشان أـ access حاجة جوه الـ packet بعمل إيه؟ بحدد الأول أنا عايز أنهي object من دول بحدده ازاي؟ بـ square brackets أقوله يا عم أنا عايز الـ TC
الـ TCP. طيب جوه الـ TCP بقى إحنا عارفين إن فيه شوية headers علشان أـ access الـ headers بالـ dot. أقوله مثلاً TCP.source أو source port أو sport أو whatever الـ syntax بتاعها. تمام؟ يبقى أنا جايلي دي list of packets كل packet الـ structure بتاعها زي ما شفنا شوية أهو يعني ده الـ packet لو عملناه بشـ
بشكل تاني شوية objects فوق بعض. فـ أنا عشان أـ access field جوه object لازم الأول أـ define أنا هـ access أنهي object فبقوله أنا عايز يا عم الـ object TCP. ماله بقى الـ object TCP؟ dot هاتلي من جواه الـ source. فساعتها أعمل بقى equal أخد الـ value أو whatever. فـ لو جينا نبص على الـ file ده
تمام؟ ده file معمول ودي آخر حاجة يعني إن شاء الله. قال لي إن الـ file ده عايزين نعدله أمشي عليهم وأجيب الـ packet اللي هي الـ packets الـ MQTT Connect وأبتدي إن أنا أغير الـ username والـ password. طيب يا سيدي شكراً. أولاً الـ break دي مش عايزينها مش مشكلة سيبك من الـ break إحنا عايزين ايه
سيبك من الـ count والكلام ده. فأول حاجة أنا هقرأ من الـ file اللي هو old.pcap، تمام؟ فاللي معايا دي list. أبسط طريقة علشان أـ loop على الـ listـا هي إن أنا أمشي عليها object object هي list of objects. فلو قلت for packets in packet in packets فـ كل iteration الـ packet ده شايل إيه packet من الـ packets يعني هي شوية packets مع بعض فـ أنا معايا دلوقتي pa
packet منهم. طيب. برضه أبسط طريقة إحنا قلنا دلوقتي إن انا الـ packet عبارة عن شوية أهيه الـ packet الواحدة عبارة عن شوية objects فوق بعض، صح؟ فلو انا جيت أـ access أنا مثلاً عايز أتاكد بقى دي برضه الـ simple أبسط طريقة لو حد عنده طريقة مختلفة أو sophisticated أو whatever برا
براحتك يعني بس أبسط طريقة إن إحنا نلعب إيه يعني أسهل حاجة أعبط حاجة ممكن تتعمل إن أنا دلوقتي أنا عشان عايز أتاكد من packet معينة أنا عايز أعرف الـ packet دي DNS ولا CoAP ولا مثلاً MQTT أو MQTT Connect كمان
طب هعرف منين؟ أنا دلوقتي الـ IP موجود. تمام؟ سيبك من الـ CoAP، DNS ولا MQTT عشان يبقى الاتنين TCP. الـ TCP موجود. طيب أنا عايز أعرف إيه اللي هيفرق بين دي ودي؟ ما دي packet ودي packet، دي object ودي object. إن أنا الـ object اللي فوق هنا هيبقى DNS وهنا الـ object اللي فوق هيبقى MQTT Connect يعني ده هيبقى موجود في الـ packet
دي لو هو الـ packet MQTT فـ فيها الـ object ده، لو الـ packet DNS هيبقى فيها الـ object بتاع الـ DNS صح؟ فعلشان أتأكد بقى الـ packet دي هي اللي أنا عايزها أو من نوع اللي أنا عايزه ولا لا، هـ access على طول packet of وأديله الـ object اللي أنا عايزه. فلو الـ packet دي MQTT Connect packet خلاص هيخش يكمل الـ
execution. طب لو هي مش connect، الـ object ده مش موجود فـ أنا كدة بـ access حاجة مش موجودة فهضرب error فعشان كدة حطينا جوا try و except وأبتدي أقوله pass خلاص، يبقى لو هو الـ object مش موجود يبقى الـ packet دي أنا مش عايزها. تمام؟ لو الـ object موجود يبقى الـ packet دي MQTT Connect أنا عايزها. طيب هو عايز نعدل إيه؟ عايزني أعدل الـ
الـ code بحيث إن أنا أعدل جوه الـ MQTT الـ packets بتاعت الـ MQTT Connect أعدل الـ username والـ password. فـ بس ببساطة أدي الـ packet أقوله خلاص يا عم هات الـ object بتاع الـ MQTT Connect هات الـ username اللي جواه وساويوهولي بـ new. تمام؟ عايز الـ password
هات يا عم packet of MQTT  بردو Connect dot password وساويه بـ new. يبقى أنا كدة دخلت جوه الـ packet جوه
الـ object بتاع الـ MQTT وقلتله هات يا عم الـ field اللي اسمه username وهات الـ field اللي اسمه password وعدله. تمام؟ أخلي بالي إن أنا لو أنا عايز آخد الكلام ده في temp فـ هعمل temp equal packet. كدة أنا خدت إيه؟ عملت copy للـ packet كلها في الـ temp. تمام؟ غير إن أنا لو أعمل MQ-
TT Connect. تمام؟ أنا كدة عملت إيه؟ أنا كدة عملت copy للـ object اللي هو الـ MQTT جوه الـ temp. فالـ temp دي جواها إيه؟ object واحد اللي هو الـ MQTT Connect كأني بعمل MQTT- كأني عملت ايه؟ كأني عملت temp
equal MQTT Connect وعملت كدة عملت initialization object. فده ساعتها اللي هيبقى جوه الـ temp لو أنا أخدت copy من الـ object ده. إنما أنا عايز آخد الـ packet كلها فـ هاخد الـ packet كلها وآجي أـ access هتبقى temp of أشيل الـ packet دي وأحط إيه temp وهنا temp. تمام؟ عدلت بقى whatever بقى عايز إن أنا أـ send الكلام ده تاني، أعمل send-
أديله الـ temp، عايزة sr وكلام ده whatever أنا عايز أعمل إيه. بس كدة وده كان الـ يعني أهو أنا مكتوبة كمان comment يعني لو إنت عايز تـ test it out وكلام ده بس طبعاً ده هيبقى إحنا مفيش broker فـ إحنا مش بنشتغل
الـ MQTT بس whatever يعني عشان إنت لازم تحدد destination معينة طبعاً، فـ أدي الكلام ده لو حد عايز يدعبس ويجرب يعني ويبقوا عادي معاكم. وبس كدة أعتقد أتمنى يكون حد عنده سؤال؟ محدش عنده سؤال ومحدش هيرد يعني؟ طيب خلاص. أتمنى يكون يعني الشرح
الشرح واضح شوية، ماكنش لغبطتكم توهتكم معايا، ويكون فيه استفادة منه وأشوفكم على خير يا شباب وربنا معاكم.