Packet capturing with tcpdump command in linux

Совместимость Tcpdump

Чтение пакетов из сетевого интерфейса с помощью команды tcpdump может потребовать специальных привилегий ( чтение сохраненный пакетный файл не требует таких привилегий):


    SunOS 3.x или 4.x с NIT или BPF: Вы должны иметь доступ для чтения к / DEV / нит или же DEV / BPF * . Solaris с DLPI: У вас должен быть доступ на чтение / запись к псевдо-устройству сети, например / DEV / ле , Однако, по крайней мере, в некоторых версиях Solaris этого недостаточно ТСРйитр для захвата в беспорядочном режиме; в тех версиях Solaris, вы должны быть root или ТСРйитр должен быть установлен setuid на root, чтобы захватить в беспорядочном режиме

    Обратите внимание, что на многих (возможно, всех) интерфейсах, если вы не выполняете захват в беспорядочном режиме, вы не увидите никаких исходящих пакетов, поэтому захват, не выполненный в беспорядочном режиме, может оказаться не очень полезным. HP-UX с DLPI: Вы должны быть root или ТСРйитр должен быть установлен setuid на root. IRIX с snoop: Вы должны быть root или ТСРйитр должен быть установлен setuid на root. Linux: Вы должны быть root или ТСРйитр должен быть установлен setuid на root. Ultrix и Digital UNIX / Tru64 UNIX: Любой пользователь может захватить сетевой трафик с помощью ТСРйитр , Тем не менее, ни один пользователь (даже суперпользователь) не может захватывать в режиме promiscuous на интерфейсе, если суперпользователь не включил режим promiscuous-mode на этом интерфейсе, используя pfconfig (8), и ни один пользователь (даже не суперпользователь) не может захватить одноадресный трафик, полученный или отправленный машиной на интерфейсе, если суперпользователь не включил операцию полного копирования на этом интерфейсе, используя pfconfig , так полезным пакетный захват на интерфейсе, вероятно, требует, чтобы на этом интерфейсе была включена работа как в режиме размножения, так и в режиме полного копирования или в обоих режимах. BSD: Вы должны иметь доступ для чтения к / DEV / BPF * .

Как работает tcpdump

Для того, чтобы научиться читать записи tcpdump нужно хотя бы небольшие знания основных протоколов, в частности рассматриваемом ниже протоколе TCP. Хотя если вы хотите максимально использовать tcpdump, без глубокого изучения теории их работы ни коим образом не обойтись. Напомню, что tcpdump – лишь программа для отображения, но не генерирования трафика. Она может только показать то, что происходит в сети и повлиять на трафик она не может.

Для работы в tcpdump нужны полномочия пользователя root. Это связано с тем, что tcpdump необходимо перевести сетевую карту в так именуемый неразборчивый (promiscuous) режим, при котором сетевая карта не проверяет предназначены ли именно ей приобретенные данные, она принимает абсолютно всё. Схема передачи данных, при котором трафик (Телефонный трафик — в телекоммуникациях — большое количество телефонных разговоров и попыток установления соединения, проходящих через коммутационной оборудования и/или телефонную сеть Транспортный) проходит чрез каждый компьютер свойственна для Ethernet-сетей, основанных прежде всего на концентраторах. Их называют «сетями всеобщего пользования», то есть получив данные от какого-нибудь хоста, концентратор отправляет эти данные на все присоединенные к нему порты не заботясь о том, кому именно они предназначались.

Противоположность такому типу сети – Ethernet-сеть базирующаяся на коммутаторах. Здесь данные передаются только указанному получателю. Коммутатор создает условное соединение между компьютерами, что не позволяет остальным хостам в сети «прослушивать» передаваемые ими этые. Однако, это вовсе не означает, что их невозможно перехватить, правда для этого не обойтись без некоторых хитростей.

Коммутатор работает не столько с ip-адресами сколько с фреймами (единица передачи этих на канальном уровне), для каждого порта которого в его таблице закреплен mac-адрес компьютера в сети. Весьма часто эта таблица является не статичной, а динамически изменяемой. Благодаря этому, существует много способов arp-спуфинга и другой хакерской деятельности по отношению к коммутатору… Так вот, если переполнить эту матрицу mac-адресов, то, скорее всего, коммутатор перейдет в неразборчивый режим, то есть будет себе везти как обычный концентратор, что и позволит tcpdump перехватывать весь трафик.

Еще один момент, какой следует указать, так это то, что tcpdump поддерживает chroot. chroot – это переопределение корневой папки для програмки, пользователя. С ее помощью можно сделать так, чтобы даже в случае взлома программы и приобретенье прав с помощью которой запускается программа, взломщик не сможет выйти за пределы папки узкой chroot-средой. Эта полезная опция, указывается при компиляции Tcpdump.

