Центр исследования компьютерной преступности

home контакты

Шпионский ярлык: история трояна Stuxnet

Дата: 19.11.2010
Источник: Xakep.ru


hack/1043259246-3.jpg Мы привыкли, что киберпреступность пытается обмануть, взломать и обворовать несчастных пользователей интернета. Но время всегда заставляет людей двигаться дальше, за новыми результатами и новой прибылью. То же самое происходит и в отношении плохих парней. Можно еще с десяток лет строить ботнеты, воровать номера CC, но ведь есть еще огромная неизведанная ниша — промышленность, ее технологии, секреты и ценные данные. Именно с ней и произошел инцидент в разгар лета — беспрецедентная атака на промышленные системы SCADA, Supervisory Control And Data Acquisition, что переводится как "Диспетчерское Управление и Сбор Данных" (по-нашему это аналог АСУ ТП — Автоматизированная Система Управления Технологическим Процессом). Такие системы контролируют процессы на производстве, нефтяных вышках, атомных электростанциях, газопроводах и т.д. Естественно, такие комплексы имеют свои базы данных, и та информация, что в этих базах, бесценна. Именно на эту информацию и нацелилась свежая вредоносная программа, получившая имя Stuxnet.
Stuxnet

Первыми обнаружили нового зверя братья-славяне из Белоруссии, а именно — антивирусная контора VirusBlokAda. 17 июня ими было найдено тело виря, но лишь к 10 июля они выпустили пресс-релиз (объясняя это тем, что им было необходимо уведомить компании, чье имя было в ходе дела "опорочено", и изучить экземпляр). Компании эти достаточно известны — Microsoft и Realtek. Специалисты VirusBlokAda зафиксировали использование червем 0day-уязвимости при обработке файлов ярлыков (.lnk), и поэтому в дело оказались вмешаны Microsoft (о самой уязвимости поговорим позже). А вот при чем тут Realtek? Дело в том, что устанавливаемые червем драйвера имели действующий сертификат, заверенный Verisign и выданный на имя Realtek. Такой оборот дела сильно усложняет процесс детектирования вредоносного контента различными системами обнаружения и предотвращения вторжения на уровне хоста (HIPS, антируткиты), так как такие системы безгранично доверяют сертификатам, не обращая внимания на суть дела. Я вполне уверен, что доверенный сертификат сильно продлил жизнь "малваре", прежде, чем ее обнаружили. Как бы то ни было, после пресс-релиза белорусов, другие антивирусные компании так же подключились к исследованию, как новой уязвимости, с помощью которой распространялся червь, так и к боевой нагрузке.
Распространение

Механизм размножения червя, казалось бы, не особо-то и оригинальный — через USB-флешки. Но autorun.inf тут уже ни при чем. В дело вступает новая уязвимость, которая позволяет загружать произвольную .DLL-библиотеку, как только флешка будет вставлена, и пользователь откроет ее содержимое. Дело в том, что на флешке лежит .DLL-файл с вредоносным кодом (ну, фактически расширение, в случае с червем, — .TMP) и .LNK-файл. Файл с расширением .LNK является обычным ярлыком. Но в нашей ситуации ярлык не совсем обычный. При отображении ярлычка в стандартной оболочке или Total Commander автоматически выполнится лежащий рядом .DLL-файл со всеми вытекающими отсюда последствиями! Как такое могло произойти?

Как известно, ярлык указывает на исполняемый файл и при двойном щелчке вызывает его. Но тут все без щелчков, да и .DLL-файл так не выполнить. Если рассмотреть ярлык в HEX-редакторе, можно увидеть, что в его середине указан путь до нашей .DLL. Кроме того, это не обычный ярлычок, а ярлычок на элемент панели управления! Эта-то деталь все и объясняет. Любой элемент панели управления — .CPL- апплет. Но CPL — это, по сути, простая .DLL, поэтому ярлык для панели управления особый, он как бы понимает, что имеет дело с .DLL. Кроме того, такой ярлык пытается ВЫТАЩИТЬ иконку из.DLL, чтобы отобразить ее в проводнике. Но для того, чтобы вытащить иконку, надо подгрузить библиотеку. Что, собственно, оболочка и делает с помощью вызова LoadLibraryW().

Справедливости ради стоит отметить, что вызов этой функции автоматически влечет за собой выполнение функции DllMain() из подгружаемой библиотеки. Поэтому, если такой ярлычок будет указывать не на .CPL-апплет, а на злую библиотеку со злым кодом (в функции DllMain()), то код выполнится АВТОМАТИЧЕСКИ при просмотре иконки ярлыка. Кроме того, эту уязвимость можно использовать и с помощью .PIF-ярлыков.
Боевая нагрузка

