Создание и использование комплекта инструментов "живого ответа" для Unix
Lsof
Поскольку для большинства разновидностей систем Unix отсутствует версия netstat, которая поддерживает флаг -p, то для отображения сетевых сокетов, открытых в файловой системе для исполняемых файлов, мы используем инструмент, который называется lsof. В этом отношении, lsof подобен инструменту fport, который был описан в "Компоновка и использование набора инструментов для расследования хакерских атак, то есть для "живого ответа" в системе Windows" . Кроме того, lsof покажет нам все открытые файлы в системе. Инструмент lsof распространяется бесплатно и перенесен почти на все разновидности системы Unix. Хотя lsof имеет множество опций, полезных для обычного системного администратора, в этой лекции обсуждаются только те опции, которые полезны для сценария "живого ответа". Если вам интересно использование других опций, с помощью команды man посмотрите страницы, посвященные утилите lsof. На них этот инструмент широко обсуждается.
lsof доступен на следующих FTP-сайтах:
- ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/
- ftp://ftp.cert.dfn.de/pub/tools/admin/lsof/
- ftp://ftp.auscert.org.au/pub/mirrors/vic.cc.purdue.edu/lsof/
- ftp://ftp.web.ad.jp/pub/UNIX/tools/lsof/
- ftp://ftp.sunet.se/pub/unix/admin/lsof/
Реализация
Используйте следующую команду, чтобы получить список всех открытых сокетов и файлов в системе:
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/.net19.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 aux19.2.
Если мы рассмотрим процесс, соответствующий выполнению команды 1, мы увидим, что он выполняется как процесс с идентификатором (ID) 721. Процесс был запущен пользователем с правами привилегированного доступа (root) в 00:14 того же дня. Следовательно, если мы знаем, что пользователь с именем kjohnson, запустивший исполняемый файл 1, был неправомочным пользователем в системе, и этот процесс выполняется с правами привилегированного доступа (root), то, вероятно, у взломщика есть право привилегированного доступа.
Примеры, приведенные в этой книге, показывают такой формат вывода, который в большинстве ситуаций полезен человеку, проводящему расследование. Однако команда ps может делать вывод данных в разнообразных форматах. Формат, заданный в первой команде ps (ps -aux), отсекает часть синтаксиса командной строки перечисляемых процессов. Чтобы решить проблему с отсечением части данных, мы можем переформатировать вывод команды ps следующим образом:
victim# ./ps-axo <var1>, <var2>, :