
취약한 애플리케이션과 함께 시크릿을 사용하지 않는 방법을 보여주는 예제들
OWASP WrongSecrets 게임에 오신 것을 환영합니다! 이 게임은 소프트웨어에서 시크릿을 저장하지 않는 방법에 대한 실제 사례들로 가득 차 있습니다. 각 사례는 도전 과제로 구성되어 있으며, 다양한 도구와 기술을 사용하여 해결해야 합니다. 이러한 도전 과제를 풀다 보면 일반적인 실수를 인식하고, 자신의 시크릿 관리 전략을 되돌아볼 수 있습니다.
67개의 모든 도전 과제를 해결할 수 있나요?
Heroku 데모 환경에서 몇 가지를 시도해 보세요.
다른 도전 과제를 플레이하고 싶나요? 아래에 설정 방법에 대한 지침을 읽어보세요.
WrongSecrets가 처음이신가요? 여기서 시작하세요:
그런 다음 http://localhost:8080을 엽니다. 3. 무엇이 앞에 있는지 보고 싶으신가요? 최신 기능이 포함된 최첨단 마스터 컨테이너를 사용해 보세요: ```bash docker run -p 8080:8080 -p 8090:8090 ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master
⚠️ *참고: 이는 개발 버전이며 불안정할 수 있습니다*
4. **고급 설정**: 클라우드 챌린지 및 Kubernetes 연습에 대한 자세한 지침은 아래를 참조하세요.
**학습 내용:**
- 일반적인 비밀 관리 실수
- 노출된 자격 증명 식별 방법
- 비밀 보호를 위한 모범 사례
- 비밀 탐지를 위한 도구 및 기술
**작동 방식:**
이 저장소에는 코드베이스 전체에 숨겨진 실제 및 가짜 비밀이 포함된 **의도적으로 취약한 코드 및 구성 파일**이 포함되어 있습니다. 소스 코드, 구성 파일, Docker 컨테이너 및 클라우드 배포를 검토하여 이러한 비밀을 발견하게 됩니다. 각 챌린지는 실제 애플리케이션에서 비밀이 실수로 노출될 수 있는 다양한 방법을 가르쳐 줍니다.

