Несколько дней назад @akaDimiG задал интересный вопрос:
Интересно узнать, есть ли простой способ через консоль узнать о сетевых подключениях и именах программ, их осуществляющих. Цель - выяснить, есть ли шпионские программы, осуществляющие вещание в сеть без моего ведома.
Тема комплексная, я посвящу ей несколько статей.
Сетевые соединения можно трактовать в Unix как открытые файлы, а этим вопросом занимается команда lsof (list open files). Например, для обработки входящих соединений для TCP используются “слушающие” порты (LISTEN). Детально почитать о TCP и UDP можно в статьях ”Transmission Control Protocol” и ”User Datagram Protocol”.
В основном угрозу представляют именно “слушающие” порты, раз на этому порту слушает какая-либо программа, то можно попробовать либо просто к ней доступиться удалённо, либо использовать уязвимость, которая может быть в этой программе. Также опасны исходящие соединения - “троян” может обратиться в Интернет за инструкциями, а потом, их исполняя, пересылать данные наружу (или найденные данные по кредитным картам, или же массово рассылать спам - вариантов много). Попробуем посмотреть, как можно через консоль получить хоть какую-то информацию о сетевой активности.
Сразу скажу, что оптимальнее использовать специализированные программы вроде Little Snitch. Обзор программы вы можете посмотреть в моей статье ”Берём управление сетевой активностью приложений в свои руки (Little Snitch)”.
Входящие TCP-соединения
Посмотреть, какие программы принимают входящие TCP-соединения можно командой:
ole-mac:~ ctrld$ sudo lsof -iTCP -sTCP:LISTEN COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME launchd 1 root 18u IPv6 0x083bce20 0t0 TCP localhost:ipp (LISTEN) launchd 1 root 19u IPv4 0x083c1b4c 0t0 TCP localhost:ipp (LISTEN) iStatLoca 42 root 4u IPv4 0x083c1740 0t0 TCP *:5204 (LISTEN) iStatLoca 42 root 7u IPv6 0x083bcbb0 0t0 TCP *:5204 (LISTEN) Skype 162 ctrld 36u IPv4 0x083bda8c 0t0 TCP *:48929 (LISTEN) Skype 162 ctrld 39u IPv4 0x083bd274 0t0 TCP *:49215 (LISTEN) textexpan 165 ctrld 7u IPv4 0x083c1334 0t0 TCP *:49160 (LISTEN) textexpan 165 ctrld 8u IPv4 0x083c1334 0t0 TCP *:49160 (LISTEN) Dropbox 175 ctrld 21u IPv4 0x0bb5dabc 0t0 TCP *:9979 (LISTEN) Dropbox 175 ctrld 24u IPv4 0x083bde98 0t0 TCP localhost:26164 (LISTEN) iChatAgen 936 ctrld 8u IPv4 0x0bb5f710 0t0 TCP *:49477 (LISTEN) httpd 1448 root 3u IPv6 0x083bc940 0t0 TCP *:http (LISTEN) httpd 1452 _www 3u IPv6 0x083bc940 0t0 TCP *:http (LISTEN)
Номера портов есть в файле /etc/services. Посмотрим, что такое “ipp”:
ole-mac:~ ctrld$ cat /etc/services | grep "^ipp" ipp 631/udp # IPP (Internet Printing Protocol) ipp 631/tcp # IPP (Internet Printing Protocol)
Те же данные, но без указания информации о программе, слушающей порт, можно получить командой netstat:
ole-mac:~ ctrld$ netstat -an | grep LISTEN tcp46 0 0 *.80 *.* LISTEN tcp4 0 0 *.49477 *.* LISTEN tcp4 0 0 127.0.0.1.26164 *.* LISTEN tcp4 0 0 *.9979 *.* LISTEN tcp4 0 0 *.49215 *.* LISTEN tcp4 0 0 *.48929 *.* LISTEN tcp4 0 0 *.49160 *.* LISTEN tcp46 0 0 *.5204 *.* LISTEN tcp4 0 0 *.5204 *.* LISTEN tcp4 0 0 127.0.0.1.631 *.* LISTEN tcp6 0 0 ::1.631 *.* LISTEN
Обратите внимание, что нужно запускать lsof через sudo - иначе будет выдана информация по процессам, запущенным под вами, и системных процессов, таких, как httpd, вы не увидите. В последней колонке строка вида “localhost:ipp” обозначает, что программа слушает порт ipp только на localhost (127.0.0.1), и “извне” этот порт недоступен. Строка же “*:5204” говорит о том, что порт 5204 открыт для всех сетевых интерфейсов.
В приведённом выше выводе lsof имя программы указано в обрезанном виде, но во второй колонке (PID) указан номер процесса, по которому можно найти более подробную информацию командой ps. Посмотрим, что это за программа iStatLoca:
ole-mac:~ ctrld$ ps ax | grep 42 42 ?? Ss 1:00.45 /Library/Application Support/iStat local/iStatLocalDaemon
Теперь ясно, что это программа iStatLocalDaemon из пакета iStat Menus.
Исходящие соединения TCP
Слежение за исходящими соединениями с помощью lsof проблематично, да и не его это задача. Если какая-то программа мгновенно передала данные и закрыла сокет, то lsof этого не покажет. Можно захватывать трафик с помощью Wireshark, однако узнать, какая именно программа прослала этот трафик, так невозможно.
Поэтому нужно использовать сторонние программы, следящие за сетевой активностью. Самая известная - Little Snitch, стоит $29.95. Или же ProteMac Meter.
Просмотр соединений tcp, находящиеся не в состоянии LISTEN:
ole-mac:~ ctrld$ sudo lsof -i TCP -n -s TCP:^LISTEN COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME iStatLoca 42 root 8u IPv4 0x083bfef8 0t0 TCP 127.0.0.1:5204->127.0.0.1:49176 (ESTABLISHED) iStatLoca 42 root 9u IPv4 0x083bf6e0 0t0 TCP 127.0.0.1:5204->127.0.0.1:49177 (ESTABLISHED) Wakoopa 172 ctrld 12u IPv4 0x0c761740 0t0 TCP 192.168.5.10:50928->75.127.77.173:http (CLOSE_WAIT) Dropbox 175 ctrld 7u IPv4 0x083be2a4 0t0 TCP 10.141.30.43:49271->174.36.30.67:https (CLOSE_WAIT) Dropbox 175 ctrld 31u IPv4 0x0c753334 0t0 TCP 192.168.5.10:49448->174.36.30.68:https (CLOSE_WAIT) Dropbox 175 ctrld 33u IPv4 0x0c757274 0t0 TCP 127.0.0.1:26164->127.0.0.1:50184 (ESTABLISHED) aosnotify 177 ctrld 5u IPv4 0x0bb5ff28 0t0 TCP 192.168.5.10:49463->17.250.248.83:5223 (ESTABLISHED) iChatAgen 936 ctrld 12u IPv4 0x0bb5f304 0t0 TCP 192.168.5.10:49479->209.85.137.125:5223 (ESTABLISHED) iChatAgen 936 ctrld 16u IPv4 0x0bb5ca8c 0t0 TCP 192.168.5.10:49480->64.12.26.146:aol (ESTABLISHED) Safari 1020 ctrld 18u IPv4 0x0c752f28 0t0 TCP 192.168.5.10:50592->128.210.7.20:ftp (CLOSE_WAIT) TextMate 1114 ctrld 9u IPv4 0x0c77b2d4 0t0 TCP 127.0.0.1:50184->127.0.0.1:26164 (ESTABLISHED) SubmitDia 1222 ctrld 5u IPv4 0x0c74f680 0t0 TCP 192.168.5.10:49894->17.254.2.214:https (ESTABLISHED) httpd 1448 root 4u IPv4 0x0bb5e6e0 0t0 TCP *:* (CLOSED) httpd 1452 _www 4u IPv4 0x0bb5e6e0 0t0 TCP *:* (CLOSED)
Соединения UDP
Протокол UDP - это протокол “connectionless”, не ориентированный на соединение. В отличие от TCP в нём нет стадий соединения (LISTEN, ESTABLISHED, etc), и по этому принципу нельзя отфильтровать программы.
Список программ, слушающих по UDP:
ole-mac:~ ctrld$ sudo lsof -i UDP -n COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ntpd 14 root 20u IPv4 0x081ca2e8 0t0 UDP *:ntp ... mDNSRespo 58 _mdnsresponder 8u IPv4 0x081cac5c 0t0 UDP *:mdns ... Skype 162 ctrld 8u IPv4 0x09e5a7bc 0t0 UDP 127.0.0.1:51892 Skype 162 ctrld 37u IPv4 0x09e5ac08 0t0 UDP *:48929 Dropbox 175 ctrld 20u IPv4 0x081ca054 0t0 UDP *:ewctsp iChatAgen 936 ctrld 11u IPv4 0x09e5ae9c 0t0 UDP 127.0.0.1:57343->127.0.0.1:57343 ...
Аналог с применением netstat:
ole-mac:~ ctrld$ netstat -an | grep udp udp6 0 0 *.123 *.* udp4 0 0 *.123 *.* udp6 0 0 *.5353 *.* udp4 0 0 *.5353 *.* udp4 0 0 127.0.0.1.51892 *.* udp4 0 0 *.48929 *.* udp4 0 0 *.6066 *.* udp4 0 0 127.0.0.1.57343 127.0.0.1.57343