Настройка рабочей среды
Я собирался проводить исследования исключительно в памяти, а, значит, мне нужно было найти простой и надежный способ для поиска и изменения информации, а также отслеживание внесенных правок.
Самый очевидный метод – создавать дамп каждый раз, когда вносятся изменения, что легко сделать в виртуальной машине. Мы просто делаем снимок каждый раз при изменении какой-либо информации. Затем мне нужно было сравнивать два снимка с целью нахождения точного места, где произошли изменения.
Далее процесс установки довольно прост: несколько браузеров (Chrome, IE, FF), учетная запись LastPass и добавление аккаунтов для нескольких сайтов.
В плагинах для браузеров я оставил стандартные настройки и использовал встроенную функцию для генерации паролей различной длины. В паролях использовались буквенно-цифровые символы смешанного регистра.
Кроме того, я скопировал все сгенерированные пароли в отдельный документ на основном компьютере, чтобы использовать эту информацию в дальнейшем.
После того как пароли были продублированы на моей машине, я разлогинился из всех учетных записей, почистил историю и папку с временными файлами, перезапустил и выключил машину.
Методика исследования
Вначале все было довольно просто, но при попытке найти ограничения метода, задача начала усложняться. В целом последовательность действий состояла из следующих шагов:
Открыть браузер.
Авторизоваться в плагине LastPass (если произошло разлогинивание).
Авторизоваться на сайте.
Проверить память на присутствие паролей в открытом виде.
Что-нибудь поменять:
Закрыть вкладку.
Повторно использовать вкладку.
Разлогиниться.
Повторить.
Тест №1
Я знал все имена пользователей и пароли, так что первый шаг был довольно очевидным. Я авторизовался на первом сайте при помощи тестовой учетной записи на FaceBook. После авторизации я прогулялся по двум страница и далее, оставив вкладку открытой, сделал первый снимок.
Мой первый поисковый запрос был простым:
grep -a 03rRJaYNMuoXG7hs Win7x64-MemTesting-Snapshot3.vmem | strings > ~/Desktop/fb.txt
Параметр –а говорит утилите grep о том, что бинарный дамп нужно обрабатывать как текст, а утилита string немного очищает выходные данные перед записью в текстовый файл.
В полученном текстовом файле сразу же видим незашифрованный пароль:
Содержимое снимка памяти во время работы с учетной записью в FaceBook
Два момента сразу же привлекают внимание:
Первый - объект JSON с паролем, именем домена, временными метками и другой информацией, которая, скорее всего, имеет отношение к автоматическому заполнению полей формы.
Второй – выглядит немного оторванным от остальной информации.
passO3rRJaYNMuoXG7hspassword
Продолжаем исследование.
Тест №2
В следующем снимок делался во время авторизации на нескольких сайтах. Вкладки оставались открытыми. Далее происходило разлогинивание из всех учетных записей перед выключением и повторным запуском виртуальной машины. Я хотел сделать снимок памяти настолько чистым, насколько возможно.
Кроме того, чтобы убедиться, что браузер сам по себе не хранит данную информацию, я полностью почистил историю.
Полное удаление истории браузера
На скриншоте ниже видно, что все вкладки загружены и залогинены за исключением QNAP. Я зашел на главную страницу, и плагин LastPass показал, что есть одно совпадение учетных записей, но я еще не загрузил страницу с формой, и, соответственно, не произошло никакого автозаполнения.
Индикация совпадения одной учетной записи в тот момент, когда форма еще не загружена
При исследовании новых снимков использовались те же команды для всех доменов в открытых вкладках. По всем доменам, на которых я логинился, в памяти хранилась одна и та же структура данных.
В структуре выше имя пользователя, имя домена и пароль хранятся как обычный текст.
Информация по сайту QNAP, который был просто загружен, но без заполнения формы, в памяти отсутствовала.
Во время поиска в памяти других интересных деталей я натолкнулся на интересную информацию:
Область данных, помеченная как LastPassPrivateKeyНайденная мной информация помечена как LastPassPrivateKey. На данный момент я занимаюсь выяснением, можно ли при помощи этой информации получить мастер-пароль или расшифровать файл с хранилищем.
Во время размышлений о возможностях использования содержимого PrivateKey меня осенило, что еще не проверено, присутствует сам мастер-пароль в памяти. Я предполагал, что мастер-пароль удаляется сразу же после расшифровки информации.
Используя grep, я нашел имя пользователя и пароль в открытом виде только в одном из снимков.
Далее я попробовал посмотреть информацию по открытым, закрытым и повторно используемым вкладкам. По результатам экспериментов я пришел к выводу, что если вкладка открыта и авторизация произошла, то учетные записи в памяти, в большинстве случаев, найти можно.
Что касается повторно используемых, неактивных и закрытых вкладок другими доменами, то здесь уже сложнее найти нужные структуры данных. Информация находится в памяти, и если вы знаете конкретные значения, то найти нужные структуры можно, в противном случае процесс напоминает поиск иголки в стоге сена.
После того как набралось достаточно информации, я решил автоматизировать процесс извлечения учетных записей из памяти при помощи плагина Volatility.
Пару лет назад Брайан Баскин (Brian Baskin) опубликовал статью с описанием плагина Volatility, который использует YARA-правила для поиска и извлечения информации из памяти. Именно данная технология легла в основу моего плагина.
Далее нужно было применить несколько YARA-правил и впоследствии обработать полученную информацию, чтобы собрать результаты воедино.
После обработки снимка памяти вы получите нечто следующее:
localadmin@tech-server:~$ vol.py --plugins=/home/localadmin/github/volatility_plugins/lastpass --profile=Win7SP1x86 -f /home/localadmin/Desktop/lastpass-mem.vmem lastpass
Volatility Foundation Volatility Framework 2.5
Searching for LastPass Signatures
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3400)
Found pattern in Process: chrome.exe (3840)
Found pattern in Process: chrome.exe (3840)
Found pattern in Process: chrome.exe (3840)
Found pattern in Process: chrome.exe (3840)
Found pattern in Process: chrome.exe (3912)
Found pattern in Process: chrome.exe (3912)
Found pattern in Process: chrome.exe (3912)
Found pattern in Process: chrome.exe (3912)
Found pattern in Process: chrome.exe (3912)
Found pattern in Process: chrome.exe (3912)
Found pattern in Process: chrome.exe (4092)
Found pattern in Process: chrome.exe (4092)
Found pattern in Process: chrome.exe (4092)
Found pattern in Process: chrome.exe (4092)
Found pattern in Process: chrome.exe (2036)
Found pattern in Process: chrome.exe (2036)
Found pattern in Process: chrome.exe (2036)
Found LastPass Entry for hackforums.net
UserName: peters.lastpass
Pasword: jRvTpQoTHS4OTcl
Found LastPass Entry for facebook.com
UserName: peters.lastpass@gmail.com
Pasword: Unknown
Found LastPass Entry for sainsburys.co.uk
UserName: peters.lastpass@gmail.com
Pasword: mt5JwaPctWFzBj
Found LastPass Entry for leakforums.net
UserName: peterslastpass
Pasword: rmH61HSabrVJ9a2
Found LastPass Entry for facebook.com,facebook.com,messenger.com
UserName: Unknown
Pasword: O3rRJaYNMuoXG7hs
Found Private Key
Found Private Key
LastPassPrivateKey<\x00\xb2\x88\x10\x02N;$\x02&\x00\x00\x00>LastPassPrivateKey
localadmin@tech-server:~
Мне нужно еще многое доработать, чтобы полностью доделать плагин. Текущую версию можно взять на Github:
https://github.com/kevthehermit/volatility_plugins/tree/mast...