Гайд - Уроки форензики. Расследуем заражение машины с Windows шпионским трояном | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой скрипт на основе слитого?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Гайд Уроки форензики. Расследуем заражение машины с Windows шпионским трояном

  • Автор темы Удалённый пользователь
  • Дата начала
У

Удалённый пользователь

Guest
Автор темы
В этой статье я покажу, как извлекать основные артефакты из образов оперативной памяти Windows. Мы восстановим процесс атаки, чтобы расследовать инцидент. В этом нам поможет лабораторная работа TeamSpy с ресурса CyberDefenders.

По сценарию сотрудник компании сообщил, что получил подозрительное электронное письмо с файлом документа и после этого компьютер начал вести себя странно. Группа реагирования на инциденты сделала несколько дампов памяти с подозрительных машин. Наша задача — расследовать инцидент и разобраться, что произошло.

По результатам решения кейса необходимо ответить на ряд вопросов, однако я покажу лишь сам процесс решения. Повторив прохождение, ты сможешь сам дать ответы для закрепления материала.
Загрузим архив с артефактами и приступим к их исследованию.

ИСПОЛЬЗУЕМЫЕ УТИЛИТЫ​

  1. Volatility Framework 2.6.1 — инструмент, реализованный на Python 2. Предназначен для извлечения артефактов из образцов энергозависимой памяти.
  2. Bulk extractor — инструмент для извлечения структурированной информации, к примеру адресов электронной почты, URL, доменов.
  3. YARA Editor — программа для тестирования и создания правил YARA.
  4. OST Extractor — инструмент для восстановления OST-контейнеров в EML.
  5. Scdbg — программа для анализа shell-кода.

ИСПОЛЬЗУЕМЫЕ ДЛЯ ИЗВЛЕЧЕНИЯ ДАННЫХ ПЛАГИНЫ VOLATILITY 2​

  1. Imageinfo — плагин для определения операционной системы, пакета обновлений и аппаратной архитектуры исследуемого образа.
  2. Pstree — просмотр списка процессов в виде дерева.
  3. Handles — просмотр открытых дескрипторов к файлам, разделам реестра, мьютексам, именованным каналам, событиям в процессах. Также можно отобразить дескрипторы для конкретного процесса, задав фильтр по типу объекта.
  4. Consoles — плагин для поиска команд, которые злоумышленники ввели через cmd.exe. Основное преимущество этого плагина в том, что он не только печатает команды, введенные злоумышленниками, но и собирает весь экранный буфер (ввод и вывод).
  5. Memdump — извлечение всех резидентных страниц памяти в процессе.
  6. Filescan — плагин для поиска объектов FILE_OBJECT в памяти с помощью сканирования тегов пула. Этот плагин найдет все открытые файлы.
  7. Dumpfiles — извлечение кешированных файлов из образа памяти.
  8. Netscan — поиск сетевых артефактов в 32- и 64-разрядных дампах памяти. Этот плагин находит конечные точки TCP и UDP, а также ищет локальные и удаленные IP-адреса.
  9. Printkey — поиск значений в указанном разделе реестра Windows.
  10. Userassist — получение информации из ключа реестра UserAssist.
  11. Mftparser — сканирует записи главной таблицы файлов (MFT) в памяти и выводит информацию о временных метках файлов.
  12. Autoruns — подключаемый плагин для поиска точек сохранения исполняемых файлов в системе. Для подключения плагина нужно добавить его в каталог plugins инструмента Volatility.
  13. Malfind — плагин для поиска скрытого или внедренного в память процессов кода.
  14. Editbox — плагин для извлечения текста из элементов управления Windows Edit.

ИССЛЕДОВАНИЕ ХОСТА ECORPOFFICE​

Прежде чем искать вирусную активность, давай получим первичную информацию о системе, имя компьютера, сетевой адрес и версию операционной системы.

python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" imgeinfo

Версия ОС — Win7SP1x64. Мы будем ее указывать при поиске других артефактов в качестве профиля в Volatility.

Получим имя компьютера, для этого проверим следующий ключ реестра:
Код:
Код:
SYSTEM\ControlSet001\Control\ComputerName\ComputerName
python2 vol.py -f ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem \
--profile=Win7SP1x64 printkey -K  "ControlSet001\Control\ComputerName\ComputerName"

1673330094250

Выясним сетевой адрес. Для этого проверим ключ, в котором содержатся идентификаторы сетевых адаптеров. Здесь же можно найти и информацию о сети.

Код:
python2 vol.py -f  ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem \
--profile=Win7SP1x86_23418 printkey \
-K "ControlSet002\Services\Tcpip\Parameters\Interfaces\{360E0CDC-9C78-4D3B-A0Af-69CC45DE6D70}"

