Получаем образ оперативной памяти

image
Содержание оперативной памяти является очень важной информацией при изучении предыдущих действий с машиной. Оперативная память может содержать как части самих исполняемых процессов, так и части удаленных файлов, пользовательских сессий, криптографических ключей. При современном распространении сложных систем защиты информации, основанных на криптовании восстановление их ключей становиться чуть-ли не одной из основных задач для исследования. В защищенных системах зачастую оперативная память это единственное место где могут сохраниться защитные ключи и другая временная, но очень важная информация.


Процесс получения информации, которая содержится в оперативной памяти состоит из двух этапов: изъятие содержимого оперативной памяти
и
анализ полученных во время изъятия данных.

Обращая внимание на первый этап стоит заметить, что изъятие оперативной памяти может быть выполнено с помощью ряда средств: непосредственный доступ к памяти с использованием специальных плат расширения, порта FireWire, и даже физическом изъятии запоминающего устройства оперативной памяти (потребует замораживания плат),

image

но в данном материале мы рассмотрим программные средства, которые позволяют изъять содержимое оперативной памяти защищенных машин путем так называемой «горячей» перезагрузки и запуска машины в Live-режиме.

Для выполнения этой задачи будем использовать специальный дистрибутив Ubuntu CyberPack (IRF) 1.0, состоящий из минимального набора компонент, а именно, только те, которые необходимы для изъятия данных из памяти. Соответственно отсутствует и графический интерфейс.

Использование такого подхода к изъятию содержимого оперативной памяти имеет ряд преимуществ и недостатков сравнительно с другими перечисленными выше средствами.
Плюсы:
— использование Live-дистрибутива позволяет проводить действие не зависимо от того какая операционная система установлена на исследуемой машине;
— отсутствуют затраты на приобретение дорогостоящих специальных устройств, кабелей, плат, и др.
Недостаток:
— содержимое оперативной памяти будет неполным — ее часть будет перезаписана данными, необходимыми для запуска Live-дистрибутива (приблизительно 125 Мб).

Для использования доступны специально собранные дистрибутивы для машин с памятью объемом до 3 Гб (і386) и свыше 3 Гб (amd64). С их помощью можно создать загрузочный CD/DVD-диск или загрузочный USB-диск.

Замечания:
второго шанса система нам не дает — у нас есть только одна попытка. т. е. при повторной перезагрузке исследуемого компьютера большая вероятность того что мы уже не найдем необходимой информации. Отсюда следует что не надо перезагружать его несколько раз, экспериментировать, прицеливаться.
Необходимо заранее подготовится и знать как компьютер себя поведет после перезагрузки.
Большинство современных компьютеров позволяют прямо при старте указать откуда производить загрузку, но если этого нет, тогда необходимого настроить BIOS машины на загрузку с CD/DVD-привода или USB-привода/накопителя, после чего загрузить Live-дистрибутив с указанного устройства.

Итак, приступим.

Перезагружаем компьютер.
ВАЖНО: перезагрузка ни в коем случае не должна быть холодной (путем нажатия кнопки «ресет» или выключение\включение питания), а именно — перезагрузка должна быть осуществлена средствами самой работающей системы (например нажатием кнопок Ctrl-Alt-Del или путем выбора пункта «перезагрузка» в системе)

После загрузки дистрибутива пользователю доступна привычная строка консоли Linux, и краткая информация для запуска модуля.
image

Подготовка к работе программы fmem заключается в выполнении следующих команд:
$ sudo -s
# cd /opt (переход в папку где находиться программа);
# ./run-fmem.sh (скрипт запуска модуля съема памяти);


Замечание: Для дальнейших действий понадобиться примонтировать заранее подготовленный носитель (внешний жесткий диск, флеш-накопитель) с файловой системой ext2/3/4, в который будет сохраняться файл с содержимым оперативной памяти.

Для того, что бы узнать какой идентификатор присоединенному носителю присвоила система, необходимо после его подключения к компьютеру ввести следующую команду:
# dmesg | tail (Команда выводит на экран информацию буфера сообщений ядра. Нас будет интересовать последняя запись.)
Как например вот это:
[16091.995428] sd 9:0:0:0: Attached scsi generic sg2 type 0
[16091.995996] sd 9:0:0:0: [sdb] 32096120 512-byte logical blocks: (16.4 GB/15.3 GiB)
[16091.998192] sd 9:0:0:0: [sdb] Write Protect is off
[16091.998205] sd 9:0:0:0: [sdb] Mode Sense: 0b 00 00 08
[16091.999433] sd 9:0:0:0: [sdb] No Caching mode page found
[16091.999447] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[16092.003486] sd 9:0:0:0: [sdb] No Caching mode page found
[16092.003495] sd 9:0:0:0: [sdb] Assuming drive cache: write through
[16092.004251] sdb: sdb1