The Examples

TCPDUMP does the same job irrespective to what technology (or) server you are using it for. In other words, if you would like capture HTTP calls for Apache.  You mostly going to be using the port 80 or 443.


If you would like to capture the traffic of weblogic (or) Websphere or any application servers. All you have to do is change the port number in which your application server is listening

Though we have given examples for both web and application server here.  All you should be aware of is that. There is nothing specific to technology. We just change the port number (or) interface. That’s all.

How to capture All incoming  HTTP GET  traffic (or) requests

tcpdump -i enp0s8 -s 0 -A 'tcp & 0xf0) >> 2):4] = 0x47455420'

Explanation:-

tcp & 0xf0) >> 2):4] first determines the location of the bytes we are interested in (after the TCP header) and then selects the 4 bytes we wish to match against.

To know more about how this segment syntax has been derived. refer this link

Character ASCII Value
G 47
E 45
T 54
Space 20

How to capture All incoming HTTP POST requests

tcpdump -i enp0s8 -s 0 -A 'tcp & 0xf0) >> 2):4] = 0x504F5354'

Here represents  the ASCII value of 


Sample Output

# tcpdump -i enp0s8 -s 0 -A 'tcp & 0xf0) >> 2):4] = 0x504F5354'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
08:12:59.552588 IP 192.168.10.1.60651 > mwiws01.http: Flags , seq 1817631852:1817632015, ack 3385979723, win 4117, options , length 163: HTTP: POST /new.html HTTP/1.1
E.....@.@..C..
...

...PlV.l...K...........
.....fx
POST /new.html HTTP/1.1
Host: 192.168.10.10
User-Agent: curl/7.54.0
Accept: */*
X-Requested-By: middlewareinventory
TestHeader: TestValue
MyName: SaravAK


^C
1 packet captured
1 packet received by filter
0 packets dropped by kernel
#

How to capture only HTTP GET requests Incoming to port 80 ( Apache/NGINX)

tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp & 0xf0) >> 2):4] = 0x47455420'

Sample Output

# tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp & 0xf0) >> 2):4] = 0x47455420'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
06:50:12.424996 IP 192.168.10.1.58034 > mwiws01.http: Flags , seq 1518079346:1518079506, ack 1444634698, win 4117, options , length 160: HTTP: GET /new.html HTTP/1.1
E..._.@.@.E7..
...

...PZ|.rV.`J.....u.....
..d|...3GET /new.html HTTP/1.1
Host: 192.168.10.10
User-Agent: curl/7.54.0
Accept: */*
X-Requested-By: middlewareinventory
TestHeader: TestValue
MyName: Sarav

How to capture only HTTP POST requests Incoming to port 80 ( Apache/NGINX)

tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp & 0xf0) >> 2):4] = 0x504F5354'

Sample Output

# tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp & 0xf0) >> 2):4] = 0x504F5354'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
08:16:50.394502 IP 192.168.10.1.60759 > mwiws01.http: Flags , seq 2281273674:2281273837, ack 1974611475, win 4117, options , length 163: HTTP: POST /new.html HTTP/1.1
E...G.@.@.]...
...