## 📋 전제 조건
**기본 사용:**
- 웹 브라우저
- Docker (로컬 설정용) - [여기서 설치](https://docs.docker.com/get-docker/)
**고급 설정:**
- Kubernetes/Minikube - [여기서 설치](https://minikube.sigs.k8s.io/docs/start/)
- 클라우드 챌린지용 클라우드 계정 (AWS/GCP/Azure)
- 명령줄 사용 경험
<a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/README.md"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-no-action.svg" /></a>
## 목차
### 🎯 시작하기
- [빠른 시작](#-quick-start)
- [전제 조건](#-prerequisites)
- [지원](#support)
### 🐳 배포 옵션
- [기본 Docker 연습](#basic-docker-exercises)
- [Heroku에서 실행](#running-these-on-heroku)
- [Render.io에서 실행](#running-these-on-renderio)
- [Railway에서 실행](#running-these-on-railway)
- [기본 K8s 연습](#basic-k8s-exercise)
- [Minikube 기반](#minikube-based)
- [k8s 기반](#k8s-based)
- [Minikube를 사용한 Vault 연습](#vault-exercises-with-minikube)
### ☁️ 클라우드 챌린지
- [클라우드 챌린지](#cloud-challenges)
- [AWS에서 WrongSecrets 실행](#running-wrongsecrets-in-aws)
- [GCP에서 WrongSecrets 실행](#running-wrongsecrets-in-gcp)
- [Azure에서 WrongSecrets 실행](#running-wrongsecrets-in-azure)
- [자체 클라우드에서만 Challenge15 실행](#running-challenge15-in-your-own-cloud-only)
### 🎮 고급 사용
- [지침 없이 플레이하고 싶으신가요?](#do-you-want-to-play-without-guidance-or-spoils)
- [CTF](#ctf)
- [CTFD 지원](#ctfd-support)
- [FBCTF 지원](#fbctf-support-experimental)
- [OWASP WrongSecrets를 비밀 탐지 벤치마크로 사용](#use-owasp-wrongsecrets-as-a-secret-detection-benchmark)
### 👨💻 개발 및 기여
- [개발 참고 사항](#notes-on-development)
- [Spring Boot 4 채택 체크리스트](https://github.com/owasp/wrongsecrets/blob/HEAD/docs/SPRING_BOOT_4_ADOPTION_CHECKLIST.md)
- [의존성 관리](#dependency-management)
- [IntelliJ IDEA에서 프로젝트 시작](#get-the-project-started-in-intellij-idea)
- [개발 중 자동 리로드](#automatic-reload-during-development)
- [챌린지 추가 방법](#how-to-add-a-challenge)
- [로컬 테스트](#local-testing)
- [로컬 자동화 테스트](#Local-automated-testing)
- [자체 릴리스에서 챌린지를 비활성화하고 싶으신가요?](#want-to-disable-challenges-in-your-own-release)
### 📚 리소스 및 커뮤니티
- [특별 감사 및 기여자](#special-thanks--contributors)
- [스폰서십](#sponsorships)
- [도움 요청](#help-wanted)
- [비밀 관리 관련 추가 자료](#further-reading-on-secrets-management)
## 지원
지원이 필요하신가요? [OWASP Slack](https://owasp.slack.com/archives/C02KQ7D9XHR) (가입은 [여기](https://owasp.org/slack/invite))을 통해 문의하시거나, [PR](https://github.com/OWASP/wrongsecrets/pulls)을 제출하거나, [이슈](https://github.com/OWASP/wrongsecrets/issues)를 등록하거나, [토론](https://github.com/OWASP/wrongsecrets/discussions)을 이용해 주세요. 이 프로젝트는 OWASP 자원봉사 기반 프로젝트이므로 응답까지 시간이 다소 걸릴 수 있습니다.
저작권 (c) 2020-2025 Jeroen Willemsen 및 WrongSecrets 기여자.
## 🛤️ 경로 선택
어떤 설정이 적합한지 확신이 없으신가요? 빠른 안내입니다:
| **원하는 작업** | **권장 설정** | **사용 가능한 챌린지** |
|------------------|----------------------|--------------------------|
| 빠르게 온라인으로 시도 | [Heroku에서 실행되는 컨테이너](https://www.wrongsecrets.com/) | 기본 챌린지 (0-4, 8, 12-32, 34-43, 49-52, 54-66) |
| Docker로 로컬 실행 | [기본 Docker](#basic-docker-exercises) | 위와 동일, 단 로컬 머신에서 |
| Kubernetes 비밀 학습 | [K8s/Minikube 설정](#basic-k8s-exercise) | Kubernetes 챌린지 (0-6, 8, 12-43, 48-66) |
| 클라우드 비밀 실습 | [클라우드 챌린지](#cloud-challenges) | 모든 챌린지 (0-66) |
| 워크숍/CTF 실행 | [CTF 설정](#ctf) | 사용자 정의 가능한 챌린지 세트 |
| 프로젝트에 기여 | [개발 설정](#notes-on-development) | 모든 챌린지 + 개발 도구 |
## 기본 Docker 연습
_챌린지 0-4, 8, 12-32, 34-43, 49-52, 54-66에 사용 가능_
기본 Docker 연습을 위해 현재 필요합니다:
- Docker [여기서 설치](https://docs.docker.com/get-docker/)
- HTML을 렌더링할 수 있는 브라우저
다음을 통해 설치할 수 있습니다:```bash
docker run -p 8080:8080 -p 8090:8090 jeroenwillemsen/wrongsecrets:latest-no-vault
🚀 최첨단 버전을 사용해보고 싶으신가요?
다음 릴리스에서 제공될 기능을 미리 확인해보고 싶다면, 자동으로 빌드된 마스터 컨테이너를 사용할 수 있습니다:```bash docker run -p 8080:8080 -p 8090:8090 ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master
⚠️ **경고**: 이는 최신 master 브랜치에서 빌드된 개발 버전으로, 실험적인 기능이나 불안정성이 포함될 수 있습니다.
**📝 포트에 관한 참고 사항:**
- 포트 **8080**: 메인 애플리케이션 (챌린지 0-66)
- 포트 **8090**: MCP 서버 (챌린지 60에 필요)
**📝 챌린지 62 (Google Drive MCP) 참고 사항:**
챌린지 62는 전체 기능을 사용하려면 Google 서비스 계정을 구성해야 합니다. 설정 방법은 [docs/CHALLENGE62_GOOGLE_DRIVE_SETUP.md](https://github.com/owasp/wrongsecrets/blob/HEAD/docs/CHALLENGE62_GOOGLE_DRIVE_SETUP.md)를 참조하세요. 구성하지 않으면 챌린지에 자리 표시자 메시지가 표시됩니다.
이제 아래 링크에서 제공되는 챌린지를 풀어 비밀을 찾을 수 있습니다.
<details>
<summary>모든 docker 챌린지 링크 (삼각형을 클릭하여 블록을 열어보세요).
</summary>
- [localhost:8080/challenge/challenge-0](http://localhost:8080/challenge/challenge-0)
- [localhost:8080/challenge/challenge-1](http://localhost:8080/challenge/challenge-1)
- [localhost:8080/challenge/challenge-2](http://localhost:8080/challenge/challenge-2)
- [localhost:8080/challenge/challenge-3](http://localhost:8080/challenge/challenge-3)
- [localhost:8080/challenge/challenge-4](http://localhost:8080/challenge/challenge-4)
- [localhost:8080/challenge/challenge-8](http://localhost:8080/challenge/challenge-8)
- [localhost:8080/challenge/challenge-12](http://localhost:8080/challenge/challenge-12)
- [localhost:8080/challenge/challenge-13](http://localhost:8080/challenge/challenge-13)
- [localhost:8080/challenge/challenge-14](http://localhost:8080/challenge/challenge-14)
- [localhost:8080/challenge/challenge-15](http://localhost:8080/challenge/challenge-15)
- [localhost:8080/challenge/challenge-16](http://localhost:8080/challenge/challenge-16)
- [localhost:8080/challenge/challenge-17](http://localhost:8080/challenge/challenge-17)
- [localhost:8080/challenge/challenge-18](http://localhost:8080/challenge/challenge-18)
- [localhost:8080/challenge/challenge-19](http://localhost:8080/challenge/challenge-19)
- [localhost:8080/challenge/challenge-20](http://localhost:8080/challenge/challenge-20)
- [localhost:8080/challenge/challenge-21](http://localhost:8080/challenge/challenge-21)
- [localhost:8080/challenge/challenge-22](http://localhost:8080/challenge/challenge-22)
- [localhost:8080/challenge/challenge-23](http://localhost:8080/challenge/challenge-23)
- [localhost:8080/challenge/challenge-24](http://localhost:8080/challenge/challenge-24)
- [localhost:8080/challenge/challenge-25](http://localhost:8080/challenge/challenge-25)
- [localhost:8080/challenge/challenge-26](http://localhost:8080/challenge/challenge-26)
- [localhost:8080/challenge/challenge-27](http://localhost:8080/challenge/challenge-27)
- [localhost:8080/challenge/challenge-28](http://localhost:8080/challenge/challenge-28)
- [localhost:8080/challenge/challenge-29](http://localhost:8080/challenge/challenge-29)
- [localhost:8080/challenge/challenge-30](http://localhost:8080/challenge/challenge-30)
- [localhost:8080/challenge/challenge-31](http://localhost:8080/challenge/challenge-31)
- [localhost:8080/challenge/challenge-32](http://localhost:8080/challenge/challenge-32)
- [localhost:8080/challenge/challenge-34](http://localhost:8080/challenge/challenge-34)
- [localhost:8080/challenge/challenge-35](http://localhost:8080/challenge/challenge-35)
- [localhost:8080/challenge/challenge-36](http://localhost:8080/challenge/challenge-36)
- [localhost:8080/challenge/challenge-37](http://localhost:8080/challenge/challenge-37)
- [localhost:8080/challenge/challenge-38](http://localhost:8080/challenge/challenge-38)
- [localhost:8080/challenge/challenge-39](http://localhost:8080/challenge/challenge-39)
- [localhost:8080/challenge/challenge-40](http://localhost:8080/challenge/challenge-40)
- [localhost:8080/challenge/challenge-41](http://localhost:8080/challenge/challenge-41)
- [localhost:8080/challenge/challenge-42](http://localhost:8080/challenge/challenge-42)
- [localhost:8080/challenge/challenge-43](http://localhost:8080/challenge/challenge-43)
- [localhost:8080/challenge/challenge-49](http://localhost:8080/challenge/challenge-49)
- [localhost:8080/challenge/challenge-50](http://localhost:8080/challenge/challenge-50)
- [localhost:8080/challenge/challenge-51](http://localhost:8080/challenge/challenge-51)
- [localhost:8080/challenge/challenge-52](http://localhost:8080/challenge/challenge-52)
- [localhost:8080/challenge/challenge-54](http://localhost:8080/challenge/challenge-54)
- [localhost:8080/challenge/challenge-55](http://localhost:8080/challenge/challenge-55)
- [localhost:8080/challenge/challenge-56](http://localhost:8080/challenge/challenge-56)
- [localhost:8080/challenge/challenge-57](http://localhost:8080/challenge/challenge-57)
- [localhost:8080/challenge/challenge-58](http://localhost:8080/challenge/challenge-58)
- [localhost:8080/challenge/challenge-59](http://localhost:8080/challenge/challenge-59)
- [localhost:8080/challenge/challenge-60](http://localhost:8080/challenge/challenge-60)
- [localhost:8080/challenge/challenge-61](http://localhost:8080/challenge/challenge-61)
- [localhost:8080/challenge/challenge-62](http://localhost:8080/challenge/challenge-62)
- [localhost:8080/challenge/challenge-63](http://localhost:8080/challenge/challenge-63)
- [localhost:8080/challenge/challenge-64](http://localhost:8080/challenge/challenge-64)
- [localhost:8080/challenge/challenge-65](http://localhost:8080/challenge/challenge-65)
- [localhost:8080/challenge/challenge-66](http://localhost:8080/challenge/challenge-66)
</details>
이러한 챌린지는 아직 매우 기본적이며, 설명도 그에 맞춰 간단합니다. 더 나은 모양을 위해 PR을 제출해 주세요 ;-).
### Heroku에서 실행하기
[https://wrongsecrets.herokuapp.com/](https://wrongsecrets.herokuapp.com/)에서도 테스트할 수 있습니다! Heroku 팀이 멋진 오픈소스 지원 패키지를 제공해 주셔서, 앱을 거의 항상 가동되는 상태로 무료로 실행할 수 있습니다. 그렇지만, 다른 사람들이 테스트 드라이브를 할 수 있도록 퍼징하거나 다운시키려고 하지 말아 주세요.
호스팅된 버전을 사용하려면 [이 링크](https://wrongsecrets.herokuapp.com/)를 이용하세요. 직접 Heroku에 호스팅하려면(예: 교육 목적) [이 링크](https://heroku.com/deploy?template=https://github.com/OWASP/wrongsecrets/tree/master)를 클릭하면 됩니다. 이로 인해 발생하는 비용에 대해 프로젝트 및/또는 유지관리자는 책임을 지지 않습니다.
### Render.io에서 실행하기
*상태: 실험적*
[https://wrongsecrets.onrender.com/](https://wrongsecrets.onrender.com/)에서 테스트할 수 있습니다. 무료 티어 인스턴스에서 실행되고 있으므로 보장할 수 없습니다. 다른 사람들이 테스트 드라이브를 할 수 있도록 퍼징하거나 다운시키려고 하지 말아 주세요.
Render로 직접 배포하고 싶으신가요? 아래 버튼을 클릭하세요:
[](https://render.com/deploy?repo=https://github.com/OWASP/wrongsecrets)
### Railway에서 실행하기
*상태: [alphasec.io](https://github.com/alphasecio)에서 유지 관리*
Railway에 WrongSecrets를 호스팅하려면 [이 원클릭 템플릿](https://railway.com/deploy/McqJ_j?referralCode=I07F1)을 배포하면 됩니다. Railway는 더 이상 항상 무료 플랜을 제공하지 않지만, 무료 평가판으로 업그레이드 전에 충분히 테스트 드라이브를 할 수 있습니다. 단계별 가이드가 필요하다면 [이 블로그 게시물](https://alphasec.io/test-your-secret-management-skills-with-owasp-wrongsecrets/)을 참조하세요.
[](https://railway.com/deploy/McqJ_j?referralCode=I07F1j)
## 기본 K8s 연습
_챌린지 0-6, 8, 12-43, 48-66에 사용 가능_
### Minikube 기반
다음이 설치되어 있는지 확인하세요:
- Docker [여기서 설치](https://docs.docker.com/get-docker/)
- Minikube [여기서 설치](https://minikube.sigs.k8s.io/docs/start/)
현재 K8S 설정은 로컬에서의 편의를 위해 Minikube를 사용하는 것을 기반으로 합니다. 프로젝트 루트에서 아래 명령어를 사용할 수 있습니다:```bash
minikube start
kubectl apply -f k8s/secrets-config.yml
kubectl apply -f k8s/secrets-secret.yml
kubectl apply -f k8s/challenge33.yml
kubectl apply -f k8s/challenge53/secret-challenge53.yml
echo "Setting up the bitnami sealed secret controler"
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl apply -f k8s/sealed-secret-controller.yaml
kubectl apply -f k8s/main.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
kubectl create -f k8s/sealed-challenge48.json
echo "finishing up the sealed secret controler part"
wait 10 #or check whether secret48 is there
kubectl apply -f k8s/secret-challenge-deployment.yml
while [[ $(kubectl get pods -l app=secret-challenge -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for secret-challenge" && sleep 2; done
kubectl expose deployment secret-challenge --type=LoadBalancer --port=8080
minikube service secret-challenge
또는 다음과 같이 할 수 있습니다 :```bash ./k8s-vault-minikube-start.sh
이제 제공된 IP 주소와 포트를 사용하여 (localhost 대신) K8s 변형을 더 실험할 수 있습니다.
- [localhost:8080/challenge/challenge-5](http://localhost:8080/challenge/challenge-5)
- [localhost:8080/challenge/challenge-6](http://localhost:8080/challenge/challenge-6)
- [localhost:8080/challenge/challenge-33](http://localhost:8080/challenge/challenge-33)
- [localhost:8080/challenge/challenge-48](http://localhost:8080/challenge/challenge-48)
- [localhost:8080/challenge/challenge-53](http://localhost:8080/challenge/challenge-53)
### k8s 기반
자신의 k8s에서 vanilla를 실행하고 싶으신가요? 아래 명령어를 사용하세요:```bash
kubectl apply -f k8s/secrets-config.yml
kubectl apply -f k8s/secrets-secret.yml
echo "Setting up the bitnami sealed secret controler"
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl apply -f k8s/sealed-secret-controller.yaml
kubectl apply -f k8s/main.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
kubectl create -f k8s/sealed-challenge48.json
echo "finishing up the sealed secret controler part"
wait 10 #or check whether secret48 is there
kubectl apply -f k8s/challenge33.yml
kubectl apply -f k8s/secret-challenge-deployment.yml
while [[ $(kubectl get pods -l app=secret-challenge -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for secret-challenge" && sleep 2; done
kubectl port-forward \
$(kubectl get pod -l app=secret-challenge -o jsonpath="{.items[0].metadata.name}") \
8080:8080
now you can use the provided IP address and port to further play with the K8s variant (instead of localhost).
챌린지 0-8, 12-66에 사용 가능 다음이 설치되어 있는지 확인하십시오:
./k8s-vault-minikube-start.sh를 실행하면, 스크립트가 완료된 후 챌린지가 http://localhost:8080에서 기다립니다. 이를 통해 챌린지 0-8, 12-66을 실행할 수 있습니다.
k8s-vault-minikube-start.sh 스크립트를 중지하고 포트 포워딩을 재개하려면 k8s-vault-minikube-resume.sh를 실행하십시오.
그 이유는 시작 스크립트를 다시 실행하면 vault의 비밀이 교체되고 secret-challenge 애플리케이션이 새 비밀로 업데이트되지 않기 때문입니다.
챌린지 0-66에 사용 가능
참고: 아래 연습에는 IAM 권한 상승 연습이 포함되어 있으므로, 프로덕션 환경과 관련된 계정이나 계정 전체 리소스에 영향을 줄 수 있는 계정에서는 절대 실행하지 마십시오.
AWS 하위 폴더의 README에 있는 단계를 따르십시오.
GCP 하위 폴더의 README에 있는 단계를 따르십시오.
Azure 하위 폴더의 README에 있는 단계를 따르십시오.
클라우드 배포에 자체 Canarytokens을 포함하려면 다음을 수행하십시오:
AWS Keys를 선택하고 웹후크 URL 필드에 <1단계에서 생성한 도메인>/canaries/tokencallback을 입력합니다.각 챌린지에는 힌트 보기 버튼과 무엇이 문제인가요? 버튼이 있습니다. 이 버튼은 챌린지를 단순화하고 독자에게 설명을 제공하는 데 도움을 줍니다. 하지만 해킹 연습으로 하려는 경우 설명이 재미를 망칠 수 있습니다.
따라서 환경에서 다음 설정을 재정의하여 조작할 수 있습니다:
hints_enabled=false는 힌트 보기 버튼을 비활성화합니다.reason_enabled=false는 무엇이 문제인가요? 설명 버튼을 비활성화합니다.spoiling_enabled=false는 /spoil/challenge-x 엔드포인트를 비활성화합니다 (여기서 x는 챌린지의 짧은 이름).Docker 컨테이너를 실행할 때 SPRINGDOC_UI와 SPRINGDOC_DOC을 재정의하여 Swagger 문서와 Swagger UI를 활성화할 수 있습니다.
리더:
주요 기여자:
기여자:
테스터:
특별 감사:
다음 당사자들의 도움에 감사드립니다:
GitGuardian의 후원 덕분에 클라우드 계정 비용을 지불할 수 있습니다.
Jetbrains는 프로젝트 리더에게 Intellij IDEA Ultimate Edition 인스턴스 라이선스를 제공했습니다. 이것이 없었다면 이렇게 빠르게 개발할 수 없었을 것입니다!
1Password는 비밀 탐지 테스트베드를 위해 1Password 오픈 소스 라이선스를 제공했습니다.
AWS는 AWS 오픈 소스 크레딧을 제공하여 AWS에서 프로젝트와 Wrongsecrets CTF Party 설정을 테스트할 수 있게 했습니다.
다음 방법으로 도움을 줄 수 있습니다:
Docker와 Git 모두에 대한 수많은 비밀 탐지 도구가 등장함에 따라, 우리는 이에 대한 벤치마크 테스트베드를 만들고 있습니다. 도구가 모든 것을 탐지하는지 알고 싶으신가요? 우리는 이 이슈에 포함된 비밀을 추적하고 있으며, 도구가 탐지할 추가 비밀을 넣은 브랜치도 있습니다. 이 브랜치에는 Docker 컨테이너 생성 스크립트가 포함되어 있어 컨테이너 비밀 스캐닝을 테스트할 수 있습니다.
이제 WrongSecrets 코드베이스에 대해 여러 비밀 스캐닝 도구를 벤치마킹하는 자동화된 GitHub Action 워크플로우를 제공합니다. 비밀 스캐너 비교 워크플로우는 7가지 다른 도구를 테스트합니다:
워크플로우는 매주 실행되며 각 도구가 탐지하는 비밀 수에 대한 비교 표를 제공하여 다양한 비밀 스캐닝 도구의 상대적 효과를 이해하는 데 도움을 줍니다. 실행 및 결과 해석에 대한 자세한 내용은 docs/scanner-comparison.md를 참조하십시오.
CTF를 플레이하는 3가지 방법이 있습니다:
무료 Heroku wrongsecrets-ctf 인스턴스를 기반으로 CTFD와 함께 CTF를 플레이하고 싶으신가요? 가능합니다!
참고: CTFD 지원은 이제 Juiceshop CTF CLI를 기반으로 작동합니다.
참고-II: https://wrongsecrets-ctf.herokuapp.com (OSS 크레딧 부족으로 일시 중단됨)는 Heroku를 기반으로 하며 용량이 제한적입니다.
CTFD용 zip 파일의 초기 생성은 아래 단계를 실행하기 전에 https://wrongsecrets-ctf.herokuapp.com/api/Challenges를 한 번 방문해야 합니다.
다음 단계를 따르십시오:```shell npm install -g [email protected] juice-shop-ctf #choose ctfd and https://wrongsecrets-ctf.herokuapp.com as domain. No trailing slash! The key is 'TRwzkRJnHOTckssAeyJbysWgP!Qc2T', feel free to enable hints. docker run -p 8001:8000 -it ctfd/ctfd:3.7.4
> **참고:** WrongSecrets 인스턴스에서 힌트가 활성화되어 있어야만 힌트가 생성됩니다 (`HINTS_ENABLED=true`). Heroku CTF 인스턴스 ([https://wrongsecrets-ctf.herokuapp.com](https://wrongsecrets-ctf.herokuapp.com))는 `HINTS_ENABLED=false`로 실행되므로 "무료 힌트" 또는 "유료 힌트"를 선택하면 빈 힌트 목록이 표시됩니다. 힌트를 생성하려면 `HINTS_ENABLED=true`로 설정하여 자신의 인스턴스를 실행하세요.
이제 [http://localhost:8001](http://localhost:8001)에서 CTFD 인스턴스를 방문하여 CTF를 설정하세요.
그런 다음 관리자 백업 기능을 사용하여 juice-shop-ctf 명령으로 만든 zip 파일을 가져오세요.
[https://wrongsecrets-ctf.herokuapp.com](https://wrongsecrets-ctf.herokuapp.com)를 사용하여 게임을 시작하세요!
직접 설정하고 싶으신가요? 가능합니다! 다만, 다른 사람이 키를 발견하지 않도록 주의하세요. 실제 ctf-key가 포함된 실행 중인 컨테이너가 청중에게 노출되지 않도록 안전하게 보호하세요. Heroku 컨테이너와 유사하게 말이죠.
## FBCTF 지원 (실험적!)
참고: FBCTF 지원은 실험적입니다.
CTFD와 동일한 단계를 따르되, 이번에는 fbctfd를 선택하고 countrymapping URL로 `https://raw.githubusercontent.com/OWASP/wrongsecrets/79a982558016c8ce70948a8106f9a2ee5b5b9eea/config/fbctf.yml`을 선택하세요.
그런 다음 [https://github.com/facebookarchive/fbctf/wiki/Quick-Setup-Guide](https://github.com/facebookarchive/fbctf/wiki/Quick-Setup-Guide)를 참조하여 FBCTF를 실행하세요.
## 개발 참고 사항
로컬 머신에서 개발하려면 `local` 프로필을 사용하세요: `./mvnw spring-boot:run -Dspring-boot.run.profiles=local,without-vault`
K8s 없이 vault를 테스트하려면 vault를 로컬에서 시작하세요:```shell
export SPRING_CLOUD_VAULT_URI='http://127.0.0.1:8200'
export VAULT_API_ADDR='http://127.0.0.1:8200'
vault server -dev
그리고 다음 터미널에서 (이전 명령의 토큰을 사용하여) 다음을 실행하세요:```shell export SPRING_CLOUD_VAULT_URI='http://127.0.0.1:8200' export SPRING_CLOUD_VAULT_TOKEN='' vault token create -id="00000000-0000-0000-0000-000000000000" -policy="root" vault kv put secret/secret-challenge vaultpassword.password="$(openssl rand -base64 16)" vault kv put secret/injected vaultinjected.value="$(openssl rand -base64 16)" vault kv put secret/codified challenge47secret.value="debugvalue"
이제 `local-vault` 프로필을 사용하여 개발을 진행하세요.```shell
./mvnw spring-boot:run -Dspring-boot.run.profiles=local,local-vault
Vault 인스턴스 없이 개발하고 싶다면, without-vault 프로파일을 추가로 사용하여 개발하십시오:```shell
./mvnw spring-boot:run -Dspring-boot.run.profiles=local,without-vault
컨테이너를 푸시하고 싶으신가요? `.github/scripts/docker-create-and-push.sh`를 참조하세요. 모든 컨테이너를 생성하고 푸시하는 스크립트입니다. 컨테이너를 구성하기 전에 앱을 다시 빌드하는 것을 잊지 마세요.
Vault의 어떤 것이 Kubernetes에서 작동하지 않는 이유를 확인하고 싶으신가요? `kubectl exec vault-0 -n vault -- vault audit enable file file_path=stdout`를 실행하세요.
### 종속성 관리
취약점을 확인하기 위해 CycloneDX와 OWASP Dependency-check를 통합했습니다. OWASP Dependency-checker를 사용하려면 `mvn dependency-check:aggregate`를 호출하고, CycloneDX를 사용하여 SBOM을 생성하려면 `mvn cyclonedx:makeBom`을 호출하면 됩니다.
### Dependency-Check Maven 플러그인 구성
OWASP WrongSecrets는 [`dependency-check-maven`](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html) 플러그인을 사용하여 프로젝트 종속성에서 알려진 취약점(CVE)을 자동으로 스캔합니다.
#### 작동 방식
- 플러그인은 Maven 빌드(`./mvnw clean install`) 중에 실행되어 공개 취약점 데이터베이스에 대해 모든 종속성을 확인합니다.
- 기본적으로 NVD(국가 취약점 데이터베이스)를 사용하며, 추가 범위를 위해 OSS Index도 사용할 수 있습니다.
#### 구성 주요 사항
플러그인은 `pom.xml`의 `<build><plugins>` 섹션에 구성됩니다:```xml
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>${dependency-check-maven.version}</version>
<configuration>
<nvdApiKey>...</nvdApiKey>
<assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled>
<ossIndexServerId>ossindex</ossIndexServerId>
<ossIndexAnalyzerEnabled>true</ossIndexAnalyzerEnabled> <!-- SET THIS TO FALSE IF YOU HAVE NO SONATYPE ACCOUNT! -->
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
settings.xml에 있는 자격 증명을 참조합니다 (아래 참조).true로 설정합니다. 인증 오류(401)가 발생하면 이 값을 false로 설정하여 OSS Index를 비활성화합니다.OSS Index를 사용하려면 Maven settings.xml에 자격 증명을 추가해야 합니다:```xml
ossindex
YOUR_OSSINDEX_USERNAME
YOUR_OSSINDEX_API_TOKEN
`YOUR_OSSINDEX_USERNAME` 및 `YOUR_OSSINDEX_API_TOKEN`를 OSS Index 계정 세부 정보로 교체하세요.
#### 문제 해결
- OSS Index에서 `401 Unauthorized` 오류가 발생하면 자격 증명을 확인하거나 `pom.xml`에서 `<ossIndexAnalyzerEnabled>false</ossIndexAnalyzerEnabled>`를 설정하여 OSS Index를 비활성화하세요.
- NVD 기반 스캐닝만 선호하는 경우 OSS Index 없이 빌드를 실행할 수 있습니다.
#### 추가 정보
[Dependency-Check Maven Plugin 설명서](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html)에서 고급 구성 옵션을 확인하세요.
### IntelliJ IDEA에서 프로젝트 시작하기
요구 사항: 다음 도구가 설치되어 있는지 확인하세요: [Docker](https://www.docker.com/products/docker-desktop/), [Java25 JDK](https://jdk.java.net/25/), [NodeJS 24](https://nodejs.org/en/download/current) 및 [IntelliJ IDEA](https://www.jetbrains.com/idea/download).
1. 프로젝트를 포크하고 복제하는 방법은 [문서](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md)에 설명된 대로 따르세요.
2. IntelliJ에서 프로젝트를 가져옵니다 (예: mvn 프로젝트 / 로컬 소스로 가져오기)
3. 프로젝트 설정으로 이동하여 Java25를 사용하는지 확인하세요 (JDK를 찾을 수 있는지도 확인)
4. IDE 설정 > 언어 및 프레임워크 > Lombok으로 이동하여 Lombok 처리가 활성화되어 있는지 확인하세요.
5. IDEA에서 Maven 탭을 열고 "Reload All Maven Projects"를 실행하여 시스템이 동기화되고 모든 것을 다운로드하도록 하세요. 그런 다음, 같은 탭에서 OWASP WrongSecrets 라이프사이클의 "install" 옵션을 사용하여 asciidoc 등을 생성하세요.
6. 이제 `org.owasp.wrongsecrets.WrongSecretsApplication.java`의 `main` 메서드를 실행하세요. 스택 트레이스와 함께 실패해야 합니다.
7. 이제 앱의 실행 구성으로 이동하여 활성 프로필이 `without-vault`인지 확인하세요. VM 옵션 인수를 `--server.port=8080 --spring.profiles.active=local,without-vault`로 설정하면 됩니다. `K8S_ENV=docker`를 환경 인수로 설정하세요.
8. 6단계를 반복합니다: 앱을 다시 실행하면 브라우저에서 http://localhost:8080에 접속할 수 있는 제대로 실행되는 애플리케이션이 나타나야 합니다.
**그림 가이드** IntelliJ IDEA에서 프로젝트를 시작하는 방법에 대한 그림 가이드는 [_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-get-started-with-the-project-in-intellij-idea)에서 확인할 수 있습니다.
자유롭게 편집하고 풀 리퀘스트를 통해 변경 사항을 제안하세요. 작업이 승인되도록 하려면 [문서](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md)의 지침을 따르세요.
참고: 공식적으로는 Linux와 MacOS만 개발을 지원합니다. Windows 머신에서 개발하려면 WSL2 또는 Linux를 실행하는 가상 머신을 사용하세요. 첫 번째 실험을 위해 Windows 감지 및 여러 `exe` 파일을 포함했지만, 이에 대한 적극적인 유지관리자를 찾고 있습니다. Windows에서 실행되도록 하고 싶나요? PR을 만들어주세요 ;-).
이 섹션을 읽은 후에도 여전히 애플리케이션 코드에 대한 감이 없다면: [Baeldung의 Spring Boot 튜토리얼](https://www.baeldung.com/spring-boot)을 살펴보세요.
### 개발 중 자동 리로드
변경 사항을 더 빠르게 로드하기 위해 Maven 프로젝트에 `spring-dev-tools`를 추가했습니다. IntelliJ에서 자동으로 활성화하려면 다음을 확인하세요:
- 컴파일러 -> 프로젝트 자동 빌드가 활성화되어 있는지, 그리고
- 고급 설정 -> 현재 개발 중인 애플리케이션이 실행 중이더라도 자동 메이크를 시작하도록 허용.
수동으로 호출할 수도 있습니다: 빌드 -> 방금 변경한 파일을 다시 컴파일하면 애플리케이션 리로드가 강제됩니다.
### 챌린지 추가 방법
챌린지를 추가하려면 아래 단계를 따르세요:
1. 먼저 챌린지가 실제로 필요한 [이슈](https://github.com/OWASP/wrongsecrets/issues)가 보고되었는지 확인하세요.
2. `org.owasp.wrongsecrets.challenges` 폴더에 새 챌린지를 추가하세요. `src/main/resources/explanations`에 설명을 추가하고 새 Challenge 클래스에서 이를 참조하세요.
3. 챌린지가 작동함을 보여주기 위해 적절한 단위, 통합 및 UI 테스트를 추가하세요.
4. `src/main/resources/wrong-secrets-configuration.yaml`에서 챌린지를 구성하는 것을 잊지 마세요.
5. 컨트리뷰션 환경 설정 및 좋은 커밋 메시지 작성에 대한 [CONTRIBUTING 가이드](https://github.com/owasp/wrongsecrets/blob/HEAD/CONTRIBUTING.md)를 검토하세요.
자세한 내용은 [_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-add-a-challenge)를 참조하세요.
기존 클라우드 챌린지를 다른 클라우드로 이동하려면: `org.owasp.wrongsecrets.challenges.cloud` 패키지에서 Challenge 클래스를 확장하고 별도 클라우드가 식별된 폴더에 필요한 Terraform을 추가해야 합니다. 환경이 `org.owasp.wrongsecrets.RuntimeEnvironment`에 추가되었는지 확인하세요. 프로젝트의 다른 사람들과 협력하여 컨테이너를 실행하고 클라우드 계정에서 테스트할 수 있도록 하세요.
### 로컬 테스트
코드베이스를 변경하거나 새 챌린지를 추가한 후 병합 후 컨테이너가 어떻게 보일지 정확히 테스트하고 싶다면, 이 작업을 매우 쉽게 해주는 스크립트가 있습니다. 아래 단계를 따르세요:
1. bash가 설치되어 있고 열려 있는지 확인하세요.
2. .github/scripts로 이동하세요.
3. docker-create 스크립트 `bash docker-create.sh`를 실행하세요.
- 참고: minikube에서 실행하려면 먼저 `eval $(minikube docker-env)`를 실행하세요.
4. 주어진 지침을 따르세요, 패키지를 설치/변경해야 할 수도 있습니다.
5. 새로 생성된 컨테이너를 실행하세요:
- 로컬에서 실행: `docker run -p 8080:8080 -p 8090:8090 jeroenwillemsen/wrongsecrets:local-test-no-vault`
- minikube에서 실행: 배포 정의에서 컨테이너 `jeroenwillemsen/wrongsecrets:local-test-k8s-vault`를 사용하세요.
- minikube에서 Vault와 함께 실행: 배포 정의에서 컨테이너 `jeroenwillemsen/wrongsecrets:local-test-local-vault`를 사용하세요.
### 로컬 자동화 테스트
현재 2개의 다른 테스트 스위트가 있으며, 둘 다 `./mvnw test`로 실행됩니다.
- 일반적인 junit 단위 및 통합 테스트 스위트: [`test/java` 폴더](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/java)에 위치하며 출력은 기본 target 디렉터리에 저장됩니다.
- Cypress 테스트 스위트: junit 테스트를 통해 통합되며 [`test/e2e` 폴더](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/e2e)에 위치하고 출력은 [`target/test-classes/e2e/cypress/reports/`](https://github.com/owasp/wrongsecrets/blob/HEAD/target/test-classes/e2e/cypress/reports/)에 저장됩니다. 자세한 내용은 [cypress readme](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/e2e/cypress/README.md)를 참조하세요.
참고: `./mvnw clean install`로 정리, 빌드, 테스트의 전체 과정을 수행할 수 있습니다.
## 🔧 문제 해결
### 일반적인 문제
**Docker 문제:**
- **포트 이미 사용 중**: 포트 매핑 변경: `docker run -p 8081:8080 -p 8091:8090 jeroenwillemsen/wrongsecrets:latest-no-vault`
- **Docker를 찾을 수 없음**: Docker가 설치 및 실행 중인지 확인하세요.
- **권한 거부됨**: Linux에서는 사용자를 docker 그룹에 추가해야 할 수 있습니다.
**브라우저 문제:**
- **localhost:8080에 접근할 수 없음**: `docker ps`로 Docker 컨테이너가 실행 중인지 확인하세요.
- **챌린지가 로드되지 않음**: 브라우저 캐시를 지우거나 시크릿 모드를 시도하세요.
**Kubernetes 문제:**
- **Minikube가 시작되지 않음**: `minikube delete` 후 `minikube start`를 시도하세요.
- **Pod가 pending 상태에 멈춤**: `kubectl describe pod <pod-name>`으로 리소스를 확인하세요.
**도움이 필요하신가요?**
- [GitHub Issues](https://github.com/OWASP/wrongsecrets/issues)를 확인하세요.
- [OWASP Slack](https://owasp.slack.com/archives/C02KQ7D9XHR)에 참여하세요.
- [지원](#support) 섹션을 검토하세요.
## 플레이하고 싶지만 도구를 설치할 수 없나요?
챌린지를 플레이하고 싶지만 keepass, Radare 등의 도구를 설치할 수 없고 Docker 컨테이너를 실행할 수 있다면 다음을 시도하세요:```shell
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest
또는 더 구성 가능한 것을 사용하세요:```shell
docker run -d
--name=webtop
--security-opt seccomp=unconfined
-e PUID=1000
-e PGID=1000
-e TZ=Europe/London
-e SUBFOLDER=/
-e KEYBOARD=en-us-qwerty
-p 3000:3000
-v /var/run/docker.sock:/var/run/docker.sock
--shm-size="2gb"
--restart unless-stopped
jeroenwillemsen/wrongsecrets-desktop:latest
그런 다음 [http://localhost:3000](http://localhost:3000)에서 확인하세요.
참고: `jeroenwillemsen/wrongsecrets-desktop` 컨테이너를 Heroku에 배포하려고 할 때 주의하세요 ;-).
## macOS M1 및 Colima에서의 Docker (실험적!)
참고: Colima를 공식적으로 지원하지 않습니다. Github 러너가 많은 문제를 겪고 있음을 확인했기 때문입니다.
Docker Desktop/Podman으로 전환할 수 없고 Apple Silicon M1에서 Colima를 사용하여 Docker 이미지 `jeroenwillemsen/wrongsecrets`를 실행하려면 다음 중 하나를 시도하세요:
- Colima를 끕니다 (`colima stop`)
- Docker 컨텍스트를 변경합니다 (`docker --context desktop-linux run -p 8080:8080 jeroenwillemsen/wrongsecrets:latest-no-vault`)
- 1 CPU로 Colima를 실행합니다 (`colima start -m 8 -c 1 --arch x86_64`)
## 자신의 릴리스에서 챌린지를 비활성화하고 싶으신가요?
WrongSecrets를 실행하고 싶지만 다른 사람에게 제공하고 싶지 않은 특정 챌린지를 제외하려면: 이 섹션을 읽어주세요.
*_참고_* 아래 프로세스를 따를 때 귀하의 포크에 대해 어떠한 지원도 제공하지 않음을 알려드립니다. 원본 애플리케이션의 라이선스와 저작권은 귀하의 포크에 대해 그대로 유지된다는 점을 이해해 주시기 바랍니다.
요구 사항:
- Java 25 JDK가 설치되어 있어야 합니다;
- WrongSecrets 컨테이너 변형을 푸시할 수 있는 레지스트리 계정이 있어야 합니다;
다음은 특정 챌린지를 비활성화한 자신만의 WrongSecrets 릴리스를 만들기 위해 따라야 할 단계입니다:
1. 저장소를 포크합니다.
2. `src/main/resources/wrong-secrets-configuration.yaml`에서 더 이상 포크에 포함하고 싶지 않은 챌린지에 대한 참조를 제거합니다.
3. 프로젝트 루트에서 `./mvnw clean install`을 실행합니다
4. 이제 원하는 대상에 대한 Docker 이미지를 빌드합니다:```sh
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx build --platform linux/amd64,linux/arm64 -t <registry/container-name>:<yourtag>-no-vault --build-arg "argBasedPassword='this is on your command line'" --build-arg "PORT=8081" --build-arg "argBasedVersion=<yourtag>" --build-arg "spring_profile=without-vault" --push
docker buildx build --platform linux/amd64,linux/arm64 -t <registry/container-name>:<yourtag>-kubernetes-vault--build-arg "argBasedPassword='this is on your command line'" --build-arg "PORT=8081" --build-arg "argBasedVersion=<yourtag>" --build-arg "spring_profile=kubernetes-vault" --push
더 알아보고 싶으신가요? 아래 자료를 확인하세요: