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

 

Промышленный шпионаж

Мы привыкли, что киберпреступность пытается обмануть, взломать и обворовать
несчастных пользователей интернета. Но время всегда заставляет людей двигаться
дальше, за новыми результатами и новой прибылью. То же самое происходит и в
отношении плохих парней. Можно еще с десяток лет строить ботнеты, воровать
номера 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 для работы с файлами, создания
процессов, внедрения в процесс и загрузки новых библиотек и др.

 

Что это было?

Именно так… что же это было?! Простые блэкхаты не будут ввязываться в то, что
не принесет легких денег. Данные из SCADA-систем интересны лишь конкурентам.
Конкурентам в коммерческом или политическом планах. Если взглянуть на карту
распространения заразы (по данным лаборатории Касперского), то видно, что
эпицентр — Азия (а именно — Индия, Иран и Индонезия). Если взглянуть на
описанный функционал червя, то можно ужаснуться — контроль над .DLL и перехват
функций SCADA. Разве не круто — управлять индийской атомной электростанцией по
инету? Или проникнуть в иранскую ядерную программу? К тому же, мы имеем факт,
что драйвера руткита имеют легальный сертификат, который географически
принадлежит компании, базирующейся в той же зоне (в Тайланде)!

Этой историей занимаются не только антивирусные компании, но и
правительственные структуры (чтобы замести свои следы? :)). В результате
"захвата" указанных доменов и командных серверов удалось проанализировать
статистику стучащихся туда больных машин. В итоге данные Symantec практически
совпадают со сведениями Лаборатории Касперского — все те же страны. Кроме всего
этого уже подтвердились факты проникновения и в саму систему SCADA. Пока не так
много, около трех фактов (два из Германии и один из Ирана). Но ведь не все будут
публично говорить, что их поимели...

 

Что будет?

После всего случившегося, я думаю, возникнет неслабый интерес к безопасности
SCADA. До этого инцидента уже были и исследователи, и фирмы, которые
предупреждали о проблемах в безопасности и предлагали свои услуги, но этот
конкретный случай может помочь им очень неплохо заработать. Смею полагать, что
такая же модель червя годится и для ERP-систем, так как показанная схема
применима и для этой модели. ERP-системы отвечают за планирование и управление
бизнесом — деньгами, задачами, товарами и т.д., и т.п. (Я бы даже сказал, что
написать такого червя под ERP было бы легче, но раз была выбрана SCADA и регионы
Азии, то тут скорее попахивает политикой...). Так что все эти бизнес- и
промышленные системы еще ждут своих героев (привет Александру Полякову aka
sh2kerr). Но вот что касается .LNK-уязвимости, то, например, троянец Zeus уже
стал использовать ее для своего размножения. Кроме того, ребята из Rapid7
сделали эксплойт для Metasploit, который способен работать через HTTP с помощью
WebDav.

При этом шеллкод забивается в .DLL-файл, и ярлык его подгружает. Патча на
момент написания статьи еще не было, а угроза весьма существенная — тут все
антивирусные компании говорят, что они прекрасно детектируют виря по сигнатурам,
поэтому самое время обратить внимание, что сигнатуры — отстой. Сигнатура DLL нам
не так интересна, а вот сигнатура, по которой определяется, что данный ярлык —
эксплойт, определенно может хромать. Возьмем ярлык от публичного PoC
(suckme.lnk_) и отправим это чудо на virustotal.com. В итоге мы имеем 27
антивирусов, которые его обнаружили. Теперь откроем панель управления и создадим
пару ярлыков, один желательно от Java. Далее переименуем эти ярлыки через
консоль:

nopy Java.lnk Java.lnk_

Второй ярлык копируем аналогично первому. Теперь мы можем редактировать их в
HEX-редакторе. Обычно все ярлыки имеют указатель в виде Unicode-формата, но
Java-ярлык — нет. В итоге мы видим две ссылки на CPL-апплеты, причем для Java —
не в Unicode-виде. Меняем путь к CPL (DLL) на наш файл, удаляем посередине
лишние байты (fa ff ff ff 20) и сохраняем. Копируем обратно с расширением .LNK.
Итоги отправляем на virustotal.com. Для Unicode-ярлыка осталось 11 антивирусов,
для Java-ярлыка — 8, то есть 70% антивирусов перестали детектить эксплойт, и
среди этих антивирусов такие гиганты, как Symantec, Kaspersky, AVG, NOD32. Так
что антивирус тут — не панацея.

Это так... пять копеек от меня, чтобы там не расслаблялись, а вообще,
антивирусникам надо сказать спасибо за столь тщательную и интересную работу,
которую они проделали, чтобы помочь нам разобраться в этой угрозе. Спасибо Вам,
бойцам антивирусного фронта: AdBlokAda (первыми обнаружили и изучили), Symantec
(за подробный технический анализ в своем блоге), компании ESET и лично 
Александру Матросову за их работу в московской лаборатории. Также спасибо
лаборатории Касперского и их блогу, в котором Александр Гостев делился своими
мыслями и красивыми картами :). Ну и спасибо тебе, мой читатель, переваривший
этот важный материал.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    1 Комментарий
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии