Опубликован: 20.02.2007 | Уровень: специалист | Доступ: платный
Лекция 19:

Создание и использование комплекта инструментов "живого ответа" для Unix

< Лекция 18 || Лекция 19: 12345 || Лекция 20 >

Lsof

Поскольку для большинства разновидностей систем Unix отсутствует версия netstat, которая поддерживает флаг -p, то для отображения сетевых сокетов, открытых в файловой системе для исполняемых файлов, мы используем инструмент, который называется lsof. В этом отношении, lsof подобен инструменту fport, который был описан в "Компоновка и использование набора инструментов для расследования хакерских атак, то есть для "живого ответа" в системе Windows" . Кроме того, lsof покажет нам все открытые файлы в системе. Инструмент lsof распространяется бесплатно и перенесен почти на все разновидности системы Unix. Хотя lsof имеет множество опций, полезных для обычного системного администратора, в этой лекции обсуждаются только те опции, которые полезны для сценария "живого ответа". Если вам интересно использование других опций, с помощью команды man посмотрите страницы, посвященные утилите lsof. На них этот инструмент широко обсуждается.

lsof доступен на следующих FTP-сайтах:

Реализация

Используйте следующую команду, чтобы получить список всех открытых сокетов и файлов в системе:

victim# ./lsof -n

Опция -n используется в команде lsof, чтобы не выполнять обратный поиск имен DNS для всех IP-адресов, перечисленных в результатах. В целях нашего расследования, мы стараемся не полагаться на полностью квалифицированные имена доменов, потому что они могут меняться; лучше использовать действующие IP-адреса. Ниже показан вывод этой команды.

COMMAND PID USER    FD    TYPE    DEVICE     SIZE    NODE   NAME
inetd   721 root    cwd   DIR        3,2     4096       2   /
inetd   721 root    rtd   DIR        3,2     4096       2   /
inetd   721 root    txt   REG        3,2    21552   35319   /usr/sbin/inetd
inetd   721 root    mem   REG        3,2   340663  146606   /lib/ld-2.1.3.so
inetd   721 root    mem   REG        3,2  4101324  146613   /lib/libc-2.1.3.so
inetd   721 root    mem   REG        3,2   246652  146644   /lib/libnss_files-2.1.3.so
inetd   721 root    0u    CHR        1,3            65387   /dev/null
inetd   721 root    1u    CHR        1,3            65387   /dev/null
inetd   721 root    2u    CHR        1,             65387   /dev/null
inetd   721 root    3u    IPv4       745              TCP   *:39168 (LISTEN)
inetd   721 root    4u    IPv4       746              TCP
192.168.1.104:39168-192.168.1.1:2028 (CLOSE_WAIT)
inetd   721 root    5u    unix 0xc2a99980             853   socket
inetd   721 root    6u    IPv4       748              TCP   *:ftp (LISTEN)
inetd   721 root    7u    IPv4       749              TCP   *:telnet (LISTEN)
inetd   721 root    8u    IPv4       750              TCP   *:shell (LISTEN)
inetd   721 root    9u    IPv4       751              TCP   *:login (LISTEN)
inetd   721 root    10u   IPv4       752              UDP   *:talk
inetd   721 root    11u   IPv4       753              UDP   *:ntalk
inetd   721 root    12u   IPv4       754              TCP   *:finger (LISTEN)
inetd   721 root    13u   IPv4       755              TCP   *:linuxconf (LISTEN)
inetd   721 root    14u   IPv4       756              TCP   *:4375 (LISTEN)
1       881 root    cwd   DIR        3,2     4096   83456   /home/kjohnson
1       881 root    rtd   DIR        3,2     4096       2   /
1       881 root    txt   REG        3,2   210096   83461   /home/kjohnson/1
1       881 root    mem   REG        3,2   340663  146606   /lib/ld-2.1.3.so
1       881 root    mem   REG        3,2  4101324  146613   /lib/libc-2.1.3.so
1       881 root    mem   REG        3,2   246652  146644   /lib/ /libnss_files-2.1.3.so
1       881 root    0u    CHR      136,0                2   /dev/pts/0
1       881 root    1u    CHR      136,0                2   /dev/pts/0
1       881 root    2u    CHR      136,0                2   /dev/pts/0
1       881 root    3u    sock       0,0              954   can't identify protocol
1       881 root    4w    REG        3,2    36864   35934   /tmp/.net
19.1.

Здесь мы видим, что inetd открыл TCP-порт 4375. Следовательно, мы должны исследовать файл /etc/inetd.conf. Далее мы видим, что исполняемый файл 1 открывает файл с именем /tmp/.net, и этот файл также надо исследовать. Исполняемый файл 1 открывает также "сырой" (необработанный) сокет, как видно из следующей строки:

1   881 root   3u    sock       0,0    954   can't identify protocol

Если мы убеждаемся, что этот исполняемый файл открывает "сырой" сокет и обычный файл, то можно предполагать, что исполняемый файл 1 может быть анализатором сетевого трафика (sniffer) (анализаторы сетевого трафика обсуждались в лекции "Анализаторы сетевых потоков" ).

ps

Чтобы получить список процессов, в настоящее время выполняющихся в системе, используется команда ps. Эта команда подобна программе Pslist, которую мы обсуждали в лекции "Компоновка и использование набора инструментов для расследования хакерских атак, то есть для "живого ответа" в системе Windows" . Мы используем команду ps, чтобы увидеть процессы, запущенные взломщиком, такие как анализаторы сетевых потоков (sniffers), черные ходы для скрытого удаленного администрирования, зомби, вызывающие распределенный отказ в обслуживании, а также взломщики паролей (password cracker), выполняющиеся на машине-жертве.