1673330116050

IP-адрес исследуемой машины — 10.1.1.122.

Проанализируем запущенные процессы в системе, их список выгрузим в файл pstree.txt.

1673330161220

Мы обнаружили процесс OUTLOOK.EXE, идентификатор процесса — 2692. По сценарию нам известно, что инцидент произошел после того, как пользователь запустил вложение в письме. Восстановим все сообщения пользователя и найдем вредоносное. Для этого ищем в процессе все объекты FILE.

Код:
python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \
--profile=Win7SP1x64 handles -p 2692 -t FILE > ecorpoffice/FILE_OUTLOOK

В результате анализа объектов FILE обнаружено имя почтового ящика пользователя:

Код:
\Device\HarddiskVolume1\Users\phillip.price\AppData\Local\Microsoft\Outlook\[email protected]

Попробуем выгрузить этот контейнер из памяти процесса. Найдем физический адрес файла, используя плагин filescan.

Код:
python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \
--profile=Win7SP1x64 filescan > ecorpoffice/filescan`

1673330219337

Выгружаем найденный файл, даем ему расширение .ost и загружаем в утилиту OST Extractor.

Код:
python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \
--profile=Win7SP1x64 dumpfiles -Q 0x000000007d4d9450 -u -D ecorpoffice/

Не забываем про аргумент -u, который позволяет выгрузить большее количество данных.

Получаем файл file.None.0xfffffa80042dcf10.dat. Тоже меняем ему разрешение на .ost и загружаем в OST Extractor.

1673330279273

После конвертирования OST в указанной папке появится сообщение пользователя в формате EML. Переходим в папку сообщений и смотрим его.

Заголовок письма


1673341096379

Письмо отправлено с почтового ящика [email protected]. В аттаче — документ bank_statement_088452.doc. IP-адрес почтового сервера — 31.6.35.122. Письмо поступило 4 октября 2016 года в 12:02:04 (UTC).

Чтобы извлечь вложение, можно воспользоваться блокнотом, для этого декодируем аттач из Base64 и сохраняем файл с расширением .doc. Либо можешь открыть EML с помощью почтового клиента (того же Outlook).

Исследовать вредоносные файлы необходимо в изолированной среде. Итак, берем файл bank_statement_088452.doc и начинаем изучать. Его MD5:
c2dbf24a0dc7276a71dd0824647535c9
Проверим наличие макроса в полученном вложении с помощью утилиты olevba.

olevba bank_statement_088452.doc
Результат работы утилиты olevba


Макрос сильно обфусцирован, и по‑быстрому его проанализировать не получится, поэтому откроем документ в Microsoft Word и начнем отлаживать скрипт на Visual Basic.

Содержимое вредоносного документа


Перейдем в «Вид → Макросы» и нажмем кнопку «Отладить». Находим следующий участок кода.

1673341109176

В функции xvkBjM выполняется запуск содержимого в переменной UsoJar. Найдем место в коде, где формируется эта переменная, поставим точку останова и запустим скрипт.

Отладка скрипта


После выполнения этого участка кода в переменной UsoJar появится команда на PowerShell, которая декодирует данные и исполняет их.

Преобразуем данные из Base64 и посмотрим содержимое.

Преобразованные данные


Как видим, скрипт на PowerShell находит и запускает исполняемые файлы вот из этой папки:

C:\Users\<user>\AppData\Local\Temp

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

Сетевая активность вредоносного документа


Как видим, до запуска скрипта на PowerShell происходит загрузка полезной нагрузки с IP-адреса 54.174.131.235.

1673341146428

Вредоносный скрипт на VBA загружает полезную нагрузку со следующего адреса:

http://54.174.131.235/files/tv_x64.exe

Нагрузка будет сохранена в файл
C:\Users\<user>\AppData\Local\Temp\SkypeC2AutoUpdate.exe

Затем этот файл запускается.

Процесс SkypeC2AutoUpdate.exe — это средство удаленного управления TeamViewer.

Найдем системный идентификатор этого процесса в файле pstree. Это 1364.

Идентификатор вредоносного процесса


Теперь изучим сетевую активность процесса. Для этого извлечем из образа все взаимодействия с сетью и сохраним в файлик netscan.txt.

python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \ --profile=Win7SP1x64 netscan > ecorpoffice/netscan.txt

1673341232314

Процесс с идентификатором 1364 взаимодействует с управляющим сервером 54.174.131.235.

Получим дамп адресного пространства процесса.
python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \ --profile=Win7SP1x64 memdump -p 1364 -D ecorpoffice/
Выгруженный файл называется 1364.dmp.

Теперь при помощи регулярного выражения найдем все взаимодействия с управляющим сервером 54.174.131.235.
strings 1364.dmp | grep '54.174.131.235'

Взаимодействия с управляющим сервером


Вредоносный файл обращается вот на этот адрес:

http://54.174.131.235/getinfo[.]php
Установив соединение, он отправляет собранную информацию. Версия программного обеспечения TeamViewer (параметр tvrv=) — 0.2.2.2.

Попробуем вытащить данные из полей TeamViewer, нам интересен его пароль и идентификатор. Для этого воспользуемся плагином editbox.

python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \ --profile=Win7SP1x64 editbox
Идентификатор хоста


Идентификатор системы — 528 812 561.

Пароль для доступа к удаленному хосту


Пароль для доступа к хосту — P59fS93m.

Попробуем вытащить из процесса интересную информацию, связанную с работой TeamViewer.

strings 1364.dmp | grep 'teamviewer' -B 3 -A 3

Обнаруженный сетевой адрес


В памяти процесса обнаружен сетевой адрес 31.6.13.155, с которого произошел удаленный вход в систему.

Использовав плагин procdump, получим этот процесс, чтобы проверить через VirusTotal.

python2.7 vol.py -f "ecorpoffice/win7ecorpoffice2010-36b02ed3.vmem" \ --profile=Win7SP1x64 procdump -p 1364 -D ecorpoffice/
Получим его хеш и найдем его описание на VirusTotal. MD5-сумма — 6ecd2ed83b0bc2eea7c7a75d06a610b6.

Также проанализируем все письма в папке после работы утилиты ost-extractor.exe.

Письмо с информацией о выкупе


Давай теперь зафиксируем картину произошедшего.

04.10.2016 в 12:02 (UTC) на адрес [email protected] с адреса [email protected] поступило письмо, в котором сообщается номер цифрового кошелька, куда необходимо перевести выкуп. Адрес кошелька Bitcoin:

25UMDkGKBe484WSj5Qd8DhK6xkMUzQFydY
04.10.2016 в 12:02:04 (UTC) на адрес [email protected] от [email protected] пришло фишинговое сообщение, содержащее вредоносный документ bank_statement_088452.doc. Пользователь открыл этот документ, что и привело к компрометации компьютера. С адреса http://54.174.131.235/files/tv_x64.exe на его машину загружается исполняемый файл TeamViewer, содержащий идентификатор и пароль для доступа к скомпрометированному хосту.

В 12:02 04.10.2016 на адрес [email protected] от [email protected] пришло сообщение с адресом кошелька Bitcoin. Если компания не переведет на него определенную сумму, злоумышленники начнут атаковать инфраструктуру организации.

ИССЛЕДОВАНИЕ ОБРАЗА ECORPWIN7​

Получим первичную информацию о системе.

python2 vol.py -f ecorpwin7/ecorpwin7-e73257c4.vmem --profile=Win7SP1x64 imageinfo
python2 vol.py -f ecorpwin7/ecorpwin7-e73257c4.vmem --profile=Win7SP1x64 printkey \ -K "ControlSet001\Control\ComputerName\ComputerName"`
python2 vol.py -f ecorpwin7/ecorpwin7-e73257c4.vmem --profile=Win7SP1x64 printkey \ -K "ControlSet002\Services\Tcpip\Parameters\Interfaces\{3AE5A5FF-4A27-4327-9C26-1493676FB9E5}"
Имя компьютера — WIN-KMUKM7JPN9D, сетевой адрес — 10.1.1.141, профиль операционной системы — Win7SP1x64.

