tcpdump: как получить grepable вывод?

13

Я пытаюсь устранить проблему, когда на устройстве доступно только tcpdump. Я хочу использовать tcpdump для фильтрации веб-трафика и отображения только трафика, содержащего определенные строки.

Я делаю следующее:

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

Вывод представляет собой hexview с 16 байтами pr строки. Я не могу получить эти данные, поскольку данные представлены в несколько строк.

Есть ли способ для tcpdump представить захваченные данные в одной строке? Это позволило бы использовать grep для поиска интересных пакетов.

Собака ест кошачий мир
источник
1
ну, я не могу проверить это сейчас, но если у вас есть несколько строк, вы можете сделать | tr -d '\ n' или grep -C 3, чтобы получить строки до и после
barlop
@barlop, grep -C вроде работает, но ненадежно, так как я никогда не знаю, сколько строк будет в заголовке, и я не увижу строки под соответствием. Команда tr транслирует весь вывод в 1 строку, так что это слишком много.
Собака ест кошачий мир
Следующее не будет grep, но tcpdump может сопоставлять строки по шестнадцатеричному значению, которое по сути является grep без каких-либо регулярных выражений. Вы можете указать смещение. Я записал это в файл (сделано с помощью windump, но это всего лишь версия tcpdump для Windows, поэтому предположим, что tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop
tcpdump -nei eth0 -X | grep --line-buffered "something interesting"сделаю, по незаметным причинам мой действительный рабочий ответ был удален.
sjas

Ответы:

11

Для таких, как вы, которые не могут использовать ngrep, вот как использовать, awkчтобы сделать tcpdumpвывод содержимого пакета grepable.

Сначала приведем пример выходных данных, предоставленных 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

Из tcpdumpсправочной страницы:

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

Убедитесь, что вы также используете -s 0опцию, чтобы убедиться, что весь пакет отображается.

Flup
источник
Спасибо, но данные по-прежнему представлены в виде нескольких строк - везде, где на веб-странице есть новые строки. У меня есть проблема, связывающая заголовок (и остальную часть данных) с grepped выводом.
Собака ест кошачий мир
Я только что понял, почему инструмент называется awk ward
Dog eat cat world
1

Вы можете посмотреть на ngrepкоманду:

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

Где:

  • -W single определяет форматирование одной строки
  • regex to match означает только сбросить пакеты, содержащие определенную строку.
  • 'port 80' это фильтр pcap, который только прослушивает пакеты от или до порта 80
LatinSuD
источник
1
Хотелось бы использовать ngrep, но такого инструмента нет - это прибор ...
Мир кошек с собакой
Нгреп это круто. Я часами искал, какой хост генерирует HTTP-трафик на мой хост. С единственным sudo ngrep "GET .." нашел ответ в минуту.
Бартош Билицкий
0

Причиной вашего вывода является шестнадцатеричный -Xфлаг. Пытаться:

tcpdump -ni eth1 | grep something_interesting

Вы получите дамп читаемый вывод прямо в кли.

DaveA
источник
Да, но он не будет содержать содержимое пакета.
Ральф Фридл
0

Я не мог заставить скрипт awk делать то, что хотел, и ngrep не работал на Ethernet через USB, поэтому я написал небольшую программу на C для соединения строк, выводимых tcpdump, чтобы они были grepable. Это на https://gitlab.com/dargaud/TcpDumpJoin

dargaud
источник