Инструментальные средства обеспечения безопасности

       

Реализация


Для запуска надежной оболочки наберите следующую команду:

victim# ./bash Примечание. Оболочка bash - это одна из любимых командных оболочек автора, но можно использовать sh, tsh, csh, или другие оболочки в качестве альтернативы, если они были скопированы с надежной системы.


Следующая команда используется в живом ответе. Обратите внимание, что она выглядит точно так же, как соответствующая команда в Windows:

victim# ./netstat -an

Следующий вывод является результатом команды netstat. Предполагается, что взломанная система имеет IP-адрес 192.168.1.104.

Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:4375 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:98 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:79 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:513 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:514 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:23 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:515 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:113 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:1024 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN udp 0 0 0.0.0.0:518 0.0.0.0:* udp 0 0 0.0.0.0:517 0.0.0.0:* udp 0 0 0.0.0.0:513 0.0.0.0:* udp 0 0 0.0.0.0:1026 0.0.0.0:* udp 0 0 0.0.0.0:1025 0.0.0.0:* udp 0 0 0.0.0.0:704 0.0.0.0:* udp 0 0 0.0.0.0:689 0.0.0.0:* udp 0 0 0.0.0.0:1024 0.0.0.0:* udp 0 0 0.0.0.0:111 0.0.0.0:* raw 0 0 0.0.0.0:1 0.0.0.0:* 7 raw 0 0 0.0.0.0:6 0.0.0.0:* 7 Active UNIX domain sockets (servers and established) Proto RefCnt Flags Type State I-Node Path unix 0 [ ACC ] STREAM LISTENING 517 /dev/printer unix 7 [ ] DGRAM 422 /dev/log unix 0 [ ACC ] STREAM LISTENING 682 /tmp/.font-unix/fs-1 unix 0 [ ACC ] STREAM LISTENING 652 /dev/gpmctl unix 0 [ ] STREAM CONNECTED 169 @00000014 unix 0 [ ] DGRAM 853 unix 0 [ ] DGRAM 720 unix 0 [ ] DGRAM 685 unix 0 [ ] DGRAM 636 unix 0 [ ] DGRAM 511 unix 0 [ ] DGRAM 446 unix 0 [ ] DGRAM 434

Здесь мы видим, что порт 4375 открыт и прослушивает подключения. Я знаю, что раньше этот порт не был открыт (потому что являюсь системным администратором), и это необходимо расследовать! Никакие другие порты, упомянутые в результатах netstat, не требуют нашего внимания.

Версия netstat, работающая в системе Linux, позволяет использовать ключ -p, по которому порты прослушивания будут отображены в двоичные файлы, расположенные на диске, который их открывает. Команда выглядит следующим образом:

victim#./netstat -anp

Поскольку большинство разновидностей Unix не поддерживают флаг -p, мы не будем его использовать. Вместо этого в следующем разделе мы используем инструмент lsof, чтобы найти соответствие между открытыми портами и их "родительскими" процессами.

Совет. Если вы заинтересованы в получении таблицы маршрутизации хоста, можете получить ее, добавив ключ -r к утилите netstat.




Команда используется для просмотра ARP-таблицы машины-жертвы. Очень похожа на команду, которая используется при живом ответе в Windows:



victim# ./arp -an

С системы-жертвы возвращается следующая таблица ARP:

? (192.168.1.1) at 00:BD:81:43:07:03 [ether] on eth0

Результаты показывают, что машина с IP-адресом 192.168.1.1 имеет MAC-адрес 00:BD:81:43:07:03. Эта дополнительная часть информации помогает нам при отслеживании адреса 192.168.1.1 из нашей сети, когда мы не регулируем IP-адреса сами. Мы можем проверять каждую машину, пока не найдем MAC-адрес 00:BD:81:43:07:03.

Внимание. Пользователь с достаточными привилегиями может изменять свой собственный MAC- и IP-адрес во многих операционных системах, работая в системах Windows или Unix.




