PointBlank: PyPI RAT приховує C2 у сервісі JSON-Bin

PointBlank: повнофункціональний Python RAT, який запускав свій командний канал через безкоштовний сервіс хостингу нотаток.

TL, д-р

Пакет PyPI під назвою gcli-control постачав повноцінний інструмент віддаленого доступу для Windows: реєстрація натискань клавіш, захоплення даних з веб-камери та мікрофона, моніторинг буфера обміну, доступ до облікових даних браузера, керування екраном, збереження прав доступу, підвищення привілеїв та саморекламовані «140+ команд». Він не приховував, що це таке: у власному описі PyPI пакета його описували як «інструмент віддаленого доступу через npoint.io".

Деталь, на якій варто зупинитися, це фраза «через npoint.io». Замість того, щоб телефонувати додому на виділений сервер, імплантат використовувався npoint[.]io (безкоштовний, легітимний сервіс для розміщення невеликих JSON-документів) як ретранслятор команд та контролю. Оператор записує команди в JSON-бук; імплант опитує цей букмекерський бірж, виконує його та записує результати назад. Немає домену, що належить зловмиснику, для блокування, немає нової IP-адреси для позначки: трафік надходить до сервісу, який розробники використовують щодня.

Шість версій було опубліковано приблизно за тринадцять з половиною годин, кожна з яких була кращою за попередню. Кожна з них була оцінена. ml_predicted_safe автоматизованим класифікатором, перш ніж ручний перегляд перекласифікував сімейство як шкідливе.

Анатомія атаки

gcli-control встановлює пакет імпорту gcli, 35-модульна кодова база Python. Немає потреби в часі встановлення hooks — нічого не працює під час pip встановитиЦя можливість знаходиться в самих модулях, викликається після запуску інструменту, а макет модуля виглядає як технічний опис продукту:

Область можливостейМодулі
Спостереження за господаремkeylog, webcam, audio, clipboard, desktop, monitoring
Доступ до облікових даних та данихbrowser, forensics, fileops, transfer, users
Опорний пункт та ескалаціяpersistence, elevator, registry, security
Розвідка хоста та мережіsystem, processes, network_config, wifi, bluetooth, netutils
Командування та управлінняclient, host, session, protocol, npoint, crypto, encrypt

Цікавою частиною є канал команд. Більшість інструментів віддаленого доступу досягають сервера, яким керує оператор — IP-адреси, домену, хостинг-провайдера, про які можна повідомити та перевести в автономний режим. gcli-control замість цього розглядає a безкоштовний сервіс JSON-bin як мертва точка, npoint Модуль читає та записує невеликі JSON-документи на npoint[.]io через звичайний HTTPS; крипто/шифрувати Модулі обгортають обмінювані корисні навантаження, тому вміст контейнера не є командами у відкритому тексті. Ефект полягає у опосередкованому, зашифрованому реле:

  • Оператор поміщає (зашифровану) інструкцію в JSON-бік.
  • Імплантат, що працює на хості-жертві, опитує цей bin, розшифровує його, виконує один зі своїх обробників команд і записує (зашифрований) результат назад.
  • Для мережевого монітора жертва просто розмовляє з npoint[.]io — сервіс, який має законну причину з’являтися в трафіку розробника.

Тут немає завантаження другого етапу та обфускованого завантажувача: функція постачається цілою, на читабельному Python, і єдиним «приховуванням» є вибір ретрансляції та шифрування ретрансльованих корисних навантажень.

Варто пояснити, чому мертва точка в JSON-bin є операційно привабливою, адже це пояснює, чому ми очікуємо побачити цю закономірність знову:

  • Немає кінцевої точки, що належить оператору. Немає домену C2 для реєстрації, немає VPS для оренди, і немає нічого, що захисник чи реєстратор міг би вилучити. Видалення пакет не торкається каналу; демонтаж канал означає прохання до універсального SaaS контролювати один документ серед мільйонів.
  • Відмивання репутації. Вихідний HTTPS-сервіс до відомого розробницького сервісу не має жодних погіршень репутації, які мав би новий домен або необроблена IP-адреса. Багато налаштувань фільтрації вихідного трафіку дозволяють це неявно.
  • Асинхронність та заперечуваність. Модель опитування — імплант отримує документ з певним інтервалом, а не тримає відкритий сокет — створює трафік, який виглядає як періодичне опитування API, а не як інтерактивний сеанс. Шифрування вмісту документа означає, що навіть аналітик, який знаходить контейнер, бачить зашифрований текст, а не список команд.
  • Тривіальне обертанняПерехід до іншого кошика або до іншого сервісу нотаток/вставки — це зміна конфігурації в один рядок для оператора. Будь-який список блоків, пов’язаний із певним реле, є застарілим з моменту його відправлення.

