Selon GreyNoise Research (blog), dans un article du 17 décembre 2025, l’équipe a étudié plus de 50 000 payloads liés à la campagne React2Shell ciblant des React Server Components et a analysé leur taille, style et logique pour déterminer leur origine et sophistication.

📊 L’analyse de la distribution des tailles montre que la majorité des tentatives (150–400/200–500 octets) sont du bruit automatisé (scanners tirant des templates standards pour des commandes simples). Un petit volume de payloads lourds (≥1 000 octets) correspond à des charges utiles réelles (ex. crypto-mining, DoS, persistence, élimination de concurrents). Un « middle messy » reflète des variantes de botnets IoT (Mirai) avec des clusters hétérogènes.

🤖 Exemple « IA » probable: un dropper Node.js/Next.js fortement commenté, structuré par étapes, avec des commentaires pédagogiques et une mention du prompt d’origine (ex. « This matches the user’s example… /home/xx »). Le code inclut des patterns « safe » fréquents dans les corpus d’entraînement (polyfill require), une détection Alpine soignée (/sbin/apk, /etc/os-release) et des noms grossiers fournis par l’humain (ex. WormBoner, domain fantaisiste), suggérant un LLM assisté par un opérateur.

🧵 Exemple « humain expérimenté »: un script Linux « organique », idiosyncratique (usage de ls pour tester l’existence, enchaînements tr/sed/echo/sort sur-ingénierés), un fallback HTTP via /dev/tcp, des indicateurs opérationnels précis (taille et MD5 d’un binaire), et une infrastructure pointant vers un IP au Brésil avec endpoint hispanophone mal orthographié — caractéristiques d’un malware mûr issu d’itérations de terrain (familles type Mirai/Gafgyt).

⚠️ Exemple « hybride cassé »: un script Mirai humain entouré d’un wrapper JavaScript généré par LLM qui implémente la décodification Base64 mais oublie d’encoder effectivement la donnée (variable b64 en clair), illustrant un échec de transformation typique.

🧪 Exemple « bounty/chercheur »: un payload verbeux et non destructif exploitant la gestion d’erreurs Next.js pour renvoyer la sortie (ex. id, cat /etc/passwd, hostname) dans le navigateur, adapté à la preuve d’impact RCE sans persistance.

IOC observables:

  • IP/C2: 200.4.115.1
  • URL: http://200.4.115.1/promocionao.php
  • Domaine: bewildered-cock-lover.online
  • Fichiers/chemins: WormBoner, /tmp/httpd, /tmp/.xdiag/p
  • Hash: md5=267b27460704e41e27d6f2591066388f
  • Taille binaire vérifiée: 10 955 043 octets

TTPs (extraits):

  • Mass scanning opportuniste de React Server Components via React2Shell; web shells, reverse shells, PoE, crypto-mining, DoS.
  • Droppers Node.js/Next.js avec commentaires excessifs, détection Alpine, et obfuscation Base64 (parfois incorrecte).
  • Utilisation de busybox wget, fallback /dev/tcp, vérifications de hash/taille, et styles shell idiosyncratiques.
  • Exploitation de la gestion d’erreurs Next.js pour renvoyer la sortie en preuve de RCE.

Type: analyse de menace publiée par un fournisseur de renseignement; but principal: caractériser la campagne React2Shell, distinguer bruit automatisé et charges utiles réelles, et identifier des indices d’usage de LLMs dans certains payloads.

🧠 TTPs et IOCs détectés

TTP

Mass scanning opportuniste de React Server Components via React2Shell; web shells, reverse shells, PoE, crypto-mining, DoS. Droppers Node.js/Next.js avec commentaires excessifs, détection Alpine, et obfuscation Base64 (parfois incorrecte). Utilisation de busybox wget, fallback /dev/tcp, vérifications de hash/taille, et styles shell idiosyncratiques. Exploitation de la gestion d’erreurs Next.js pour renvoyer la sortie en preuve de RCE.

IOC

{‘ip’: ‘200.4.115.1’, ‘url’: ‘http://200.4.115.1/promocionao.php’, ‘domaine’: ‘bewildered-cock-lover.online’, ‘fichiers/chemins’: [‘WormBoner’, ‘/tmp/httpd’, ‘/tmp/.xdiag/p’], ‘hash’: ‘267b27460704e41e27d6f2591066388f’}


🔗 Source originale : https://www.greynoise.io/blog/react2shell-payload-analysis