Оружие не может быть ни плохим, ни хорошим. Собственно говоря, мое отношение к жанру фэнтази основано именно на формуле: «нет ни добра, нет ни зла – есть только наше отношение к происходящему».
Начав в предыдущих постах рассказ об арсенале для видения кибер войн, я руководствовался именно этим подходом к жизни: оружие может служить добру, может служить злу. И винить оружие или его разработчика в чем либо нельзя. Рассудят только факты.
Еще одна простая формула: есть оружие – есть броня от него. Как противостоять Stuxnet, используя утилиты от Sysinternals, я начну рассказывать в самое ближайшее время. Сейчас же настало время, чтобы коротко и сухо изложить, то против чего нам предстоит бороться.
Итак, небольшое техническое описание Stuxnet (разумеется, исключительно из свободнодоступного материала сети, и никакого творчества от автора блога, так как тематика блога – описательного характера)
Распространение
Stuxnet – червь.
Механизм размножения — через USB-флешки.
Использует уязвимость, которая позволяет загружать произвольную .DLL-библиотеку, как только пользователь открывает содержимое флэш-накопителя.
На флэшке лежит .DLL-файл с вредоносным кодом (ну, фактически расширение, в случае с червем, — .TMP) и .LNK-файл. Файл с расширением .LNK - обычный ярлык. Но здесь с боевой начинкой. При отображении ярлыка в стандартной оболочке или Total Commander автоматически выполнится лежащий рядом .DLL-файл со всеми вытекающими отсюда последствиями!
Ярлык указывает на исполняемый файл и при двойном щелчке вызывает его. Но тут все без кликов, да и .DLL-файл так не выполняется.
В ярлыке указан путь на .DLL. Кроме того, это не обычный ярлычок, а ярлычок на элемент панели управления. Любой элемент панели управления — .CPL-апплет. Но CPL — это, по сути, простая .DLL, поэтому ярлык для панели управления особый, он понимает, что имеет дело с .DLL. Кроме того, такой ярлык пытается ВЫТАЩИТЬ иконку из DLL, чтобы отобразить ее в проводнике. Но для того, чтобы вытащить иконку, надо подгрузить библиотеку, что, оболочка и делает, с помощью вызова LoadLibraryW().
Вызов данной функции автоматически влечет за собой выполнение функции DllMain() из подгружаемой библиотеки. Поэтому, если такой ярлык будет указывать не на .CPL-апплет, а на злую библиотеку со злым кодом (в функции DllMain()), то код выполнится АВТОМАТИЧЕСКИ при просмотре иконки ярлыка.
Кроме интересного метода распространения удивила и боевая нагрузка — никаких ботнетов, краж банковских паролей, номеров 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 (остальную часть функций Stuxnet и вовсе эмулирует самостоятельно).
Кроме всего перечисленного, червь блокирует процессы антивирусов и пытается найти сервера СУБД (MSSQL). Найдя таковые, он пробует выполнить вход с учетной записью WinCCConnect и паролем по умолчанию — 2WSXcder. Это учетная запись от БД SCADA типа Siemens Simatic WinCC. Как видно, червь заточен именно под продукт Siemens. Если аутентификация прошла успешно, шпион выкачивает данные о процессах и прочую секретную инфу. Кроме того, он не гнушается поискать в локальных файлах полезную для шпионов информацию. Если удается обнаружить выход в интернет, то червь лезет на один из командных серверов:
- mypremierfutbol.com
- todaysfutbol.com
Туда Stuxnet и пытался достучаться и "что-то" слить в зашифрованном виде. Благодаря Symantec ясно, что шифрование представляет собой побайтовую операцию XOR с 31-битным ключом, который был прошит в одной из .DLL-библиотек. Ответ с сервера также приходит в XOR-виде, правда, используется уже другой ключ из той же библиотеки. Троян отсылает на сервер общую информацию о зараженной машине (версия винды, имя компьютера, адреса сетевых интерфейсов, а также флаг наличия SCADA). В ответ от командного центра могут приходить вызовы RPC для работы с файлами, создания процессов, внедрения в процесс и загрузки новых библиотек и др.
Ну пока, в общем и все, что следует знать об нашем звери, а вот как эти знания применить для борьбы с Stuxnet рассмотрим в ближайшее время.