Чтобы собрать файлы, к которым кто-либо обращался в последнее время, выполните следующую команду:

victim# ls-alR --time=atime/

Соответствующие файлы, возвращенные в результате этой команды, показаны в следующем фрагменте. Сначала, мы видим файлы из каталога /etc.

-rw-r--r-- 1 root root 7470 Mar 21 06:32 mime.types -rw-r--r-- 1 root root 1048 Mar 7 2000 minicom.users -rw-r--r-- 1 root kjohnson 196 Mar 22 00:17 motd -rw-r--r-- 1 root root 90 Mar 22 00:23 mtab -rw-r--r-- 1 root root 1925 Feb 9 2000 mtools.conf

Затем мы видим файлы в подкаталоге home каталога /kjohnson:

/home/kjohnson: total 240 drwx------ 2 root kjohnson 4096 Mar 22 00:30 . drwxr-xr-x 7 root root 4096 Mar 22 00:30 .. -rw------- 1 root kjohnson 216 Mar 22 00:18 .bash_history -rw-r--r-- 1 root kjohnson 24 Mar 22 00:18 .bash_logout -rw-r--r-- 1 root kjohnson 230 Mar 21 23:40 .bash_profile -rw-r--r-- 1 root kjohnson 124 Mar 21 23:40 .bashrc -rw-r--r-- 1 root kjohnson 3394 Mar 21 23:39 .screenrc -rwxr-xr-x 1 root kjohnson 210096 Mar 22 00:13 1

Чтобы собрать файлы, которые в последнее время модифицировались, выполняем следующую команду:

victim# ls-alR - time=mtime/

Если команда не сработала, это может означать, что модифицированные файлы уже были отображены по умолчанию (так обстоит дело в системе Linux).

Если файлы, модифицированные в ближайшее время, были показаны по умолчанию, то вместо предыдущей команды можно использовать следующую:

victim# ls-alR/

В результате этой команды были отображены следующие файлы. Сначала видим подозрительные файлы в каталоге /etc.

-rw-r--r-- 1 root root 7470 Mar 21 06:32 mime.types -rw-r--r-- 1 root root 1048 Mar 7 2000 minicom.users -rw-r--r-- 1 root kjohnson 196 Mar 22 00:17 motd -rw-r--r-- 1 root root 90 Mar 22 00:23 mtab -rw-r--r-- 1 root root 1925 Feb 9 2000 mtools.conf

Затем смотрим файлы из подкаталога home каталога /kjohnson.

/home/kjohnson: total 240 drwx------ 2 root kjohnson 4096 Mar 22 00:18 . drwxr-xr-x 7 root root 4096 Mar 21 23:39 .. -rw------- 1 root kjohnson 216 Mar 22 00:18 .bash_history -rw-r--r-- 1 root kjohnson 24 Mar 21 23:39 .bash_logout -rw-r--r-- 1 root kjohnson 230 Mar 21 23:39 .bash_profile -rw-r--r-- 1 root kjohnson 124 Mar 21 23:39 .bashrc -rw-r--r-- 1 root kjohnson 3394 Mar 21 23:39 .screenrc -rwxr-xr-x 1 root kjohnson 210096 Mar 21 23:43 1

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

victim# ls -alR --time=ctime /

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

В подкаталоге home каталога /kjohnson мы видим подозрительный файл с именем 1. Сейчас он может не иметь для нас большого значения, но он будет играть важную роль позже в разделе "Пример из жизни".

Примечание. ctime часто путают с "Creation Time" (Время создания). Не забывайте правильного значения этой команды при расследовании в системе Unix.




Чтобы использовать команду w, наберите следующее:

victim# w

Вывод команды w на нашей машине-жертве выглядит следующим образом:

12:24am up 1:38, 1 user, load average: 0.02, 0.02, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT Root tty1 - 10:44pm 0.00s 0.71s 0.03s w

Поскольку мы вошли в систему в качестве привилегированного (root) пользователя с консоли (обозначено символом "-" в столбце FROM), мы не видим никакой подозрительной деятельности.

Внимание. Хотя в выводе команды w не видно никаких неправомочных учетных записей, мы не можем быть уверены, что взломщик в настоящее время не находится в системе. Пользователь должен завершить процесс правильного входа в систему, а файлы регистрации в системе должны быть неповрежденными, чтобы информация из них показывалась в этом выводе. Обычно черные ходы не пользуются средствами входа в систему, и поэтому в этом выводе их нельзя обнаружить.




В сценарии своего расследования вам нужно сделать дамп всех попыток входа в систему. Это должно выполняться следующей командой (при использовании команды lastb, замените last на lastb):

victim# last

Команда выведет следующие результаты с нашей машины-жертвы:

mpepe pts/0 192.168.1.1 Thu Mar 21 23:37 - 00:24 (00:46) root tty1 Thu Mar 21 22:44 still logged in reboot system boot 2.2.14-5.0 Fri Mar 22 03:42 (-3:-6) root tty1 Fri Mar 22 03:39 - down (00:00) reboot system boot 2.2.14-5.0 Fri Mar 22 03:09 (00:30) reboot system boot 2.2.14-5.0 Thu Mar 21 09:04 (18:36)

wtmp begins Thu Mar 21 09:04:17 2002

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




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

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

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

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

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




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

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




Следующая команда уничтожит процесс с идентификатором <PID>:

victim# ./kill-9 <PID> Примечание. Мы вовсе не рекомендуем исправлять возникшую ситуацию таким способом. Мы упоминаем его только потому, что это вполне возможный вариант, и он успешно применялся в прошлом.




Следующая команда вычислит контрольную сумму MD5-файлов вывода и сохранит их в файле с именем md5sums.txt.

forensic# md5sum-b * > md5sums.txt

В любой момент утилита Md5sum может проверять контрольные суммы MD5 любых файлов, если вы снабдите ее списком этих файлов. Следующая команда проверит контрольные суммы MD5 для списка файлов и сообщит о любом изменении в их содержании.

forensic# md5sum-c md5sums.txt Примечание. В системах *BSD используется команда не md5sum, а md5, и она не требует ключа -b.




Инструмент Carbonite должен компилироваться на системе, имеющей то же ядро, что и машина-жертва. Версию ядра можно, обычно, посмотреть с помощью следующей команды:

victim# uname-a

После того как надежная машина с такой же самой версией ядра, как у вашей машины-жертвы, найдена, разархивируйте содержимое пакета Carbonite и измените каталог в ней. Введите следующую команду, чтобы создать пакет:

forensic# make

Пакет компилируется, и создается файл carbonite.o. Скопируйте этот каталог на машину-жертву надежным способом (через диск или компакт диск). Затем Carbonite нужно установить в ядро, используя команду

victim# ./carbonite.sh Примечание. Возможно, что файл carbonite.sh потребуется отредактировать, чтобы удовлетворить ваши определенные потребности. Например, если вы используете Carbonite в живом ответе, вы захотите указать скрипт в надежной версии загрузчика модуля (insmod) так, чтобы не использовать копию, принадлежащую взломанной машине.

Когда Carbonite внесен в ядро, он временно замораживает систему, пока не выполнит свою миссию. Он создает каталог /tmp/CARBONITE, который будет содержать копию каждого процесса, выполняющегося на машине. Имена копий процессов будут CARBONITE.<Команда><PID>, где <команда> - имя процесса и <PID> - ID процесса.

Создается дополнительный файл, CARBONITE.html, который может быть загружен в Web-браузер. Этот файл подобен файлу, созданному с помощью команды ps (рассматривался ранее), но поскольку он получен в результате прямого входа в ядро, то он более надежен и показывает все процессы, даже если они скрыты с помощью инструмента Knark.

Внимание. Carbonite будет вести запись в среде хоста. Учтите это, если планируете оставить открытой возможность судебного дублирования!



Содержание раздела