2012-08-01 28 views
7

मैं टीसीपीडम्प का उपयोग करके http शीर्षलेखों को स्नीफ करने की कोशिश कर रहा हूं।टीसीपीडंप फ़िल्टर और बिट-मास्किंग को समझना

इस फिल्टर अच्छी तरह से काम करता है लेकिन मैं इसे नहीं समझ सकता -

(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) 

मैं इसे googled है, लेकिन मैं किसी भी उपयोगी जानकारी

यहाँ नहीं मिल सकता है पूरे tcpdump आदेश

है
sudo tcpdump -A 'dst [dest host] or src [src host] and tcp and 
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -i eth0 

उत्तर

15

यह बीपीएफ फ़िल्टर नहीं है जो http शीर्षलेख प्राप्त करता है लेकिन आपके टीसीपीडम्प कमांड पर "-ए" स्विच हो जाता है।

आपका tcpdump कमांड कुछ गंतव्य पर या eth0 पर एक निश्चित स्रोत से टीसीपी यातायात की तलाश करता है जहां अंतिम बीपीएफ फ़िल्टर में ऐसी गणना शामिल होती है जो नॉन-शून्य कुल में होती है। "-ए" विकल्प के साथ, यह एएससीआईआईआई में प्रत्येक पैकेट को लिंक लिंक हेडर से घटाता है।

मैंने नीचे गणना की व्याख्या की है लेकिन मेरा मानना ​​है कि वास्तविक फ़िल्टर में कुछ समस्याएं हैं, संभवतः प्रतिलिपि बनाने और पेस्ट करने के माध्यम से। आप tcpdump में इन फ़िल्टर का उपयोग करते हैं, तो आप टीसीपी बिट मास्किंग, जो आम तौर पर जब खेतों कि बाइट सीमाओं

  • ip[2:2] दो बाइट्स (यानी 3 & 4 बाइट्स) को संदर्भित करता है पर गिर नहीं है की जांच के लिए किया जाता है का उपयोग कर रहे आईपी ​​हेडर में, बाइट 2 से शुरू होता है (याद रखें कि यह ऑफ़सेट 0 से शुरू होता है)। यह कुल आईपी पैकेट की कुल लंबाई का प्रतिनिधित्व करता है जो अधिकतम 65535 बाइट्स हो सकता है।

bitmask यहाँ के लिए, स्पष्टता के लिए, मैं पूर्व pended एक '0' तो 0xf0x0f हो जाता है मुखौटा है। मुखौटा पर अग्रणी '0' नीचे गायहरिस से टिप्पणी के अनुसार गिरा दिया गया है।

  • ip[0]&0x0f, आईपी शीर्षक में बाइट 0 की दूसरी छमाही (यानी 1 बाइट) है, जो आप 32 बिट शब्दों में और जैसे IP हेडर लंबाई दे देंगे को संदर्भित करता है यह आम तौर पर के लिए 4 से गुणा किया जाता ऐसी गणना

  • tcp[12]&0xf0), बाइट 12 की पहली छमाही (यानी 11 वीं बाइट) है, जो है डेटा ऑफसेट क्षेत्र है, जो 32-बिट शब्दों में और इस तरह के रूप टीसीपी हेडर के आकार को निर्दिष्ट करने के लिए संदर्भित करता है यह आम तौर पर से गुणा किया जाता 4 ऐसी गणना के लिए।

आप 4 से पिछले 2 लंबाई गुणा करने के लिए है क्योंकि वे 32 बिट/4 बाइट शब्द हैं की जरूरत है और इसलिए सही होने के लिए गणना के लिए बाइट में कुल में अनुवाद करने की आवश्यकता

आपका फ़िल्टर किया जाना चाहिए की गणना:

  • IP पैकेट लंबाई (बाइट्स में) - IP हेडर लंबाई - टीसीपी हैडर लंबाई

और कहा कि मूल्य की तलाश में ज़ी जा करने के लिए इस

sudo tcpdump -A -nnpi eth0 '(ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

तरह ro है, यानी कुछ जब आप घटाव करने के लिए, आप एक गैर शून्य की कुल के लिए देख रहे हैं।यह गैर-शून्य कुल का अर्थ है कि परत 4 के ऊपर डेटा है, यानी टीसीपी पेलोड में डेटा, आमतौर पर एप्लिकेशन यातायात।

आप भी जोड़ने के लिए port 80 संभालने सबसे http यातायात पोर्ट 80

इस तरह के एक फिल्टर आमतौर पर सुरक्षा लोक द्वारा किया गया है SYN, जो सामान्य लेकिन RFC, के अनुसार नहीं है पर डेटा का पता लगाने के खत्म हो गया है चाहते हो सकता है यह मान्य है।

'tcp[13]=0x02 and (ip[2:2] - ((ip[0]&0x0f)*4) - ((tcp[12]&0xf0)*4) != 0)'

TCPIPGuide btw टीसीपी/आईपी पर एक बहुत अच्छा, मुफ्त ऑनलाइन गाइड है - तो पूरी बात कुछ ऐसा दिखाई देगा।

अपडेटेडः गाय हैरिस के अपडेट के अनुसार बिटमास्क पर 'अग्रणी शून्य' अनुभाग संशोधित करें।

+1

'0x0f' और' 0xf' वही बात है; प्रमुख शून्यों को हेक्स मानों में छोड़ा जा सकता है। हालांकि, प्रमुख शून्य मौजूद हैं, तो कोड अधिक * स्पष्ट * पढ़ सकता है। '<< 2'' * 4' जैसा ही है; '>> 2', हालांकि,'/2' (2 से विभाजित) है, जो गलत है - यह शायद एक टाइपो है। –

+1

धन्यवाद बहुत बहुत व्यापक जवाब! – kingasmk

+1

@ गुएहरिस थक्स, मुझे यकीन नहीं था कि अग्रणी शून्य गिरा दिया गया था, इसलिए मैंने सोचा कि मैं स्पष्टता के लिए अपनी टिप्पणी में डालूंगा। '>> 2'' के बारे में '* 4' के समान होने के कारण, मैंने इसे स्पष्ट रूप से' >> 2' से बदल दिया, क्योंकि '* 4' बहुत स्पष्ट है और महसूस किया गया है कि मूल्यों के अंतर को समझाना आवश्यक था (32 बाइट बनाम-बिट शब्द), और '<< 2' टाइपो के आसपास संदेह को दूर करने के लिए। –