Создание и использование комплекта инструментов "живого ответа" для Unix
Подобно компьютеру с системой Windows, рассмотренному в предыдущей лекции, инциденты, жертвой которых стал компьютер с системой Unix, могут быть также расследованы с помощью методики "живого ответа". Живой ответ позволяет вам получить данные, помогающие при расследовании инцидентов, которые касаются событий, произошедших до того, как машина была выключена для судебного дублирования, и которые пропадают при выключении машины. (Ваша компания может не позволить вам выключить машину, необходимую для выполнения судебного дублирования.) "Живой ответ" позволит вам выполнить качественное расследование и исправить ситуацию, возникшую в результате нападения. В этой лекции обсуждаются инструментальные средства, используемые для успешного "живого ответа", и демонстрируется их применение при изучении реального примера.
Все инструментальные средства, упомянутые в этой лекции, должны быть объединены в надежный набор инструментов живого ответа, который вы копируете на свой компакт диск или дискету. Поскольку все примеры с использованием командной строки в этой лекции предполагают, что текущим каталогом является ваше "средство живого ответа" (компакт диск или дискета, которая содержит ваш набор инструментов), то к началу командной строки надо присоединять путь ./. Использование пути ./ приведет к запуску инструмента из текущего каталога и предотвратит возможность выполнения инструмента с тем же именем, расположенного на ненадежной системе-жертве.
Чтобы проводить деятельность, связанную с "живым ответом", вы должны войти в систему с привилегированными правами (root). Большинство команд живого ответа не сможет делать вывод, если у вас нет привилегированных прав доступа (root) при обращении к объектам, для анализа которых они были разработаны.
Вывод всех команд, выполненных в этих расследованиях, будет производиться на компьютер, предназначенный для хранения и анализа данных. Не стоит сохранять информацию на локальном жестком диске машины-жертвы, потому что это могло бы уничтожить потенциальные свидетельства. Процесс передачи информации по сети может быть выполнен с помощью следующих команд - инструментов Netcat (или Cryptcat ).
Ниже показана команда, выполненная на машине-получателе, использующейся для расследования (с именем forensic-судебный):
forensic# nc -l -p <порт получателя> > <команда>.txt
Маркер <команда> будет представлять каждую из команд, выполненных на исходной машине-жертве (с именем victim - жертва).
На машине-жертве (с именем victim ) наберите следующую команду, чтобы выполнить <команду> и передать информацию на компьютер с IP-адресом <IP-адрес получателя> по TCP-порту <порт получателя>:
victim# ./ <команда> | .nc <IP-адрес получателя> <порт получателя>
Система Unix работает иначе, чем Windows, в том отношении, что вы не можете просто скопировать нужные DLL-файлы на компакт-диск, если требуется делать запросы к файлам динамической компоновки. Вместо этого вы должны перекомпилировать их статически, потому что большинство инструментальных средств имеет открытый исходный код (то есть исходный код вам доступен). Объяснение статического компилирования инструментальных средств, представленных в этой лекции, выходит за рамки темы данной книги. Однако основное правило, которое стоит упомянуть, состоит в том, что нужно изменить файл makefile так, чтобы строки CFLAGS или LDFLAGS содержали маркер static. С некоторыми пакетами, чтобы создать makefile, сначала необходимо выполнить скрипт configure. Если вы не можете скомпилировать статическую версию, вы должны скопировать все библиотеки динамической компоновки на компакт-диск и изменить переменную среды LD_LIBRARY_PATH так, чтобы путь указывал то место, где будет смонтирован (mount) компакт-диск во время расследования (обычно что-то вроде /mnt/cdrom). Вы можете определить, какие библиотеки необходимы для работы исполняемых файлов, набрав следующее:
forensic * ldd/usr/local/sbin/lsof libkvm.so.2 = >/usr/lib/libkvm.so.2 (0x2807d000) libc.so.4 = >/usr/lib/libc.so.4 (0x28083000)
Эта команда показывает, что команда lsof для своей работы нуждается в файлах libkvm.so.2 и libc.so.4, если мы не перекомпилируем ее статически.
bash
Представьте себе на минуту, что вы взломщик, и хотите поддерживать доступ к системе, которую вы только что взломали. Вы хотите изменить некоторые из системных команд, например, командную оболочку (shell), чтобы скрыть свое присутствие в системе. Если вы сможете модифицировать командную оболочку, чтобы сделать то, что задумали, то поместите ее на взломанной системе.
Теперь вернитесь назад в положение человека, расследующего инцидент. Выполняя ответ на атаку, вы должны точно знать, что не пользуетесь этой поддельной оболочкой; поэтому вам нужно загрузить такую оболочку, которую вы сами скомпилировали и которой доверяете. На большинстве систем Unix-оболочки обычно находятся в каталоге /bin.
Реализация
Для запуска надежной оболочки наберите следующую команду:
victim# ./bash
netstat
Команда netstat в системе Unix подобна аналогичной команде в системе Windows. Она перечисляет все сетевые подключения, прослушивающие TCP/UDP-порты в системе. Этот инструмент обеспечивает вас данными, которые будут полезны при поиске черных ходов и конечных точек сетевых подключений, связанных с системой жертвы. Netstat обычно находится в каталоге /bin или /usr/bin/, в зависимости от типа системы Unix, которую вы используете.
Реализация
Следующая команда используется в живом ответе. Обратите внимание, что она выглядит точно так же, как соответствующая команда в 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, чтобы найти соответствие между открытыми портами и их "родительскими" процессами.