Network: работа с pcap – сбор и анализ (Wireshark/tshark, tcpdump, packetdump), редактирование (hex editor, tcprewrite, bittwiste, editcap, mergecap, wireedit), воспроизведение (tcpreplay, bittwist), анонимизация, комплексные продукты (moloch, observer)

СБОР и АНАЛИЗ

Wireshark

Разное

  • курс “Wireshark: Packet Analysis and Ethical Hacking: Core Skills” на GNS3. В целом базовый (уровень CCNA), но есть интересные вещи –  например, тут увидел полноценную эмуляцию VoIP с sofphone/call manager в среде GNS3.
  • идентификация данных о хосте на основе pcap (из dhcp, nbns, http, kerberos)
  • упражнения по анализу трафика с атаками
  • пример выдачи IP по DHCP с работой ARP
  • много разных дампов можно найти тут

https://wiki.wireshark.org/SampleCaptures

https://packetlife.net/captures/

  • Wireshark не показывает Checksum Ethernet, в отличии, например, от Ixia IxExplorer и не включает размер CRC в размер фрейма. Поэтому, смотря в дамп трафика Wireshark:

    • можно думать, что конец фрейма одинаковый у фреймов с одинаковым payload, но разными SRC/DST адресами, но по факту он отличается т.к. checksum фрейма отличается
    • можно некорректно рассчитывать размер фрейма – нужно прибавлять 4 байта к тому, что видим в Wireshark (4 байта чаще всего представляются в виде 8ми hex символов, сгруппированных по два)

Wireshark может:

  • Расшифровать зашифрованные данные, если дать ему ключ (например, дав ему пароль от Wi-Fi для WEP/WPA сети)
  • Найти пароль в протоколах, не использующих шифрование (telnet, snmp, http, SIP/RTP, etc). Причем по follow tcp stream можно посмотреть весь текстовый обмен – красным отправленные данные, синим полученные (дубли для некоторых т.к. сервер подтверждает прием от клиента символов).

  • Собрать телефонный VoIP звонок из stream
  • Можно посмотреть задержку в stream
  • Собрать файл из stream SMB/FTP/HTTP/etc
  • Собрать страницу из HTTP пакетов (follow TCP stream)
  • Легко посмотреть задержку между пакетами – delta time.
In Wireshark Preferences / Appearance / Columns you can add a new column of type Delta time. With this new column and wise capture filtering you should be able to do what you want.

  • В Wireshark есть выгрузка object из дампов – можно картинки просмотренного сайта выгрузить, страницы html

  • Можно искать запросы к определенным URL (можно и в tcpdump, но проще куда в акулке)
  • Продуманный интерфейс: Сразу можно посмотреть и HEX и ASCII репрезентацию данных, отсортировать пакеты, увидеть проблемы по цвету, отфильтровать вывод и прочпроч

Wireshark не только с точки зрения удобства использования лучше tcpdump, он считается и намного более мощным инструментом в сравнении с ним, особенно когда идет вопрос в анализе уровня приложений (поддержка более 2к протоколов, даже таких как USB/Bluetooth/Zigbee). Так же использует libpcap. Кроме того у Wireshark есть консольная утилита tshark (terminal-shark), которая по сути устраняет необходимость в tcpdump вовсе (сори, tcpdump). Например, можно использовать фильтры, аналогичные wireshark в консоли.

tcpdump is a command line utility, while wireshark has a powerful graphical interface. While tcpdump understands some application-layer protocols, wireshark expands on this with a much larger complement of protocols understood.
Фильтры

Фильтры бывают двух видов:

  • display filters – применяемые на уже захваченный трафик, чаще всего используются именно они

  • capture filters – применяемые при перехвате трафика, используются при больших объемах данных

Очень полезная вещь, которая позволяет не знать синтаксис:

  • apply as a filter – применяешь нажав ПКМ по информации из полей пакетов или по самому пакету в brief view. Причем
    • можно выбрать как подпадания (Selected), так и все записи, которые отличаются от нашей (Not Selected)
    • можно дополнять фильтр другими полями, используя между выражениями булевую логику (and/or selected, not/or selected)
  • conversational filter – позволяет показать только взаимодействие двух участников на каком-либо уровне адресации. Очень удобно. К примеру, находим все пакеты между 15.1.1.2 15.1.1.1 с использованием номеров портов 11451 и 179. 

  • drag and drop (новые версии) – тянешь любое значения из поля любого пакета и тебе просто показывается синтаксис (можешь дотянуть до фильтра или просто узнать, что нужно вводить в нем)!