.W.P..yJu.......x......
..{..i..POST /new.html HTTP/1.1
Host: 192.168.10.10
User-Agent: curl/7.54.0
Accept: */*
X-Requested-By: middlewareinventory
TestHeader: TestValue
MyName: SaravAK


^C
1 packet captured
1 packet received by filter
0 packets dropped by kernel
tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 or tcp dst port 443 and tcp & 0xf0) >> 2):4] = 0x47455420 or tcp & 0xf0) >> 2):4] = 0x504F5354' and host 192.168.10.1

Let suppose I access a page hosted in web server from my base machine with ip address   using both GET and POST methods.  How do we track the HTTP request and response between the server and the client

tcpdump -i enp0s8 -s 0 -A 'tcp dst port 80 and tcp & 0xf0) >> 2):4] = 0x47455420 or tcp & 0xf0) >> 2):4] = 0x504F5354 or tcp & 0xf0) >> 2):4] = 0x48545450 or tcp & 0xf0) >> 2):4] = 0x3C21444F and host 192.168.10.1'

Here additionally, we are using two more ASCII values to capture the outgoing HTML files and HTTP calls they are as follows.


 represents the ASCII value of   this is to capture the outgoing HTML file

 represents the ASCII value of  this is to capture the outgoing HTTP traffic (HTTP response)

Trying with GET

Trying with POST

In the preceding illustrations,  you can see the output of tcpdump command (to the right) shows the REQUEST and RESPONSE data along with the HTML code. You can also find it aligning to the CURL’s verbose output

Ключи

ключ описание
-a Преобразовывает сетевые и широковещательные адреса в доменные имена.
-e Отображает данные канального уровня (MAC-адрес, протокол, длина пакета). Помимо IP-адресов будут отображаться MAC-адреса компьютеров.
-F файл Использовать фильтр, находящийся в файле. Если вы используете этот параметр, фильтр из командной строки будет игнорироваться.
-i Указывает на то, какой сетевой интерфейс будет использоваться для захвата пакетов. По умолчанию — eth0, для выбора всех интерфейсов — any. Если отсутствует локальная сеть, то можно воспользоваться интерфейсом обратной связи lo.
-l Использовать стандартный потоковый вывод tcpdump (stdout), например для записи в файл:
shell# tcpdump -l | tee out.log //отобразит работу tcpdump и сохранит результат в файле out.log
-N Не добавляет доменное расширение к именам узлов. Например tcpdump отобразит ‘net’ вместо ‘net.library.org’
-n Отображает IP-адрес вместо имени хоста.
-nn Отображает номер порта вместо используемого им протокола.
-p Не переводит интерфейс в режим приема всех пакетов (promiscuous mode).
-q Выводит минимум информации. Обычно это имя протокола, откуда и куда шел пакет, порты и количество переданных данных.
-r Этот параметр позволяет tcpdump прочесть трафик из файла, если он был предварительно сохранен параметром -w.
-S Позволяет не обрабатывать абсолютные порядковые номера (initial sequence number — ISN) в относительные.
-s число Количество байтов пакета, которые будет обрабатывать tcpdump. При установке большого числа отображаемых байтов информация может не уместиться на экране и её будет трудно изучать. В зависимости от того, какие цели вы преследуете, и следует выбирать значение этого параметра. По умолчанию tcpdump захватывает первые 68 байт (для SunOS минимум 96 байт), однако если вы хотите увидеть содержимое всего пакета, используйте значение в 1514 байт (максимально допустимый размер кадра в сети Ethernet).
-t Не отображает метку времени в каждой строке.
-T тип Интерпретация пакетов заданного типа. Поддерживаются типы aodv, cnfp, rpc, rtp, rtcp, snmp, tftp, vat, wb.
-tt Отображает неформатированную метку времени в каждой строке.
-tttt Показывает время вместе с датой.
-v Вывод подробной информации (TTL; ID; общая длина заголовка, а также его параметры; производит проверку контрольных сумм IP и ICMP-заголовков)
-vv Вывод ещё более полной информации, в основном касается NFS и SMB.
-vvv Вывод максимально подробной информации.
-w файл Сохраняет данные tcpdump в двоичном формате. Преимущества использования данного способа по сравнению с обычным перенаправлением в файл является высокая скорость записи и возможность чтения подобных данных другими программами, например snort, но этот файл нельзя прочитать человеку. Возможен вывод двоичных данных на консоль, для этого необходимо использовать -w —
-x Делает распечатку пакета в шестнадцатеричной системе, полезно для более детального анализа пакета. Количество отображаемых данных зависит от параметра -s
-xx Тоже, что и предыдущий параметр -x, но включает в себя заголовок канального уровня
-X Выводит пакет в ASCII- и hex-формате. Полезно в случае анализа инцидента связанного со взломом, так как позволяет просмотреть какая текстовая информация передавалась во время соединения.
-XX Тоже, что и предыдущий параметр -X, но включает заголовок канального уровня.
-с число tcpdump завершит работу после получения указанного числа пакетов.
-U Собранные пакеты будут сразу складываться в файл, а иначе копиться в памяти до тех пор, пока она не закончится

Программная реализация

Программа состоит из двух основных частей: части захвата пакетов (обращение к библиотеке, libpcap (Unix) или pcap (Windows)) и части отображения захваченных пакетов (которая на уровне исходного кода является модульной и для поддержки нового протокола достаточно добавить новый модуль).

Часть захвата пакетов (при запуске) передаёт «выражение выбора пакетов» (идущее после всех параметров командной строки) напрямую библиотеке захвата пакетов, которая проверяет выражение на синтаксис, компилирует его (во внутренний формат данных), а затем копирует во внутренний буфер программы сетевые пакеты, проходящие через выбранный интерфейс и удовлетворяющие условиям в выражении.

Часть отображения пакетов выбирает захваченные пакеты по одному из буфера, заполняемого библиотекой, и выводит их (в воспринимаемом человеком виде) на стандартный вывод построчно, в соответствии с заданным (в командной строке) уровнем детальности.

Если задан подробный вывод пакетов, программа проверяет для каждого сетевого пакета, имеется ли у неё модуль расшифровки данных, и, в случае наличия, соответствующей подпрограммой извлекает (и отображает) тип пакета в протоколе или передаваемые в пакете параметры.


С этим читают