tcpdump: grepable आउटपुट कैसे प्राप्त करें?


13

मैं एक समस्या का निवारण करने की कोशिश कर रहा हूं जहां मेरे पास केवल एक उपकरण पर उपलब्ध tcpdump है। मैं वेब ट्रैफ़िक को फ़िल्टर करने के लिए tcpdump का उपयोग करना चाहता हूं, और केवल कुछ स्ट्रिंग्स वाले ट्रैफ़िक प्रदर्शित करता हूं।

मैं निम्नलिखित कार्य करता हूं:

tcpdump -nei eth0 -X | grep "something interesting"

आउटपुट 16 बाइट्स पीआर लाइन के साथ एक हेक्सव्यू है। मैं इस डेटा को प्राप्त नहीं कर सकता, क्योंकि यह डेटा कई लाइनों पर प्रस्तुत किया गया है।

क्या tcpdump के लिए एक लाइन पर कैप्चर किए गए डेटा को प्रस्तुत करने का कोई तरीका है? यह दिलचस्प पैकेट खोजने के लिए grep का उपयोग करना संभव बनाता है।


1
ठीक है, मैं अभी इसका परीक्षण नहीं कर सकता, लेकिन यदि आपके पास कई लाइनें हैं, तो आप कर सकते हैं | tr -d '\ n' या grep -C 3 से पहले और बाद में कुछ पंक्तियाँ प्राप्त करने के लिए
barlop

@barlop, grep -C तरह के काम करता है, लेकिन अविश्वसनीय, जैसा कि मुझे कभी नहीं पता है कि हेडर कितनी लाइनों में होगा, और मैं मैच के नीचे की लाइनें नहीं देखूंगा। Tr कमांड सभी आउटपुट को 1 लाइन में विभाजित करता है, इसलिए यह थोड़ा बहुत अधिक है।
कुत्ते

निम्नलिखित grep नहीं होगा, लेकिन tcpdump हेक्स द्वारा स्ट्रिंग्स का मिलान कर सकता है जो अनिवार्य रूप से किसी भी रेगेक्स के बिना grep है। आप एक ऑफसेट निर्दिष्ट कर सकते हैं। मुझे यह एक फाइल में नीचे लिखा गया है (विंडम्प के साथ किया गया है, लेकिन मैं सिर्फ tcpdump का एक विंडोज़ संस्करण हूं, इसलिए tcpdump मान लें) tcpdump -nXr zfile "tcp [32: 4]
0x47455420

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"क्या होगा, उन कारणों के लिए जो मेरे वैध काम के जवाब को नष्ट कर दिया गया था।
सजेस

जवाबों:


11

आप जैसे लोग जो उपयोग नहीं कर सकते ngrep, उनके लिए पैकेट सामग्री awkको tcpdumpआउटपुट योग्य बनाने के लिए यहाँ कैसे उपयोग किया जाए।

tcpdump -xआगे दिए गए कार्य को प्रस्तुत करने के लिए पहले कुछ नमूना आउटपुट दिए गए हैं :

$ tcpdump -xr dump.pcap 2>/dev/null
12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370
        0x0000:  4500 018e 0000 4000 fa11 7625 0a11 0e5d
        0x0010:  efc2 0109 c741 c741 017a 6f28 1120 2020
        0x0020:  3337 3030 3039 3031 3835 3635 3430 3130
...

और यह copy-and-pastable awkscript है जिसे आप आउटपुट को पाइप कर सकते हैं

awk '{ if (match($0, /^[0-9]/, _)) { printf (NR == 1 ? "%s " : "\n%s "), $0; fflush() } else { sub(/^\s+0x[0-9a-z]+:\s+/, " "); gsub(" ", ""); printf "%s", $0 } } END { print ""; fflush() }'

निम्नलिखित प्राप्त करने के लिए, grepable आउटपुट

12:04:59.590664 IP 10.17.14.93.51009 > 239.194.1.9.51009: UDP, length 370 4500018e00004000fa1176250a...
12:04:59.590798 IP 10.17.14.113.51011 > 239.194.1.11.51011: UDP, length 370 4500018e00004000fa11760f...
...

नीचे उपरोक्त स्क्रिप्ट का टिप्पणी संस्करण है:

awk '
{
    # if this is a header line
    if (match($0, /^[0-9]/, _)) 
    {
        # print the header, but:

        # except for the first line,
        # we need to insert a newline,
        # as the preceding data lines
        # have been stripped of theirs

        # we also append a space to
        # separate header info from the
        # data that will get appended
        printf (NR == 1 ? "%s " : "\n%s "), $0
        # enforce line-buffering
        fflush()
    }
    # otherwise it is a data line
    else 
    {
        # remove the data address
        sub(/^\s+0x[0-9a-z]+:\s+/, " ");
        # remove all spaces
        gsub(" ", "");
        # print w/o newline
        printf "%s", $0 
    }
}
END
{
    # print final newline, as
    # the preceding data lines
    # have been stripped of theirs
    print ""
    # enforce line-buffering
    fflush()
}'

2

से tcpdumpमैनपेज:

-A      Print each packet (minus its link level header) in ASCII.  Handy
        for capturing web pages.

सुनिश्चित करें कि आप यह सुनिश्चित -s 0करने के लिए भी विकल्प का उपयोग करते हैं कि पूरा पैकेट प्रदर्शित किया गया है।


धन्यवाद, लेकिन डेटा अभी भी कई लाइनों में प्रस्तुत किया जाता है - जहां भी वेबपृष्ठ में नई लाइनें हैं। मुझे हेडर (और बाकी डेटा) को ग्रीप्ड आउटपुट के साथ जोड़ने में समस्या है।
कुत्ता बिल्ली दुनिया में

मुझे बस एहसास हुआ कि टूल को वॉक वार्ड
डॉग खाओ बिल्ली दुनिया

1

आप ngrepकमांड पर एक नज़र रखना चाहते हैं :

ngrep -W single -d eth0 'regex to match' 'port 80'

कहाँ पे:

  • -W single एकल पंक्ति स्वरूपण निर्दिष्ट करता है
  • regex to match केवल कुछ पैकेट युक्त डंप पैकेट का मतलब है।
  • 'port 80' केवल 80 या पोर्ट से सूँघने के पैकेट के लिए एक pcap फ़िल्टर है

1
Ngrep का उपयोग करना चाहते हैं, लेकिन ऐसा कोई टूल नहीं है - यह एक उपकरण है ...
डॉग खाओ बिल्ली दुनिया

ngrep कमाल का है। मैं उन घंटों की खोज कर रहा था जो होस्ट मेरे होस्ट को HTTP ट्रैफ़िक उत्पन्न कर रहे हैं। एकल सूडो एनजीआरईपी "जीईटी .." के साथ मिनट में जवाब मिला।
बार्टोज़ बिल्की सिप

0

आपके उत्पादन का कारण हेक्स -Xझंडा है। प्रयत्न:

tcpdump -ni eth1 | grep something_interesting

आपको क्ली पर पठनीय आउटपुट मिलेगा।


हां, लेकिन इसमें पैकेट की सामग्री नहीं होगी।
राल्फफ्राइडल

0

मुझे वह करने के लिए awk स्क्रिप्ट नहीं मिली जो मैं चाहता था और ngrep USB पर एक ईथरनेट पर काम नहीं करेगा, इसलिए मैंने tcpdump द्वारा लाइनों के उत्पादन में शामिल होने के लिए एक छोटा सी प्रोग्राम लिखा ताकि वे संक्षिप्त हों। यह https://gitlab.com/dargaud/TcpDumpJoin पर है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.