# GENERAL/MISC
dhcp # user insted bootp nbns # netbios http.request or !(ssdp) # вместо or можно использовать || kerberos.CNameString kerberos.CNameString and !(kerberos.CNameString contains $) # вместо and можно использовать && http.request.uri matches "q=example"
tcp.srcport==8000
# ADDR
ip.addr == 192.168.0.0
ip.src == 192.168.0.0

ip.dst == 192.168.0.0
ipv6.addr ip.addr == 192.168.0.1 or not tcp.port in (80 25)
eth.addr == ff:ff:ff:ff:ff:ff


# NETS
ip.src==192.168.0.0/16 and ip.dst==192.168.0.0/16 # traffic inside LAN (между сетями)

# CONTENT
frame contains 06:03:55:1d:0e:04 # CONTENT (данные любого уровня во фрейме)
udp contains 81:60:03 # данные в UDP (поиск делается как в header, так и в payload)
tcp contains 03:00:00
or
tcp.payload == 03:00:00

# IP
ip.flags.mf == 1 or ip.frag_offset gt 0 # фрагментированные пакеты (fragmented ip packets)

# TCP
tcp # оставляем только фреймы, в которых инкапсулирован TCP
tcp.port == 3389
tcp.window_size == 0 && tcp.flags.reset != 1 # TCP buffer full - source is instructing Destination to stop sending data
# TCP FLAGS
tcp.flags.syn == 1
tcp.flags.reset == 1
tcp.flags.fin == 1

# BGP
bgp.open.identifier # смотрим open сообщения с полем BGP identifier в нем
bgp.update.path_attribute # смотрим update сообщения с полем path_attribute в нем

# OSPF
ospf.area_id = 0.0.0.0

# SSH
not port 22 # полезно для отброса управляющего коннекта

# ICMP
icmp # полезно для просмотра только icmp пакетов (ping)

# WIFI handshake
# в дампе должны быть все четыре сообщения eapol key (Message 1-4 to 4)
# тут есть sh скрипт по извлечению https://miloserdov.org/?p=1047
# напр. wlan.addr==28:28:5D:6C:16:24
wlan.fc.type_subtype == 0x08 || wlan.fc.type_subtype == 0x05 || eapol && wlan.addr == BSSID

# TSHARK example (Y - display filter)
tshark -r dump.pcap -Y "(ip.src == 172.17.0.2)"
Профили

Можно создать разные профили под разные задачи –  Multicast, VOIP, RIP/OSPF/BGP/etc. В профилях будут уникальные настройки интерфейса – zoom, расположение панелей, шрифты (размер, цвета), можно добавить уникальные для протокола столбцы.

RTT

statistics -> tcp stream graph -> round trip time

VoIP

Wireshark очень полезен для диагностики VoIP.

Заходим в контекст Telephony, выбираем VoIP Calls. Видим звонки успешные и не очень. Так же видим и активные звонки.

Выбрав звонок и нажав на Flow Sequence можно посмотреть наглядно весь процесс согласования.

А по Play Streams можно даже прослушать звонок (если он успешен и поддерживается кодек, как тут G.711A), через встроенный в акулу RTP player. Круто!

Разговор в VoIP состоит из двух unicast RTP потоков – один от src до dst, второй от dst до src. По analyse можно посмотреть детальные данные (max jitter, RTP packets, lost, etc) по каждому потоку.

Пример дампа с разговором (из курса GNS3 Wireshark: Packet Analysis and Ethical Hacking: Core Skills). Для прослушивания RTP потока нужно сделать decode as по одному из UDP пакетов разговора и выбрать протокол RTP для интерпретирования.

voip_skinny-rtp_call.pcapng

Время

В настройках просмотра можно выбрать формат времени – например, не на основе старта снятия дампа, а реальное время с датой.

Статистика

