PointBlank: PyPI RAT amaga C2 en un servei JSON-Bin

PointBlank: un RAT de Python amb totes les funcions que executava el seu canal de comandaments a través d'un servei gratuït d'allotjament de notes.

TL; DR

Un paquet PyPI anomenat control de gcli va incloure una eina completa d'accés remot per a Windows: registre de pulsacions de tecles, captura de càmera web i micròfon, monitorització del porta-retalls, accés a les credencials del navegador, control de pantalla, persistència, elevació de privilegis i uns "més de 140 ordres" autoanunciats. No amagava què era: el propi resum de PyPI del paquet el descrivia com una "eina d'accés remot mitjançant npoint.io".

El detall en què val la pena aturar-se és aquesta frase "via npoint.io." En lloc de trucar a un servidor dedicat, l'implant utilitzat npoint[.]io (un servei gratuït i legítim per allotjar documents JSON petits) com a relé de comandament i control. L'operador escriu ordres en un contenidor JSON; l'implant sondeja aquest contenidor, l'executa i escriu els resultats. No hi ha cap domini propietat d'un atacant per bloquejar, ni cap IP nova per marcar: el trànsit va a un servei que els desenvolupadors utilitzen cada dia.

Es van publicar sis versions en aproximadament tretze hores i mitja, cadascuna més potent que l'anterior. Totes elles van ser puntuades ml_predicted_safe per un classificador automatitzat abans que la revisió manual reclassifiqués la família com a maliciosa.

Anatomia d'atac

control de gcli instal·la el paquet d'importació gcli, una base de codi Python de 35 mòduls. No hi ha temps d'instal·lació hooks — no funciona res durant instal·lació de pipLa capacitat resideix en els mateixos mòduls, s'invoca un cop s'executa l'eina, i el disseny del mòdul sembla una fitxa tècnica del producte:

Àrea de capacitatmòduls
Vigilància de l'amfitriókeylog, webcam, audio, clipboard, desktop, monitoring
Accés a credencials i dadesbrowser, forensics, fileops, transfer, users
Punt de suport i escaladapersistence, elevator, registry, security
Reconeixement d'amfitrió i xarxasystem, processes, network_config, wifi, bluetooth, netutils
Comandament i controlclient, host, session, protocol, npoint, crypto, encrypt

El canal de comandaments és la part interessant. La majoria de les eines d'accés remot arriben a un servidor controlat per l'operador: una IP, un domini, un proveïdor d'allotjament que es pot informar i desconnectar. control de gcli en comptes d'això, tracta un servei JSON-bin gratuït com a dead-drop. La npunt el mòdul llegeix i escriu petits documents JSON npoint[.]io sobre HTTPS ordinari; el/la/els/les cripto/xifrar els mòduls emboliquen les càrregues útils intercanviades de manera que el contingut del bin no siguin ordres de text pla. L'efecte és un relé xifrat i mediat:

  • L'operador descarrega una instrucció (xifrada) en un bin JSON.
  • L'implant, que s'executa a l'amfitrió víctima, sondeja aquest contenidor, el desxifra, executa un dels seus controladors d'ordres i escriu el resultat (xifrat).
  • Per a un monitor de xarxa, la víctima simplement està parlant amb npoint[.]io — un servei amb una raó legítima per aparèixer al trànsit de desenvolupadors.

Aquí no hi ha cap descàrrega de segona etapa ni cap carregador ofuscat: la capacitat es distribueix sencera, en Python llegible, i l'única "amagatall" és l'elecció del relé i el xifratge de les càrregues útils retransmeses.

Val la pena explicar per què un dead-drop JSON-bin és operativament atractiu, ja que explica per què esperem tornar a veure el patró:

  • Cap punt final propietat de l'operador. No hi ha cap domini C2 per registrar, cap VPS per llogar i res que un defensor o registrador pugui confiscar. Eliminació del paquet no toca el canal; retirada del canal significa demanar a un SaaS d'ús general que supervisi un document entre milions.
  • Blanqueig de reputació. El HTTPS de sortida a un servei de desenvolupador conegut no comporta cap de les penalitzacions de reputació que tindria un domini nou o una IP sense processar. Moltes configuracions de filtratge de sortida ho permeten implícitament.
  • Asincronia i negació. Un model de sondeig (l'implant recupera un document en un interval en lloc de mantenir un sòcol obert) produeix trànsit que sembla un sondeig periòdic de l'API, no una sessió interactiva. Xifrar el contingut del document significa que fins i tot un analista que troba la carpeta veu text xifrat, no una llista d'ordres.
  • Rotació trivialCanviar a una altra safata o a un servei de notes/enganxades completament diferent és un canvi de configuració d'una sola línia per a l'operador. Qualsevol llista de bloqueig associada al relé específic queda obsoleta en el moment en què s'envia.

El compromís que accepta l'operador és el rendiment i la latència: un relé de dead-drop és més lent i té una amplada de banda inferior que una connexió directa. Per a un implant de vigilància i control que principalment emet ordres curtes i recopila resultats al llarg del temps, aquest compromís és fàcil de fer.

Línia de temps

La família va anar augmentant ràpidament. Les marques de temps de creació de tiquets per a les versions marcades situen tot l'arc observat en unes tretze hores i mitja, i el recompte de proves del propi escàner va créixer juntament amb el codi, des d'un parell de llocs marcats a la primera versió fins a catorze a la darrera.

versionVist per primera vegada (UTC)Nota
0.1.02026-07-21 12:59Càrrega inicial; superfície mínima marcada
0.5.02026-07-21 18:01La capacitat s'expandeix
0.2.02026-07-21 18:03(numeració de versions no monòtona amb ordre de pujada)
0.6.02026-07-22 00:44Conjunt de mòduls més ampli
0.7.02026-07-22 01:58Joc d'eines gairebé complet
0.7.12026-07-22 02:28Últim; 35 mòduls, capacitat completa

Els números de versió no es van publicar en ordre estricte, però la direcció és clara: un primer petit tall, després una iteració ràpida cap a la versió 0.7.1 amb totes les funcions. Aquesta és la forma d'un projecte en desenvolupament actiu que s'envia a un registre públic a mesura que creix, no un llançament puntual.

Indicadors de compromís

Tots els indicadors següents s'han confirmat amb el contingut del paquet al disc i una exploració d'indicadors determinista de la versió 0.7.1; cap és especulatiu.

TipusIndicador
Paquet (PyPI)gcli-control, versions 0.1.0, 0.2.0, 0.5.0, 0.6.0, 0.7.0, 0.7.1
Importa el paquetgcli
Relé C2npoint[.]io (JSON-bin dead-drop; càrregues útils xifrades)
Repositori declaratgithub[.]com/gcli-control/gcli
Empremta digital conductualMòduls de vigilància coubicats: keylog, webcam, audio, clipboard, browser, a més de persistència, elevador i una capa d'ordres client/amfitrió/protocol en un sol paquet
install hooksCap: la capacitat s'executa en temps d'execució de l'eina, no durant la instal·lació

Nota del defensor: el senyal més fort i durador no és el domini (un host de retransmissió gira trivialment) sinó el donar forma a: un únic paquet que agrupa tres o més primitives de vigilància d'amfitrió diferents i encamina un bucle d'ordres/respostes a través d'un servei públic d'allotjament de contingut. Bloqueig npoint[.]io La funció directa no és pràctica per a la majoria de botigues; l'alerta sobre un procés inesperat que captura dispositius d'entrada i es comunica amb un servei JSON-bin és molt més robusta.

Comportament observat i enquadrament

Dues coses fan que aquesta mostra sigui inusual, i ambdues són fets observables més que no pas inferències sobre el motiu.

Es va anunciar a si mateix. El resum del paquet distribuït a PyPI enumerava les capacitats en llenguatge planer: accés remot, control d'escriptori, gestió d'usuaris, càmera web, àudio, keylogger, persistència, dades del navegador, WiFi, registre, "més de 140 ordres". No hi va haver cap intent de fer passar el codi com un ajudant de compilació, un contenidor CLI o una utilitat d'agent d'IA, que és la disfressa més comuna que veiem als registres públics. Si aquesta obertura reflecteix una eina red-team publicada sense controls d'accés o alguna altra cosa és una qüestió que el contingut del paquet per si sol no resol; el que és cert és que qualsevol persona podia instal·lar un conjunt d'eines d'accés remot i vigilància d'ús general que funcionés. pip.

Es basava en la confiança en un servei benigne. Ús npoint[.]io ja que el relé és la tècnica definidora. És un exemple d'un patró més ampli: encaminar C2 a través d'un SaaS legítim (enganxar llocs, contenidors JSON, xat webhooks, documents al núvol) de manera que el trànsit maliciós es barregi amb l'activitat normal del desenvolupador i no hi hagi cap punt final propietat de l'operador per confiscar. Les càrregues útils del relé estaven xifrades, de manera que el contingut del contenidor no es llegiria com a ordres per a un observador casual.

Els senyals de l'editor són prims i genèrics. El paquet va declarar un autor de "col·laboradors de gcli" i una llicència MIT, i apuntava a la seva pàgina d'inici i als camps del repositori github[.]com/gcli-control/gcliRes d'això és verificació: una cadena d'autor és text lliure, una capçalera de llicència MIT no costa res i una URL de repositori a les metadades del paquet és una afirmació, no una prova de procedència. El patró (un nom nou de trinca, un autor col·lectiu genèric i una organització/repositori autoreferencial creat al voltant del paquet) és l'aspecte d'un projecte quan es crea específicament per portar el codi, en lloc d'una eina establerta que ha desenvolupat una funció de control remot. Ho anotem com a observacions; són coherents amb, però no estableixen per si soles, una distribució creada amb un propòsit.

Descrivim la disposició com a maliciosa en funció de la capacitat i el lliurament: un implant complet i executable d'accés remot i vigilància, distribuït en un índex de paquets públic amb un relé encobert. No atribuïm un objectiu ni un motiu.

Impacte, tendències i què poden fer els defensors

Un punt cec per al triatge orientat a la disfressa. Moltes claus de triatge de paquets automatitzades al disfressar senyals de programari maliciós típic del registre — blobs ofuscats, en temps d'instal·lació hooks, frases fetes per a la recol·lecció de credencials. Un paquet que és simplement obertament una RAT, amb codi net i llegible i sense ganxo d'instal·lació, no presenta cap d'aquests tells i pot passar per alt les heurístiques que esperen ocultació. Els senyals que detecten de manera fiable aquesta classe són estructurals en lloc de basats en la dissimulació: un cens de capacitats (quantes primitives de vigilància d'amfitrió diferents coexisteixen en un paquet) i una anàlisi de forma C2 (un bucle d'ordres/resposta encaminat a través d'un servei d'allotjament de contingut d'ús general). Aquestes comprovacions s'activen independentment de com d'honestes o obfuscat l'embalatge és.

