tcpdump: як отримати вигідний вихід?


13

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

Я роблю наступне:

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

Вихід - це гекс-перегляд з 16-ти байтовим рядком PR. Я не можу отримати ці дані, оскільки дані представлені в декількох рядках.

Чи є спосіб tcpdump представити захоплені дані в одному рядку? Це дозволило б використовувати греп для пошуку цікавих пакетів.


1
ну, я не можу перевірити це зараз, але якщо у вас є кілька рядків, ви можете це зробити tr -d '\ n' або grep -C 3, щоб отримати рядки до і після
барлоп

@barlop, grep -C начебто працює, але ненадійно, тому що я ніколи не знаю, скільки буде рядків у верхній частині заголовка, і я не побачу рядки нижче відповідності. Команда tr переводить весь вихід на 1 рядок, тому його трохи занадто багато.
Собака їсть котячий світ

Далі не буде grep, але tcpdump може відповідати рядкам за допомогою шістнадцяткових значень, які по суті є grep без регексу. Можна вказати зміщення. У мене це записано у файлі (зроблено з windump, але я - це лише версія Windows для tcpdump, тому припустимо, tcpdump) tcpdump -nXr zfile "tcp [32: 4] = 0x47455420"
barlop

tcpdump -nei eth0 -X | grep --line-buffered "something interesting"зробимо, з мотивів невстановлених мою дійсну робочу відповідь було видалено.
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() }'

для того, щоб отримати наступний, надійний вихід

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опцію, щоб переконатися, що весь пакет відображається.


Дякую, але дані все ще представлені у множинних рядках - де б на веб-сторінці не було нових рядків. У мене проблеми з асоціюванням заголовка (та решти даних) із вилученим виведенням.
Собака їсть котячий світ

Я щойно зрозумів, чому цей інструмент називається awk палат
Собака їсть котячий світ

1

Ви можете переглянути ngrepкоманду:

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

Де:

  • -W single задає форматування одного рядка
  • regex to match означає лише скинути пакети, що містять певний рядок.
  • 'port 80' являє собою фільтр pcap, щоб нюхати лише пакети від або до порту 80

1
Хотіли б використовувати ngrep, але такого інструменту немає - це прилад ...
Собака їсть котячий світ

ngrep - приголомшливий. Я годинами шукав, який хост генерує HTTP-трафік для мого хоста. З одиночним судо ngrep "GET .." знайшов відповідь за хвилину.
Bartosz Bilicki

0

Причиною вашого виведення є шістнадцятковий - -Xпрапор. Спробуйте:

tcpdump -ni eth1 | grep something_interesting

Ви отримаєте відкинутий читабельний вихід прямо до кліпу.


Так, але він не буде містити вміст пакету.
РальфФрідл

0

Я не міг отримати скрипт awk, щоб зробити те, що хотів, і ngrep не працюватиме на Ethernet через USB, тому я написав невелику програму C, щоб приєднатись до рядків, що виводяться tcpdump, щоб вони були зібрані. Це за адресою https://gitlab.com/dargaud/TcpDumpJoin

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.