tcpdump: bagaimana cara mendapatkan output yang dapat diterima?

13

Saya mencoba memecahkan masalah di mana saya hanya memiliki tcpdump pada suatu alat. Saya ingin menggunakan tcpdump untuk memfilter lalu lintas web, dan hanya menampilkan lalu lintas yang berisi string tertentu.

Saya melakukan hal berikut:

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

Outputnya adalah hexview dengan garis 16 byte pr. Saya tidak dapat menerima data ini, karena data disajikan pada beberapa baris.

Apakah ada cara bagi tcpdump untuk menyajikan data yang diambil pada satu baris? Ini akan memungkinkan untuk menggunakan grep untuk menemukan paket yang menarik.

Anjing makan dunia kucing
sumber
1
baik, saya tidak bisa menguji ini sekarang tetapi jika Anda memiliki beberapa baris yang bisa Anda lakukan | tr -d '\ n' atau grep -C 3 untuk mendapatkan beberapa baris sebelum dan sesudah
barlop
@barlop, grep -C semacam bekerja, tetapi tidak dapat diandalkan, karena saya tidak pernah tahu berapa banyak baris header akan, dan saya tidak akan melihat garis di bawah pertandingan. Perintah tr memroses semua output ke 1 baris, jadi agak terlalu banyak.
Anjing memakan kucing dunia
Berikut ini tidak akan grep, tetapi tcpdump dapat mencocokkan string dengan hex yang pada dasarnya grep tanpa regex. Anda dapat menentukan offset. Saya telah mencatat ini dalam file (dilakukan dengan windump tapi saya itu hanya versi windows tcpdump jadi anggap tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop
tcpdump -nei eth0 -X | grep --line-buffered "something interesting"akan melakukan, karena alasan yang tidak diketahui jawaban kerja saya yang valid telah dihapus
sjas

Jawaban:

11

Bagi Anda yang tidak bisa menggunakan ngrep, berikut cara menggunakannya awkuntuk membuat tcpdumpoutput isi paket dapat diterima.

Pertama-tama, beberapa sampel keluaran disediakan oleh tcpdump -x, untuk mempresentasikan tugas di depan

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

Dan ini adalah skrip copy-and-pastable awkyang bisa Anda gunakan untuk mengirimkan hasilnya

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

untuk mendapatkan yang berikut, hasil yang dapat diterima

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

Di bawah ini adalah versi komentar dari skrip di atas:

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()
}'
Eugene Beresovsky
sumber
2

Dari halaman tcpdumpmanual:

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

Pastikan Anda juga menggunakan -s 0opsi untuk memastikan seluruh paket ditampilkan.

Flup
sumber
Terima kasih, tetapi data masih disajikan pada baris berlipat ganda - di mana pun laman web memiliki baris baru di dalamnya. Saya memiliki masalah mengaitkan header (dan sisa data) dengan output grepped.
Anjing memakan kucing dunia
Saya baru menyadari mengapa alat ini disebut awk ward
Dog eat cat world
1

Anda mungkin ingin melihat ngrepperintah:

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

Dimana:

  • -W single menentukan pemformatan garis tunggal
  • regex to match artinya hanya membuang paket yang berisi string tertentu.
  • 'port 80' adalah filter pcap untuk hanya mengendus paket dari atau ke port 80
LatinSuD
sumber
1
Ingin menggunakan ngrep, tetapi tidak ada alat seperti itu - ini adalah alat ...
Anjing memakan dunia kucing
ngrep luar biasa. Saya mencari berjam-jam host mana yang menghasilkan traffic HTTP ke host saya. Dengan satu sudo ngrep "GET .." ditemukan jawaban dalam hitungan menit.
Bartosz Bilicki
0

Alasan output Anda hex adalah -Xbendera. Mencoba:

tcpdump -ni eth1 | grep something_interesting

Anda akan mendapatkan hasil keluaran yang dibuang langsung ke klien.

DaveA
sumber
Ya, tetapi itu tidak akan mengandung konten paket.
RalfFriedl
0

Saya tidak bisa mendapatkan script awk untuk melakukan apa yang saya inginkan dan ngrep tidak akan bekerja pada Ethernet melalui USB, jadi saya menulis sebuah program C kecil untuk bergabung dengan output baris oleh tcpdump sehingga mereka dapat diterima. Itu ada di https://gitlab.com/dargaud/TcpDumpJoin

dargaud
sumber