27.04.2015

tcpdump wireshark

Мониторинг сети с помощью tcpdump

Довольно часто встает проблема, когда ему нужно узнать как работает сеть. Или просто для учебных-исследовательских целей узнать как взаимодействуют между собой объекты сети. Для этих целей в UNIX-мире написано целая куча инструментов. В данном материале будет рассматриваться TCPDUMP
посмотреть трафик на интерфейсе:
tcpdump -i fxp1

посмотреть трафик одного хоста:
tcpdump host 1.2.3.4
посмотреть трафик на порте:
tcpdump src port 80

посмотреть IP трафик на хост:
tcpdump ip host 1.2.3.4

посмотреть ARP трафик на хост:
tcpdump arp host 1.2.3.4

посмотреть RARP трафик на хост:
tcpdump rarp host 1.2.3.4

посмотреть трафик, кроме хоста unixserver:
tcpdump not host unixserver

посмотреть трафик на server1 и server2
tcpdump host server1 or host server2

посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru
tcpdump -X -i tun0 host ya.ru

подсмотреть номера и пароли к icq
tcpdump -X -i fxp1 port aol

посмотреть содержимое пакетов на интерфейсе tun0 на хост ya.ru, при этом прочитать из каждого пакета по 1500 байт и не преобразовывать IP в имя хоста
tcpdump -X -s 1500 -n -i tun0 host ya.ru
Одной из самых распространенных программ для перехвата и анализа сетевого трафика является tcpdump [1]. Приведем примеры ее применения.
1. Опции захвата трафика.
В простейшем случае достаточно указать интерфейс для анализа трафика:
tcpdump –i INTERFACE
Можно отключить преобразования IP адресов в доменные имена:

tcpdump -n
Ограничение числа перехватываемых пакетов:
tcpdump –c PACKET_COUNT
Запись в файл:
tcpdump -w FILE_NAME
Чтение из файла:
tcpdump -r FILE_NAME
Отметим, что для воспроизведения записанного файла в сеть можно использовать отдельную утилиту tcpreplay (не входящую в комплект tcpdump):
tcpreplay FILE_NAME
Вывод данных канального уровня (например, mac адреса и прочее):
tcpdump -e
Вывод дополнительной информации (например, TTL, опции IP):
tcpdump -v
Увеличение размера захватываемых пакетов (больше 68 байт по умолчанию):
tcpdump -s SNAP_LEN
2. Опции фильтрации трафика.
Можно осуществлять фильтрацию на канальном уровне. Для выделения Ethernet фреймов используются следующие конструкции:
tcpdump ether { src | dst | host } MAC_ADDRESS
tcpdump ether { broadcast | multicast }

Примеры:

# tcpdump -n -i vlan0 ether src 0:2:b3:d8:d8:2c
# tcpdump -n -e -i vlan0 ether broadcast

Просмотр фреймов 802.1Q можно осуществить следующими способами (на интерфейсе с виланами):
tcpdump –i INTERFACE vlan
Примеры:
# tcpdump -n -e -i fxp0 vlan
# tcpdump -n -e -i fxp0 vlan 100
# tcpdump -n -e -i fxp0 ether proto 0x8100

Фильтрация по IP протоколу:
tcpdump { arp | rarp | ip | tcp | udp | icmp | wlan | multicast | broadcast }
Примеры:
# tcpdump -n -i fxp0 ip
# tcpdump -n -i fxp0 tcp
# tcpdump -n -i fxp0 udp

Фильтрация по IP адресам:
tcpdump { src | dst } { net | host | port }
Примеры:
# tcpdump -n -i fxp0 src 195.12.66.1
# tcpdump -n -i fxp0 dst 195.12.66.65
# tcpdump -n -i fxp0 host 195.12.66.1
# tcpdump -n -i fxp0 port 25
# tcpdump -n -i fxp0 dst 195.12.66.1 and port 53

Фильтрация по размеру пакетов:
tcpdump { less | greater } PACKET_SIZE
Существуют расширенные возможности по фильтрации пакетов TCP с флагами. Заголовок TCP пакета состоит из 20 октетов. Поле битов управления (флагов) TCP содержится в октете номер 13. Соответственно под флаги отводятся следующие битовые позиции в 13 байте (по возрастанию степени 2): FIN (1), SYN(2), RST(4), PSH(8), ACK(16), URG(32), ECE(64), CWR(128).
Таким образом, например, для пакетов только с флагом SYN октет номер 13 заголовка TCP должен содержать значение 2. И соответствующий фильтр будет выглядеть так:
# tcpdump -n -i em0 'tcp[13] == 2'
Для перехвата пакетов только с флагами SYN и ACK (значения битовых позиций 2 и 16) можно использовать следующую конструкцию:
# tcpdump -n -i em0 'tcp[13] == 18'
Кроме того, можно использовать опцию tcpflags.
Пакеты с любым флагом:
# tcpdump -n -i em0 'tcp[tcpflags] != 0'
Пакеты, включающие SYN:

# tcpdump -n -i em0 'tcp[tcpflags] & tcp-syn != 0'

Для того, чтобы анализировать передаваемые данные по протоколу TCP, можно использовать tcpflow:
# tcpflow -c -i ep0 host 195.12.69.199 and port 80
3. Полезные рецепты.
Получение рейтинга наиболее активных участников сетевого взаимодействия (top talkers):

# tcpdump -tn -c 10000 -i fxp0 tcp or udp | awk -F "." '{print $1"."$2"."$3"."$4}' | \ sort | uniq -c | sort -nr | awk '$1 > 100'