Кроме интересного метода распространения удивила и боевая нагрузка — никаких ботнетов, краж банковских паролей, номеров CC. Все оказалось куда масштабнее. Уязвимость .LNK провоцирует загрузку скрытого файла с именем ~wtr4141.tmp, лежащего рядом с ярлыком. Файл этот исполняемый, но маленький (всего 25 Кб). Как отметили специалисты из Symantec, очень важно на первых порах скрыть свое присутствие, пока система еще не заражена. С учетом специфики 0day-уязвимости, которая действует, как только пользователь увидит иконки, сработает и ~wtr4141.tmp, который в первую очередь вешает перехваты системных вызовов в kernel32.dll. Перехватываемые вызовы:

* FindFirstFileW
* FindNextFileW
* FindFirstFileExW

Хуки также вешаются и на некоторые функции из ntdll.dll:

* NtQueryDirectoryFile
* ZwQueryDirectoryFile

Все эти функции обрабатываются со следующей логикой — если файл начинается с "~wtr" и заканчивается на ".tmp" (или на ".lnk"), то удалить его из возвращенного оригинальной функцией значения, а затем вернуть, что осталось. Другими словами, скрыть свое присутствие на диске. Поэтому пользователь просто не увидит файлы на флешке. После этого ~wtr4141.tmp подгружает второй файл с диска (~wtr4132.tmp). Делает он это не совсем стандартно, я бы даже сказал, извращенно — установкой хуков в ntdll.dll на вызовы:

* ZwMapViewOfSection
* ZwCreateSection
* ZwOpenFile
* ZwCloseFile
* ZwQueryAttributesFile
* ZwQuerySection

Затем с помощью вызова LoadLibrary он пытается подгрузить несуществующий файл со специальным именем, на это дело срабатывают ранее установленные хуки и грузят второй файл, уже реально существующий — ~wtr4132.tmp, вернее, его незакодированную часть, которая раскодирует вторую часть (по факту — UPX-сжатие). Вторая часть представляет собой некие ресурсы, другие файлы, которые вступают в дело после расшифровки и экспорта (аналогичным извращенным методом с хуками на API функции).

Первым делом устанавливаются два драйвера — mrxcls.sys и mrxnet.sys (именно из-за этих файлов червь получил такое название — Stuxnet). Устанавливаются они в системную директорию, а функционал на них — руткит уровня ядра с той же логикой, что и в первом файле. Это обеспечит защиту червя после перезагрузки и завершения процесса ~wtr4141.tmp.

Драйвера эти, как уже было сказано, имеют легитимный сертификат Realtek, поэтому их установка пройдет без проблем (на данный момент сертификат уже отозван). Кроме руткита распаковываются файлы шаблона ярлыка и ~wtr4141.tmp для организации заражения других USB-устройств. Потом экспортируется код, который инъектится в системные процессы и добавляет в реестр вышеотмеченные .SYS-файлы руткита (HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\MRxCls). Далее раскодируются два .DLL-файла, которые заменяют существующие файлы системы SCADA — Siemens Step 7.

Таким образом, все вызовы из системы SCADA переходят в поддельные библиотеки. Там происходит "нужная" обработка, после чего вызовы передаются в оригинальные .DLL (остальную часть функций вирь и вовсе эмулирует самостоятельно). Кроме всего перечисленного, червь блокирует процессы антивирусов и пытается найти сервера СУБД (MSSQL). Найдя таковые, он пробует выполнить вход с учетной записью WinCCConnect и паролем по умолчанию — 2WSXcder. Это учетная запись от БД SCADA типа Siemens Simatic WinCC. Как видно, червь заточен именно под продукт Siemens. Если аутентификация прошла успешно, шпион выкачивает данные о процессах и прочую секретную инфу. Кроме того, он не гнушается поискать в локальных файлах полезную для шпионов информацию. Если удается обнаружить выход в интернет, то червь лезет на один из командных серверов. Имена серваков такие:

* mypremierfutbol.com
* todaysfutbol.com

Туда червь и пытался достучаться и "что-то" слить в зашифрованном виде. Ребята из Symantec разобрались и с этой задачей. Оказалось, что шифрование представляет собой побайтовую операцию XOR с 31-битным ключом, который был прошит в одной из .DLL-библиотек. Ответ с сервера также приходит в XOR-виде, правда, используется уже другой ключ из той же библиотеки. Троян отсылает на сервер общую информацию о зараженной машине (версия винды, имя компьютера, адреса сетевых интерфейсов, а также флаг наличия SCADA). В ответ от командного центра могут приходить вызовы RPC для работы с файлами, создания процессов, внедрения в процесс и загрузки новых библиотек и др.

Добавить комментарий
Всего 0 комментариев


Copyright © 2001–2021 Computer Crime Research Center

CCRC logo