Компроміс, на який погоджується оператор, полягає у пропускній здатності та затримці: ретрансляція з тупиковим з’єднанням повільніша та має меншу пропускну здатність, ніж пряме з’єднання. Для імплантату спостереження та контролю, який здебільшого видає короткі команди та збирає результати з часом, такий компроміс легко здійснити.

Хронологія

Сімейство швидко нарощувало. Мітки часу створення квитків для позначених версій розміщують всю спостережувану дугу приблизно в межах тринадцяти з половиною годин, а кількість власних доказів сканера зростала разом із кодом — від кількох позначених сайтів у першій версії до чотирнадцяти в останній.

версіяВперше побачено (UTC)Примітка:
0.1.02026-07-21 12:59Початкове завантаження; мінімальна позначена поверхня
0.5.02026-07-21 18:01Можливості розширюються
0.2.02026-07-21 18:03(нумерація версій не монотонна з порядком завантаження)
0.6.02026-07-22 00:44Ширший набір модулів
0.7.02026-07-22 01:58Майже повний набір інструментів
0.7.12026-07-22 02:28Найновіша версія; 35 модулів, повний спектр можливостей

Номери версій не були опубліковані в строгому порядку, але напрямок чіткий: невелике спочатку скорочення, потім швидка ітерація до повнофункціональної версії 0.7.1. Це форма проекту, що активно розробляється, який переміщується до публічного реєстру в міру його зростання, а не одноразове вилучення.

Показники компромісу

Усі наведені нижче індикатори були підтверджені вмістом пакета на диску та детермінованим скануванням індикаторів версії 0.7.1; жоден з них не є спекулятивним.

типіндикатор
Пакет (PyPI)gcli-control, версії 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1
Імпорт пакетаgcli
Реле C2npoint[.]io (мертве місце JSON-bin; зашифровані корисні навантаження)
Заявлене сховищеgithub[.]com/gcli-control/gcli
Поведінковий відбитокСпільно розташовані модулі спостереження: keylog, webcam, audio, clipboard, browser, а також персистентність, ліфт та командний рівень клієнт/хост/протокол в одному пакеті
Встановлювати hooksНемає: функція працює під час виконання інструменту, а не під час встановлення.

Примітка захисника: Найсильніший тривалий сигнал – це не домен (хост ретрансляції змінюється незначно), а формуватиодин пакет, що об'єднує три або більше різних примітивів спостереження за хостом та маршрутизує цикл команд/відповідей через публічний сервіс розміщення контенту. Блокування npoint[.]io відверте використання непрактичне для більшості магазинів; сповіщення про неочікуваний процес, який одночасно фіксує дані з пристроїв введення та взаємодіє зі сервісом JSON-bin, є набагато надійнішим.

Спостережувана поведінка та фреймінг

Дві речі роблять цю вибірку незвичайною, і обидві є спостережуваними фактами, а не висновками про мотив.

Воно само себе рекламувало. У описі пакета, розповсюдженому на PyPI, можливості перераховані простою мовою: віддалений доступ, керування робочим столом, керування користувачами, веб-камера, аудіо, кейлогер, персистентність, дані браузера, Wi-Fi, реєстр, «140+ команд». Не було жодної спроби видати код за помічник збірки, обгортку CLI або утиліту агента штучного інтелекту, що є більш поширеною маскуванням, яке ми бачимо в публічних реєстрах. Чи відображає ця відкритість інструмент червоної команди, опублікований без контролю доступу, чи щось інше, питання, яке не вирішує сам лише вміст пакета; безперечно те, що робочий універсальний інструментарій для віддаленого доступу та спостереження міг встановити будь-хто з... типун.

Це спиралося на довіру до доброякісного сервісу. використання npoint[.]io оскільки ретрансляція є визначальною технікою. Це приклад ширшого шаблону — маршрутизація C2 через легітимний SaaS (сайти вставки, JSON-біни, веб-чатhooks, хмарна документація), щоб шкідливий трафік зливався зі звичайною діяльністю розробника, і не було жодної кінцевої точки, що належить оператору, для захоплення. Корисні навантаження на ретрансляції були зашифровані, тому вміст кошика не сприймався б як команди випадковим спостерігачем.

