CVE-2023-50164 : Apache Struts 2 vulnerable 실습

CVE-2023-50164 : Apache Struts 2 vulnerable 실습

in

이번 CCE 2024 일반부 예선에서 해당 취약점을 이용하는 문제가 나왔는데 나름대로 정리하고자 올립니다.

개요

  • Apache Struts에서 CVE-2023-50164 (CVE: 9.8)로 식별된 심각한 보안 취약점이 발견되었습니다.
  • 해당 취약점을 악용해 공격자는 파일 업로드 시 매개변수를 조작하여 허가되지 않은 경로에 웹쉘 등의 악성 파일을 업로드 하여 최종적으로 원격 코드 실행(RCE)이 발생할 수 있습니다.

환경 구축

여기서는 1) 로컬 Maven Jetty 환경, 2) docker 컨테이너 환경에서 각 취약 환경을 구축하는 방법을 설명합니다.

로컬 Maven Jetty 환경에서 구축

maven install

  • mac의 경우 간단하게 아래 명령어를 입력해서 설치해줍니다.
brew install maven

서버구동 및 실습

  • git과 mvn을 통해 간단하게 테스트 환경 구축이 가능합니다.
git clone https://github.com/snyk-labs/CVE-2023-50164-POC
cd CVE-2023-50164-POC

mvn clean jetty:run -P vuln
  • “http://localhost:9999/struts-vuln-poc/upload.action” 경로로 접속 시 아래와 같이 업로드 페이지가 나옵니다. image upload.action page

  • 간단한 테스트 파일 하나를 업로드 시 아래와 같은 패킷이 요청됩니다. image file upload request

  • 또한 응답에 표시된 경로로 직접 확인한 결과 업로드 파일 확인이 가능합니다.

$ cd uploads
$ ls
test.txt
  • 현재 루트 디렉터리는 /Users/dohyeoneom/tmp/CVE-2023-50164-POC/src/main/webapp 으로, 업로드 파일 경로인 /Users/dohyeoneom/tmp/CVE-2023-50164-POC/uploads는 루트 디렉터리 하위에 위치하므로 접근이 불가합니다. 또한 Path Traversal 공격에 대한 필터링도 되어있습니다.

  • 그러나 CVE-2023-50164 취약점을 통해 루트 디렉터리에 임의 경로에 파일을 업로드하여 접근 가능합니다.

  • 아래와 같이 기존 요청 패킷의 form-data name을 upload -> Upload 로 변경하고, 추가적으로 urlFileName form-data를 추가하여 해당 폼의 값으로 업로드 경로를 입력해주면 됩니다. image exploit

  • 이후 “http://localhost:9999/struts-vuln-poc/test.jsp” 경로로 직접 접근하면 업로드된 파일을 확인할 수 있습니다. image 경로 접근

  • 만약, 해당 파일 내 커맨드를 실행하는 스크립트를 포함시키면 RCE가 가능합니다.

Docker 환경에서 구축

git clone https://github.com/Trackflaw/CVE-2023-50164-ApacheStruts2-Docker.git
cd CVE-2023-50164-ApacheStruts2-Docker/
docker build -t cve-test:0.1 .
docker run -it -p 9090:8080 cve-test:0.1
  • 서버가 정상적으로 구동되면 9090포트로 접근 시 아래와 같은 업로드 페이지가 나타납니다. image upload page

  • 업로드 시 아래와 같은 요청을 합니다. 여기서는 확장자 검증을 하고있기 때문에 jpg 파일을 올렸습니다. image file upload

  • 해당 서비스에서 업로드에 성공한 파일들은 /usr/local/tomcat/webapps/ROOT/uploads 경로에 업로드 되며, 검증에 실패한 파일들은 /usr/local/tomcat/webapps/ROOT/forbidden 경로에 업로드 됩니다.

# 업로드 성공 - "/ROOT/uploads" 경로 업로드
root@969bf7c2559b:/usr/local/tomcat/webapps/ROOT/uploads# ls
test.jpg
# 확장자 검증 실패 - "/ROOT/forbidden" 경로 업로드
root@969bf7c2559b:/usr/local/tomcat/webapps/ROOT/forbidden# ls
test.jsp
  • 여기서 CVE-2023-50164 취약점을 통해 루트 디렉터리에 임의 경로에 파일을 업로드합니다.
  • 아래와 같이 기존 요청 패킷의 form-data name을 upload -> Upload 로 변경하고, 추가적으로 urlFileName form-data를 추가하여 해당 폼의 값으로 업로드 경로를 입력해주면 됩니다.
  • 또한, 현재 /ROOT/uploads 경로에 파일이 업로드 되기 때문에 한칸 상위인 ../ 경로로 업로드하면 직접 접근이 가능하게 됩니다. image exploit

  • 해당 서비스의 경우 확장자 검증 필터링은 하고있으나, 필터링된 파일들도 forbidden 폴더에 따로 업로드 되기때문에 임의 경로에 파일 업로드가 가능해집니다.
  • 또한 해당 파일 내 커맨드를 실행하는 스크립트를 포함시키면 RCE가 가능합니다.

대응 방안

  • 해당 취약점은 애초에 파일 업로드 시 서버 측에서 파일 및 확장자 검증 기능을 수행할 경우 상당히 제한적인 공격입니다.
  • 하지만, 취약한 환경에서 파일 업로드 시 검증을 수행하지 않는 환경에서 RCE 악용이 가능하므로 상당히 치명적이라 할 수 있습니다.
  • 해당 취약점에 대응하기 위해서는 파일 업로드 시 기본적으로 파일 및 확장자 검증을 수행하고, Apache Struts 2 버전 2.5.33 또는 6.3.0.2 이상으로 업그레이드해야 합니다.