В разделе statistics можно узнать кучу разных вещей (только часть):

  • общая статистика по файлу:
    • дата/время первого и последнего пакета
    • размер дампа
    • количество пакетов
    • время съема трафика
    • средний pps, packet size, bits/s

  • распределение по протоколам в protocol hierarchy, причем можно посмотреть на эти данные в самом дампе, применив стандартный Apply as a filter в статистике

  • по размерам пакетов в packet lengths

  • найти top talkers в endpoints (MAC, IP4/6, UDP, TCP)

  • проанализировать взаимодействие между хостами по объему трафика в conversations (MAC, IP4/6, UDP, TCP)

  • проанализировать взаимодействие между хостами по передаваемым сообщениям (транзакциям), сохраняя их последовательность в flow graph. Очень удобно, что используя стандартный фильтр можно посмотреть конкретное взаимодейтсвие (в статистике прожать “Limit to display filter”) – к примеру ниже отфильтрованное взаимодействие только по DHCP.

tcpdump
  • Tcpdump по сути консольный Wireshark. Дампы tcpdump, кстати, читаются легко Wireshark, что делает его очень полезной утилитой
  • tcpdump (да и wireshark) может дропать трафик при большом объеме. Главное узкое место – скорость ЖД. Сделал несколько генераций одного трафика. В первом pcap меньше данных и нет всех пакетов если открыть в Wireshark. При этом все пакеты пришли по назначению во все итерации.

    -rw-r--r--  1 root root 830277116 янв 01 10:29 test_1.pcap
    -rw-r--r--  1 root root 830356104 янв 01 10:33 test_2.pcap
    -rw-r--r--  1 root root 830356104 янв 01 10:44 test_3.pcap
    -rw-r--r--  1 root root 830356104 янв 01 10:56 test_4.pcap
    -rw-r--r--  1 root root 830311550 янв 01 10:59 test_5.pcap
  • Tcpdump может при старте не показывать какое-то время наличие пакетов на интерейсе, особенно если не отключен DNS resolve через -n
 tcpdump -i enp2s0 -n
  • При передаче файлов с дампами по сети, всегда нужно учитывать, что Wireshark/tcpdump не ужимают дампы, а после сжатия обычным zip/rar файл может весить в десятки раз меньше (gzip c 800MB до 50MB, 7z c 800MB до 20MB).

tcpdump использует open source libpcap библиотеку. Показывает (STDOUT) по умолчанию данные в terminal. Может писать в файл дамп или читать из файла. По умолчанию показывает brief информацию в удобном для человека формате – IP адреса там например через точку или по умолчанию он даже делает reverse lookup (PTR) или номера портов подменит на сервисы, но конечно все равно не так удобно как Wireshark.

Tcpdump is a popular, lightweight command line tool for capturing packets and analyzing network traffic.

tcpdump требует прав админа для запуска. Минимум ему нужно скормить название ip интерфейса через опцию -i (узнать его можно через ifconfig/ip link). По результату будет показана статистика. По умолчанию будет показана базовая инфа – layer 3 protocol, source, and destination addresses and ports, TCP details, like flags, sequence and ack numbers, window size, and options.

Head's up that tcpdump does require root or administrator privileges in order to capture traffic, so every command must begin with sudo. At a minimum, you must specify an interface to listen on with the -i flag. You may want to check what the primary network interface name is using ip link.
~$ tcpdump host 8.8.8.8
tcpdump: no suitable device found
~$ sudo tcpdump host 8.8.8.8
[sudo] password for <user>: 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes

Опции:

-i [if] # название прослушиваемого интерфейса, сразу после интерфейса можно указать еще что-то, например port 80, тогда вывод будет фильтроваться сообщениями только port 80 на этом интерфейсе
-e # показать MAC адреса (ethernet адреса) в выводе
-n # не резолвим IP в FQDN, номера портов в сервисы
-w [filename.pcap] # сохраняем захваченное в binary файл
-r [filename.pcap] # читаем файл (можно без прав sudo), причем можно указывать те же опции, что при обычном захвате (-v для большего вывода, -n для фильтрации, etc)
-v # более детальная инфа (details of the IP header, like time-to-live, IP ID number, IP options, and IP flags) 
-x # показываем raw data 
-X # ASCII вид данных
-c # выход при получении определенного количества пакетов
vlan [N] - фильтруем по номеру VLAN (при наличии SVI) host [ip] - указываем чтобы в содержимом был IP (DST/SRC)
port [N] - TCP/UDP port
greater [N] - указываем размер пакета
timeout [N] <command> - запуск только на определенное время

