Как отфильтровать результаты tshark перед записью в файл?

Я пытаюсь вычислить GET Запрос с моего сервера.

Я использую tshark.

Я запускаю следующую команду для фильтрации входящего трафика и получения только GET запросов:

/usr/sbin/tshark   -b filesize:1024000  -b files:1  \
'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \
-w samples.pcap -R 'http.request.method == "GET"'  

Как видите, я определил хранить отфильтрованные результаты в 1 файле с максимальным размером 1G и именем: samples.pcap.

Проблема в том, что когда я пытаюсь открыть файл pcap, я вижу, что tshark stored all traffic there:

3245 172.692247  1.1.1.1 -> 2.2.2.2 HTTP [TCP Retransmission] Continuation or non-HTTP traffic
3246 172.730928  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic
3247 172.731944  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic
3248 172.791934  1.1.1.1 -> 2.2.2.2  HTTP GET /services/client/client.php?cnc=13 HTTP/1.1
3249 172.825303  1.1.1.1 -> 2.2.2.2 HTTP HTTP/1.1 200 OK [Unreassembled Packet [incorrect TCP checksum]]
3250 172.826329  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic
3251 172.826341  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic
3252 172.826347  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic
3253 172.826354  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic
3254 172.826359  1.1.1.1 -> 2.2.2.2 HTTP Continuation or non-HTTP traffic

У меня действительно большой трафик, в течение 10 минут я получаю размер файла pcap 950M. И на его разбор уходит около 4 минут.

Интересно, что когда я пытаюсь запустить его без сохранения в локальном файле (но в /tmp):

/usr/sbin/tshark \
'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' \
-R 'http.request.method == "GET"':

3.776587 1.1.1.1 -> 2.2.2.2  HTTP GET /services/client/client.php?cnc=13 HTTP/1.1
4.775624 1.1.1.1 -> 2.2.2.2  HTTP GET /services/client/clsWebClient.php HTTP/1.1
8.804702 1.1.1.1 -> 2.2.2.2  HTTP GET /services/client/client.php?cnc=13 HTTP/1.1

Это работает, но в этом случае у меня в /tmp есть несколько временных файлов с огромным размером 1G+.

Я что-то пропустил?

Спасибо

=======================================================

Изменить

Ларс попросил добавить -f:

sudo /usr/sbin/tshark   -T fields -e 'http.request.uri contains "cnc=13"'  \
         -b filesize:1024000  -b files:1  \
         -f 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'  \
         -w samples.pcap

Не помогает, все равно sample.pcap хранит весь трафик:

 74   6.908388  172.20.0.23 -> 89.78.170.96 HTTP Continuation or non-HTTP traffic
 75   6.908394  172.20.0.23 -> 89.78.170.96 HTTP Continuation or non-HTTP traffic

person Maxim Shoustin    schedule 17.04.2013    source источник
comment
Вы пытались передать выражение фильтра захвата параметру -f?   -  person Lars Kotthoff    schedule 21.04.2013
comment
Я пробовал, все равно получаю весь трафик. Куда поставить -f?   -  person Maxim Shoustin    schedule 21.04.2013
comment
Прямо перед выражением фильтра, т.е. -f 'tcp...   -  person Lars Kotthoff    schedule 21.04.2013
comment
Не помогает, см. мою правку   -  person Maxim Shoustin    schedule 21.04.2013


Ответы (2)


Кажется, это работает, когда вы хотите объединить фильтры пакетов -w и bpf (т.е. то, что вы поставили на -f):

 tcpdump -nli en1 -w - 'tcp port 80' | tshark -i - -R'http.request.method == "GET"'

(замена исходного tcpdump на tshark приводит к этой ошибке в моей локальной системе: tshark: Unrecognized libpcap format)

Сохранение результата фильтра чтения (-R), похоже, больше не поддерживается, начиная с версии 1.4.0, при захвате (или чтении из захвата) и повторной записи результата (см.: http://ask.wireshark.org/questions/10397/read-filters-arent-supported-when-capturing-and-saving-the-captured-packets ). Предположительно версии до 1.4.0 позволяли записывать в pcap и ограничивать вывод с помощью -b (это не проверялось).

Если вам просто нужен текстовый вывод -R (в отличие от вывода pcap). Я думаю, что приведенная выше команда будет вашим решением.

Чтобы ограничить свой вывод (т.е. вы упомянули, что просто хотите взять образец), вы можете использовать head -c <bytes> в любой точке конвейера обработки:

tcpdump -nli en1 -w - 'tcp port 80' | \
  tshark -i - -R'http.request.method == "GET"' | \
  head -c 1024000 > output.txt

для создания выходного текстового файла размером 1024000 байт с именем output.txt или

tcpdump -nli en1 -w - 'tcp port 80' | \
  head -c 1024000 | \
  tshark -i - -R'http.request.method == "GET"' > output.txt

для обработки 102400 байт входных данных pcap, которые были предварительно отфильтрованы для TCP-порта 80, и поместить текстовый вывод в файл с именем output.txt

person Emile Aben    schedule 25.04.2013
comment
Итак, в вашем примере, если у меня 100 М трафика в минуту, будет захвачен только GET, и где он будет размещен? Я хочу предотвратить создание временных файлов, что делает thar в /tmp. Для этого я использую -w - person Maxim Shoustin; 25.04.2013
comment
Насколько я вижу, в моей локальной системе (Mac OS X) этот метод не создает временные файлы в каталоге /tmp, а только фиксирует запросы GET к указанному выходному файлу. - person Emile Aben; 26.04.2013
comment
1-я и 2-я команды, которые вы разместили, работают, но я все еще получаю файл etherXXXX** в папке /tmp. - person Maxim Shoustin; 26.04.2013
comment
возможно, обновите версию wireshark (тот факт, что вы можете использовать -r и -f одновременно, предполагает, что вы можете запустить версию до 1.4.0). - person Emile Aben; 26.04.2013
comment
также: даже если ваша версия tshark по-прежнему создает файлы etherXXXX** в /tmp, они будут намного меньше, чем полный дамп, поскольку они предварительно фильтруются tcpdump. Сделайте предварительный фильтр более конкретным, и вы получите еще меньше в них (например, используйте полное выражение, которое вы разместили ранее: 'tcp порт 80 и (((ip[2:2] - ((ip[0]&0xf) ‹‹2)) - ((tcp[12]&0xf0)››2)) != 0)'). - person Emile Aben; 27.04.2013
comment
Спасибо за ваши усилия, я попробую на альфа-машине, когда приду в офис. В любом случае, вы проделали большую работу, и я ценю это. Я не знал, что вы можете сделать предварительный фильтр. В любом случае, в конце недели 50 баллов за вас. - person Maxim Shoustin; 27.04.2013

ну, не используйте -w, это сохранит необработанные данные, вы должны использовать оператор перенаправления «>», чтобы указать каталог назначения.

person Archiles heel    schedule 28.07.2017