Далее получим список процессов в виде дерева, а также сетевую активность. Результат сохраним в файл.

python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 pstree > ecorpwin7/pstree

python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 netscan > ecorpwin7/netscan
Находим почтовый процесс OUTLOOK.EXE, идентификатор 2496.

Получим дамп адресного пространства этого процесса.

python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 memdump -p 2496 -D ecorpwin7/
Получим список объектов FILE в адресном пространстве процесса.

python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 handles -t FILE -p 2496 > ecorpwin7/handles_file_2496
Получаем файл handles_file_2496, а в нем название другого файла:

[email protected]
Это почтовый контейнер. Найдем его физический адрес и выгрузим его из образа. Для этого получим список файлов:
python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 filescan > ecorpwin7/filescan
Физический адрес почтового контейнера


Восстановим почтовый контейнер.

python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 dumpfiles -Q 0x000000007de17f20 -u -D ecorpwin7/
Теперь конвертируем файл с помощью OST Extractor и находим сообщение с вложением.

Содержимое вредоносного письма




Заголовок письма


04.10.2016 в 13:35:13 (UTC) от [email protected] поступило письмо, содержащее вредоносное вложение. IP-адрес почтового сервера отправителя — 31.6.35.122. Выгрузим вложения с помощью Outlook.

Получаем файл RTF:

Important_ECORP_Lawsuit_Washington_Leak.rtf
Но эта версия файла битая. Поэтому попробуем восстановить его не из сообщения, а из памяти. Находим его по названию в выгруженном списке файлов.

Физический адрес вредоносного файла


Восстановим его.

python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" \ --profile=Win7SP1x64 dumpfiles -Q 0x000000007d6b3850 -u -D ecorpwin7/
Открываем восстановленный файл в Hex-редакторе и удаляем в конце незначащие нули. MD5-сумма этого файла:

00e4136876bf4c1069ab9c4fe40ed56f
Это реализация эксплоита в документе RTF (CVE-2010-3333). Подробнее о нем можешь прочесть в исследовании Sophos (PDF).

Начнем анализ вредоносного документа. Получим список потоков:

py rtfdump.py file.None.0xfffffa80040b3260.dat.rtf
Список потоков документа RTF


Согласно исследованию Sophos, полезная нагрузка находится за фрагментом \sv.

Содержимое документа RTF


Полезная нагрузка начинается после 0xacc8. Выгрузим нагрузку и сохраним в файл shell.

py rtfdump.py file.None.0xfffffa80040b3260.dat.rtf -s 5 -H -d > shell
Далее с помощью утилиты scdbg найдем точку входа шелл‑кода.

scdbg /f shell /findsc
Поиск точки входа


Полезная нагрузка загружается с ресурса по следующему адресу:

http://files.allsafecybersec.com
Проанализируем процессы.

Процесс svchost.exe с запущенными дочерними процессами rundll32.exe


Мы обнаружили процесс svchost.exe с идентификатором 288, запустивший дочерние процессы rundll32.exe. Получим информацию об их запуске при помощи плагина cmdline.

python2.7 vol.py -f ecorpwin7/ecorpwin7-e73257c4.vmem \ --profile=Win7SP1x64 cmdline > ecorpwin7/cmdline
Запуск rundll32.exe


Как видим, rundll32.exe запускает динамическую библиотеку C:\ProgramData\test.DLL, функция экспорта GnrkQr.

Выгрузим test.DLL и проверим его на VirusTotal. Для этого найдем физический адрес файла.
Физический адрес файла test.DLL




python2.7 vol.py -f ecorpwin7/ecorpwin7-e73257c4.vmem \ --profile=Win7SP1x64 dumpfiles -Q 0x000000007e8b03c0 -D c74-TeamSpy/ecorpwin7/
Его MD5 — 2769761a23f793d93bbad3ded28e8ebd.

Файлик оказался вредоносным и относится к семейству PlugX.

Найдем управляющий сервер процесса с идентификатором 288.
Адрес управляющего сервера



Вредоносный модуль взаимодействует с управляющим сервером 52.90.110.169.

Далее получим дамп адресного пространства процесса.

python2.7 vol.py -f ecorpwin7/ecorpwin7-e73257c4.vmem \ --profile=Win7SP1x64 memdump -p 288 -D ecorpwin7/
Найдем все URI, через которые шло взаимодействие с files.allsafecybersec.com:

strings 288.dmp | grep files.allsafecybersec.com
Загрузка линукс-пакета



Для бокового перемещения по сети и заражения машин с Linux злоумышленник загрузил модуль linuxav.deb.

Продолжаем анализировать процессы и находим запущенный исполняемый файл conhost.exe, который обрабатывает консольные окна в последних версиях Windows.
Обнаруженный процесс conhost.exe



Получим дамп его адресного пространства.
python2.7 vol.py -f "ecorpwin7/ecorpwin7-e73257c4.vmem" --profile=Win7SP1x64 memdump -p 3056 -D ecorpwin7/
Теперь проанализируем строки в дампе процесса.

Обычно, попав в систему, злоумышленники начинают искать в ней интересные файлы, чтобы их выгрузить. Посмотрим, как злоумышленник выгружал файлы со скомпрометированной системы. Найдем все файлы с расширениями .zip и .rar. При поиске архивов RAR находим файл report.rar.
strings -el 3056.dmp | grep reports.rar -B 3 -A 3
Результат поиска файла report.rar


Пароль выгружаемых данных — password1234.
 
Активность:
Пока что здесь никого нет