Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа №4 (FAQ).doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
406.02 Кб
Скачать

6.3. Определение какие tcp или udp порты открыты в системе

Описание.  Кандидат BSDA должен уметь использовать программы входящие в состав BSD, а так же сторонние программы, для определения того, какие порты в системе открыты, и какие порты видны через брандмауэр.

Практика. netstat(1), services(5), fstat(1); sockstat(1) и сторонное продукты nmap и lsof.

Комментарий

Как было показано выше (см. Раздел 6.1.2.3, «Работающие интернет сервисы и открытые сокеты»), команда netstat(1) пригодна для того, чтобы определить открытые tcp/udp соединения и их состояние. Другим средством для определения состояния файлов и сокетов являются команды fstat(1) и sockstat(1). Первая позволяет понять какие файловые дескрипторы какими пользователями открыты, вторая перечисляет открытые сокеты.

Жизнедеятельность всех программ выполняемых в пространстве пользователя может быть отслежена при помощи обращения к устройствам /dev/mem и /dev/kmem, предоставляющим информацию непосредственно из ядра системы. Файловой системы /proc в системах BSD нет. (Если она нужна для совместимости с какими-то программами, её можно специально смонтировать, при условии, что в ядре имеется поддержка PROCFS.) Программы fstat(1) и sockstat(1) берут информацию из упомянутых устройств.

В некоторых случаях названия протоколов употребляются символьные (вроде ssh, imap), в других случаях явно номера портов (22, 143). Соответствие символьных названий протоколов и их номеров указано в файле /etc/services.

6.3.1. Fstat(1)

Команда fstat(1) выводит информацию обо всех открытых файловых дескрипторах. С её помощью можно получить информацию обо всех запущенных программах, так как каждая из них имеет по нескольку открытых файловых дескрипторов или сокетов, даже если в данный момент она не выполняет никакой работы. Пример, приведённый ниже, сильно урезан, так как всего в выводе команды fstat(1) было более семисот строк.

$ fstat > fstat-output

$ cat fstat-output

USER CMD PID FD MOUNT INUM MODE SZ|DV R/W

emin fstat 84130 root / 2 drwxr-xr-x 512 r

emin fstat 84130 wd /usr 5958657 drwxr-xr-x 2048 r

emin fstat 84130 text /usr 447995 -r-xr-sr-x 14716 r

emin fstat 84130 0 /dev 68 crw--w---- ttyp0 rw

emin fstat 84130 1 /usr 5958902 -rw-r--r-- 0 w

emin fstat 84130 2 /dev 68 crw--w---- ttyp0 rw

emin fstat 84130 3 /dev 20 crw-r----- mem r

emin fstat 84130 4 /dev 21 crw-r----- kmem r

emin fstat 84130 5 / 8381 -rw-r--r-- 40960 r

......

root getty 633 root / 2 drwxr-xr-x 512 r

root getty 633 wd / 2 drwxr-xr-x 512 r

root getty 633 text /usr 565434 -r-xr-xr-x 21016 r

root getty 633 0 /dev 39 crw------- ttyv7 rw

root getty 633 1 /dev 39 crw------- ttyv7 rw

root getty 633 2 /dev 39 crw------- ttyv7 rw

......

root getty 626 root / 2 drwxr-xr-x 512 r

root getty 626 wd / 2 drwxr-xr-x 512 r

root getty 626 text /usr 565434 -r-xr-xr-x 21016 r

root getty 626 0 /dev 32 crw------- ttyv0 rw

root getty 626 1 /dev 32 crw------- ttyv0 rw

root getty 626 2 /dev 32 crw------- ttyv0 rw

......

root devd 242 root / 2 drwxr-xr-x 512 r

root devd 242 wd / 2 drwxr-xr-x 512 r

root devd 242 text / 112 -r-xr-xr-x 281208 r

root devd 242 0 /dev 8 crw-rw-rw- null rw

root devd 242 1 /dev 8 crw-rw-rw- null rw

root devd 242 2 /dev 8 crw-rw-rw- null rw

root devd 242 3 /dev 5 crw------- devctl r

root devd 242 4* local stream c1089000

root adjkerntz 179 root / 2 drwxr-xr-x 512 r

root adjkerntz 179 wd / 2 drwxr-xr-x 512 r

root adjkerntz 179 text / 117 -r-xr-xr-x 6912 r

root adjkerntz 179 0 - - bad -

root adjkerntz 179 1 - - bad -

root adjkerntz 179 2 - - bad -

root init 1 root / 2 drwxr-xr-x 512 r

root init 1 wd / 2 drwxr-xr-x 512 r

root init 1 text / 47 -r-x------ 485892 r

