tcpdump: วิธีรับเอาต์พุต grepable?


13

ฉันกำลังพยายามแก้ไขปัญหาที่มีเฉพาะ tcpdump บนอุปกรณ์ ฉันต้องการใช้ tcpdump เพื่อกรองปริมาณการใช้งานเว็บและแสดงเฉพาะปริมาณการใช้งานที่มีสตริงที่แน่นอน

ฉันทำต่อไปนี้:

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

เอาต์พุตเป็น hexview ที่มี 16 ไบต์บรรทัด pr ฉันไม่สามารถ grep ข้อมูลนี้เนื่องจากมีการนำเสนอข้อมูลในหลายบรรทัด

มีวิธีสำหรับ tcpdump เพื่อนำเสนอข้อมูลที่บันทึกไว้ในบรรทัดเดียวหรือไม่? สิ่งนี้จะทำให้สามารถใช้ grep เพื่อค้นหาแพ็กเก็ตที่น่าสนใจ


1
ฉันไม่สามารถทดสอบได้ตอนนี้ แต่ถ้าคุณมีหลายบรรทัดคุณสามารถทำ | tr -d '\ n' หรือ grep -C 3 เพื่อรับบางบรรทัดก่อนและหลัง
barlop

@barlop, grep -C เรียงลำดับของงาน แต่ไม่น่าเชื่อถือเนื่องจากฉันไม่เคยรู้ว่ามีกี่บรรทัดที่ส่วนหัวจะเป็นและฉันจะไม่เห็นบรรทัดด้านล่างที่ตรงกัน คำสั่ง tr ทำการปิดเอาต์พุตทั้งหมดเป็น 1 บรรทัดดังนั้นมันมากเกินไป
สุนัขกินโลกของแมว

ต่อไปนี้จะไม่เป็น grep แต่ tcpdump สามารถจับคู่สตริงตาม hex ซึ่งเป็น grep โดยไม่มี regex คุณสามารถระบุการชดเชย ฉันเขียนสิ่งนี้ลงในไฟล์ (ทำด้วย windump แต่ฉันเป็นเพียงรุ่น windows ของ tcpdump ดังนั้นสมมติว่า tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"จะทำด้วยเหตุผลที่ถูกต้อง undiscerned ของฉันทำงานคำตอบที่ถูกลบ
sjas

คำตอบ:


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
...

และนี่คือสคริปต์คัดลอกและวางawkคุณสามารถไพพ์เอาต์พุต

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

จากtcpdumpmanpage:

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

ตรวจสอบให้แน่ใจว่าคุณใช้-s 0ตัวเลือกเพื่อให้แน่ใจว่าแสดงแพ็กเก็ตทั้งหมด


ขอขอบคุณ แต่ข้อมูลยังคงแสดงอยู่ที่เส้นคูณ - ทุกที่ที่หน้าเว็บมีบรรทัดใหม่ ฉันมีปัญหาในการเชื่อมโยงส่วนหัว (และส่วนที่เหลือของข้อมูล) กับเอาต์พุต grepped
สุนัขกินโลกของแมว

ฉันเพิ่งรู้ว่าทำไมเครื่องมือนี้จึงถูกเรียกว่า awk Ward
สุนัขกินแมวโลก

1

คุณอาจต้องการดูngrepคำสั่ง:

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

ที่ไหน:

  • -W single ระบุการจัดรูปแบบบรรทัดเดียว
  • regex to match หมายถึงเฉพาะการถ่ายโอนข้อมูลแพ็คเก็ตที่มีสตริงที่แน่นอน
  • 'port 80' เป็นตัวกรอง pcap เพื่อ sniff แพ็กเก็ตเท่านั้นจากหรือไปยังพอร์ต 80

1
ต้องการใช้ ngrep แต่ไม่มีเครื่องมือดังกล่าว - เป็นเครื่องมือ ...
สุนัขกินโลกของแมว

ngrep น่ากลัว ฉันค้นหาชั่วโมงที่โฮสต์สร้างปริมาณการใช้งาน HTTP ไปยังโฮสต์ของฉัน ด้วย sudo ngrep เดียว "GET .. " พบคำตอบในนาที
Bartosz Bilicki

0

สาเหตุที่เอาต์พุตของคุณคือ hex คือ-Xแฟล็ก ลอง:

tcpdump -ni eth1 | grep something_interesting

คุณจะได้รับเอาต์พุตที่อ่านได้ที่ cli


ใช่ แต่จะไม่มีเนื้อหาของแพ็คเก็ต
RalfFriedl

0

ฉันไม่สามารถรับสคริปต์ awk เพื่อทำสิ่งที่ฉันต้องการและ ngrep จะไม่ทำงานบนอีเธอร์เน็ตผ่าน USB ดังนั้นฉันจึงเขียนโปรแกรม C ขนาดเล็กเพื่อเข้าร่วมเอาต์พุตบรรทัดโดย tcpdump เพื่อให้สามารถพิมพ์ได้ อยู่ที่https://gitlab.com/dargaud/TcpDumpJoin

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.