(где «sdb» — присвоенное обозначение физического накопителя, а «sdb1» — присвоенное обозначение логического раздела накопителя).

Далее следует примонтировать логический раздел накопителя к папке /tmp загруженной в Live-режиме операционной системы:

# mount /dev/sdb1 /tmp
(где
«mount» — команда монтирования устройства
«/dev/sdb1» — адрес файла логического раздела присоединенного накопителя
«/tmp» — папка в которую необходимо подключить накопитель).

Все подготовительные шаги сделаны — можно переходить к изъятию содержимого оперативной памяти:

# dd if=/dev/fmem of=/tmp/ram-image.mem bs=1K count=`head -1 /proc/meminfo | awk '{print $2}'`
(где
«dd» — команда создания образа
«if=/dev/fmem» — источник данных, а именно оперативная память
«of=/tmp/ram-image.mem» — запись в файл «ram-image.mem» в папку «/tmp»
«bs=1K» — размер блока информации — 1 Кб
«count=`head -1 /proc/meminfo | awk '{print $2}'`» — объем оперативной памяти, информация о которой извлекается из файла /proc/meminfo).

И ждем…
В результате удачного выполнения команды, мы получим сообщение похожее на это:
image
521453568 bytes (521 MB) copied, 158.405 s, 3.3 MB/s
(где
«521453568 bytes (521 MB) copied» — объем скопированной информации
«158.405 s» — время в течении которого проводилась операция
«3.3 MB/s» — скорость при которой проводилась операция)

В результате мы получили содержимое оперативной памяти машины в файле «ram-image.mem» на накопителе. Теперь его можно обрабатывать в т.ч. извлекая части исполняемых процессов, удаленных файлов, информацию о пользовательских сессиях, криптографических ключах и многое другое.

P.S.
Также стоит обратить внимание что все современные системы используют в своей работе и swap-память (так называемый «файл подкачки»)
Файл подкачки – это своеобразное дополнение к оперативной памяти (которая занимается временным хранением данных для быстрой доставки их на обработку процессору) Вашего компьютера. Даже не столько дополнение, сколько её уширение или, можно сказать, продолжение. Дело в том, что когда не хватает оперативной памяти система может переносить данные из памяти на диск (так называемая дополнительная память), в котором соответственно также хранятся данные.
И для полной картины анализа памяти необходимо также получить и их.
Различные операционные системы используют разные способы их хранения.

В случае с Windows это обычно файлы в корне на системном диске С:
pagefile.sys для Win XP и Win 7 и достаточно просто скопировать файл

Для Linux — это отдельный раздел на носителе.
Например:
Команда sudo fdisk -l /dev/sda
покажет нам все разделы в системе
/dev/sda1 * 2048 78125055 39061504 83 Linux
/dev/sda2 78125056 117186559 19530752 82 Linux своп / Solaris
/dev/sda3 117186560 625141759 253977600 83 Linux
Исходя из чего мы видим что раздел подкачки находиться в /dev/sda2
Скопировать его можно также с помощию команды dd.
Например:
dd if=/dev/sda2 of=/media/<путь куда записать>/linux-swap.dd

Для MacOS необходимо скопировать все файлы из директории /private/var/vm/swapfile*

Обработка и анализ полученных результатов (как дампа оперативной памяти так и swap-памяти) может проводиться как в ручную с помощью например HEX-редактора, так и с помощью ряда программ о которых будет рассказано в следующий раз.
Поделиться публикацией

