Интересно, есть ли способ разделить pcap, содержащий (только) IRC по каналам. Я пытаюсь сравнить точность обнаружения ботнета в каналах с использованием существующих IDS (suricata, snort). Единственный способ проверить, какой канал IRC был обнаружен, - это разделить pcap на каналы IRC и попытаться проанализировать каждый pcap отдельно. Есть ли способ сделать это с помощью tcpdump
или любого другого инструмента?
Большое спасибо!
Это должно быть довольно просто, так как каждое сообщение (RFC 2812, 3.3; RFC 1459, 2.3) и операция канала (RFC 2812, 3.2; RFC 1459, 4.2) содержит имя канала в обоих направлениях:
Сообщение клиента на канал:
PRIVMSG #channel :Hello !
Сообщение сервера от канала:
(скрыто) PRIVMSG #channel :Hello!
Примеры команд операций, связанных с каналом, на сервер и с сервера:
JOIN #channel
(скрыто) ПРИСОЕДИНЯЙТЕСЬ к #каналу
РЕЖИМ #канал +ts
(скрыто) РЕЖИМ #channel +ts
ТЕМА #test :новая тема
(скрыто) ТЕМА #test :новая тема
Конечно, вы должны создать регулярное выражение, которое не считает имя канала, если оно находится внутри сообщения, темы и т. д. Я думаю, было бы нормально использовать :
символ в качестве разделителя, например:
/^(:|)[^:]*(PRIVMSG|JOIN|PART|MODE|TOPIC) #channel( |$)/gm
^(:|)
позволяет использовать необязательный :
в качестве первого символа для сообщений с сервера[^:]*
отключает весь поиск после следующего :
(PRIVMSG|JOIN|PART|MODE|TOPIC)
список команд, которые вы ищете – полный как требуется! #channel
имя канала ( |$)
конечный пробел или конец строки (мы не хотим совпадать с #channelfoo
) /gm
для глобальных и многострочных Это должно работать в вашем случае использования: это может привести к сбою в границе случаях и на самом деле не является полным парсером протокола IRC.