Выявление аномалий TCP путем вычисления отношения числа исходящих пакетов с SYN флагом к числу входящих с SYN+ACK:
SYN_ONLY_FROM_ISP=`tcpdump -n -l -r $1 'src net 192.168.0.0/24' and \ 'dst net not 192.168.0.0/24' and 'tcp[13] == 2' | wc | awk '{print $1}'`
SYN_ACK_TO_ISP=`tcpdump -n -l -r $1 'src net not 192.168.0.0/24' and \ 'dst net 192.168.0.0/24' and 'tcp[13] == 18' | wc | awk '{print $1}'`
RATIO=$(echo "scale=3; $SYN_ACK_TO_ISP/$SYN_ONLY_FROM_ISP" | bc) 

Защита от DDoS с помощью утилиты tcpdump

tcpdump — это мощнейшая утилита UNIX, позволяющая перехватывать и анализировать сетевой трафик, проходящий через сетевые интерфейсы. Об установке читайте в документации утилиты или на сайте разработчика, в FreeBSD она есть в портах, в Debian Linux в репозиториях.
Приведу пример как можно использовать tcpdump. Например, на сервере отключены логи, идет легкая ddos атака, происходит что-то не ладное, вы хотите быстро посмотреть масштабность или убедиться, что это DDoS-атака, а не DoS или может это вообще никак не связано с внешним миром? Давайте посмотрим:

tcpdump -v -i eth0 dst port 80
После выше набранной команды вы сможете наблюдать список подключений к 80-у порту, чем больше повторных подключений с одинаковых хостов тем вероятнее мы столкнулись с DoS или DDoS атакой. Как вы уже наверное догадались, изменив порт можно проверить есть ли атака на FTP, SSH или другие сервисы которые крутятся на сервере. Добавив ключ -n имена хостов преобразуются в IP адреса.
Глазами все не уследить, при атаке на веб-сервер вывод tcpdump-a сумасшедшей скоростью будет двигаться вдоль окна вывода терминала :) Поэтому, мы сначала запишем вывод tcpdump-a в файл. пакетов 200-300 хватит.
tcpdump -v -n -w attack.log dst port 80 -c 250
-v самый простой уровень логирования, без изысканности.
-n преобразуем имена хостов в IP адреса
-w записываем анализ трафика в файл
-c количество захваченных пакетов
Приступим к анализу полученных данных через tcpdump, отпарсим лог следующей командой:
tcpdump -nr attack.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn
Результат будет — 2 столбца, в первом количество подключений, во втором IP. Чем больше подключений для одного IP тем вероятнее что это бот.
Если список очень длинный можно ограничить его указав нужное количество выводимых строк
tcpdump -nr attack.log |awk '{print $3}' |grep -oE '[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}' |sort |uniq -c |sort -rn | head -20
Что бы получить только IP адреса, без первого столбца, нужно убрать ключ -c после uniq
Вывод парсинга можно перенаправить в файл, а затем простым bash-скриптом, заблокировать все IP со списка.
#!/bin/bash
BLOCKDB="ips.txt" 
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
iptables -A INPUT -s $i -j DROP
Очень похожие трюки иногда проделывают с помощью утилиты netstat.


ip.addr ==x.x.x.x

Sets a filter for any packet with x.x.x.x, as either the source or destination IP address. This is useful if you want to look for specific machines or networks. A good example would be some odd happenings in your server logs, now you want to check outgoing traffic and see if it matches. This is a great filter for that.
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits

ip.addr ==x.x.x.x && ip.addr ==x.x.x.x

Sets a conversation filter between the two IP addresses. This is useful to watch communication between two specific hosts or networks. Sometimes you only need specific data, so there is no need to bother sifting through the others.
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits
Also of note with the '&&' operator—those of you who are familiar with programming will know this—but it could be repeated. The '&&' will return both conditions in the statement, and not one or the other as is sometimes thought. And yes, you need both of the ampersands.

http or dns

Sets a filter based on protocol. You do not always need to know every single packet traveling across, so being able to narrow down to the exact protocol you need is helpful. Looking to track some odd FTP traffic? set it for 'ftp'. Looking to see why you can't find any websites? Try setting it to 'dns' and see what is going on.
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits

tcp.port==xxx

Sets filters based on TCP port numbers. Because port numbers can be reassigned and used in various places (within obvious limitations), it is useful to be able to just look at traffic going into and out of a specific port. Here we will look for all traffic using port 80 (HTTP).
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits

tcp.flags.reset==1

Sets filters to show all TCP resets. Each packet contains a TCP header. Each of these headers contains a bit known as the "reset" flag. In most packets, this bit is set to 0 and has no effect, however if this bit is set to 1, it indicates to the receiving computer that it should should immediately stop using the connection—A TCP reset basically kills a TCP connection instantly.
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits

http.request

Sets a filter for all HTTP GET and POST requests. This will show webpages being accessed for the most part here.
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits

tcp contains xxx

Set a filter based on a string you provide and searches TCP packets for that string. If you were looking for a specific item or user name you knew was appearing in the packet, this is a filter you could use. Here we type 'wonder' as I am writing this article and we see:
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits

!(arp or icmp or dns)

This filter format is designed to filter out certain types of protocols you might not want. In my example, we have ARP, ICMP, and DNS—all of which are broadcasts—to hide. This lets our eyes work on other things.
8 Wireshark Filters Every Wiretapper Uses to Spy on Web Conversations and Surfing Habits