Пошук Індикаторів Атаки Через Ctime
Вступ
Сучасні файлові системи Unix зберігають чотири часові мітки для кожного файлу, і кожна з них може допомогти з аналізом атаки. В цьому пості я зосереджусь лише на одній - ctime, проте не буде зайвим пригадати роль усіх чотирьох:
atime
(access time): час останнього доступу до файлуmtime
(modify time): час останньої зміни вмісту файлуctime
(change time): час останньої зміни метаданих (права, власник)btime
(birth time): час створення файлу (тільки в деяких ОС)
Зверніть увагу, що все не так просто, і мітки можуть не відповідати визначенню. Наприклад, на деяких системах atime не оновлюється взагалі, а при кожній зміні mtime також оновлюється і ctime. Переглянути часові мітки файлу ви можете командою stat <filename>
, а дізнатися про них більше можете тут і тут.
Пошук по Ctime
Уявіть типовий сценарій: ІТ-команда помітила шкідливий файл /bin/kbeacon, створений 05.06.2025. Логування на системі відсутнє, проте потрібно швидко зрозуміти звідки взявся цей файл, як він засів на системі, та чи ворог раптом не лишив запасних бекдорів.
Якщо припустити що вся атака зайняла всього 1-2 дні (а часто це так і є) - можна вивести список файлів, створених або змінених за цей період, а далі вручну перевірити чи вони належать до атаки. Звісно ж, метод не надто надійний, однак швидкий та часто ефективний:
# Шукаємо всі файли змінені між 4 і 6 червня
find -L /etc /root /home /bin /sbin /var/www 2>/dev/null \
-newerct "2025-06-04" ! -newerct "2025-06-06"
/bin/kbeacon # Шкідливий файл з якого ми і почали
/etc/init.d/kernupd # Також знайшли інший підозрілий файл
/var/www/html/photos/render.php # А також і вебшел, потенційну точку входу
У результатах може бути шуму - особливо якщо в день атаки хтось встановлював пакети чи оновлював ОС. В такому разі раджу погратись з параметрами: змінити часові рамки або виключити певні директорії з пошуку. Якщо ж навпаки, результатів немає, спробуйте також пошук за mtime та btime (про це нижче), і переходьте до інших методів аналізу.
Особливості Mtime
Як ви могли помітити, команда з прикладу вище працює з аргументом newerct
, тобто ctime. Навіщо ж шукати по ctime, якщо зміну вмісту файлу відслідковує саме mtime? По-перше, нагадаю що при кожній зміні mtime також оновлюється і ctime.
По-друге, підмінити ctime досить важко - для усіх відомих мені методів потрібен root доступ, а також або окрема тула, debugfs, або зміна системного часу. Натомість, підмінити mtime не складно навіть без привілеїв - під це навіть є окрема техніка MITRE. Наприклад, ось так в одну команду touch -r <source> <malware>
можна підмінити mtime, проте ctime залишиться оригінальним:
Зважаючи на вразливість mtime до підміни, орієнтуватися виключно на цю мітку не варто. Проте, якщо пошук по ctime нічого не виявив, не завадить спробувати і по mtime. Наприклад, якщо зловмисник не підмінив mtime, а ІТ адмін в один день випадково змінив права до всіх файлів в /bin (в тому числі й до шкідливого /bin/kbeacon), тоді ctime оновиться, а mtime все ще вкаже реальний час створення чи останньої модифікації малварі:
# Зверніть увагу: для пошуку по mtime потрібен аргумент "newermt"
find -L /etc /root /home /bin /sbin /var/www 2>/dev/null \
-newermt "2025-06-04" ! -newermt "2025-06-06"
Особливості Btime
Birth time - також корисна мітка, яку можна підмінити лише від рута, та яка допоможе покрити деякі недоліки пошуку по ctime. Наприклад, якщо зловмисник створив бекдор /etc/systemd/system/bad.service першого числа, а ІТ адмін випадково змінив його шостого числа - тільки btime вкаже на оригінальний час створення бекдору.
Проте, мітка btime з’явилась тільки в ext4, і деякі системні утиліти досі її не підтримують, в тому числі й команда find. Для пошуку по btime можете скористатись Bash скриптом нижче (протестовано на Ubuntu 24.04, має працювати на ext4 з Linux 4.11+):
# Директорії в яких вести пошук
DIRS="/etc /root /home /bin /sbin"
# Birth time який вас цікавить: від і до
FROMDATE=$(date -d 2025-06-04 +%s)
TODATE=$(date -d 2025-06-06 +%s)
for FPATH in $(find -L $DIRS 2>/dev/null); do
FDATE=$(stat $FPATH | grep "Birth" | sed 's/ Birth: //g' | cut -b 1-10)
FDATE=$(date -d "$FDATE" +%s)
if [ "$FDATE" -ge "$FROMDATE" ] && [ "$FDATE" -le "$TODATE" ];
then
echo $FPATH
fi
done
У Підсумку
Мені дуже подобається метод із find+ctime (власне, тому я ним і поділився) - він часто допомагає знаходити глибоко заховані бекдори, які було б складно виявити вручну. Водночас хочу наголосити, що цей підхід радше допоміжний, ніж основний. Покладатися виключно на результати find доволі ризиковано, особливо якщо зловмисник діяв від рута або якщо часові межі атаки точно невідомі.