Комментарии 29

    +3
    Очень интересно, но есть немного вопросов:
    1. Если переводить систему в спящий режим (т.е. когда дамп памяти сбрасывается на диск), то можно ли потом анализировать именно этот дамп?
    2. Не совсем понял, как по закрытию программы память остается на месте. Или там образуется «каша», которую и анализируют? Файл подкачки тоже, если не ошибаюсь, может очищаться при перезагрузке.
      0
      1. да. ведь туда как раз и сбрасывает всю память
      2. «Не совсем понял, как по закрытию программы память остается на месте. Или там образуется «каша», которую и анализируют?»
      не понял полностью вопроса.
      «Файл подкачки тоже, если не ошибаюсь, может очищаться при перезагрузке. „
      зависит от настроек системы.

      это програмное решение.
      есть еще апаратные.
      если мне попадет в руки хоть одно, опишу )
        +1
        1. Да, я знаю, что скидывается. Но всегда есть нюансы… Может там шифруется все, может формат очень хитрый, может еще что вылезет…
        Просто учитывая (2) мне кажется более надежным способом.

        2. Я про то, что перезагрузка предварительно закрывает запущенные задачи.
        И как потом найти область памяти, если она была освобождена, ссылки на нее перезатерты и еще из файла подкачки подгрузились старые задачи, которые опять же закрывались…

        По аппаратному решению: азот и жесткая перезагрузка (ресет).
        Если не ошибаюсь, именно в таком контексте я слышал про чтение памяти, кроме первых МБ.
          +1
          Да, я знаю, что скидывается. Но всегда есть нюансы… Может там шифруется все, может формат очень хитрый, может еще что вылезет…

          Ключи шифрования для FDE удаляются из памяти при блокировке компьютера или уходе в сон, это сделали после популяризации атаки через Firewire.
      +1
      Для Linux — это отдельный раздел на носителе.

      Linux давно уже умеет подключать файлы для подкачки, а не обязатльно отдельный раздел.
        0
        Просто мало кто использует именно файлы подкачки. Все установщики по умолчанию создают отдельный раздел. Да и смысла в файле подкачки меньше. Некоторые файловые системы не поддерживают файлы подкачки, например, btrfs.
        +3
        Кстати, один линк вместо целой статьи: memdump :))
          0
          О, отличная статья и отличный инструмент!
          ВАЖНО: перезагрузка ни в коем случае не должна быть холодной (путем нажатия кнопки «ресет» или выключение\включение питания), а именно — перезагрузка должна быть осуществлена средствами самой работающей системы (например нажатием кнопок Ctrl-Alt-Del или путем выбора пункта «перезагрузка» в системе)

          А почему так? Неужели современные BIOS/UEFI перезаписывают память при запуске? Там же Quick Boot сто лет, все дела?
          В общем, пытались мы сдампить один комп, в котором использовалась кастомная материнская плата, кастомный BIOS, стоял Linux и все данные расшифровывались через TPM. Ну, достаточно стандартная связка из TrustedGRUB и BIOS, поддерживающий TPM. TrustedGRUB закидывает в TPM PCR все: MBR, свои настройки (grub.cfg), ядро, initrd и себя, т.е. если хоть что-то изменить, например, настройки grub, то TPM PCR будет в другом состоянии и ФС не расшифруется.
          Ну и нагуглил я тогда msramdmp. Пробовали-пробовали, ничего не выходит, дамп содержит только образ BIOS. Решили, что система очищает память при перезагрузке, BIOS-то все-таки кастомный, да и грузится долго, секунд 15-20 до включения экрана. Решили быстренько память в другой компьютер переставлять, а там msramdmp запускать. Выключаем комп, быстро вынимаем память, вставляем, и опять пусто. Секунд 7 на перестановку памяти уходило, хоть и DDR2, но что-нибудь то должно было остаться.
          В общем, так ничего и не получилось.
            –1
            Нажатие клавиши ресет делает аппаратный сброс, читайте рвёт цепь питания (разумеется это не так, но для понимания достаточно). Не знаю как обстоят дела с оперативкой, ли тактирование прекращается, либо ставится сброс, но совершенно точно содержимое обнуляется.
              0
              По всей видимости вы правы, но я что-то не понимаю, как можно моментально очистить память.
              Судя по некоторым статьям (вот, например, одна из них, собственно, в статье вторая картинка оттуда) у людей получается держать память без питания по 30 секунд при комнатной температуре и считывать с нее данные после включения. С ошибками, конечно, но не нули. Речь идет именно о выключении питания и холодной загрузке после выключения.
                0
                Выключение питания и reset — не одно и тоже. Выключение, это просто снятие питания. Заморозкой можно добиться сохранения ячеек. А ресет — это запись туда нулей. Ну схемотехнически это реализовать просто. Значение в ячейке — это заряд конденсатора, разрядили все конденсаторы, вот вам нули в оперативке. А там как реализовано — надо читать стандарт на соответствующую память.
                  0
                  Ну, я не могу ни подтвердить, ни опровергнуть ваши слова. Я много статей про cold-boot атаки и дампы памяти читал, но все сходились во мнении, что память может обнулить исключительно BIOS/UEFI при запуске без Quick Boot (когда вся память чекается во время POST, фактически, в нее просто нули пишутся), а насчет физической очистки памяти нигде не слышал, но, вполне возможно, что вы правы. По крайней мере, даже ECC-память очищается именно BIOS при загрузке.
                  В любом случае, у некоторых людей получалось физически переставить память в другой компьютер и успешно считать ее при комнатных температурах и без заморозки.
                    0
                    DRAM-память это не триггер, все ячейки разом обнулить не получится физически — как минимум нужно пройтись по всем строкам памяти.
                      0
                      не прав, понимаю
                  0
                  нет у RAM-модулей вывода сброса… память не очищается. Просто прекращается рефреш и ячейки через некоторое время переходят в неопределенное состояние. Когда я эксперементировал с 128кБ модулем памяти, он спокойно переживал примерно 20 секунд без питания — все данные оставались целыми. Сейчас же, с уменьшением технологических норм это время повидимому сократилось, возможно до считанных секунд или десятых долей секунд. Единственное беспокойство — насчет процедуры определения объема памяти в БИОСе, алгоритм проходится по диагональным ячейкам и скорей всего они «затираются». Возможно, затирается содержимое в процессе первоначального теста памяти, т.е. желательно было бы еще и кастомный БИОС поставить, который память не тестирует.
                    0
                    Когда я эксперементировал с 128кБ модулем памяти, он спокойно переживал примерно 20 секунд без питания — все данные оставались целыми.


                    Какой тип памяти? Если SRAM — то ничего удивительного.
                      0
                      нет, именно DRAM — модуль от 286-го компа, 30-ти контактный SIMM.
                        0
                        Забавно :). Буду знать.

                        А как проходил эксперимент?
                          +1
                          В обстановке строжайшей секр…

                          На самодельном компе, вестимо на Z80. Прикрутить-то прикрутил, поигрался и забросил. Всего-то надо два мультиплексора 555КП11 и небольшая логика с RC-цепью для реализации задержки RAS-CAS, даже рефреш не надо делать — это делал Z80 аппаратно.
                          Просто в первый раз удивился что после выключения и включения системы ячейки памяти не изменились. Потом стал перекрывать кислород системе все дольше и дольше, остановился на 30 секундах — там уже начинались повреждения. На 20 секундах стабильно держалось при комнатной температуре.
                  0
                  Потому, что при подаче аппаратного RESET BIOS/UEFI начнет проверку объема памяти, хотябы путем записи по границам параграфов ( размеры — где какие, у серверов раньше настраивалось, что сейчас — хз ), в худшем случае запись будет идти по всему объему ОЗУ. Соответственно вместо того, что нам надо было скопировать — будет мусор или нули или что там ещё биос запишет.
                  0
                  У меня совершенно очевидный и простой вопрос. Ведь этот linux, какой бы он маленький не был, таки будет выполняться в том же адресном пространстве, что и предыдущая ОС, и соответственно он затрёт её содержимое. А во вторых, никто не гарантирует, что программы, которые завешаются таким образом не проведут очистку памяти, им же приходит сигнал о заверении работы ОС.
                    –1
                    У меня совершенно очевидный и простой вопрос. Ведь этот linux, какой бы он маленький не был, таки будет выполняться в том же адресном пространстве, что и предыдущая ОС, и соответственно он затрёт её содержимое.

                    Именно так. Есть тот же msramdmp, он весит несколько килобайт и является syslinux-приложением.
                    А во вторых, никто не гарантирует, что программы, которые завешаются таким образом не проведут очистку памяти, им же приходит сигнал о заверении работы ОС.

                    Обычные программы крайне-крайне редко перезаписывают память при завершении, как правило, это излишне. Как правило, очищают какие-то секретные данные, например, ключи шифрования, если они в программе использовались, как раз чтобы избежать атак на дамп памяти.
                    +2
                    Большинство умных программ, работающих с паролями, зануляет области, где были ценные данные. Так что если ребутить — то передёргивая питание или роняя ОС, так, чтобы программы не могли завершиться.

                    В минимальном виде — хотя бы на stop поставить.
                      0
                      Может через SysRq?
                        0
                        Для линукса — да. Но, тут есть пара факторов:

                        если есть kexec-ядро в памяти, будет запущено оно, а не стандартный биос.
                        если биос решит пошуршать памятью, мало не покажется (в смысле, потрёт много).
                      +3
                      Мне со BSoD и full_memdump'ом как-то спокойнее
                        0
                        Тупой вопрос, да и не совсем по теме (обсуждается же программный способ) — а разве нельзя подключить свой источник питания к планке памяти, затем переставить её в свой компьютер второй планкой и считать информацию с неё?
                          0
                          DRAM… Ей требуется постоянное обновление (refresh). А делает его контроллер. Так что источника памяти тут мало — нужен таймер и вся соответствующая обвязка.
                            0
                            А если DRAM не обновится, то слетает содержимое, я правильно понимаю?
                            — Всё, понял, спасибо =)

                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                        Самое читаемое