Usage:

# БАЗОВЫЙ ЗАХВАТ
$ sudo tcpdump -i eth0
20:44:29.087535 IP linux-instance.c.qwiklabs-gcp-c7fbce528931fd28.internal.ssh > test.net.54895: Flags [P.], seq 419056:419280, ack 4961, win 285, length 224
20:44:29.103033 IP test.net.54895 > linux-instance.c.qwiklabs-gcp-c7fbce528931fd28.internal.ssh: Flags [P.], seq 4961:5025, ack 402400, win 1020, length 64
1951 packets captured
2001 packets received by filter
50 packets dropped by kernel

# ЗАХВАТ В TXT только заданное количество секунд

$ sudo timeout 5 -n host 1.1.1.1 and port 80 and greater 1000

# ЗАХВАТ В TXT с завершением по получению хоть одного пакета
$ sudo tcpdump -c 1 -n host 1.1.1.1 and port 80 and greater 1000 > pcap.txt
# ЗАХВАТ В PCAP $ sudo tcpdump -i eth0 port 80 -w http.pcap # This starts a capture on our eth0 interface that filters for only HTTP traffic by specifying port 80. The -w flag indicates that we want to write the captured packets to a file named http.pcap $ curl example.com $ ls -lh http.pcap -rw-r--r-- 1 root root 9.3K Feb 19 21:16 http.pcap $ tcpdump -r http.pcap -nv # Note that we don't need to use sudo to read packets from a file. Also note that tcpdump writes full packets to the file, not just the text-based analysis that it prints to the screen when it's operating normally. For example, somewhere in the output you should see the html that was returned as the body of the original query in the other terminal # С ФИЛЬТРАМИ на DNS 8.8.8.8 ~$ sudo tcpdump -i eth0 -vn host 8.8.8.8 and port 53 tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 21:02:36.484819 IP (tos 0x0, ttl 64, id 32534, offset 0, flags [none], proto UDP (17), length 68) 10.0.0.2.40596 > 8.8.8.8.53: 64482+ [1au] A? example.com. (40) 21:02:36.486077 IP (tos 0x0, ttl 115, id 11509, offset 0, flags [none], proto UDP (17), length 84) 8.8.8.8.53 > 10.0.0.2.40596: 64482$ 1/0/1 example.com. A 93.184.216.34 (56) Host 8.8.8.8 specifies that we only want packets where the source or destination IP address matches what we specify (in this case 8.8.8.8). If we only want traffic in one direction, we could also add a direction qualifier, like dst or src (for the destination and source IP addresses, respectively). However, leaving out the direction qualifier will match traffic in either direction. Next, the port 53 portion means we only want to see packets where the source or destination port matches what we specify (in this case, DNS). These two filter statements are joined together with the logical operator "and". This means that both halves of the filter statement must be true for a packet to be captured by our filter. $ dig @8.8.8.8 A example.com ; <<>> DiG 9.10.3-P4-Debian <<>> @8.8.8.8 A example.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64482 ;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;example.com. IN A ;; ANSWER SECTION: example.com. 6385 IN A 93.184.216.34 ;; Query time: 1 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Tue Feb 19 21:02:36 UTC 2019 ;; MSG SIZE rcvd: 56 # читаем файл $ tcpdump -r <file> # читаем файл и фильтруем вывод только udp пакетами $ tcpdump -r <file> udp
packetdump

Сбор и сохранение в компрессированном pcap с ротацией каждый час.

packetdump -i eth0 -G 3600 -w foo-%y%m%d-%H%M%S.pcap.lz4

Читаем последние логи для интерфейса:

packetdump collected-info-eth1 dump_text.txt
This is a high-speed (10gig) packet-sniffer that compresses packets as it writes to disk. I wrote it because the packet logging features of tcpdump are slow, but extra special slow when attempting to compress files after they've been written uncompressed to the disk when rotating files.
Python + pyshark

подробнее в python.

 

Редактирование
PYTHON + SCAPI