Команда ps обычно расположена в каталоге /bin.

Реализация

Когда мы собираем информацию о процессах, мы хотим видеть все процессы, которые в настоящее время выполняются в системе, и какие пользователи ими управляют. Это можно сделать с помощью следующей команды:

victim# ./ps-aux

Ниже показан список процессов нашей машины-жертвы. Обратите внимание, что мы можем видеть время начала каждого процесса, то есть, можем узнать, какие процессы были выполнены вскоре после того, как система была взломана.

USER    PID  %CPU   %MEM    VSZ   RSS TTY     STAT  START   TIME   COMMAND
root      1   0.1    0.7   1120   476   ?     S     Mar21   0:06   init [3]
root      2   0.0    0.0      0     0   ?     SW    Mar21   0:00   [kflushd]
root      3   0.0    0.0      0     0   ?     SW    Mar21   0:01   [kupdate]
root      4   0.0    0.0      0     0   ?     SW    Mar21   0:00   [kpiod]
root      5   0.0    0.0      0     0   ?     SW    Mar21   0:00   [kswapd]
root      6   0.0    0.0      0     0   ?     SW    Mar21   0:00   [mdrecoveryd]
bin     319   0.0    0.7   1212   496   ?     S     Mar21   0:00   portmap
root    334   0.0    0.0      0     0   ?     SW    Mar21   0:00   [lockd]
root    335   0.0    0.0      0     0   ?     SW    Mar21   0:00   [rpciod]
root    358   0.0    0.7   1104   480   ?     S     Mar21   0:00   /usr/sbin/apmd -p
root    409   0.0    0.8   1172   552   ?     S     Mar21   0:00   syslogd -m 0
root    418   0.0    1.2   1440   768   ?     S     Mar21   0:00   klogd
nobody  432   0.0    0.9   1292   628   ?     S     Mar21   0:00   identd -e -o
nobody  435   0.0    0.9   1292   628   ?     S     Mar21   0:00   identd -e -o
nobody  436   0.0    0.9   1292   628   ?     S     Mar21   0:00   identd -e -o
nobody  438   0.0    0.9   1292   628   ?     S     Mar21   0:00   identd -e -o
nobody  439   0.0    0.9   1292   628   ?     S     Mar21   0:00   identd -e -o
daemon  450   0.0    0.7   1144   496   ?     S     Mar21   0:00   /usr/sbin/atd
root    464   0.0    0.9   1328   620   ?     S     Mar21   0:00   crond
root    496   0.0    0.8   1204   532   ?     S     Mar21   0:00   lpd
root    510   0.0    0.8   1156   532   ?     S     Mar21   0:00   rpc.rstatd
root    526   0.0    0.6   1140   408   ?     S     Mar21   0:00   rpc.rusersd
nobody  540   0.0    0.9   1316   612   ?     S     Mar21   0:00   rpc.rwalld  root
root    554   0.0    0.8   1132   552   ?     S     Mar21   0:00   rwhod
root    598   0.0    1.7   2128  1124   ?     S     Mar21   0:00   sendmail: accepti
root    613   0.0    0.7   1144   456   ?     S     Mar21   0:00   gpm -t ps/2
xfs     647   0.0    1.2   1728   808   ?     S     Mar21   0:00   xfs -droppriv -da
root    685   0.0    1.6   2224  1040   tty1  S     Mar21   0:00   login - root
root    686   0.0    0.6   1092   408   tty2  S     Mar21   0:00   /sbin/mingetty tt
root    687   0.0    0.6   1092   408   tty3  S     Mar21   0:00   /sbin/mingetty tt
root    688   0.0    0.6   1092   408   tty4  S     Mar21   0:00   /sbin/mingetty tt
root    689   0.0    0.6   1092   408   tty5  S     Mar21   0:00   /sbin/mingetty tt
root    690   0.0    0.6   1092   408   tty6  S     Mar21   0:00   /sbin/mingetty tt
root    693   0.0    1.5   1716   976   tty1  S     Mar21   0:00   -bash
root    721   0.0    0.8   1156   520   ?     S     Mar21   0:00   /usr/sbin/inetd
root    881   0.0    1.2   1964   776   ?     S     00:14   0:00   ./1 -s 65535 -n -
root    975   0.0    1.1   2332   700   tty1  R     00:34   0:00   ps aux
19.2.

Если мы рассмотрим процесс, соответствующий выполнению команды 1, мы увидим, что он выполняется как процесс с идентификатором (ID) 721. Процесс был запущен пользователем с правами привилегированного доступа (root) в 00:14 того же дня. Следовательно, если мы знаем, что пользователь с именем kjohnson, запустивший исполняемый файл 1, был неправомочным пользователем в системе, и этот процесс выполняется с правами привилегированного доступа (root), то, вероятно, у взломщика есть право привилегированного доступа.

Примеры, приведенные в этой книге, показывают такой формат вывода, который в большинстве ситуаций полезен человеку, проводящему расследование. Однако команда ps может делать вывод данных в разнообразных форматах. Формат, заданный в первой команде ps (ps -aux), отсекает часть синтаксиса командной строки перечисляемых процессов. Чтобы решить проблему с отсечением части данных, мы можем переформатировать вывод команды ps следующим образом:

victim# ./ps-axo <var1>, <var2>, :
< Лекция 18 || Лекция 19: 12345 || Лекция 20 >
Сергей Хлюкин
Сергей Хлюкин
Россия, Москва, Московский Государственный Открытый Университет, 2007
Игорь Касаткин
Игорь Касаткин
Россия, Москва