Специалисты Rapid7 Labs обнаружили и проанализировали масштабную продолжающуюся кампанию, в ходе которой злоумышленники используют взломанные, зачастую авторитетные, сайты на платформе WordPress. На эти ресурсы внедряется вредоносный код, имитирующий проверку Cloudflare CAPTCHA, который в итоге заражает посетителей многоэтапным вредоносным ПО, похищающим учетные данные и криптокошельки с систем Windows. Эта активность, направленная как на частных лиц, так и на организации, подчеркивает важность постоянной бдительности в сети, даже при посещении доверенных ресурсов.
Описание
Кампания в ее текущем виде активна с декабря 2025 года, хотя часть инфраструктуры (например, доменные имена) использовалась еще с июля-августа того же года. На момент публикации анализа выявлено более 250 отдельных зараженных сайтов как минимум в 12 странах, включая США, Великобританию, Германию, Австралию и Израиль. Среди скомпрометированных ресурсов - региональные новостные издания, сайты местного бизнеса и, в одном случае, даже официальная страница кандидата в Сенат США. Высокий уровень доверия к таким сайтам в сочетании с убедительной имитацией проверки Cloudflare делает эту угрозу особенно опасной.
Механика атаки: от легитимного сайта к похитителю данных
Атака начинается с посещения пользователем взломанного сайта на WordPress. Незаметно для посетителя в код страницы внедряется обфусцированный JavaScript, который проверяет, не является ли пользователь администратором или поисковым ботом, и лишь затем загружает следующий этап. Основная нагрузка - интерактивное окно, внешне неотличимое от настоящей проверки Cloudflare CAPTCHA, с инструкцией нажать кнопку и скопировать команду, якобы необходимую для подтверждения. На самом деле эта команда представляет собой PowerShell-степпер, который запускает цепочку загрузки вредоносного ПО.
Как сообщают эксперты Rapid7 Labs, ключевой особенностью данной кампании является использование двухэтапного загрузчика в памяти, основанного на открытом инструменте Donut. Первый этап загружает и исполняет в памяти небольшой двоичный файл, который, в свою очередь, скачивает и внедряет второй этап в процесс "svchost.exe". Такой подход, практически не оставляющий следов на диске, затрудняет обнаружение традиционными антивирусными средствами. Финальной полезной нагрузкой в этой цепочке становятся программы-похитители данных (stealer).
Арсенал злоумышленников: эволюция известных угроз и новые разработки
В рамках кампании наблюдалась доставка нескольких семейств вредоносного ПО. Во-первых, это обновленная версия известного похитителя Vidar, получившая усовершенствованное шифрование конфигурации для управления командными серверами (C2) и новую технику обфускации управляющего потока. Во-вторых, ранее не документированный .NET-похититель, условно названный Impure Stealer, использующий собственный алгоритм шифрования строк и кастомный сетевой протокол. В-третьих, совершенно новый похититель на C++, названный VodkaStealer, который, судя по переиспользованию кода и инфраструктуры, создан теми же разработчиками, что и двухэтапный загрузчик.
Несмотря на доступ к продвинутым коммерческим вредоносным программам, появление собственной разработки может указывать на экономические мотивы или эксперименты злоумышленников. Однако VodkaStealer демонстрирует меньшую техническую изощренность: он не использует обфускацию, оставляет временные файлы на диске и имеет ошибки в логике внедрения вспомогательного инструмента для обхода шифрования данных браузера Chrome.
Рекомендации по защите
Главный вывод для пользователей - сохранять принцип «нулевого доверия» даже к знакомым сайтам. Не следует слепо копировать и выполнять команды, предлагаемые веб-страницами. Для администраторов сайтов на WordPress критически важно выяснить и устранить первопричину компрометации. Наиболее вероятными векторами являются уязвимости в плагинах или темах, использование слабых или скомпрометированных учетных данных администратора или атаки методом перебора на публично доступную панель управления "wp-admin". В качестве мер защиты рекомендуется регулярно обновлять все компоненты CMS, использовать сложные уникальные пароли в связке с двухфакторной аутентификацией и проводить аудит безопасности.
Для корпоративных защитников важны мониторинг необычной активности PowerShell, особенно с флагами загрузки удаленного контента, и анализ сетевого трафика на предмет соединений с известными вредоносными адресами. Эксперты Rapid7 Labs опубликовали обширный список индикаторов компрометации (IoC) и правила обнаружения YARA, которые позволяют выявлять различные компоненты этой цепочки атаки. Социальная инженерия остается одним из самых эффективных методов получения первоначального доступа, и данная кампания наглядно показывает, как автоматизированные атаки на массовые платформы вроде WordPress могут быть использованы для кражи конфиденциальных данных у широкого круга жертв.
Индикаторы компрометации
IPv4
- 172.94.9.187
- 178.16.53.137
- 94.154.35.115
- 94.154.35.152
IPv4 Port Combinations
- 158.94.210.166:5555
- 158.94.210.166:9993
- 178.16.55.40:5555
- 198.251.89.239:27767
Domains
- alianzeg.shop
- bek.cloudvaly.com
- beta-charts.org
- captiort.shop
- captiorweb.com
- captioto.com
- captioz.shop
- captolls.com
- captoolsz.com
- capztoolz.com
- cptoptious.com
- csp.cloudvaly.com
- getalia.org
- getalib.org
- getfix.win
- gieable.shop
- goarnsds.shop
- gorscts.shop
- goveanrs.org
- govearali.org
- greecpt.shop
- gty.cloudvaly.com
- kec.cloudvaly.com
- ligovera.shop
- lts.cloudvaly.com
- namsioc.shop
- namzcp.org
- newtdsone.shop
- pov.cloudvaly.com
- rrg.cdcmn.edu.bd
- spf.cloudvaly.com
- surveygifts.org
- tor.cloudvaly.com
- trx.cdcmn.edu.bd
- ztdaliweb.shop
URLs
- http://158.94.209.33/
- http://172.94.9.187/9cca20c6df659f72/chromelevator.bin
- http://172.94.9.187/9cca20c6df659f72/cptch2.bin
- http://172.94.9.187/9cca20c6df659f72/cptchbuild.bin
- http://172.94.9.187/9cca20c6df659f72/mycptpl.bin
- http://178.16.53.70/
- http://45.61.148.118/
- http://91.92.240.219/
- http://94.154.35.115/user_profiles_photo/chromelevator.bin
- http://94.154.35.115/user_profiles_photo/cptch.bin
- http://94.154.35.115/user_profiles_photo/cptch2.bin
- http://94.154.35.115/user_profiles_photo/cptchbuild.bin
- https://cptoptious.com/captcha.html
- https://gorscts.shop/captcha.html
- https://greecpt.shop/captcha.html
- https://steamcommunity.com/profiles/76561198745091601
- https://telegram.me/n1ds03
SHA256
- 09d19e2b98e8eb530855fee8e19e9d5c68c70f558e024dcf82253209668a40ab
- 14fc0065cc0b3ca215ffdf14824e41fb0a7840e8e771dbfdc3bbb06a9e042e9e
- 16508e345ac1734a6bb661e87c96553fd7fd8a184296bd2aa3203b65efc1bae9
- 1d9a023dacaf443ea6d4cf1d8f44027cb034883ecb732b5ac434b26b4b3f4320
- 20c6c29f7daca909b1d89a39a2e4e0f6f93ad9c495a4153da305a9cac7157001
- 334930b8096992d4c02aca57497818a0f3477ba773dd2c7c97efcc0b70c16b6d
- 4a59ea08df0b002d5f9d28ebd778cdd854777ac9bf918469576e00e121586852
- 4f6afc69c3151bbc71f86417dbf8cca0eed89b47c66d3e0d8712bfd4eba87a00
- 50fc22b653a6436825658260c92c3750169622522aa0bf8147fb36a384e85245
- 522faa41e7dc20bcacb1651ed1ea85a58c34b4a24411a7f75a00f4e795ac0d35
- 57439ae4c63579d9995ed4a1e54ecb2b510c1afa5864f1188acebe6660da62c7
- 69bc8caf4b5da7ae33c5568b1c90212627728540e1a5b79412ae68d0abfda2f4
- 867d7859c1a8b0d8b83ec2b5b712b9430c53ef7cbca80ebba03da7ca31b3793d
- 8c83b46a7ca674bf717765b734a919c78556c193d1942de94be409c4ed663d1a
- b73d9535dea3d153abedae031b0f4534d68bf881b72554eeb5a48f4752ee4f7d
- bdd8e61402a0683a5e15c06628a6adf2f222e9b14f06f2952d633f68b5e801f6
- c8dbd5335dc0828556e6abc2a804121bf65240719a8a3388a5af6b65065a2d5b
- ca9e370c4676fe94a275647831769fe83fd151bfe8a2c8bbe9660fe10d9b4f0c
- d8f3ee9dd462c7745db488bc4a8e77ea11b79048ce952b66e55665c530de2ddc
- de5d188dae7206097f4615a07fb0a1c53903936f8d71abe69b494c24af79b27d
- f302654cd962076c6ca566e96ad95c9f4663ae422ed3b24a1a96d6d33a39f3da
- f9eb41e9989ac7ce9c1ece15a7e7c4a0adef1434444598f28c6ba5d20daf1352
YARA
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | rule clickfix_compromised_website { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies WordPress websites infected by DoubleDonut ClickFix campaign." strings: $ = "try { eval(jsCode); } catch(e) { console.error('Cache optimize error', e); }" $ = "window.__performance_optimizer_v6=true;" $ = "var endpointUrl=atob(perfEndpoints[endpointIndex])+Math.random();" $ = "if (window.__AJJS_LOADED__) return;" $ = "if (/iframeShown=true/.test(cookies)) return;" $ = "if (/wordpress_logged_in_|wp-settings-|wp-saving-|wp-postpass_/.test(cookies)) return;" $ = "/wp-admin/admin-ajax.php?action=ajjs_run" condition: any of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | rule clickfix_injector_javascript { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies ClickFix injection script from the DoubleDonut campaign." reference = "https://urlscan.io/responses/8c83b46a7ca674bf717765b734a919c78556c193d1942de94be409c4ed663d1a/" strings: $ = "TARGET_URL=_0x" $ = "let finalUrl;" $ = "try{const u=new URL(TARGET_URL)" $ = "finalUrl=TARGET_URL+sep+encodeURIComponent(" $ = "let showIframe=" condition: 3 of them } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | rule clickfix_fake_captcha_html { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies fake CAPTCHA lures from the DoubleDonut ClickFix campaign." example_url = "hxxps[://]greecpt[.]shop/captcha.html" strings: $head1 = "<title>Security Check</title>" $head2 = "<link rel=\"stylesheet\" href=\"captcha.css\">" $body1 = "<textarea id=\"clipboard-text\" readonly></textarea>" $body2 = "<span id=\"verifying-text\">\xE3\x85\xA4</span>" condition: any of ($head*) and any of ($body*) } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | rule donut_loader_shellcode { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies Donut Loader shellcode (observed in ClickFix campaigns to deliver infostealers)." strings: $entry_point = { 59 // pop ecx 31 C0 // xor eax, eax 48 // dec eax 0F // js loc_A0BB } condition: uint8(0) == 0xE8 and // near, relative call int32(1) >= 0 and // positive displacement uint32(5) > 0 and uint32(5) <= 0xFFFFFF and // payload size $entry_point at (uint32(1) + 5) // signature found at target of call at offset 0 } |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import "pe" rule double_donut_loader_strings { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies DoubleDonut loader (a.k.a. VodkaStealer loader) used to deliver infostealers in ClickFix campaigns." hash = "6437db6158ee8fa2d316ba3625ca8df6afdb9304bb3c1e6ee4fb0bcdabb7f212" strings: $ = "SeDebugPrivilege\x00" $ = "Mozilla/5.0\x00" wide $ = "user_profiles_photo" wide $ = "svchost.exe\x00" wide condition: for any section in pe.sections: ( (section.name == ".rdata" or section.name == ".rodata") and (all of them in (section.raw_data_offset .. section.raw_data_offset + 1024)) ) } |
| 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 | rule vidar_stealer_v2_strings { meta: author = "Milan Spinka @ Rapid7" description = "Identifies obfuscated Vidar v2 payloads based on static sequences." hash = "de5d188dae7206097f4615a07fb0a1c53903936f8d71abe69b494c24af79b27d" strings: $x01 = "C:\\ProgramData\\\x00" xor $x02 = "\\logins.json\x00" xor $x03 = "Browser List\x00" xor $x04 = "Chromium Plugins\x00" xor $x05 = "Firefox Plugins\x00" xor $x06 = "Wallet Rules\x00" xor $x07 = "File Grabber Rules\x00" xor $x08 = "Loader Tasks\x00" xor $x09 = "\\IndexedDB\\chrome-extension_\x00" xor $x10 = "\\Network\\Cookies\x00" xor $x11 = "%DRIVE_FIXED%\x00" xor $x12 = "%DRIVE_REMOVABLE%\x00" xor $x13 = "Files\\\x00" xor $x14 = "chromium_plugins\\Local Extension Settings\\\x00" xor $x15 = "\\IndexedDB\\chrome-extension_\x00" xor $x16 = "browser_files\x00" xor $x17 = "APPDATA\x00" xor $x18 = "%LOCALAPPDATA%\x00" xor $x19 = "SOFTWARE\\Microsoft\\Cryptography\x00" xor $warning_malware = "WARNING: MALWARE!\n\nThe binary should be protected with a packer/crypter\nbefore distribution to avoid detection.\n\n\x00" xor $base91 = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!#$&()*+,-./:;<=>?@[]^_`{|}~ \x00" condition: uint16(0) == 0x5a4d and ( $warning_malware or ($base91 and 10 of ($x*)) ) } |
| 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 | rule impure_stealer_method_names { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies Impure Stealer payloads by cleartext method names." hash = "b73d9535dea3d153abedae031b0f4534d68bf881b72554eeb5a48f4752ee4f7d" strings: $ = "get_Discords" $ = "set_Discords" $ = "get_IsChromium" $ = "set_IsChromium" $ = "get_VideoControllers" $ = "set_VideoControllers" $ = "get_PotentialBrowsers" $ = "set_PotentialBrowsers" $ = "get_Wallets" $ = "set_Wallets" $ = "get_Accounts" $ = "set_Accounts" $ = "get_LoginDataForAccount" $ = "set_LoginDataForAccount" $ = "get_AppBoundKey" $ = "set_AppBoundKey" condition: uint16(0) == 0x5a4d and all 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 24 25 26 27 | rule vodka_stealer_strings { meta: author = "Milan Spinka @ Rapid7 Labs" description = "Identifies payloads of VodkaStealer by cleartext strings." hash = "d8f3ee9dd462c7745db488bc4a8e77ea11b79048ce952b66e55665c530de2ddc" strings: $m01 = "/user_profiles_photo/chromelevator.bin" $m02 = "%s\\chromelevator_output" $m03 = "Ip: %s\r\nCountry: %s\r\n\r\nDate: %s\r\nMachineID: %s\r\nGUID: %s\r\nHWID: %s\r\n\r\nPath: %s\r\n\r\nWindows: %s\r\nInstall Date: %s\r\nAV: Windows Defender\r\nComputer Name: %s\r\nUser Name: %s\r\nDisplay Resolution: %s\r\nKeyboard Languages: %s\r\nLocal Time: %s\r\nTimeZone: %d\r\n\r\n[Hardware]\r\nProcessor: %s\r\nCores: %lu\r\nThreads: %lu\r\nRAM: %s\r\nVideoCard: %s\r\n" $m04 = "sysinfo_aes256_channel_key_2024!!" $m05 = "Global\\sysinfo_single_instance" $s01 = "logins.json" $s02 = "systeminfo.txt" $s03 = "First run: %02d/%02d/%04d %02d:%02d:%02d" $s04 = "chromelevator_output" $s05 = "%s\\InstalledSoftware.txt" condition: uint16(0) == 0x4d5a and ( any of ($m*) or all of ($s*) ) } |