Самый удобный способ когда нужно сделать более чем одно действие по изменению сетевых дампов. Легко можно сделать даже непростые операции, например, заменить все сетевые (MAC, IP, PORT) адреса в дампе на другие, IPv6 header на IPv4. Замена IPv6 header на IPv4 подразумевает извлечение payload, создание IPv4 header, добавление в него payload, пересчет checksum и length (см. в HEX EDITORS).

Подробнее в python поиском по scapi.

hex editors

Самый хардкорный 🙂 способ изменения дампов. Подразумевает и пересчет checksum, тут может помочь tcprewrite.

К примеру,  c помощью hex editor ipv6 header заменить на ipv4 не так просто (особенно, в сравнении со python + scapi):

1) изменяем hex строку. Много разных способов, хорошо с gif описано тут.

https://hexed.it/

vim
:%!xxd # преобразуем в hex данные и превращаем vim в hex editor

2) после изменения нужно использовать pcapfix (причина однозначно непонятна, возможно, разрушается структура при экспорте)

pcapfix -d test.pcap
[+] CORRECTED Packet #1 at position 24 (1566304697 | 904775 | 74 | 74).
[!] This corruption seems to be a result of an ascii-mode transferred pcap file via FTP.
[!] The pcap structure of those files can be repaired, but the data inside might still be corrupted!
[+] SUCCESS: 1 Corruption(s) fixed!

3) IPv6 header меняется от пакета к пакету, даже с учетом совпадения адресов SRC/DST – flow label в пакетах дампа зачастую разный, payload length так же разный; поэтому при массовой замене нужно заменять в HEX с помощью regexp

4) IPv4 header должен иметь корректный total length от IPv4 header + payload; т.е. при каждой замене нужно корректировать total length для каждого пакета, иначе пакет будет отбрасываться еще на уровне ядра ОС (Linux, Windows)

15:38:17.904775 IP 7.7.7.7.49474 > 192.168.0.1.8000: Flags [S] [bad hdr length 40 - too long, > 32]
[Malformed Packet: TCP: length of contained item exceeds length of containing item]

5) Checksum может не пересчитываться tcprewrite с segmentation fault (помог запуск tcprewrite на другой VM)

# tcprewrite --fixcsum --infile=test.pcap --outfile=test_new.pcap
Ошибка сегментирования

И все это нужно делать для всех пакетов в дампе.

 

tcprewrite

Хороший, хотя и базовый, редактор дампов.

  • Usage
  • Ставится совместно с последним tcpreplay (apt-get install tcpreplay)
  • Если воспроизвести корректно дамп с icmp request (dst ip) хост, на который прилетит трафик, может ответить icmp reply. Аналогичное справедливо и для любых других серверных приложений.

Change MAC

tcprewrite --enet-dmac=2c:56:dc:72:08:39 --infile=UDP_original.pcap --outfile=UDP_changed_dst.pcap

Change IP

Можно менять по net/mask, если не использовать опцию -fixsum, то чексумма может не пересчитаться.

tcprewrite --srcipmap=127.0.0.1:7.7.7.7 --dstipmap=127.0.0.1:192.168.0.1 --infile=test.pcap --outfile=test_without_loo.pcap

tcprewrite --fixcsum --dstipmap=0.0.0.0/0:172.17.0.2 --infile=UDP_changed_dst.pcap --outfile=UDP_changed_dst_mac_ip.pcap

tcprewrite --fixcsum --srcipmap=0.0.0.0/0:172.0.0.2 --infile=UDP_changed_dst_mac_ip.pcap --outfile=UDP_changed_dst_mac_ip_src_ip.pcap
bittwist/bittwiste

Хорошие, но старые утилиты для воспроизведения/генерации трафика (bittwist) и редактирования pcap (bittwiste). Bittwiste не поддерживает IPv6.

Bittwiste удаление байт:

This removes (-D) the frame IP-, UDP- and GTP-Header. Result: The encapsulated IP header will be the new frame IP header ;-) Maybe you'll have to adjust the number of stripped bytes for your environment (IP Options).

bittwiste -I gtp-u.pcap -O gtp-stripped.pcap -D 15-54

 

STRIPE

Может помочь удалить лишние инкапсуляции

802.1Q VLANs, MPLS, GRE and PPPoE, L2TP,VXLAN

./stripe -r mpls-frames.cap -w clean-frames.cap
 
WireEdit

Хороший продукт для редактирования pcap. У самого Wireshark была beta с возможностью edit, но видимо дальше беты не зашло.

С помощью WireEdit в пару кликов можно поменять любые поля (в том числе массовые замены) и пересчитать checksum. Требует лицензию (высылают на почту при регистрации, сейчас с этим стало сложнее).

Продукт развивается, пример добавлений в новом релизе:

--------------------------------
11/01/19 WireEdit 2.10.54
--------------------------------
1)* DOCSIS 3.1 support added. Needs more work, usable as is.
2)* VRRP support added.
3)* Mobile Core (SS7, GTP, GSM MAP, DIAMETER, etc.) support added.
SPLIT PCAP

Разбиваем крупный pcap на несколько дампов по 100 MB (tcpdump).

sudo tcpdump -r ~/3.pcap -w /tmp/new3.pcap -C 100

Разбиваем крупный pcap на несколько дампов по миллиону пакетов (editcap).

sudo editcap -c 1000000 ch5.pcap out.pcap
editcap + mergecap

Поменять order пакетов можно с помощью editcap + mergecap. Сначала с помощью edit создаем pcap с отдельными пакетами из необходимого дампа, потом merge’им с помощью mergecap.

https://stackoverflow.com/questions/12741079/how-to-edit-wireshark-pcap-to-change-the-order-of-packets

editcap -r in.pcap tmp1 2-3
editcap -r in.pcap tmp2 1
editcap -r in.pcap tmp3 4-6
mergecap -w out.pcap -a tmp1 tmp2 tmp3

 

 

Воспроизведение
Tcpreplay
  • Про promiscuous режим можно почитать тут. Хотя мне не понадобилось его включение. Чаще всего утилиты его включают сами.
Tcpdump start/stop
[ 1691.019004] device eth0 entered promiscuous mode
[ 1699.783211] device eth0 left promiscuous mode
  • Основной недостаток – stateless. Полноценного TCP нет.

Описание:

tcpreplay - Replay network traffic stored in pcap files

tcpreplay is a tool for replaying network traffic from files saved with tcpdump or other tools which write pcap(3) files.

Использовать легко:

tcpreplay -i eth0 sample.pcap

# performance
tcpreplay -i eth0 --topspeed --preload-pcap sample.pcap# можно указать, что работать нужно с максимальной скоростью генерации (по умолчанию не с максимальной!) и выгружать pcap в RAM для ускорения (прирост может быть до трех раз)
tcpreplay -i eth0 -p 669642 --preload-pcap sample.pcap # можно указать конкретный pps

# loop, duration
tcpreplay -i eth0 --loop=1000 sample.pcap # повтор воспроизведения
tcpreplay -i eth0 --loop=1000 --duration=100 sample.pcap # повтор воспроизведения, но не более 100 секунд

# directory
tcpreplay -i eth0 --topspeed --loop=1000000000000 *cap* # воспроизводим все дампы в директории с максимальной скоростью (без предварительной загрузки в RAM)

# settings
tcpreplay --listnics # команда может не показывать по факту интерфейсы, которые может использовать. В моем случае была бесполезной (как promiscuous режим).

# version (как собрана утилита)
# tcpreplay -V
tcpreplay version: 4.3.1 (build git:v4.3.1) (debug)
Copyright 2013-2018 by Fred Klassen <tcpreplay at appneta dot com> - AppNeta
Copyright 2000-2012 by Aaron Turner <aturner at synfin dot net>
The entire Tcpreplay Suite is licensed under the GPLv3
Cache file supported: 04
Not compiled with libdnet.
Compiled against libpcap: 1.8.1
64 bit packet counters: enabled
Verbose printing via tcpdump: enabled
Packet editing: disabled
Fragroute engine: disabled
Injection method: PF_PACKET send()
Not compiled with netmap

 

tcpreplay-edit с fuzzing

Может падать с segmentation fault (segfault) на какие-то дампы/каких-то сборках, так же как tcprewrite.

