ENG    РУС

Все статьи »

Трюки со временем: анализируем mtime и ctime

Закажите лечение сайта и защиту от взлома у специалистов

В данной заметке рассматриваются примеры анализа файловых атрибутов mtime (время изменения содержимого) и ctime (время изменения метаданных) для поиска измененных файлов, в частности вирусов и хакерских скриптов после взлома.

Часто при взломе сайта советуют искать хакерские скрипты и измененные файлы по времени изменения. Для этого в операционной системе Unix у файлов есть атрибут mtime – modification time (время изменения). Данный атрибут хранит дату и время последней модификации содержимого файла. mtime меняется каждый раз, когда изменяется содержимое файла.

Зачем знать дату и время изменений файла? Данная информация позволяет выяснить, кем, когда и при каких обстоятельствах тот или иной файл был создан или изменен на основе анализа логов веб-сервера access_log и xferlog FTP (а иногда логов панели управления хостингом и CMS). Конечно, не всегда, но, порой, достаточно определить дату изменения файла, чтобы найти в логе соответствующий запрос в окрестностях указанного времени.

Еще через параметр mtime можно искать файлы, среди которых могут быть «вредоносы». Для того чтобы найти список php файлов, у которых было изменено содержимое, за последние 3 дня, достаточно выполнить команду

find . -name ‘*.ph*’ -mtime -3 -ls

Все бы ничего, но атрибут mtime можно вручную “скрутить”, то есть выставить любую произвольную дату и время изменения файла. Например, изменить содержимое без изменения параметра mtime: перед изменением файла запомнить параметр mtime, а после изменения снова восстановить его. Изменение параметра mtime выполняется командой touch.

touch -c -t 201506301730 index.php

Дата и время изменения станет 30/06/2015 17:30

После ручной установки параметра mtime (а именно так поступает большинство хакеров при инжекте кода в скрипты или загрузке веб-шелла) найти измененный файл приведенной выше командой find уже не получится. Что же делать, если mtime “подделан”?

Есть вариант – анализировать параметр ctime (change time). Вопреки расхожему мнению, это не дата и время создания файла, а дата и время последнего изменения метаданных файла, то есть его атрибутов (владельца, прав доступа, содержимого, размера и т.п.). Если у файла “скрутили” дату изменения с помощью touch и больше ничего с файлом не происходило (как это обычно и бывает), то по параметру ctime можно найти, когда операция была выполнена.

Например, можно найти все js файлы, у которых менялись атрибуты за последние 3 дня. Учитывая, что большая часть js файлов – статика (если не брать во внимание каталог с кэшем) и файлы остаются неизменными, то вполне вероятно при наличие вируса на сайте, внедренного в js файл, данной командой можно обнаружить его дислокацию (это в том случае, если поиск по mtime не помог).

find . –name '*.js' –ctime -3

Можно делать выборку не за 3, а за 14 или 30 дней (особенно это эффективно, если у вас не менялись шаблоны и javascript файлы уже долгое время).

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

Например, изменить системные дату и время, внести изменения в файл, а затем восстановить дату и время. Поскольку ctime выставляется в соответствии со временем системы, то он не будет отражать реальное время изменения параметров. Например, таким скриптом:

now=$(date)

echo $now

sudo date --set="Sat May 11 06:00:00 IDT 2013"

chmod 777 /path/file.txt

sudo date --set="$now"

На отмонтированном разделе диска также можно менять ctime параметр командами

debugfs -w -R 'set_inode_field /path/file.txt ctime 201506301010' /dev/sda1

echo 2 > /proc/sys/vm/drop_caches

К счастью, изменение системного времени доступно только привелегированным пользователям (под root или sudo), а отмонтированный раздел на хостинге – это нонсенс, поэтому будем считать, что “подделка” ctime маловероятна.

У конкретного файла можно всегда посмотреть параметры mtime и ctime командой stat:

stat index.php

File: "index.php"

Size: 7 FileType: Regular File

Mode: (0644/-rw-r--r--)         Uid: ( 501/ greg) Gid: 20/   staff)

Device: 1,4   Inode: 20457166   Links: 1

Access: Mon Jun 29 10:10:00 2015

Modify: Mon Jun 29 10:10:00 2015

Change: Tue Jun 30 15:12:28 2015

Кстати, если mtime <= ctime, то это нормально. А вот если mtime > ctime, то это уже подозрительно, верный признак поддельной даты, так как в штатном режиме mtime будет меньше или равен ctime. Так можно искать подозрительные файлы на хостинге.

Кроме двух перечисленных параметров встречается еще Access Time (atime) - это время последнего обращения к файлу на чтение. Для анализа взлома от него пользы мало, поэтому детально его рассматривать не будем.

Раз уж мы говорим о файловых атрибутах, есть еще один полезный параметр файла, о котором нужно знать – это inode. Inode (index node) - это индексный дескриптов файла, то есть запись с уникальным номером, которая хранит мета-информацию о файле. Она может быть полезна для определения уникальности файла.

В некоторых случаях нужно выяснить, был ли файл удален и пересоздан заново или это тот самый оригинальный файл. По параметру ctime достоверно сказать об этом нельзя, так как он может меняться при любых изменениях атрибутов. Поэтому нужен другой параметр для проверки. В тот момент, когда файл удаляют и создают заново с тем же именем, большая часть его атрибутов остается неизменной. Меняются в основном два – ctime и inode. ctime покажет, когда последний раз изменились атрибуты файла (совсем не обязательно, что из-за удаления и создания), а inode изменится, так как для операционной системы это будет уже совсем другой файл с новым индексным дескриптором.

Смотреть inode можно двумя способами:

  1. stat index.php
  2. ls -i index.php

Естественно, чтобы было с чем сравнивать, где-то должна храниться информация о старых inode файлов, для которых осуществляется мониторинг и процедура integrity check (контроль целостности). Но контроль целостности – это совершенно отдельная и большая тема, о которой мы расскажем позже.

Посмотреть другие статьи.

Закажите лечение сайта и защиту от взлома у специалистов

Обсуждаем!