La tendència SaaS-com-C2. L'abús d'un servei d'allotjament legítim com a punt mort no és nou, però continua funcionant perquè el cost defensiu de bloquejar el servei és alt i el cost ofensiu de canviar de servei és proper a zero. Espereu-ne més. Les defenses de xarxa relacionades amb dominis dolents específics caduquen immediatament; les regles de comportament ("aquest procés llegeix el porta-retalls i la càmera web i després es comunica amb una API d'allotjament de notes") no.

Un esbós de detecció de formigó. La regla duradora no anomena npoint[.]io en absolut. Combina dues observacions que són individualment comunes però conjuntament rares en un desenvolupador normal o amfitrió de CI:

alerta quan un sol procés, dins d'una sessió, tots dos:
(A) accedeix a una primitiva de vigilància de l'amfitrió: dispositiu d'entrada (ganxo de teclat/ratolí), càmera, micròfon, captura de pantalla, bucle de lectura del porta-retalls o un magatzem de credencials del navegador ("Login "Dades" / "Estat local" / DPAPI); I
(B) fa sol·licituds de sortida a un servei públic d'allotjament de contingut / paste / JSON-bin / chat-webhook i després les eleva per a revisió, independentment del servei específic de (B).

Cap de les dues meitats sospita per si sola: moltes captures de pantalla d'eines legítimes i moltes publicacions JSON a una API d'allotjament. La conjunció dins d'un procés de curta durada és el senyal, i sobreviu a qualsevol rotació de relé.

Passos pràctics per a equips:

  • Tracteu les instal·lacions de paquets públics en amfitrions de desenvolupadors i CI com un límit d'execució, no com una comoditat: un RAT en un agent de compilació és un RAT amb els vostres secrets.
  • Prefereix miralls interns a la llista permesa; un paquet anomenat literalment així per un control remot i que descriu un keylogger no hauria de resoldre's mai en un índex corporatiu.
  • Alerta sobre el combinació — captura de dispositiu d'entrada o de pantalla més trànsit de sortida a un servei de contingut/enganxat/JSON-bin — en lloc de fer-ho en una sola primitiva, que té usos benignes de manera aïllada.
  • No confieu en una puntuació de "segur" automatitzada com a veredicte de terminal per a paquets amb una àmplia capacitat d'accés a l'amfitrió; envieu-los a revisió humana.

La família de paquets s'ha classificat com a maliciosa i s'ha derivat a la seva eliminació al registre. Com que un C2 basat en retransmissions no deixa cap host propietat de l'operador al subsòl, el valor defensiu durador es troba en l'empremta digital del comportament anterior, no en cap entrada individual de la llista de bloqueig.

sca-tools-software-composition-analyse-tools
Prioritzar, solucionar i protegir els riscos del programari
Obtén el teu compte gratuït.
No es requereix cap targeta de crèdit.

Assegura el desenvolupament i el lliurament del teu programari

amb el paquet de productes Xygeni