Запуск простейший, поддерживаются те же опции, что в “обычном” tcpreplay и дополнительные, например нужные нам fuzz-seed и fuzz-factor.

  • fuzz-seed – seed value для рандомизации (по аналогии с isic)
  • fuzz-factor – сколько пакетов подпадает под fuzzing (с единицей каждый пакет). При fuzz-factor=1 скорость генерации уменьшается (может в несколько раз!) т.к. утилите приходится менять каждый пакет.
./src/tcpreplay-edit -i eth0 --topspeed --loop=100 --fuzz-seed=1 --fuzz-factor=1 *

 

tcpreplay с netmap

Для high performance можно использовать tcpreplay с netmap. Производительность в таком случае до line rate, что делает инструмент сопоставимым с commercial traffic generators на “обычных” сетевых картах.

--netmap
Write packets directly to netmap enabled network adapter.

This feature will detect netmap capable network drivers on Linux and BSD systems. If detected, the network driver is bypassed for the execution duration, and network buffers will be written to directly. This will allow you to achieve full line rates on commodity network adapters, similar to rates achieved by commercial network traffic generators. Note that bypassing the network driver will disrupt other applications connected through the test interface. See INSTALL for more information.

This feature can also be enabled by specifying an interface as 'netmap:<intf>' or 'vale:<intf>. For example 'netmap:eth0' specifies netmap over interface eth0.

По практике netmap дает вполне ощутимый прирост в генерации на 20-30% на 10G сетевых картах – напр. с 6 GBPS до 8-9. На 1G NIC может быть даже деградация, поэтому зачастую нет смысла на них использовать netmap.

As an aside, usually netmap is not required for GigE, especially with latest enhancements to checksum algorithms in 4.1.1. With some drivers such as e1000e I find it actually slows things down. It comes into play with 10GigE speeds and higher.

Сборка netmap.

https://github.com/luigirizzo/netmap
cd netmap-master
chmod -R 777 *
./configure
make
sudo make install
Сборка tcpreplay с netmap.
Для начала качаем сборку tcpreplay-4.3.1.tar.xz с сайта разработчика  т.к. напрямую с git требует autogen + сборка можеты быть не stable. Далее схема аналогична netmap.
cd tcpreplay-master
chmod -R 777 *
./configure --with-netmap=/path_to_netmap_dir/netmap-master
make
sudo make install
src/tcpreplay -V

Запуск tcpreplay с netmap.

Для запуска требуются установленные в ядро драйвера netmap (netmap.ko) и сетевой карты (напр. ixgbe.ko, igb.ko, igb_uio.ko, e1000e), иначе будет ошибка.

Fatal Error: failed to open device eth0: Unable to determine the running netmap version.

sudo insmod netmap.ko
sudo insmod ixgbe.ko

Можно так же проверить lsmod, ls /dev/netmap.

# lsmod | grep netmap
netmap 221184 14
# ls /dev/netmap
/dev/netmap

Enjoy.

./tcpreplay-master/src/tcpreplay -i eth0 --topspeed --loop=100 --preload-pcap --netmap *cap*
Switching network driver for eth0 to netmap bypass mode... done!
File Cache is enabled
Warning: Unable to send packet: User abort
Actual: 88828775 packets (125603887850 bytes) sent in 123.73 seconds
Rated: 1015128566.9 Bps, 8121.02 Mbps, 717912.70 pps
Statistics for network device: eth0
Switching network driver for eth0 to normal mode... done!

./tcpreplay-master/src/tcpreplay -i eth0 --topspeed --loop=100 --preload-pcap *cap*
File Cache is enabled
Actual: 33439919 packets (47284045466 bytes) sent in 66.10 seconds
Rated: 715276154.4 Bps, 5722.20 Mbps, 505853.00 pps
Statistics for network device: eth0

 

Анонимизация

Презентация

 

Комплексные продукты

Moloch – система сбора/анализа/хранения/индексации дампов в формате pcap. Идея – не замена IDS, а максимальная видимость сети (network visibility). Сайт moloch. Использует elasticsearch для поиска в дампах. Может быть использован в Big Data, Forensics. Имеет api. Доступ к дампам на сенсорах может быть через WEB HTTPS или API, есть поддержка шифрования дампов. Проект активно развивается (last release буквально за месяц до  написания этого текста). Использует java environment, могут быть проблемы с установкой и работой (удаление файлов). 

Leave a Reply