Команда Mandiant Threat Defense в ходе расследования выявила активную атаку с использованием десериализации ViewState в развертываниях платформы Sitecore. Уязвимость, получившая идентификатор CVE-2025-53690, связана с применением стандартного ключа машины (machine key), опубликованного в руководствах по развертыванию Sitecore до 2017 года. Злоумышленник использовал этот ключ для выполнения произвольного кода на уязвимых серверах.
Описание
Специалисты Mandiant оперативно взаимодействовали с разработчиками Sitecore для устранения проблемы. По данным вендора, уязвимость затрагивает клиентов, которые использовали публичные примеры конфигураций в таких продуктах, как Sitecore XP 9.0 и Active Directory 1.4 и более ранних версий. Sitecore подтвердила, что в обновленных развертываниях автоматически генерируются уникальные ключи, а пострадавшим клиентам направлены уведомления.
Атака началась с разведки, в ходе которой злоумышленник отправлял HTTP-запросы к различным конечным точкам веб-сервера, после чего сфокусировался на странице /sitecore/blocked.aspx. Эта страница, не требующая аутентификации, использует скрытое поле ViewState - стандартный механизм ASP.NET для сохранения состояния веб-страниц. При компрометации ключа машины, который обеспечивает целостность и конфиденциальность ViewState, злоумышленник может подписывать вредоносные полезные нагрузки и передавать их на сервер для десериализации.
В логах IIS было зафиксировано, что атакующий отправил POST-запрос к blocked.aspx, на который сервер ответил кодом 302. Одновременно в журнале событий Windows появилась запись с идентификатором 1316 о неудачной проверке ViewState, содержащая зашифрованный полезную нагрузку. Расшифровка показала, что она включала сборник .NET с именем Information.dll, который специалисты Mandiant обозначили как WEEPSTEEL. Этот инструмент предназначен для внутренней разведки: он собирает данные о системе, сетевых адаптерах, дисках и процессах, после чего шифрует их и передает в виде легитимного параметра __VIEWSTATE.
После успешного выполнения кода злоумышленник получил права NETWORK SERVICE и приступил к извлечению конфигурационных файлов, архивируя корневую директорию веб-приложения. Затем были проведены стандартные команды рекогносцировки: whoami, net user, ipconfig, netstat и другие. Для дальнейшего расширения доступа в публичных каталогах были размещены инструменты: архиватор 7za, туннелирующее средство EARTHWORM для организации обратного SOCKS-прокси, удаленный доступ DWAGENT и инструмент разведки Active Directory SHARPHOUND.
На этапе эскалации привилегий злоумышленник создал две учётные записи локальных администраторов - asp$ и sawadmin - и попытался использовать утилиту GoTokenTheft для кражи токенов процессов. Затем были экспортированы регистровые hive SYSTEM и SAM для извлечения хэшей паролей. Для сохранения доступа атакующий отключил expiration паролей для учетных записей администраторов и активно использовал RDP через туннель EARTHWORM.
На заключительном этапе проводилась разведка Active Directory: поиск Domain Controllers, анализ файлов Group Policy Object на наличие зашифрованных паролей, запуск SHARPHOUND для сбора данных о топологии сети и учётных записях. После завершения сбора данных созданные учётные записи были удалены, а атакующий перешел к использованию скомпрометированных учётных данных легитимных администраторов для перемещения по сети.
Несмотря на то, что специалистам Mandiant удалось быстро прервать атаку и предотвратить полный жизненный цикл воздействия, инцидент демонстрирует важность использования уникальных ключей машины в ASP.NET-приложениях и необходимость мониторинга подозрительной активности на критических веб-серверах. Компаниям рекомендуется проверить конфигурации развертываний Sitecore и убедиться в отсутствии образцовых ключей в файлах web.config.
Индикаторы компрометации
IPv4 Port Combinations
- 103.235.46.102:80
- 130.33.156.194:443
- 130.33.156.194:8080
MD5
- 117305c6c8222162d7246f842c4bb014
- 62483e732553c8ba051b792949f3c6d0
- 63d22ae0568b760b5e3aabb915313e44
- a39696e95a34a017be1435db7ff139d5
- be7e2c6a9a4654b51a16f8b10a2be175
- f410d88429b93786b224e489c960bf5c
SHA256
- 61f897ed69646e0509f6802fb2d7c5e88c3e3b93c4ca86942e24d203aa878863
- a566cceaf9a66332470a978a234a8a8e2bbdd4d6aa43c2c75c25a80b3b744307
- b3f83721f24f7ee5eb19f24747b7668ff96da7dfd9be947e6e24a688ecc0a52b
YARA Rules
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 | rule G_Recon_WEEPSTEEL_1 { meta: author = "Mandiant" strings: $v_w = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" wide $v_a = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" $v_b64_w = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" base64wide $v_b64_a = "<input type=\"hidden\" name=\"__VIEWSTATE\" id=\"__VIEWSTATE\" value=" base64 $s2 = "Services\\Tcpip\\Parameters" wide $s3 = "GetOperatingSystemInformation" $s4 = "GetSystemInformation" $s5 = "GetNetworkAdapterInformation" $s6 = "GetAllNetworkInterfaces" $s7 = "GetIPProperties" $s8 = "GetPhysicalAddress" $s9 = "GetDomainNameFromRegistry" $c1 = "Aes" fullword $c2 = "CreateEncryptor" fullword $c3 = "System.Security.Cryptography" fullword $c4 = "ToBase64String" fullword $guid = "6d5a95da-0ffe-4303-bb2c-39e182335a9f" condition: uint16(0) == 0x5a4d and ( (all of ($c*) and 7 of ($s*)) or ($guid and (any of ($v*))) ) } |
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 | rule G_Tunneler_EARTHWORM_1 { meta: author = "Mandiant" strings: $s1 = "free1.2" $s2 = ".//xxx ([-options] [values])*" $s3 = "You can create a lcx_listen tunnel like this :" $s4 = ".//ew -s lcx_listen --listenPort 1080 --refPort 8888" $s8 = "I_AM_NEW_RC_CMD_SOCK_CLIENT" $s9 = "CONFIRM_YOU_ARE_SOCK_TUNNEL" $s11 = "lcx_listen" fullword $s12 = "call back cmd_socks ok" $s13 = "lcx_tran" fullword $s14 = "lcx_slave" fullword $s15 = "rssocks" fullword $s16 = "ssocksd" fullword $s17 = "rcsocksd" fullword $marker1= "earthworm" nocase ascii wide $marker2 = "rootkiter" nocase ascii wide condition: ((uint16(0) == 0x5a4d and uint32(uint32(0x3C)) == 0x00004550) or uint32(0) == 0x464c457f or (uint32(0) == 0xBEBAFECA or uint32(0) == 0xFEEDFACE or uint32(0) == 0xFEEDFACF or uint32(0) == 0xCEFAEDFE)) and (4 of ($s*) or all of ($marker*)) } |