
CVE-2021-41773 Apache 경로 순회 및 RCE 악용에 대한 상세 분석서, TryHackMe 실습 환경에서의 단계별 명령어와 근본 원인 분석 포함.
| 항목 | 세부사항 |
|---|
| 취약점 | CVE-2021-41773 — Apache 2.4.49 경로 탐색 / RCE |
| 대상 서비스 | 포트 8080의 Apache HTTP Server |
| 취약한 버전 | Apache/2.4.49 (Unix) |
| 근본 원인 | ap_normalize_path()의 잘못된 정규화 순서 |
| 영향 | 임의 파일 읽기 → mod_cgi를 통한 원격 코드 실행 |
| 사용된 도구 | curl |
Apache 2.4.49는 ap_normalize_path()가 URL을 처리하는 방식을 변경했습니다. Apache는 파일 시스템에 도달하기 전에 ../를 포함하는 요청 경로를 차단해야 하지만, 경로 탐색 필터는 전체 URL 디코딩이 완료되기 전에 실행됩니다.
즉, 이중 인코딩된 시퀀스 .%2e/를 사용하는 요청은 필터가 ../로 인식하지 못합니다. 그러나 Apache가 경로를 OS에 전달하면 .%2e/가 ../로 해석되며 경로 탐색 필터는 이미 우회된 상태입니다.
이 자체만으로 웹 루트 외부의 임의 파일 읽기가 가능합니다. mod_cgi와 결합되면 영향이 심각해집니다. 경로 탐색 결과가 CGI가 활성화된 디렉터리(예: /cgi-bin/) 내의 /bin/sh와 같은 실행 파일로 이어지는 경우, Apache는 이를 CGI 스크립트로 실행하고 HTTP POST 본문을 표준 입력으로 전달하여 원격 명령 실행을 가능하게 합니다.
대상의 Server 응답 헤더가 다음과 같이 확인되었습니다:
Apache/2.4.49 (Unix)
이 버전은 CVE-2021-41773의 직접적인 영향을 받습니다.
/cgi-bin/ 사용 가능 여부 확인/cgi-bin/을 요청했을 때 403 Forbidden 응답을 받았습니다(404가 아님). 이는 디렉터리가 존재하고 mod_cgi가 활성화되어 있을 가능성이 높다는 것을 의미하며, 이 CVE를 통한 RCE의 전제 조건입니다.
curl에 --path-as-is 플래그를 사용하여 인코딩된 경로 탐색 시퀀스를 정확히 입력한 대로 전송했습니다. curl이 클라이언트 측에서 먼저 정규화하지 않도록 합니다.
curl -s --path-as-is "http://<TARGET_IP>:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh" \
--data 'echo Content-Type: text/plain; echo; cat /flag.txt'
--path-as-is가 필요한 이유: 기본적으로 curl은 요청이 전송되기 전에 URL을 정규화하여 .%2e/ 시퀀스를 제거합니다. --path-as-is는 curl에게 URL을 작성된 그대로 보내도록 지시하여 인코딩된 경로 탐색이 서버에 온전히 도달하도록 합니다.
페이로드는 /cgi-bin/을 빠져나와 루트 파일 시스템으로 이동하고, 삽입된 POST 본문을 통해 /bin/sh를 CGI 스크립트로 실행하여 /flag.txt의 내용을 반환했습니다.
플래그 형식 확인: THM{...}
(TryHackMe의 공개 분석 가이드라인에 따라 플래그는 편집되었습니다.)
mod_cgi + 경로 탐색 = RCE. 파일 읽기만으로도 좋지 않지만, CGI 실행 가능 디렉터리와 결합되면 명령 실행이 됩니다.--path-as-is(또는 이에 상응하는 원시 요청 도구)가 필수적입니다.mod_cgi를 비활성화합니다.이 분석은 랩 환경(TryHackMe)을 문서화합니다. 승인되지 않은 시스템에는 접근하지 않았습니다.