В сентябре 2025 года компания Volexity, занимающаяся расследованием инцидентов, получила вызов от заказчика, в сети которого были замечены подозрительные соединения. Источником аномального трафика оказалась виртуальная машина на базе Linux, работающая в качестве системы хранения и синхронизации данных Egnyte Storage Sync. Это устройство предназначено для синхронизации локальных файлов с облаком, однако вместо серверов Egnyte оно общалось с доменом, контролируемым злоумышленниками и скрытым за серверами Cloudflare. Более того, система обращалась к публичному DNS-серверу Google 8.8.8.8 по протоколу TLS, используя DNS поверх HTTPS - это означало, что стандартный DNS-запрос к вредоносному домену не фиксировался в журналах.
Описание
Последующий анализ снимков памяти и диска позволил экспертам Volexity идентифицировать злоумышленника: им оказалась китайская группировка, отслеживаемая под кодовым именем VerdantBamboo (также известная как WARP PANDA и UNC5221). Основным инструментом вторжения стала вредоносная программа BRICKSTORM - продвинутый бэкдор, написанный на Golang и адаптированный для различных платформ. Позднее выяснилось, что первоначальное проникновение произошло как минимум за 18 месяцев до обнаружения, и всё это время группа незаметно закреплялась в инфраструктуре.
Как удалось установить, VerdantBamboo получила доступ к виртуальной машине через протокол SSH, используя учётную запись egnyteservice. Этот аккаунт является стандартным для устройств Egnyte, и, хотя пароль от него был изменён провайдером управляемых услуг (MSP), хакеры всё равно смогли его раздобыть. Эксперты Volexity пришли к выводу, что источником компрометации стал именно MSP - управляющий провайдер, который обслуживал инфраструктуру заказчика. В ходе расследования специалисты обнаружили, что и сам провайдер был взломан: на его межсетевом экране pfSense, работающем под управлением FreeBSD, был найден всё тот же BRICKSTORM, адаптированный под BSD. Признаки компрометации на межсетевом экране также уходили в прошлое на 18 месяцев.
Схема атаки оказалась многоступенчатой. Получив доступ к виртуальной машине через MSP, злоумышленники повысили привилегии благодаря ошибке в конфигурации sudo: учётная запись egnyteservice могла выполнять команду tee с правами root, что позволяло произвольно записывать файлы в любую точку системы. Через эту уязвимость хакеры установили бэкдор BRICKSTORM в каталог /usr/sbin и настроили его запуск через cron. Кроме того, на всякий случай они добавили запасной канал связи в виде простого обратного шелла на Python, названного AGENTPSD. Этот инструмент должен был срабатывать, если бы BRICKSTORM был обнаружен и удалён, однако, судя по журналам, он ни разу не использовался - основной бэкдор оставался работоспособным на протяжении всего периода.
Однако самое интересное произошло после того, как Volexity изолировала скомпрометированную виртуальную машину и провайдер отключил web-портал SSL VPN. Спустя несколько дней эксперты заметили, что сетевое хранилище Synology NAS в той же сети снова начало отправлять пакеты на уже известный C2-домен. Оказалось, что VerdantBamboo вернулась: она использовала украденные административные учётные данные для входа в интерфейс межсетевого экрана заказчика, который после отключения VPN оказался доступен из интернета через публичный IP-адрес. Многофакторная аутентификация (MFA) на этом устройстве не была настроена, поэтому хакеры легко подключились к нему, включили собственный web-сервер SSL VPN и через него снова проникли во внутреннюю сеть. На Synology они развернули ещё одну новую вредоносную программу - PLENET, написанную на .NET Core и скомпилированную с помощью технологии Native AOT. Это делало её анализ особенно сложным, поскольку инструменты для обратной разработки таких бинарных файлов пока слабо развиты.
Важно отметить, что группировка целенаправленно атаковала устройства, на которых не было установлено средств обнаружения и реагирования на конечных точках (EDR). Бэкдоры были внедрены в проприетарные системы: межсетевые экраны, NAS-накопители, виртуальные машины синхронизации. Администраторы таких систем обычно не имеют полного корневого доступа, а мониторинг их безопасности сильно затруднён. VerdantBamboo использовала эти устройства как прокси-серверы для доступа к Microsoft 365 заказчика, смешивая свой трафик с легитимным и обходя политики условного доступа, которые блокировали бы прямое подключение.
В ходе расследования Volexity разработала метод поиска C2-серверов BRICKSTORM на основе характерных признаков: минималистичный HTTP-ответ, OpenBSD-клиент SSH, сертификат Cloudflare и малое количество открытых сервисов. Однако между 18 и 23 сентября все обнаруженные серверы прекратили работу на порту 443. А 24 сентября компания Google Cloud опубликовала собственный отчёт об активности BRICKSTORM. Специалисты Volexity с низкой уверенностью предполагают, что хакеры могли узнать о расследовании и оперативно изменили свою инфраструктуру, чтобы избежать дальнейшего обнаружения.
Этот инцидент наглядно демонстрирует, насколько опасным может быть компрометация цепочки поставщиков услуг. Хакеры не просто взломали одного клиента - они проникли в провайдера и через него получили доступ к его клиентам. Отсутствие многофакторной аутентификации на критических устройствах и незакрытые уязвимости в конфигурации sudo позволили группе действовать незаметно почти полтора года. Более того, даже после устранения первоначальной точки входа злоумышленники нашли новый путь благодаря небрежностям в настройке межсетевого экрана.
Для защиты от подобных угроз организациям следует обратить пристальное внимание на все устройства, работающие на периметре сети: межсетевые экраны, NAS, системы синхронизации. Даже если на них нельзя установить классический EDR, необходимо внедрять усиленный мониторинг сетевого трафика, включать многофакторную аутентификацию на всех административных интерфейсах и строго контролировать доступ сторонних провайдеров. Как показал случай VerdantBamboo, атакующие готовы ждать годами, выбирая самые уязвимые цели.
Индикаторы компрометации
IPv4
- 104.253.1.46
- 107.175.235.196
- 144.202.50.151
- 149.248.11.71
- 159.223.77.60
- 170.187.181.243
- 172.235.37.124
- 172.245.5.22
- 173.254.201.16
- 192.3.30.159
- 45.63.94.7
- 5.223.42.12
- 5.223.49.77
- 5.223.58.4
- 5.223.68.181
- 66.59.196.250
Domains
- 172-235-56-113.plesk.page
- barannclinic.com
- bititer.org
- calixcloudinfo.com
- devs.calixcloudinfo.com
- faoith.com
- fiveworkscorp.com
- kitfloor.org
- msazure.azdatastore.workers.dev
- natsupport.net
- performanceviewtools.com
- service.systemsvcs.com
- systemsvcs.com
- winfoacacorp.com
- www.natsupport.net
MD5
- 58d4eccc982c9e9b1b98aa62c514e53a
- 84ad78b2bab946c3677fdc28ebd8a774
- 95dc2289427ed29b8b996d0e3d1b78cb
SHA1
- 681075027553546c119ec447eb8df84633dcffce
- f4d77958a12a0778283d3e679b24b18f82e332c4
- f8d93c1769e877aae7e7d5c289a467b5ae371c7a
SHA256
- 2388ed7aee0b6b392778e8f9e98871c06499f476c9e7eae6ca0916f827fe65df
- 24a11a26a2586f4fba7bfe89df2e21a0809ad85069e442da98c37c4add369a0c
- 320a0b5d4900697e125cebb5ff03dee7368f8f087db1c1570b0b62f5a986d759
- 40d264cf9c73923932c3dfd52d20f46ff602be3fea8dc6ecc71aca46e6067bf5
- 42692bd13333623e9085d0c1326574a3391efcbf18158bb04972103c9ee4a3b8
- 45313a6745803a7f57ff35f5397fdf117eaec008a76417e6e2ac8a6280f7d830
- 90b760ed1d0dcb3ef0f2b6d6195c9d852bcb65eca293578982a8c4b64f51b035
- 92fb4ad6dee9362d0596fda7bbcfe1ba353f812ea801d1870e37bfc6376e624a
- aa688682d44f0c6b0ed7f30b981a609100107f2d414a3a6e5808671b112d1878
- b42159d68ba58d7857c091b5acc59e30e50a854b15f7ce04b61ff6c11cdf0156
- dfb37247d12351ef9708cb6631ce2d7017897503657c6b882a711c0da8a9a591
- e981fc4eaaa6417e6034e21438e55c0360773674a6fc0b63c1b95026449e5254
- eb141a43958802727a6c813452450c10b92704bea4474ee5fd87c0a1be326e2e
- ee41e06ed96182ce80cd4544a6abd5d7719c4a5c0e5ddb266a83842d39b99b0a
- f06457d2be0840faac9f0a91e63e33f932bf82922b25ac8c046fab38bb1e0b36
- f70abe93112637d3ec2f6c5e058ccac0307ebf63e496f38588cbfc17a8f8a264
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 | rule apt_malware_any_dotnet_aot_plenet: VerdantBamboo PLENET { meta: author = "threatintel@volexity.com" date = "2025-09-22" description = "Detect PLENET, a multiplatform malware compile with native AOT." hash1 = "eb141a43958802727a6c813452450c10b92704bea4474ee5fd87c0a1be326e2e" os = "all" os_arch = "all" scan_context = "file,memory" severity = "critical" report1 = "TIB-20251104" last_modified = "2025-10-30T17:13:27Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 12367 version = 4 strings: $str1 = "[!] Bad dat" wide $str2 = "[!] Connection error. Kill Pty" wide $str3 = "[!] Error : Plexor is nul" wide $str4 = "[!] Unkown message type" wide $str5 = "[*] Disposing.." wide $str6 = "Lack port ':" wide $str7 = "IPv6 port error ':" wide $str8 = "this.existingPipeGiven." wide $str9 = "port must within 0~6553" wide condition: 4 of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | rule apt_malware_elf_VerdantBamboo_paths: VerdantBamboo { meta: author = "threatintel@volexity.com" date = "2025-09-22" description = "Detection for VerdantBamboo related malware based on paths from local machines observed in binaries." hash1 = "eb141a43958802727a6c813452450c10b92704bea4474ee5fd87c0a1be326e2e" os = "linux" os_arch = "all" scan_context = "file,memory" severity = "critical" report1 = "TIB-20251104" last_modified = "2026-01-27T15:36:32Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 12361 version = 3 strings: $s1 = "bin/Release/net8.0/linux-x64/native/server" ascii condition: $s1 } |
| 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 | rule apt_malware_golang_brickstorm_b: VerdantBamboo BRICKSTORM { meta: author = "threatintel@volexity.com" date = "2025-09-05" description = "Detection for the BRICKSTORM malware family." hash1 = "aa688682d44f0c6b0ed7f30b981a609100107f2d414a3a6e5808671b112d1878" os = "all" os_arch = "all" scan_context = "file,memory" severity = "critical" report1 = "TIB-20251104" last_modified = "2025-10-30T17:13:51Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 12299 version = 5 strings: $method1 = "UnPackHeaderData" $method2 = "handleRelay" $method3 = "NewWebSocketClient" $method4 = "createDnsMessage" $method5 = "GetFileOwnerInfo" $err1 = "dns rcode: %v" $err2 = "readFull error" $err3 = "tagAuth error" $err4 = "error: Auth: %s" $ws1 = "<a style='text-decoration: none;' href='javascript:history.go(-1);'><h5>Back</h5></a>" $ws2 = "Mon, 02 Jan 2006 15:04:05 GMT" $doh = "https://1.0.0.1/dns-queryhttps://1.1.1.1/dns-queryhttps://8.8.4.4/dns-queryhttps://8.8.8.8/dns-query" condition: 4 of ($method*) or 3 of ($err*) or all of ($ws*) or ( $doh and any of ($method*, $err*, $ws*, $doh) ) } |
| 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 | rule apt_malware_golang_brickstorm: VerdantBamboo BRICKSTORM { meta: author = "threatintel@volexity.com" date = "2025-09-04" description = "Detects the BRICKSTORM backdoor using common strings." hash1 = "40d264cf9c73923932c3dfd52d20f46ff602be3fea8dc6ecc71aca46e6067bf5" hash2 = "e981fc4eaaa6417e6034e21438e55c0360773674a6fc0b63c1b95026449e5254" os = "all" os_arch = "all" reference = "https://blog.nviso.eu/wp-content/uploads/2025/04/NVISO-BRICKSTORM-Report.pdf" scan_context = "file,memory" severity = "critical" report1 = "TIB-20251104" last_modified = "2025-10-30T17:14:18Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 12298 version = 7 strings: $dns1 = "https://1.1.1.1/dns-query" ascii $dns2 = "https://8.8.4.4/dns-query" ascii $dns3 = "https://8.8.8.8/dns-query" ascii $pack1 = "wsshell/core" ascii $pack2 = "wssoft/core" ascii $s1 = "github.com/hashicorp/yamux" ascii $s2 = "winbindd:" ascii $s3 = "WEE1=true" ascii $s4 = "WEE2=true" ascii condition: all of ($dns*) and all of ($s*) and any of ($pack*) } |
| 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 | rule apt_malware_py_agentpsd: VerdantBamboo AGENTPSD { meta: author = "threatintel@volexity.com" date = "2025-09-05" description = "Detection for AgentPSD, a python-based malware typically delivered within PyInstaller-built binaries." hash1 = "ee41e06ed96182ce80cd4544a6abd5d7719c4a5c0e5ddb266a83842d39b99b0a" os = "all" os_arch = "all" scan_context = "memory" severity = "critical" report1 = "TIB-20251104" last_modified = "2025-10-30T17:14:31Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 12297 version = 5 strings: $s1 = "g_strPhpUrl" ascii $s2 = "g_nSleepMinits" ascii $s3 = "g_nDuringTime" ascii $func1 = "startwork" ascii $func2 = "ifrunning" ascii $func3 = "getsysinfo" ascii $func4 = "getcmdfromweb" ascii $func5 = "ParseCmdFromResponse" ascii $func6 = "PostDataToServer" ascii $func7 = "DealWithBuildinCommand" ascii $func8 = "PostBuildinResultToWeb" ascii condition: 2 of ($s*) or 4 of ($func*) } |
| 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 apt_malware_any_brickstorm_rust: VerdantBamboo BRICKSTORM { meta: author = "threatintel@volexity.com" date = "2026-02-24" description = "Detects Rust variants of the BRICKSTORM malware." hash1 = "45313a6745803a7f57ff35f5397fdf117eaec008a76417e6e2ac8a6280f7d830" os = "linux" os_arch = "all" scan_context = "file" severity = "high" report1 = "MAR-20260224" last_modified = "2026-02-24T15:29:52Z" license = "See license at https://github.com/volexity/threat-intel/blob/main/LICENSE.txt" rule_id = 12816 version = 2 strings: $package1 = "Yamux" $package2 = "/lib.rs" $str1 = "/opt/vmware/bin/vmisupport" $str2 = "Socks5CmdNotSupported" $str3 = "/dev/ptmx" $str4 = "8tr9y8e4df1h6515fthderth" condition: all of ($package*) and 3 of ($str*) } |