Файловый монитор для Linux

Тема в разделе "Linux", создана пользователем CLAY, 1 апр 2017.

  1. CLAY

    CLAY Member

    Сообщения:
    419
    Симпатии:
    5
    Есть мнение, что количество вредоносных файлов под определенную платформу зависит в первую очередь от популярности данной платформы. Этим часто объясняют то, что существуют сотни тысяч вредоносов под Windows и совсем мало под Linux. Но время на месте не стоит - Линукс популяризируется. В новостях то и дело мелькают сообщение о том, что очередная крупная организация или даже муниципальные службы переходят на Линукс. Видимо не за горами и расцвет эры вирусов под эту операционную систему. Возникает резонный вопрос: Готовы ли мы к этому?

    Под Windows существует множество прекрасных утилит для борьбы с заразой - RootKit Unhooker, FileMon, RegMon, ProcessExplorer, GMER... Перечислять можно долго. А сколько таких утилиты вы знаете для Линукс? А сколькими из них хоть раз пользовались? К своему сожалению, вынужден признать, что несмотря на то, что довольно давно занимаюсь антивирусной аналитикой знаний в этой области не накопилось - не было необходимости. Вот этот пробел и хотелось бы заполнить.


    Начнем рассказ с утилиты, которая может заменить, а в чем-то даже превзойти привычный всем FileMon. Утилита называется strace. Попробовать ее можно в любом дистрибутиве. Мои примеры традиционно сделаны в Убунту.

    Итак, начинаем с простого strace в терминале:

    Получаем в ответ краткую инструкцию по использованию и доступным ключам.

    Одно из значений слова trace, как известно, следить. За чем следить? За исполнимым файлом. Проще всего посмотреть на примере. Для этого возьмем простую команду echo, которая между прочим является исполнимым файлом (можете сами посмотреть - лежит в /bin). Пишем в терминале: strace echo Hello av-school

    В ответ получаем эхо от нашего Hello av-school и еще кучу непонятного текста:

    Чтобы стало чуточку проще воспользуемся ключом -о и укажем файл, в который strace сохранит свой лог: strace -o straceecho.txt echo Hello av-school

    Теперь на экран выводится только Hello av-school, а лог сохраняется в файл:

    А теперь вдумчиво посмотрим на лог-файл:

    Это все системные вызовы, порожденные командой echo": execve - запуск команды brk - изменение размера сегмента данных access - проверка прав доступа к файлу mmap2 - отображение файлов или устройств в память open - открытие файла или устройства fstat64 - получение статуса файла close - закрытие файла read - чтение данных из файла set_thread_area - установка области для процесса в локальном хранилище процессов mprotect - контроль доступа к области памяти munmap - обратное mmap2 - снимает отображение файлов или устройств в память write - запись в файл exit_group - завершение всех потоков процесса

    Если мы проводим аналогию с файлмоном, то нас прежде всего интересуют вызовы open, write и в меньшей степени read.

    Начнем с open. К каким файлам происходит обращение?

    /etc/ld.so.cache

    /lib/i686/cmov/libc.so.6

    /usr/lib/locale/locale-archive

    Естьещеупоминанияо

    /etc/ld.so.nohwcap

    /etc/ld.so.preload

    Нотакихфайловнет - No such file or directory.

    Файлы с расширением .so - библиотеки, аналогичные привычным .dll из Windows. ld.so - динамический линковщик, а libc.so.6 - стандартная библиотека языка С для GNU операционных систем. Эти библиотеки будут встречаться при запуске вообще любых программ в Линукс.

    locale-archive - файл с архивом установленных в системе локалей.

    Теперь переходим к записи в файл - write. В этом простом примере встречается лишь однажды: write(1, Hello av-school , 16) = 16

    Параметры данного вызова это 1, Hello av-school и 16. 1 - указатель на описатель файла, в который будет вестись запись. В данном случае это указатель на стандартный ввод/вывод, то есть запись будет вестись не в файл, а в консоль. Hello av-school - трудностей не вызывает, это то, что нужно записать. Обратите внимание, автоматически добавлен символ перевода строки. 16 - число байт, которые нужно записать. Если бы мы написали strace -o straceecho.txt echo Hello av-schoolllll, то тут было бы 20. Число 16 после знака равно - значение, возвращаемое системным вызовом. Является ничем иным, как количеством байт, успешно записанных в файл.

    Посмотрим, чем будет отличаться запись в настоящий файл, от просто вывода в консоль. Для этого введем команду: strace -o log.txt nano

    Тут вместо echo мы запускаем крошечный консольный текстовый редактор nano. Интерфейс его крайне аскетичный, но позволяет на скорую руку подправить какой-нибудь файл конфигурации, если более мощных редакторов под рукой нет (например, когда после серьезных обновлений ядра отваливаются драйвера видеокарты и использовать графический режим нельзя). Выглядит это таким образом:

    Пишем незамысловатое тестовое сообщение test text и нажимаем ctrl+x для выхода. В ответ на запрос программы задаем название файла в который нужно сохранить наш текст, после чего программа закрывается:

    Но нас интересует содержимое лога. На этот раз лог имеет размер больше 40 КБ и полный скриншот не показать. Выберем лишь интересующий нас участок:

    Что тут происходит? По порядку: проверка статуса файла test.txt, установка маски режима создания файла и открытие файла. Обратите внимание - open возвращает значение 3 (после знака равно). Это ничто иное, как описатель (дескриптор) только что созданного файла test.txt. Затем идет ряд технических вызовов и наконец запись: write(3, test text , 10) = 10

    Записать в файл с дескриптором 3 (то есть в test.txt) текст test text размером 10 байт. И возвращаемое значение - число успешно записанных байт. Тоже 10, значит все прошло успешно.

    Затем файл с дескриптором 3 закрывается: close(3) = 0

    Возвращаемое значение 0 - ошибок нет.

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

    Что ж, осталось только дождаться вредоносных программ под Linux.

Поделиться этой страницей