tcpdump: grepable çıktı nasıl alınır?


13

Yalnızca bir cihazda tcpdump bulunduğum bir sorunu gidermeye çalışıyorum. Web trafiğini filtrelemek ve yalnızca belirli dizeleri içeren trafiği görüntülemek için tcpdump kullanmak istiyorum.

Aşağıdakileri yaparım:

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

Çıktı 16 bayt pr hattı olan bir hexview. Veriler birden çok satırda sunulduğundan, bu verileri gizleyemiyorum.

Tcpdump'ın yakalanan verileri tek bir satırda sunmasının bir yolu var mı? Bu, ilginç paketler bulmak için grep'in kullanılmasını mümkün kılacaktır.


1
Peki, şimdi test edemiyorum ama birden fazla satır varsa yapabilirsin | tr -d '\ n' veya grep -C3 öncesi ve sonrası bazı satırlar almak için
barlop

@barlop, grep -C tür işler, ancak güvenilmez, çünkü üstbilgiden kaç satır olacağını asla bilemeyeceğim ve maçın altındaki satırları görmeyeceğim. Tr komutu tüm çıktıları 1 satıra çevirir , bu yüzden biraz fazladır.
Köpek kedi dünyasını yemek

Aşağıdaki grep olmaz, ancak tcpdump dizeleri hex ile eşleştirebilir, bu da herhangi bir normal ifade olmadan grep'dir. Bir ofset belirtebilirsiniz. Ben bir dosyada aşağı düştü var (windump ile yapılır ama bu sadece tcpdump bir windows sürümü yani tcpdump varsayalım) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
14:14 de barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"anlaşılamayan nedenlerle geçerli çalışma cevabım silindi.
sjas

Yanıtlar:


11

Sizin gibi ngrepkullanamayanlar awkiçin tcpdump, paket içeriğinin çıktısını akılda kalıcı kılmak için nasıl kullanılacağı aşağıda açıklanmıştır.

İlk tcpdump -xönce, ödevi sunmak için öngörülen bazı örnek çıktılar :

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

Ve bu, çıktıyı yönlendirebileceğiniz kopyala ve yapıştır awkkomut dosyasıdır.

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

aşağıdakileri elde etmek için, grepable çıktı

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

Yukarıdaki komut dosyasının yorumlanmış bir sürümü aşağıdadır:

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

Gönderen tcpdumpman:

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

-s 0Tüm paketin görüntülendiğinden emin olmak için de seçeneği kullandığınızdan emin olun.


Teşekkürler, ancak veriler yine de birden çok satırda sunulur - web sayfasının içinde yeni satırlar varsa. Üstbilgi (ve veri geri kalanı) çıkış çıktı ile ilişkilendirme sorunum var.
Köpek kedi dünyasını yemek

Aracın neden awk koğuşu
Köpek kedi dünyasını yiyor

1

ngrepKomuta bir göz atmak isteyebilirsiniz :

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

Nerede:

  • -W single tek satır biçimlendirmesini belirtir
  • regex to match yalnızca belirli dizeleri içeren paketleri dökmek anlamına gelir.
  • 'port 80' yalnızca 80 numaralı bağlantı noktasından veya 80 numaralı bağlantı noktasına paketleri koklamak için kullanılan bir pcap filtresidir

1
Ngrep kullanmak istiyorum, ama böyle bir araç yok - bir cihaz ...
Köpek kedi dünya yemek

ngrep harika. Hangi ana makinenin ana makineme HTTP trafiği oluşturduğu saatler arıyordum Tek sudo ngrep ile "GET .." dakika içinde cevap bulundu.
Bartosz Bilicki

0

Çıktınızın altıgen olmasının nedeni -Xbayraktır. Deneyin:

tcpdump -ni eth1 | grep something_interesting

Dökümlü okunabilir çıktıyı doğrudan klibe alacaksınız.


Evet, ancak paketin içeriğini içermez.
RalfFriedl

0

Ben awk betiği istediğimi yapmak için alamadım ve ngrep USB üzerinden bir Ethernet üzerinde çalışmaz, bu yüzden onlar gcableable tcpdump tarafından çıktıları katılmak için küçük bir C programı yazdı. Hiç de var https://gitlab.com/dargaud/TcpDumpJoin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.