tcpdump: làm thế nào để có được đầu ra grepable?


13

Tôi đang cố gắng khắc phục sự cố trong đó tôi chỉ có sẵn tcpdump trên thiết bị. Tôi muốn sử dụng tcpdump để lọc lưu lượng truy cập web và chỉ hiển thị lưu lượng có chứa các chuỗi nhất định.

Tôi làm như sau:

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

Đầu ra là một hexview với dòng pr 16 byte. Tôi không thể grep dữ liệu này, vì dữ liệu được trình bày trên nhiều dòng.

Có cách nào để tcpdump trình bày dữ liệu đã chụp trên một dòng không? Điều này sẽ làm cho nó có thể sử dụng grep để tìm các gói thú vị.


1
tốt, tôi không thể kiểm tra điều này ngay bây giờ nhưng nếu bạn có nhiều dòng bạn có thể làm | tr -d '\ n' hoặc grep -C 3 để nhận một số dòng trước và sau
barlop

@barlop, grep -C loại công việc, nhưng không đáng tin cậy, vì tôi không bao giờ biết tiêu đề sẽ có bao nhiêu dòng, và tôi sẽ không thấy các dòng bên dưới trận đấu. Lệnh tr chuyển tất cả đầu ra thành 1 dòng, vì vậy nó hơi quá.
Chó ăn mèo thế giới

Sau đây sẽ không phải là grep, nhưng tcpdump có thể khớp các chuỗi bằng hex, về cơ bản là grep mà không có bất kỳ biểu thức chính quy nào. Bạn có thể chỉ định một phần bù. Tôi đã ghi lại điều này trong một tệp (được thực hiện với Windump nhưng tôi chỉ là phiên bản windows của tcpdump nên giả sử tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"sẽ làm, vì lý do chưa phát hiện ra câu trả lời làm việc hợp lệ của tôi đã bị xóa.
sjas

Câu trả lời:


11

Đối với những người như bạn không thể sử dụng ngrep, đây là cách sử dụng awkđể làm cho tcpdumpđầu ra của nội dung gói có thể thay đổi được.

Đầu tiên một số đầu ra mẫu như được cung cấp bởi tcpdump -x, để trình bày nhiệm vụ phía trước:

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

Và đây là tập lệnh sao chép và có thể dán awkmà bạn có thể chuyển đầu ra sang

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() }'

để có được sau đây, đầu ra 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...
...

Dưới đây là một phiên bản nhận xét của kịch bản trên:

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

Từ tcpdumptrang hướng dẫn:

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

Đảm bảo bạn cũng sử dụng -s 0tùy chọn để đảm bảo toàn bộ gói được hiển thị.


Cảm ơn, nhưng dữ liệu vẫn được trình bày ở nhiều dòng - bất cứ nơi nào trang web có dòng mới trong đó. Tôi gặp vấn đề khi liên kết tiêu đề (và phần còn lại của dữ liệu) với đầu ra được nối.
Chó ăn mèo thế giới

Tôi mới nhận ra lý do tại sao công cụ này được gọi là awk Ward
Dog eat cat world

1

Bạn có thể muốn xem ngreplệnh:

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

Ở đâu:

  • -W single chỉ định định dạng dòng đơn
  • regex to match có nghĩa là chỉ đổ các gói chứa chuỗi nhất định.
  • 'port 80' là một bộ lọc pcap để chỉ đánh hơi các gói từ hoặc đến cổng 80

1
Muốn sử dụng ngrep, nhưng không có công cụ nào như vậy - đó là một thiết bị ...
Chó ăn thịt mèo thế giới

ngrep là tuyệt vời. Tôi đã tìm kiếm hàng giờ mà máy chủ đang tạo lưu lượng HTTP đến máy chủ của tôi. Với sudo ngrep "GET .." đã tìm thấy câu trả lời trong vài phút.
Bartosz Bilicki

0

Lý do đầu ra của bạn là hex là -Xcờ. Thử:

tcpdump -ni eth1 | grep something_interesting

Bạn sẽ nhận được kết xuất có thể đọc được ngay vào cli.


Có, nhưng nó sẽ không chứa nội dung của gói.
RalfFriedl

0

Tôi không thể có được tập lệnh awk để làm những gì tôi muốn và ngrep sẽ không hoạt động trên Ethernet qua USB, vì vậy tôi đã viết một chương trình C nhỏ để tham gia đầu ra các dòng bằng tcpdump để chúng có thể được chỉnh sửa. Đó là tại https://gitlab.com/dargaud/TcpDumpJoin

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.