yon11b

[SK 쉴더스 루키즈] [CI/CD GOAT] White Rabbit 문제 Write up 본문

보안/SK 쉴더스 루키즈

[SK 쉴더스 루키즈] [CI/CD GOAT] White Rabbit 문제 Write up

yon11b 2026. 4. 30. 23:28
반응형

 

문제

 

풀이

1. 사전 지식 점검

CICD GOAT의 환경은 이런 구조로 되어있다.

 

이번 문제에서는 Gitea-Jenkins만 이해하면 된다.

 

Gitea

코드 관리해주는 곳.

Github이랑 비슷한 느낌

Jenkins

Gitea 코드 변경되면 자동으로 빌드·테스트·배포까지 해주는 서버

코드 변경 ->  Jenkins가 빌드 -> 그 로그기록을 Jenkins UI에서 볼 수 있음

 

docker ps 뒷부분만 자른 것

jenkins는 8080에서, gitea는 3000에서 돌아간다.

 

2. 진짜 풀이

방향 잡기

문제를 보면 Jenkins credential store에 있는 flag1을 찾으라고 한다.

 

Jenkins credential store은 어떻게 접근할까?

 

1. Jenkins 웹UI에서 접근

 -> 관리자 권한 없어서 못함

 

 

2. Jenkinsfile을 통해서 빼내기

 -> 이 방식을 사용해보자!

 

gitea 코드가 수정되면 jenkins는 가장 먼저 jenkinsfile을 보고 어떻게 빌드할지를 결정한다.

또, Jenkinsfile은 credentials("flag1") 구문을 통해, 해당 Job에 사용 권한이 있는 Jenkins Credential을 환경변수로 주입받을 수 있다.

따라서 우리는 jenkinsfile을 조작하면 된다.

 

Jenkinsfile 수정하기

수정하려고 봤더니 main 브랜치에서는 권한이 없어서 수정이 안 된다.

그래서 hack 브랜치를 새로 만들고 Jenkinsfile 를 다음과 같이 수정했다.

pipeline {
    agent any
    environment {
        FLAG = credentials("flag1")
    }

    stages {
        stage ('Show flag1') {
            steps {
                sh """
                    echo $FLAG | base64
                """
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}

 

base64 인코딩 한 이유: 중간에 특수문자때문에 일부 문자가 소실 될까봐 인코딩을 한 것이다.

 

잘 수정이 되었다.

수정만 해서는 Jenkins가 작동하지 않는다. 어떻게든 main이 감지할 수 있도록 깔짝대야 한다.

그러기 위해서 hack 브랜치를 PR 날려준다.

그럼 이렇게 Jenkins UI에서 빌드내역을 확인할 수 있다.

 

show flag stage에서 base64로 인코딩된 flag1을 확인할 수 있다.

 

저 문자열을 디코딩해서 나온 값을 ctfd에 가서 정답 입력해주면 된다.

 

해결!

 

전체 흐름 정리

Gitea에서 브랜치 생성
→ Jenkinsfile 수정
→ PR 생성
→ Jenkins 빌드 트리거
→ credentials("flag1")로 flag1 주입
→ echo $FLAG | base64 실행
→ Jenkins 로그에서 base64 값 확인
→ 디코딩 후 제출

728x90