В конце декабря 2025 года на публичном веб-сервере под управлением Microsoft IIS, где работало коммерческое приложение на ASP.NET, был обнаружен вредоносный веб-шелл. Это скрытый скрипт, который позволяет злоумышленнику удаленно выполнять команды на сервере. Расследование показало, что веб-шелл является частью более сложного фреймворка под названием SharpViewStateKing. Канадский центр кибербезопасности (Canadian Centre for Cyber Security, Cyber Centre) опубликовал подробный отчет об этом инциденте, чтобы помочь другим организациям распознавать подобные угрозы и защищаться от них.
Описание
Атака началась с эксплуатации уязвимости в механизме ASP.NET, отвечающем за хранение состояния страниц. Злоумышленник смог подменить специальные скрытые параметры, передаваемые в HTTP-запросах, и выполнить собственный код на сервере. В отчете не раскрывается, как именно были получены эти параметры, однако отмечается, что аналогичная техника уже использовалась при атаках на SharePoint. Суть проблемы в том, что веб-приложение доверяет данным, которые приходят от клиента, и не проверяет их должным образом, что позволяет внедрить вредоносные инструкции.
Особенность SharpViewStateKing состоит в том, что он практически не оставляет следов на диске. Все плагины, написанные на языке C#, компилируются на компьютере атакующего непосредственно перед отправкой на сервер и загружаются прямо в память рабочего процесса IIS. По данным анализа, проведенного Cyber Centre, в первые 30 минут атаки на сервер было загружено 67 различных модулей, каждый со своим уникальным идентификатором. При этом ни один модуль не был сохранен на диск, а процесс компиляции на самом сервере не запускался, что делает обнаружение по сигнатурам практически бесполезным. Трафик маскировался под обычные HTTPS-запросы, поэтому сетевые фильтры также не видели ничего подозрительного.
Среди загруженных модулей было 42 копии плагина для загрузки файлов, но все они имели разные хэши из-за динамической компиляции. Это еще одна уловка, которая затрудняет создание универсальных правил блокировки. Вредоносные модули выполняли широкий круг задач. Один из них собирал подробную информацию о системе: версию Windows, список дисков и сетевых адаптеров, запущенные процессы. Другие модули позволяли удаленно загружать и удалять файлы, а также просматривать содержимое каталогов, получая даже иконки файлов для визуальной навигации. Отдельный модуль обеспечивал выполнение команд через командную строку Windows, что давало атакующему полный контроль над сервером.
С помощью этих возможностей злоумышленник запускал дополнительные инструменты, в том числе утилиту для повышения привилегий до уровня администратора системы, VPN-сервер для обхода сетевых ограничений, а также программы для извлечения сохраненных паролей и хэшей из памяти операционной системы. Кроме того, он создал новую учетную запись администратора на скомпрометированном сервере и изменил настройки антивируса, добавив исключения, чтобы защитное решение не мешало вредоносной активности. После этого, используя украденные пароли и VPN-туннель, атакующий подключался к серверу по протоколу удаленного рабочего стола и начинал перемещаться по внутренней сети, подключаясь к другим хостам с помощью штатных средств Windows и инструментов для удаленного управления. В итоге под контроль злоумышленника перешли несколько систем в сети организации.
Канадский центр кибербезопасности подчеркивает, что полностью восстановить зараженные системы можно только путем их переустановки с нуля. Просто удалить найденные файлы недостаточно, так как вредоносные модули живут в памяти и могут снова активироваться при следующем запросе. Также необходимо заменить ключи шифрования и валидации в приложениях ASP.NET, поскольку они могли быть скомпрометированы. Все пароли и учетные данные, хранившиеся на сервере, следует считать раскрытыми и сменить их, включая те, что использовались для доступа к другим системам.
Для выявления следов атаки в сети рекомендуется искать недавно созданные учетные записи, необычное программное обеспечение, например VPN-серверы, и изменения в настройках антивирусных продуктов. Специалистам также стоит обращать внимание на процессы, запускаемые из рабочих процессов IIS, поскольку это может указывать на попытки выполнения команд. Отчет содержит набор правил для поиска вредоносного кода, которые нацелены на исходный код C#, а не на скомпилированные файлы, что делает их более гибкими. Эти правила будут постепенно публиковаться для сообщества.
Инцидент показывает, что злоумышленники все чаще используют методы, позволяющие обходить традиционные средства защиты. Отказ от записи файлов на диск, шифрование трафика и использование легитимных механизмов веб-приложений делают такие атаки сложными для обнаружения. Организациям, использующим ASP.NET, необходимо уделять особое внимание своевременному обновлению компонентов и контролю целостности веб-приложений, а также регулярно анализировать журналы на предмет аномальных запросов. Опыт Cyber Centre подтверждает, что только сочетание нескольких уровней защиты и постоянный мониторинг могут помочь выявить подобные угрозы на ранней стадии.
Индикаторы компрометации
SHA256
- 1f258c70dfb064e6e1a55885b22660aa034469699be7e0ffeb5d174c8afa72c8
- 24c600584c3d36cfc02c8dbc528306fe8b69971045b299de8186954e0eed0f3e
- 2ff2e5b7da1a70886db220e0806aba24ad6648ba2dc40e101d5d718d1bcbd7b6
- 547b65933c4b6af8a240cca21175398775abe228eceea2c4138b262ed0a90967
- 637c7bd4d2b5c29cc2f6db802ed1cd4d4c9b49ef7e6751a38d22f9337361c2cf
- 6c249e9a4a55b18a0d17e9430666ccbf61b2fe6349e18e830c4f55ae47fc87d5
- 6df013608d0bec6d2743ad45108c43922dbfde28ddbec8b8d63f3e0b23401df2
- 8d7713e2687dd2e9311e3a3f5df85ecc20dbf4c4b0c91086e0c53bd2c112bde1
- 921f6502b79b542b2123ba05f86ccfe44746a5feeefc92d7cf5506f04c47b58a
- a6d7461a88cf7f12072b812499fee3ac6d08acff4db611623871765b60cf1014
- b6a009dc9984bf49e84e4885c87bcc0ce371f98ab2c28e71d5ebbcc0855adfce
- d2f2f0941fe3cb70ba4aeb0927d1a8abcf556d4150832962eb3cc6c13d6c7256
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | rule SharpViewStateKing { meta: id = "6gLZaiLFk2mV4fWlj0eIQ2" fingerprint = "00b4dfca3c9c883088259ec9b125411e0896be54cfe08201b03f36d51ae05c8b" version = "1.0" date = "2026-05-01" modified = "2026-05-01" status = "RELEASED" sharing = "TLP:CLEAR" source = "CCCS" author = "reveng@CCCS" description = "Detects SharpViewStateKing webshell." category = "MALWARE" malware = "SHARPVIEWSTATEKING" malware_type = "WEBSHELL" mitre_att = "T1505.003" hash = "547b65933c4b6af8a240cca21175398775abe228eceea2c4138b262ed0a90967" hash = "24c600584c3d36cfc02c8dbc528306fe8b69971045b299de8186954e0eed0f3e" hash = "8d7713e2687dd2e9311e3a3f5df85ecc20dbf4c4b0c91086e0c53bd2c112bde1" hash = "a6d7461a88cf7f12072b812499fee3ac6d08acff4db611623871765b60cf1014" hash = "921f6502b79b542b2123ba05f86ccfe44746a5feeefc92d7cf5506f04c47b58a" hash = "6c249e9a4a55b18a0d17e9430666ccbf61b2fe6349e18e830c4f55ae47fc87d5" hash = "1f258c70dfb064e6e1a55885b22660aa034469699be7e0ffeb5d174c8afa72c8" hash = "d2f2f0941fe3cb70ba4aeb0927d1a8abcf556d4150832962eb3cc6c13d6c7256" strings: $web_1 = "&__SCROLLPATH=" wide $web_2 = "/wEPDwUKLTcyODc4" wide $web_3 = "__VIEWSTATE={0}&__VIEWSTATEGENERATOR={1}" wide $web_4 = "DecodeViewState" $web_5 = "CraeteViewState" $web_6 = "WebForms_HiddenFieldPageStatePersister_ClientState" $web_7 = "ViewStateUserKey" wide nocase $web_8 = "__VIEWSTATEENCRYPTED" wide $web_9 = "__VIEWSTATE" wide $web_10 = "&__SCROLLPOSITION=" wide $web_11 = "<input type=\"hidden\" name=\"" wide $web_12 = "<input type=\"\"hidden\"\" name=\"\"__VIEWSTATE\"\" id=\"\"__VIEWSTATE\"\" value=\"\"/wEPDwUKLTcyODc4\"" $web_13 = "&__VIEWSTATEGENERATOR=" wide $web_14 = "FriendlyUrlsViewSwitcherRoute" $web_15 = "System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(" $str_plugin_1 = "antsword" $str_plugin_2 = "godzilla" $str_plugin_3 = "ghostwebshell" $str_payload_dotnet_serialized = ": \"/wEyo" $str_name_1 = "SharpViewStateKing" ascii wide $str_name_2 = "ViewStateKing" ascii wide $str_name_3 = "ViewStateLibrary" $str_enc = "EncryptOrDecryptData" $str_key = "3c6e0b8a9c15224a" $str_enc_func = "public static byte[] Enc(byte[] data)" $str_dec_func = "public static byte[] Dec(byte[] data)" $str_sys_info = "SELECT * FROM Win32_NetworkAdapterConfiguration WHERE IPEnabled = 'TRUE'" $str_dll = "a4hmgwwu.dll" $str_bypass = "[!] Bypass error: {0}" wide condition: 2 of ($web_*) and 2 of ($str_*) } |