2012-06-12 21 views
13

मैं मोड़ के साथ स्कैपी को एकीकृत करने पर काम कर रहा हूं, लेकिन मैं ओएसएक्स पर इस अजीब बग में भाग गया कि मुझे पता लगाना प्रतीत नहीं होता है।कच्चे सॉकेट और पायथन में प्रेषण

असल में मैं कच्चे सॉकेट के माध्यम से एक वैध टीसीपी पैकेट (आईपी हेडर सहित) भेजने में असमर्थ हूं।

import socket 
from scapy.all import IP, TCP 
pkt = IP(src='0.0.0.0', dst='127.0.0.1')/TCP() 
spkt1 = str(pkt) 
outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) 
outs.sendto(spkt1, ('127.0.0.1', 0)) 

जब मैं इस मैं निम्नलिखित त्रुटि मिलती है चलाएँ::

outs.sendto(spkt1, ('127.0.0.1', 0)) socket.error: [Errno 22] Invalid argument

मामले में आप पर यह इस का उपयोग नहीं करना चाहते Scapy की जरूरत नहीं है यह मैं क्या कर रहा हूँ है पैकेट बेस 64 एन्कोड किया गया है:

import base64 
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==") 

बहुत ही अजीब बात एक पैकेट है कि लगभग समान है ठीक से आया प्रतीत होता है जो:

spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==") 

इस तरह दो पैकेट की तरह लग रहे: wireshark में उन्हें बाहर की जाँच के वे केवल टीसीपी भाग में अलग करके

SPKT1 
0000 45 00 00 28 00 01 00 00 40 06 FB CE 00 00 00 00 E..([email protected] 
0010 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........ 
0020 50 02 20 00 10 7E 00 00       P. ..~.. 
SPKT2 
0000 45 00 40 00 05 B0 00 00 02 06 00 00 00 00 00 00 [email protected] 
0010 7F 00 00 01 00 C8 03 84 00 00 00 00 00 00 00 00 ................ 
0020 B0 02 00 C8 00 7B 00 00 02 04 05 B4 01 03 03 01 .....{.......... 
0030 01 01 08 0A 4D CF 52 33 00 00 00 00 04 02 00 00 ....M.R3........ 

मैंने कई अलग-अलग प्रयोग किए हैं और मैं पैकेट भेजने के लिए कुछ विशिष्ट टीसीपी विकल्पों को सेट करके अंत में सक्षम था, लेकिन यह समझ में नहीं आता कि इस तरह के एक पैकेट को काम नहीं करना चाहिए।

क्या किसी को पता है कि यह क्यों हो रहा है?

संपादित करें:

इस पैकेट प्रकट होता है काम करने के लिए:

pkt = IP(len=16384, src='0.0.0.0', dst='127.0.0.1', 
    id=RandShort(), ttl=2)/TCP(sport=255, 
     dport=900, flags="S", window=200, 
     options=[('MSS', 1460), ('WScale', 2)]) 
spkt = bytes(pkt) 
spkt += '\x00'*20 

यह काम नहीं करता आप शून्य नहीं जोड़ते हैं तो।

+0

क्या आप अपने पहले कोड स्निपेट में 'आयात' को ठीक कर सकते हैं? (भी, मजेदार तथ्य जब मैं आपके प्रश्न के अनुरोध के माध्यम से पढ़ता हूं: आप '" ... ".decode (" base64 ")' और '" ... ".encode (" base64 ") 'आयात बेस 64' के बजाय' का उपयोग कर सकते हैं) । ठीक है, क्षमा करें, इस के साथ मदद नहीं कर सकता। लेकिन आपके पास मेरा उत्थान है। –

+0

हां, आयात तय किया गया। –

+0

FWIW, मुझे आपके कोड पर एक ही त्रुटि मिल रही है। –

उत्तर

3

मैंने फैसला किया कि कच्चे सॉकेट केवल प्रयोग करने योग्य हैं। खासकर जब से इस सॉफ़्टवेयर को क्रॉस प्लेटफार्म होने की आवश्यकता है, ओएसएक्स के लिए क्विर्क अन्य ओएस पर लागू नहीं हो सकता है।

उस समय के लिए मैंने बस "सॉकेट" को लपेट लिया जो स्कैपी द्वारा प्रदान की जाती है। भविष्य में मैं कुछ लिखूंगा जो केवल libdnet पर निर्भर करता है (जैसा कि कच्चे फ्रेम लिखने के लिए स्कैपी करता है)।

आप इस यहाँ लागू किया पा सकते हैं:

https://github.com/hellais/txscapy

0

0.0.0.0 मेरे लिए एक मान्य आईपी स्रोत पता नहीं दिखता है। क्या इसे किसी अन्य मूल्य में बदलना कोई फर्क पड़ता है?

+0

ऐसा लगता है कि इससे कोई फर्क नहीं पड़ता। –

+0

नहीं, इससे कोई फर्क नहीं पड़ता। उत्सुकता से यह पैकेट, उदाहरण के लिए, काम करने के लिए प्रतीत होता है: pkt = आईपी (लेन = 16384, src = '0.0.0.0', dst = '127.0.0.1', आईडी = रैंडशॉर्ट(), ttl = 2)/टीसीपी (खेल = 255, डपोर्ट = 900, झंडे = "एस", विंडो = 200, विकल्प = [('एमएसएस', 1460), ('डब्ल्यूएसकेले', 2)] स्पैक्ट = बाइट्स (पीकेटी) spkt + = '\ x00' * 20 यदि आप 20 शून्य जोड़ नहीं पाते हैं तो यह दूसरे की तरह विफल रहता है। (पोस्ट में पैकेट को सही ढंग से स्वरूपित किया गया) –

+0

अजीब। पता नहीं। मेरा अगला विचार यह है कि ओएस एक्स कर्नेल इस तरह की अस्पष्ट बग से भरा है। ;) –

0
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import socket 
>>> from scapy.all import IP, TCP 
WARNING: No route found for IPv6 destination :: (no default route?) 
>>> pkt = IP(src='0.0.0.0', dst='127.0.0.1')/TCP() 
>>> spkt1 = str(pkt) 
>>> 
>>> outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) 
>>> outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1) 
>>> outs.sendto(spkt1, ('127.0.0.1', 0)) 
40 

