Блог Олега Сердюкова

Идентификация через Terminal.app сетевых сервисов (lsof)

Несколько дней назад @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

Comments