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

 

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

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

Туда червь и пытался достучаться и «что-то» слить в зашифрованном виде. Ребята из 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. Далее переименуем эти ярлыки через консоль:

сopy 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 и лично Александру Матросову за их работу в московской лаборатории. Также спасибо лаборатории Касперского и их блогу, в котором Александр Гостев делился своими мыслями и красивыми картами :). Ну и спасибо тебе, мой читатель, переваривший этот важный материал.

Оставить мнение

Check Also

Windows 10 против шифровальщиков. Как устроена защита в обновленной Windows 10

Этой осенью Windows 10 обновилась до версии 1709 с кодовым названием Fall Creators Update …