मैं पैकेट की कि विशिष्ट सेट लेखन किसी भी त्रुटि है लगता नहीं है - मैं एक 2.6.38- * जीएनयू/लिनक्स कर्नेल के साथ x86_64 उपयोग कर रहा हूँ।

शायद आपकी समस्या कच्चे सॉकेट के साथ कुछ मैक ओएस एक्स मस्तिष्क क्षति से संबंधित है?

0

एक अन्य संबंधित मुद्दे। पायथन impacket मॉड्यूल में ping.py स्क्रिप्ट होस्ट करने के लिए स्क्रिप्ट है।मैक ओएस एक्स शेर मैं इस स्क्रिप्ट का उपयोग करते समय कोई त्रुटि है:

Traceback (most recent call last): 
    File "/private/var/www/env/bin/ping.py", line 73, in <module> 
    s.sendto(ip.get_packet(), (dst, 0)) 
socket.error: [Errno 22] Invalid argument 

लेकिन Ubuntu पर सब कुछ ठीक काम करता है और मैं मेजबानों से उत्तर मिल रहा है।

0

मेरे पास कोई कठोर सबूत नहीं है, लेकिन मुझे लगता है कि यह ईथरनेट न्यूनतम पेलोड आकार से संबंधित हो सकता है।

wikipedia से

:

The minimum payload is 42 octets when 802.1Q tag is present and 46 octets when absent.

आपका पहला उदाहरण पैकेट केवल 40 बाइट्स था, तो यह या तो मामले में सीमा से नीचे होगी। आप पैडिंग को 20 बाइट्स से उन मानों में बदलने के साथ प्रयोग कर सकते हैं ताकि यह सत्यापित किया जा सके कि यह सीमाओं में से एक पर काम करना बंद कर देता है।

यदि ऐसा है, तो व्यवहार सही समझ में आता है; ओएस पैकेट को खारिज कर रहा है क्योंकि आप इसे वैध पैकेट बनाने के लिए पर्याप्त डेटा नहीं दे रहे हैं।

1

32 बिट्स के एकाधिक होने के लिए एक आईपी हेडर की आवश्यकता होती है। और अंत में एक पैडिंग क्षेत्र भी है।

तो हेडर में सेट किए गए आईपी विकल्पों के आधार पर - जो कि बिट्स की एक परिवर्तनीय मात्रा में है - किसी को बिट्स और पैडिंग गिनने की आवश्यकता है।

ऐसा लगता है कि अलग-अलग ओएस इसे अलग-अलग संभालते हैं। कोई यह सोच सकता है कि एक चालाक ओएस आपके लिए यह पैडिंग करेगा।

संबंधित मुद्दे