سؤال

لقد بدأت مؤخرًا في استكشاف Scapy. أداة رائعة بالفعل!

لدي مشكلة ... عندما أراقب بطاقة الشبكة الخاصة بي باستخدام Wireshark وأقوم بعمل Ping منتظم من موجه أوامر Systems مع تثبيت Ping القياسي ، يظهر Wireshark مع "Ping Request" ثم "Ping Reply" مؤشر على أنه أرسل رد. ولكن عندما أفعل ذلك يدويًا في Scapy ، لا يرسل أي رد .. كيف يمكن أن يكون هذا؟ لقد أمضيت الكثير من الوقت في محاولة لمعرفة ذلك ، لذلك آمل حقًا أن يتمكن شخص ما من إلقاء بعض الضوء على هذه القضية من لي ...

هنا هو الرمز الذي استخدمته:

>>> from scapy.all import IP, ICMP, send
>>> IP = IP(dst="127.0.0.1")
>>> Ping = ICMP()
>>> send(IP/Ping)

يتم إرسال الحزمة بنجاح ويظهر Wireshark طلب Ping الذي تم استلامه ، ولكن ليس أنه قد أرسل رد.

هل كانت مفيدة؟

المحلول

هذا أسئلة وأجوبة:

لا أستطيع ping 127.0.0.1. لا يعمل Scapy مع 127.0.0.1 أو على واجهة الاسترجاع

واجهة الاسترجاع هي واجهة خاصة جدا. الحزم التي تمر بها لا يتم تجميعها وتفكيكها. توجه kernel الحزمة إلى وجهتها بينما لا تزال مخزنة هيكلًا داخليًا. ما تراه مع tcpdump -i lo ليس سوى مزيف لتجعلك تعتقد أن كل شيء طبيعي. لا يدرك kernel ما يفعله Scapy خلف ظهره ، لذا فإن ما تراه على واجهة الاسترجاع هو أيضًا مزيف. باستثناء هذا لم يأت من هيكل محلي. وبالتالي فإن النواة لن تستقبلها أبدًا.

من أجل التحدث إلى التطبيقات المحلية ، تحتاج إلى إنشاء حزمك الجزء العلوي من الطبقة العلوية ، باستخدام مقبس PF_INET/SOCK_RAW بدلاً من PF_PACKET/SOCK_RAW (أو ما يعادلها في أنظمة أخرى Linux):

>>> conf.L3socket
<class __main__.L3PacketSocket at 0xb7bdf5fc>
>>> conf.L3socket=L3RawSocket
>>> sr1(IP(dst="127.0.0.1")/ICMP())
<IP  version=4L ihl=5L tos=0x0 len=28 id=40953 flags= frag=0L ttl=64 proto=ICMP chksum=0xdce5 src=127.0.0.1 dst=127.0.0.1 options='' |<ICMP  type=echo-reply code=0 chksum=0xffff id=0x0 seq=0x0 |>>

نصائح أخرى

جرب هذا

def ping(host, repeat=3):
    packet = IP(dst=host)/ICMP()
    for x in range(repeat):
        response = sr1(packet)
        response.show2()

أنت لا تخزن الرد بشكل صحيح

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top