Сигнали видавця слабкі та загальні. У пакеті оголошено автор «учасників gcli» та ліцензію MIT, а також вказав поля домашньої сторінки та репозиторію на github[.]com/gcli-control/gcliНічого з цього не є верифікацією: рядок автора є вільним текстом, заголовок ліцензії MIT нічого не коштує, а URL-адреса репозиторію в метаданих пакета є твердженням, а не доказом походження. Шаблон — абсолютно нова назва, загальний колективний автор та самопосилальна організація/репозиторій, створена навколо пакета — це те, як виглядає проект, коли він спеціально розроблений для розміщення коду, а не як усталений інструмент, який випадково розвинув функцію віддаленого керування. Ми відзначаємо це як спостереження; вони узгоджуються, але самі по собі не встановлюють цільовий дистрибутив.

Ми описуємо це розташування як зловмисне на основі можливостей та способу доставки: повноцінний, працездатний імплантат віддаленого доступу та спостереження, розповсюджений у публічному індексі пакетів із прихованою ретрансляцією. Ми не вказуємо ціль чи мотив.

Вплив, тенденції та що можуть зробити захисники

Сліпа пляма для маскувально-орієнтованого сортування. Значно автоматизовані ключі сортування посилок на приховувати сигнали типове шкідливе програмне забезпечення для реєстру — завуальовані блоби, під час встановлення hooks, жарти про збір посвідчень. Пакет, який просто відкрито ЩУР, з чистим, читабельним кодом та без перехоплення встановлення, не містить жодних із цих підказок і може прослизнути повз евристики, які очікують приховування. Сигнали, які надійно виявляють цей клас, є структурними, а не маскувальними: перепис можливостей (скільки різних примітивів спостереження за хостом співіснує в одному пакеті) та аналіз C2-подібної форми (цикл команд/відповідей, що проходить через службу розміщення контенту загального призначення). Ці перевірки спрацьовують незалежно від того, наскільки чесними чи... заплутаний упаковка така.

Тренд SaaS як C2. Зловживання легітимним хостинг-сервісом як тайником не є чимось новим, але воно продовжує працювати, оскільки захисні витрати на блокування сервісу високі, а наступальні витрати на перемикання сервісів близькі до нуля. Очікуйте більшого. Мережевий захист, прив’язаний до певних поганих доменів, миттєво старіє; правила поведінки («цей процес зчитує буфер обміну та веб-камеру, а потім взаємодіє з API хостингу нотаток») – ні.

Ескіз виявлення бетону. Міцне правило не називає npoint[.]io взагалі. Це поєднує два спостереження, які окремо є поширеними, але разом рідкісними на звичайному розробнику або хості неперервної інтеграції:

сповіщення, коли один процес, протягом одного сеансу, обидва:
(A) отримує доступ до примітиву спостереження за хостом — пристрою введення (перехоплення клавіатури/миші), камери, мікрофона, захоплення екрана, циклу читання буфера обміну або сховища облікових даних браузера ("Login «Дані» / «Локальний стан» / DPAPI); ТА
(B) надсилає вихідні запити до публічного сервісу розміщення контенту / вставки / JSON-bin / chat-webhook, а потім піднімає їх на розгляд, незалежно від конкретного сервісу в (B).

Жодна з цих половин не викликає підозр окремо: безліч скріншотів легітимних інструментів і багато надсилають JSON до API хостингу. Кон'юнкція всередині одного короткочасного процесу є сигналом, і вона переживає будь-яку ротацію ретрансляції.

Практичні кроки для команд:

  • Ставтеся до встановлення публічних пакетів на хостах розробників та хостах неперервної інтеграції як до межі виконання, а не до зручності — RAT на агенті збірки — це RAT з вашими секретами.
  • Надавайте перевагу внутрішнім дзеркалам зі списку дозволених; пакет, буквально названий для віддаленого керування та описуючи кейлогер, ніколи не повинен розміщуватися в корпоративному індексі.
  • Сповіщення про поєднання — пристрій введення або захоплення екрана плюс вихідний трафік до служби контенту/вставки/JSON-bin — а не на будь-якому окремому примітиві, який окремо має безпечне використання.
  • Не покладайтеся на автоматичну оцінку «безпечності» як остаточний вердикт для пакетів із широкими можливостями доступу до хоста; направте їх на перевірку людиною.

Сімейство пакетів класифіковано як шкідливе та направлено на видалення з реєстру. Оскільки C2 на основі ретрансляції не залишає жодного хоста, що належить оператору, для виведення з ладу, довговічна захисна цінність полягає у поведінковому відбитку вище, а не в якомусь окремому записі чорного списку.

інструменти-для-аналізу-складу-програмного-засобу-sca
Визначте пріоритети, усуньте та захистіть ризики, пов'язані з програмним забезпеченням
Отримайте свій безкоштовний обліковий запис.
Не потрібна кредитна картка.

Забезпечте розробку та доставку програмного забезпечення

з пакетом продуктів Xygeni