Прежде всего, конечно, отметилась сама программа fstat(1). Видно, что от имени пользователя emin выполняется команда fstat с PID 84130. В поле FD перечислены файловые дескрипторы этой команды. Обратите внимание: дескрипторы 0, 1, и 2 отвечают за STDIN, STDOUT и STDERR. Поскольку в нашем случае вывод был направлен в файл, перый дескриптор в поле MOUNT указывает на /usr (на испытуемой машине там находятся пользовательские каталоги). Если бы мы направили вывод на консоль, то в этом месте был бы /dev:

$ fstat

USER CMD PID FD MOUNT INUM MODE SZ|DV R/W

emin fstat 748 root / 2 drwxr-xr-x 512 r

emin fstat 748 wd /usr 75413572 drwxr-xr-x 1536 r

emin fstat 748 text /usr 34739458 -r-xr-sr-x 14716 r

emin fstat 748 0 /dev 114 crw--w---- ttyp0 rw

emin fstat 748 1 /dev 114 crw--w---- ttyp0 rw

emin fstat 748 2 /dev 114 crw--w---- ttyp0 rw

emin fstat 748 3 /dev 10 crw-r----- mem r

emin fstat 748 4 /dev 11 crw-r----- kmem r

emin fstat 748 5 / 25101 -rw-r--r-- 73728 r

......

а если в pipe, то вывод будет выглядеть так:

$ fstat | less

USER CMD PID FD MOUNT INUM MODE SZ|DV R/W

emin less 731 root / 2 drwxr-xr-x 512 r

emin less 731 wd /usr 75413572 drwxr-xr-x 1536 r

emin less 731 text /usr 34739548 -r-xr-xr-x 97736 r

emin less 731 0* pipe c1ca4780 <-> c1ca482c 0 rw

emin less 731 1 /dev 114 crw--w---- ttyp0 rw

emin less 731 2 /dev 114 crw--w---- ttyp0 rw

emin fstat 730 root / 2 drwxr-xr-x 512 r

emin fstat 730 wd /usr 75413572 drwxr-xr-x 1536 r

emin fstat 730 text /usr 34739458 -r-xr-sr-x 14716 r

emin fstat 730 0 /dev 114 crw--w---- ttyp0 rw

emin fstat 730 1* pipe c1ca482c <-> c1ca4780 0 rw

emin fstat 730 2 /dev 114 crw--w---- ttyp0 rw

emin fstat 730 3 /dev 10 crw-r----- mem r

emin fstat 730 4 /dev 11 crw-r----- kmem r

emin fstat 730 5 / 25101 -rw-r--r-- 73728 r

......

Видно, что fstat(1) открыл pipe с номерами сокетов c1ca4780 и c1ca482c файловом дескрипторе 1 (STDOUT), а less сделал то же, но в обратном порядке и в файловом дескрипторе 0 (STDIN), через них идёт обмен данными.

Вернёмся к примеру. Второй файловый дескриптор направлен, как видно, на консоль ttyp0 (Это поток STDERR).

Дескрипторы 3 и 4 общаются с устройствами /dev/mem и /dev/kmem именно из них fstat(1) и берёт всю представленную здесь информацию. В операционных системах BSD нет виртуальной файловой системы /proc. Вся информация предостваляется ядром через упомянутые устройства. Хотя впринципе, если это надо для совместимости с какими-то программами, можно эмулировать наличие файловой системы /proc.

Перед перечнем файловых дескрипторов с номерами, мы видим три строки (самые первые) с отметками в поле файлового дескриптора root, wd, text. Их значение:

root

корневой inod

wd

рабочий каталог (current working directory)

text

текст исполнимого файла (собственно код)

tr

kernel trace file

mmap

memory-mapped file

Зная точку монтирования и номер inod можно найти к чему относятся приведённые значения wd, text и др.:

$ fstat

USER CMD PID FD MOUNT INUM MODE SZ|DV R/W

......

emin fstat 748 wd /usr 75413572 drwxr-xr-x 1536 r

emin fstat 748 text /usr 34739458 -r-xr-sr-x 14716 r

......

$ find -x /usr \( -inum 75413572 -o -inum 34739458 \) -ls 2>/dev/null

34739458 32 -r-xr-sr-x 1 root kmem 14716 30 авг 2005 /usr/bin/fstat

75413572 4 drwxr-xr-x 21 emin emin 1536 20 мар 21:13 /usr/home/emin

Синтаксис программы find(1) обсуждается в Раздел 7.6, «Поиск файла по заданным атрибутам». Команда lsof(1), обсуждающаяся ниже, печатает в выводе не только номера inod, но и имена файлов, которые она берёт из кеша ядра.

Здесь, для примера, приведены записи о 8-ми экземплярах команды getty(8), которые открыты на терминалах ttyv0—ttyv7 и ждут логина пользователя. (Мы прошли на машину по ssh(1), поэтому ни один из терминалов неиспользован).

В конце приведены сведения о процессе init(8) — родительском процессе для всех прочих процессов.