В мире информационной безопасности специалисты постоянно сталкиваются с эволюцией угроз, где злоумышленники стремятся максимально усложнить обнаружение и анализ своих инструментов. Ярким примером такой тенденции стала недавно документированная многостадийная кампания, использующая комплексный набор техник для доставки и скрытного функционирования бэкдора под названием HellsUchecker. Эта атака демонстрирует, как современные вредоносные программы сочетают социальную инженерию, злоупотребление доверенными системными утилитами, технологии сокрытия на базе блокчейна и продвинутые методы резидентного выполнения, чтобы оставаться незамеченными для традиционных средств защиты.
Описание
Кампания начинается с изощрённой фишинговой страницы, которая в точности имитирует систему проверки CAPTCHA от Cloudflare Turnstile. Пользователю предлагается пройти проверку, нажав на флажок, однако вместо этого страница выполняет скрытую подмену содержимого буфера обмена. Жертве предлагается вставить команду в окно "Выполнить" (Win+R) Windows, что является классическим приёмом социальной инженерии, рассчитанным на доверчивость. Интересно, что сценарий также определяет операционную систему macOS и готовит для неё другую полезную нагрузку, что указывает на широкий охват целей. Ключевой особенностью начального этапа является использование легитимного системного компонента "finger.exe" - утилиты, предназначенной для запроса информации о пользователях по давно устаревшему протоколу на порту 79. Эта техника, известная как злоупотребление доверенными исполняемыми файлами ОС (LOLBin), позволяет избежать детектирования, так как запускается подписанный Microsoft бинарный файл.
Исследователи обнаружили, что сервер на другом конце этого соединения возвращает не информацию о пользователе, а серию из 12 команд для командной строки Windows. Эти команды выполняют сложную последовательность действий: временно завершают процесс проводника "explorer.exe" для скрытия рабочего стола, загружают и распаковывают легальный дистрибутив Python, маскируя его под PDF-файл, и в конечном итоге запускают скрипт-загрузчик. Этот многоступенчатый процесс, включающий в себя исполнение MSI-пакета и запуск полиморфного BAT/MSBuild файла, ведёт к загрузке основного модуля .NET.
Сердцем механизма управления этой кампанией является технология EtherHiding, при которой конфигурация центров управления (C2) хранится не на классическом веб-сервере, а в смарт-контракте в блокчейне BNB Smart Chain (BSC) и Avalanche. Загрузчик делает вызов к контракту, используя стандартный селектор функции "name()", и получает зашифрованные данные. Для их расшифровки используется комбинация хеш-функции Keccak256 (вариант Ethereum) и алгоритма ChaCha20 с ключом, жёстко прописанным в коде. Главное операционное преимущество такого подхода заключается в том, что для обновления адресов C2 на всех заражённых машинах одновременно злоумышленнику достаточно совершить всего одну транзакцию в блокчейне. Анализ истории контракта показывает девять обновлений за три месяца, причём последние два совпали по времени с регистрацией новых доменов, используемых в инфраструктуре.
Перед непосредственной загрузкой финального бэкдора выполняется отдельный модуль, проводящий 26 различных проверок на анализное окружение. Эти проверки включают оценку объёма оперативной памяти и диска, разрешения экрана, количества установленных программ, даты инсталляции ОС и поиск процессов, связанных с отладчиками, средствами реверс-инжиниринга и санбоксами. Особый интерес вызывает проверка на наличие директории "C:\Nintendo": если она существует, все анти-анализные проверки пропускаются. Это явно указывает на механизм для разработчиков, позволяющий обходить защитные механизмы на тестовых машинах. Параллельно для маскировки сетевой активности модуль генерирует значительный объём фонового шумового трафика, имитируя запросы к реальным блокчейн-RPC и легитимным публичным API, чтобы скрыть среди них настоящее общение с C2.
Финальные стадии атаки посвящены обеспечению устойчивости и скрытной загрузке. Модуль обеспечивает закрепление в системе, копируя полиморфный BAT-файл в несколько директорий, имитирующих кэш Windows, и создавая ярлык в папке автозагрузки. Для инъекции шелл-кода используется техника Hell’s Gate, которая позволяет осуществлять прямые системные вызовы (syscalls), минуя стандартные API Windows. Это помогает избежать детектирования по вызовам, связанным с выделением исполняемой памяти. Сам шелл-код расшифровывает и распаковывает с помощью алгоритма aPLib финальный исполняемый PE-файл, который никогда не записывается на диск, оставаясь полностью в оперативной памяти.
Конечный бэкдор HellsUchecker представляет собой компактный 28 КБ нативный x64 модуль, скомпилированный в MSVC 2022. Для сетевого взаимодействия он использует библиотеку WinHTTP, отправляя HTTPS POST запросы по определённому шаблону. Примечательно, что для выделения памяти и задержек он задействует функции из "ntdll.dll" (например, "RtlAllocateHeap" и "NtDelayExecution"), а не их более распространённые аналоги из "kernel32.dll", что может быть попыткой обойти мониторинг, ориентированный на стандартные API. Инфраструктура кампании географически распределена: сервер доставки расположен во Франкфурте, основной C2 - в Амстердаме, а два нерабочих эндпоинта - в Москве и Санкт-Петербурге. При этом анти-анализный модуль геофенсит 11 стран СНГ, включая Россию, что создаёт парадоксальную картину.
Эта кампания наглядно иллюстрирует несколько тревожных тенденций. Во-первых, рост сложности цепочек доставки, где каждый этап минимально детектируется и служит лишь для загрузки следующего. Во-вторых, растущую популярность блокчейн-технологий для создания устойчивых и легко обновляемых систем управления. В-третьих, стремление к полной резидентности в памяти, что серьёзно затрудняет классический файловый анализ. Для защиты от подобных угроз специалистам по безопасности необходимо уделять повышенное внимание мониторингу нестандартного использования системных утилит (особенно сетевых), анализу исходящего трафика на предмет аномальных криптографических или RPC-запросов, а также внедрять решения для обнаружения аномалий в работе процессов (EDR), способные отслеживать прямые системные вызовы и инъекции кода в память.
Индикаторы компрометации
IPv4
- 144.124.246.155
- 178.16.52.168
- 185.93.89.62
- 193.42.124.3
- 46.173.25.138
Domains
- acchimneyservices.cfd
- allthe.site
- cl.allthe.site
- cldvrfd.click
- cmd.allthe.site
- dns-parking.com
- finger.cldvrfd.click
- h01-captcha.sbs
- more-arpc.icu
- nnp0.allthe.site
- on.cldvrfd.click
- panel.allthe.site
- pnn.allthe.site
- rec.allthe.site
- rpcsecnoweb.pro
- sobeautyrebel.cfd
- vrf.cldvrfd.click
SHA256
- 2b6273d63ec822621bbefdf723ec8182494e648e2ae1215359c090b491667249
- 6373eec0482f5b98f127967135937fca60e5a497befb51cb1267fa402063095d
- dcf5e6b4c75c50010d79ba3c451de49f433b7f7b7138013c60b1fa168441399c
Smart contract
- 0x328A1faDff154290F0Ce1389a4E633698CDfdAa7
Wallet
- 0x11e18d4e47c1c2ea4137262c3efba9123fd76b39
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 | rule HellsUchecker_Backdoor { meta: id = "XaKgn7Morr_pIPI_rOh_05" fingerprint = "549f157a1defdbefde0923a8cd73ed9dca028297e2f26074c0a0473915307d12" version = "1.0" date = "2026-03-11" modified = "2026-03-11" status = "RELEASED" sharing = "TLP:CLEAR" source = "HTTPS://GITHUB.COM/KIRKDERP/YARA" author = "kirkderp" description = "HellsUchecker native x64 backdoor - JSON-RPC HTTPS C2 with custom URL encoding. Memory-resident only (never written to disk). Scan process memory or dumps. PDB: uchecker.pdb." category = "MALWARE" malware = "HELLSUCHECKER" mitre_att = "T1071.001" reference = "https://derp.ca/blog/hellsuchecker-clickfix-etherhiding" triage_score = 10 triage_description = "HellsUchecker backdoor detected in memory. Custom native x64 implant with JSON-RPC C2." strings: $pdb = "uchecker.pdb" ascii $jsonrpc_template = "{\"id\":,\"arguments\":[]}" ascii $ua_checkin = "myApp v1.0" ascii $ct_json = "Content-Type: application/json\r\n" ascii $fingerprint_prefix = "USERNAME=" ascii condition: uint16(0) == 0x5A4D and filesize < 100KB and $pdb and $jsonrpc_template and 2 of ($ua_checkin, $ct_json, $fingerprint_prefix) } |
| 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 HellsUchecker_Backdoor_Wide { meta: id = "V1kgj1znQLmaFSSdZ2PcEA" fingerprint = "f653285ece03301efc6e4fba4761387cb6af3b52acde1b288f557d8fac4070a8" version = "1.0" date = "2026-03-11" modified = "2026-03-11" status = "RELEASED" sharing = "TLP:CLEAR" source = "HTTPS://GITHUB.COM/KIRKDERP/YARA" author = "kirkderp" description = "HellsUchecker backdoor - broader detection without PDB path. Targets the unique combination of JSON-RPC template, custom User-Agent, and URL encoding pattern." category = "MALWARE" malware = "HELLSUCHECKER" mitre_att = "T1071.001" reference = "https://derp.ca/blog/hellsuchecker-clickfix-etherhiding" triage_score = 10 triage_description = "Probable HellsUchecker backdoor detected. Custom JSON-RPC C2 implant." strings: $jsonrpc_template = "{\"id\":,\"arguments\":[]}" ascii $ua_checkin = "myApp v1.0" ascii $ct_json = "Content-Type: application/json\r\n" ascii $fingerprint_prefix = "USERNAME=" ascii $day_lut = "SunMonTueWedThuFriSat" ascii $month_lut = "JanFebMarAprMayJunJulAugSepOctNovDec" ascii condition: uint16(0) == 0x5A4D and filesize < 100KB and $jsonrpc_template and $ua_checkin and $ct_json and ($day_lut or $month_lut) and $fingerprint_prefix } |
| 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 | rule HellsUchecker_MSI_Dropper { meta: id = "7yYUKBsAG7h9MzsQlZbxze" fingerprint = "2ca7e864d2cdfad4bb2dfb2c98d6da02e6634502a40912ec8a03f2970f1d70cd" version = "1.0" date = "2026-03-11" modified = "2026-03-11" status = "RELEASED" sharing = "TLP:CLEAR" source = "HTTPS://GITHUB.COM/KIRKDERP/YARA" author = "kirkderp" description = "HellsUchecker MSI dropper - WiX-built installer masquerading as Microsoft Update. Drops BAT/MSBuild polyglot + VBS launcher to SvcUpdate directory." category = "MALWARE" malware = "HELLSUCHECKER" mitre_att = "T1218.007" reference = "https://derp.ca/blog/hellsuchecker-clickfix-etherhiding" triage_score = 10 triage_description = "HellsUchecker MSI dropper detected. Fake Microsoft Update installer dropping BAT/MSBuild polyglot." strings: $install_dir = "SvcUpdate_" ascii wide $bat_name = "wscript_ce49" ascii wide $vbs_name = "wscript_29ab" ascii wide $cache_name = "runtime_75ef" ascii wide $fake_author = "Microsoft Update" ascii wide $product = "standalone_standard_configure" ascii wide condition: uint32(0) == 0xE011CFD0 and filesize > 500KB and filesize < 5MB and $install_dir and ($bat_name or $vbs_name or $cache_name) and ($fake_author or $product) } |
| 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 HellsUchecker_MSBuild_Polyglot { meta: id = "7HOcyNketAsPJBkLPs4PLr" fingerprint = "2454f4a4d7897ac24b7ea219c45b698fef0257df611ea1107e5d2bf1cfa7373d" version = "1.0" date = "2026-03-11" modified = "2026-03-11" status = "RELEASED" sharing = "TLP:CLEAR" source = "HTTPS://GITHUB.COM/KIRKDERP/YARA" author = "kirkderp" description = "HellsUchecker BAT/MSBuild polyglot - batch script header with embedded MSBuild XML project containing C# inline task. Base91-encoded .NET assembly payload between custom delimiters." category = "MALWARE" malware = "HELLSUCHECKER" mitre_att = "T1127.001" reference = "https://derp.ca/blog/hellsuchecker-clickfix-etherhiding" triage_score = 10 triage_description = "HellsUchecker BAT/MSBuild polyglot detected. Batch script wrapping MSBuild inline C# task with base91-encoded payload." strings: $bat_header = "@echo off" ascii nocase $msbuild_project = "<Project" ascii $code_task_factory = "CodeTaskFactory" ascii $csharp_inline = "<Code Type=\"Class\" Language=\"cs\">" ascii $base91_delim = "::85a210c1::" ascii $task_class = "T_a84ee9c6" ascii condition: filesize > 1MB and filesize < 50MB and $bat_header in (0..100) and $msbuild_project and $code_task_factory and $csharp_inline and ($base91_delim or $task_class) } |
| 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 | rule HellsUchecker_Shellcode_Loader { meta: id = "ssI6NI2m8XL6s7Bj_50cli" fingerprint = "bb14f18efb80ed58ab1387945573d9d587f58e69e33431f3ff96f0034744569f" version = "1.0" date = "2026-03-11" modified = "2026-03-11" status = "RELEASED" sharing = "TLP:CLEAR" source = "HTTPS://GITHUB.COM/KIRKDERP/YARA" author = "kirkderp" description = "HellsUchecker x64 shellcode loader - position-independent code with SipHash-variant CTR cipher and aPLib decompression. Targets raw shellcode as injected via Hell's Gate NtCreateSection." category = "MALWARE" malware = "HELLSUCHECKER" mitre_att = "T1055.012" reference = "https://derp.ca/blog/hellsuchecker-clickfix-etherhiding" triage_score = 10 triage_description = "HellsUchecker shellcode loader detected in memory. SipHash-CTR cipher + aPLib PE loader." strings: // Config token in unencrypted config area (offset 0x002E) $config_token = "ebAZZQH7n" ascii // Shellcode entry point: POP RCX; PUSH RBP; MOV RBP,RSP; AND RSP,-16; SUB RSP,0x20; CALL +5 $entry_point = { 59 55 48 89 E5 48 83 E4 F0 48 83 EC 20 E8 05 00 00 00 } // SipHash-CTR round: ROL5, SHR27, ROL8, ROR16 rotation constant cluster $siphash_round = { C1 E0 05 C1 E9 1B ?? ?? ?? ?? ?? C1 E9 18 ?? ?? ?? ?? ?? C1 E0 08 } // aPLib decompressor prologue $aplib_prologue = { 48 89 5C 24 08 48 89 6C 24 10 48 89 74 24 18 4C 89 70 20 55 48 8B EC 48 83 EC 40 } condition: not uint16(0) == 0x5A4D and filesize < 100KB and $config_token and ($entry_point or $siphash_round or $aplib_prologue) } |