Перехват TCP / IP и UDP может быть сделан с использованием tcpdump
/ dumpcap
и создает файл pcap / pcapng, который может быть передан в Wireshark для дальнейшего анализа. Существует ли подобный инструмент для именованных доменных сокетов Unix? (Общее решение, которое работает для абстрактных сокетов, тоже было бы неплохо.)
strace
«как есть» недостаточно, фильтровать ввод-вывод для доменных сокетов Unix непросто. Использование прокси socat
или подобное также не подходит, так как целью является пассивный анализ для существующих открытых программ.
Как я могу получить захват пакета, который я могу использовать в Wireshark для анализа? Примерами протокольных приложений являются X11 (Xorg, мое текущее приложение) и cURL / PHP (HTTP). Я видел CONFIG_UNIX_DIAG
вариант в ядре Linux, это какой-то пользы?
источник
-nolisten tcp
, нет TCP-сокета. Если все не получится, я, вероятно, вернусь к использованию xscope или вашего хитрого трюка strace + text2pcap. Я все еще был бы заинтересован в общем захвате сокетов Unix (только для данных, а не данных побочных каналов).Ответы:
Начиная с ядра Linux v4.2-rc5, захват напрямую невозможен с использованием интерфейсов, используемых libpcap. libpcap использует специфичный для Linux домен
AF_PACKET
(псевдонимPF_PACKET
), который позволяет собирать данные только для данных, проходящих через « сетевое устройство » (например, интерфейсы Ethernet).Нет интерфейса ядра для захвата из
AF_UNIX
сокетов. Стандартные захваты Ethernet имеют заголовок Ethernet с источником / назначением и т. Д. У сокетов Unix такого поддельного заголовка нет, а реестр типов заголовков канального уровня не содержит ничего связанного с этим.Основные точки входа для данных -
unix_stream_recvmsg
иunix_stream_sendmsg
дляSOCK_STREAM
(SOCK_DGRAM
иSOCK_SEQPACKET
имеют функции с одинаковыми именами). Данные буферизируются внутриsk->sk_receive_queue
и внутриunix_stream_sendmsg
функции , нет кода, который в конечном итоге приводит к вызовуtpacket_rcv
функции для захвата пакетов. Посмотрите этот анализ с помощью osgx для SO для получения более подробной информации о внутренностях захвата пакетов в целом.Возвращаясь к первоначальному вопросу о
AF_UNIX
мониторинге сокетов, если вы в основном заинтересованы в данных приложения, у вас есть несколько вариантов:strace
и захват возможных системных вызовов, которые выполняют ввод / вывод. Есть много из них,read
,pread64
,readv
,preadv
,recvmsg
и многих других ... См @ Stéphane Chazelas примера дляxterm
. Недостаток этого подхода заключается в том, что вы сначала должны найти свой файловый дескриптор, а затем все еще можете пропустить системные вызовы. С помощью strace вы можете использовать-e trace=file
большинство из них (распространяетсяpread
только на них-e trace=desc
, но, вероятно, не используется для сокетов Unix большинством программ).unix_stream_recvmsg
,unix_stream_sendmsg
(илиunix_dgram_*
илиunix_seqpacket_*
) в ядре и вывести данные куда-нибудь. Вы можете использовать SystemTap для установки таких точек трассировки, вот пример для отслеживания исходящих сообщений. Требуется поддержка ядра и наличие символов отладки .Активно (работает только для новых процессов):
Используйте прокси, который также пишет файлы. Вы можете написать быстрый мультиплексор самостоятельно или взломать что-то вроде этого, которое также выводит pcap (остерегаться ограничений, например,
AF_UNIX
может передавать файловые дескрипторы,AF_INET
не может):Предложенная
CONFIG_UNIX_DIAG
опция, к сожалению, здесь также бесполезна, ее можно использовать только для сбора статистики, а не для получения данных в реальном времени по мере их прохождения (см. Linux / unix_diag.h ).К сожалению, в настоящее время нет идеальных трассировщиков для доменных сокетов Unix, которые производят pcaps (насколько мне известно). В идеале должен быть формат libpcap, в котором есть заголовок, содержащий PID source / dest (если он доступен), за которым следуют необязательные дополнительные данные (учетные данные, дескрипторы файлов) и, наконец, данные. Не имея этого, лучшее, что можно сделать, - это отслеживание системных вызовов.
Дополнительная информация (для заинтересованных читателей), вот некоторые следы (полученные при взломе GDB
unix_stream_*
иrbreak packet.c:.
Linux в QEMU и socat в основной Linux 4.2-rc5):источник
Я написал инструмент для захвата и сброса трафика сокетов доменов Unix. Он использует
bpf/kprobe
для проверки функции ядраunix_stream_sendmsg
и выгрузки трафика в пространство пользователя.Инструмент зависит от
bcc
, поэтому вам нужно установить вbcc
первую очередь.Пример выполнения:
источник