CTF 사격장 구축, 웹 경진대회 출제 및 단말 도커 환경 구축

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

 앞에 쓰다

╔∨∀‿‿‿⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰⁰ ╗╗╗╗╗╗╗

여러분, 안녕하세요! 저는 Myon입니다. 클라우드 서버가 만료되지 않은 동안 CTF 대회를 위한 사격장 설정과 웹 대회 질문 작성 및 도커 환경 배포에 대한 매우 자세한 튜토리얼을 제공할 것입니다. 능력이 부족해서 기본적이고 간단한 것만 말씀드릴 수 있을 뿐입니다. 댓글창을 통해 서로 소통하고 배우실 수 있습니다. 이 블로그를 통해 새로운 것을 배우실 수 있기를 바랍니다. 또한 많은 관심과 기대 부탁드립니다. 지원하다!

╚∨∀‿‿‿‿‿️ ╝╝╝╝╝╝

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

예전에 이런 CTF 사격장을 구축해 본 적이 있기 때문에 이전에 제가 쓴 블로그를 읽어보시면 이전 블로그가 순전히 CTFd 기반이었다는 것을 아실 것입니다. 저는 우리 학교의 지난 CTF 대회의 구축, 운영 및 유지 관리와 Pwn 및 Web 대회 문제의 환경 배포를 담당했습니다. 이에 대해서는 나중에 소개하겠습니다.

먼저 완성된 제품 렌더링을 보여드리겠습니다.

첫 장:

순위:

도전과제:

발표:

저는 주로 이전 내용 중 일부를 보충하고 요약하기 위해 이 블로그를 작성합니다. 읽으시면서 이해가 되지 않는 부분이 있으면 이전 기사를 참고하시기 바랍니다. "웹사이트 구축" 칼럼에 다시 한번 감사드립니다. 응원과 관심!

 글을 시작하기에 앞서, 이해하기 쉽고 유머러스한 인공지능 학습 사이트를 소개하겠습니다.

인공지능 icon-default.png?t=N7T8https://www.captainbed.cn/myon/

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

사용 서버 : centos8 OK 텍스트 시작 ◉ ‿ ◉

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

목차

Part1, CTF 사격장 구축

1. github에서 H1ve 복제

2. 도커 설치

3. python-pip 설치 

4. 도커 작성 설치 

5. 이미지를 끌어와 싱글 모드 시작

6. 전체 H1ve 디렉터리의 모든 컨테이너를 자체 시작으로 설정합니다.

2부, 웹 공모전 출제 및 터미널 Docker 환경 구축

1. 질의서 작성

(1) 파일 폴더

(2) 도커파일

​(3) docker-compose.yml

2. Docker 환경 배포

3. 경쟁 질문의 프런트엔드 배포

4. 단말기 공모전 운영 및 유지보수


Part1, CTF 사격장 구축

새 서버이고 git 명령이 없으면 먼저 설치합니다.

yum install git

1. github에서 H1ve 복제

원하는 위치에 배치하시면 됩니다.저는 루트디렉토리에 Myon 폴더를 만들어서 복제해 두었습니다.

git clone https://github.com/D0g3-Lab/H1ve.git

복제 후에도 먼저 몇 가지를 설치해야 합니다.

냠 소스 설정

yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

2. 도커 설치

yum install -y docker-ce

 완료가 표시되면 설치가 완료되었음을 의미합니다.

docker 버전을 확인하고 부팅 시 자동으로 시작되도록 설정해 보겠습니다.

docker version

systemctl start docker

systemctl enable docker

그런 다음 docker-compose를 설치합니다.

(이 docker-compose 명령은 나중에 이미지를 가져올 때 및 경쟁 환경에서 자주 사용됩니다.)

3. python-pip 설치 

>

여기서 pip를 기본 설치하면 오류가 발생하므로 다음 명령을 먼저 실행하지 말고 나중에 오류 설명을 먼저 읽어보세요.

기본 설치는 Python2.7 버전이며 여기에는 Python3 버전의 pip가 필요합니다.

>

yum -y install epel-release

yum -y install python-pip

완료가 표시되면 설치가 성공한 것입니다. 명령을 사용하여 확인할 수도 있습니다.

pip -V

하지만 docker-compose를 설치하려고 하면 오류가 발생합니다.

pip install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple 

일반적인 의미는 pip 버전이 너무 오래되어 만족할만한 적절한 docker-compose 버전을 찾을 수 없다는 것입니다.

 pip 버전을 업그레이드해 보세요 

pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install --upgrade pip

그러나 다음과 같은 오류 보고서가 나타날 가능성이 높습니다.

docker-compose 요구 사항을 충족하는 버전을 찾을 수 없습니다(버전: ).
docker-compose와 일치하는 배포판을 찾을 수 없습니다.

pip 버전 8.1.2를 사용하고 있지만 버전 23.3.1을 사용할 수 있습니다.
'pip install --upgrade pip' 명령을 통해 업그레이드하는 것을 고려해야 합니다.

해결책: python3의 pip 설치

위의 pip -v를 통해 Python2.7의 기본 버전이 설치되어 있음을 알 수 있습니다.

이제 Python3의 pip를 설치하고 업그레이드합니다.

yum install python3-pip

pip3 install --upgrade pip

pip가 21.3.1로 성공적으로 업그레이드된 것을 확인할 수 있습니다. 

 모든 후속 pip 작업은 pip3으로 대체됩니다.

4. 도커 작성 설치 

pip3 install docker-compose -i https://pypi.tuna.tsinghua.edu.cn/simple 

성공적으로 설치되었음을 알 수 있으며, 경고창은 걱정하지 않으셔도 됩니다.

다음으로 이전에 복제한 H1ve 디렉터리를 입력합니다.

구성 파일 수정

(다음 오류가 이 단계와 관련이 있는지 확실하지 않기 때문에 이 단계를 먼저 수행하지 않는 것이 가장 좋습니다. 후속 이미지 가져오기 작업을 직접 시도하는 것이 좋습니다. 문제가 있는 경우 H1ve 삭제를 시도해 볼 수 있습니다. 그리고 다시 클론하세요)

sed -i 's/mariadb:10.4/mariadb:10.4.12/g' single.yml

sed -i 's/mariadb:10.4/mariadb:10.4.12/g' single-nginx.yml

5. 이미지를 끌어와 싱글 모드 시작

docker-compose -f single.yml up

다음 오류가 발생했습니다.

오류: mariadb:10.4.12.12.12.12에 대한 매니페스트를 찾을 수 없음: 알 수 없는 매니페스트: 알 수 없는 매니페스트 

이 상황은 docker가 다운로드한 이미지의 버전 번호를 지정해야 함을 의미합니다.

하지만 해결책을 찾지 못해 해당 단일.yml 파일을 교체했습니다.

그런 다음 끌어올 수 있습니다(이전 구성 파일을 수정하여 발생한 것으로 의심됩니다)

그런 다음 포트 8000에 액세스하십시오.

기본정보를 입력하시면 아래와 같은 페이지가 로딩됩니다.

그래서 H1ve를 삭제하고 테스트를 위해 다시 복제했습니다.

구성 파일 수정으로 인해 Single.yml에 문제가 있는지 확인

복제 후에는 아무것도 할 필요가 없습니다. 디렉터리로 가서 직접 끌어오기만 하면 실제로는 다음과 같이 됩니다.

그런 다음 Single-Nginx 모드를 당겨보십시오. 

docker-compose -f single-nginx.yml up

 성공적으로 끌어올 수 있지만 여기서는 액세스할 수 없습니다.

확인을 위해 구성 파일을 수정하고 성공적으로 가져올 수 있는지 확인합니다.

참 이상하네요 물론 이전 버전을 뽑았을 때 github에서 방금 clone한 버전의 환경에 영향을 미쳤을 가능성도 배제할 수는 없습니다.

일반적으로 제가 제안하는 것은 이미지를 복제한 후 직접 이미지를 가져오는 것입니다(나중에 테스트하려면 구성 파일을 설정하지 않고도 성공적으로 가져올 수 있습니다. 세부 사항은 여전히 ​​자체 서버의 환경 구성에 따라 다릅니다) . 도 가능하니 H1ve를 삭제하고 다시 복제해 보세요.

그런데 사용된 포트가 허용되고 서버의 보안 그룹 규칙에 설정되어 있는지도 확인해야 합니다.

물론, IP 주소에 직접 접속하여 사격장으로 이동하려면 포트 80을 8000으로 포워딩하도록 프록시 포워딩을 설정해야 할 수도 있습니다.

(앞서 말씀드린 것은 100% CTFd 기반으로 구축된 것에서는 필요하지 않습니다. IP에 직접 접속하는 것은 사격장 홈페이지입니다)

구체적인 내용은 이전 블로그인 "클라우드 서버 기반 블로그 및 사격장 구축 - 경험과 교훈"을 참조하시기 바랍니다.

H1ve와 관련된 모든 컨테이너를 열고 자체 시작으로 설정해야 합니다.

컨테이너 보기

docker ps -a

컨테이너 시작 

docker start 容器名

6. 전체 H1ve 디렉터리의 모든 컨테이너를 자체 시작으로 설정합니다.

docker update --restart=always $(docker ps -aq)

 열려 있는 컨테이너 보기

docker ps

이제 더 이상 이미지를 가져올 필요가 없으며 촬영 범위 주소 + 포트 번호에 직접 액세스할 수 있으며 촬영 범위는 항상 열려 있습니다.

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

다음은 두 번째 부분입니다 ◉ ‿ ◉

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
 

2부, 웹 공모전 출제 및 터미널 Docker 환경 구축

테스트를 용이하게 하기 위해 여기에 서버의 모든 포트를 열었습니다. 질문이 있는 포트에 따라 직접 추가할 수 있습니다.

1. 질의서 작성

각 웹페이지에는 적어도 하나의 index.php 또는 index.html(홈페이지 파일)이 포함되어야 합니다.

웹 페이지의 소스 코드에 플래그를 숨기는 등 가장 간단한 웹 질문부터 먼저 해보겠습니다.

파일 이름은 index.php이고 내용은 아래와 같습니다.

내용이 복잡해 보이지만 실제로는 한 페이지에 불과합니다. 

(1) 파일 폴더

그래서 우리는 질문 파일을 갖고, 새 폴더인 files를 만들고, 이 파일 index.php를 파일 디렉토리에 넣습니다.

(폴더가 왜 파일이냐구요? 나중에 템플릿 파일 2개를 드릴테니 그냥 따라만 하시면 됩니다)

물론 Dockerfile과 docker-compose.yml을 직접 작성할 수 있다면 원하는 대로 작성할 수 있습니다.

ChatGPT에 작성해 달라고 했더니 가능하지만 여기서는 주로 기본적인 루틴에 대해서만 이야기하기 때문에 템플릿을 드리도록 하겠습니다. 말씀드린 대로 따라하시면 ​​간단한 웹 공모전 출제도 가능합니다.

파일 외에도 두 개의 다른 파일도 필요합니다.

(2) 도커파일

(해당 파일은 수정 없이 바로 사용 가능합니다)

내용은 다음과 같습니다.

FROM php:5.6-fpm-alpine

RUN rm -rf ar/wwwml/*

COPY ./files ar/wwwml

EXPOSE 80

WORKDIR ar/wwwml
CMD ["php", "-S", "0.0.0.0:80"]



(3) docker-compose.yml

(이 파일은 자신의 질문이 배포된 포트로 포트를 변경해야 합니다.)

내용은 다음과 같습니다.

version: "2"

services:

  web:
    build: .
    restart: always
    ports:
      - "0.0.0.0:8001:80"
    environment:
      - FLAG=Myon{s0_eaSyest_wEb_fl2}

두 번째 파일의 내용에 대한 설명:

0.0.0.0:8001:80 # 질문은 포트 8001에 배포됩니다. 플레이어는 포트 8001에 액세스하여 질문 환경에 액세스할 수 있습니다.

80은 ngnix가 위치한 포트입니다. 환경에 따라 다릅니다. 보통 80입니다. 물론 이전에 Pwn 경쟁 질문을 배포할 때 다른 문제에 직면한 적이 있습니다. 구성 파일을 수정해야 합니다. 자세한 내용은 내 이전 블로그를 참조할 수 있습니다.

"CTFTraining을 기반으로 CTFd에 웹 질문 배포"  및

"xinetd를 기반으로 pwn 질문 배포(100% 성공 및 사격장 주소를 찾을 수 있음)"

FLAG=Myon{s0_eaSyest_wEb_fl2} # 사실 별 영향이 없는 것 같다는 걸 나중에 알게 됐는데, 질문이 영향을 미칠 수 있는 환경 변수와 관련된 질문이 아닌 한 올바른 플래그가 파일에 직접 배치되기 때문에 켜두는 거죠. 안전 측면에서는 일관성을 더욱 보장하기 위해 여기에서 FLAG 값을 자신의 질문의 플래그 값으로 변경할 수 있습니다.

다른 모든 것은 변경되지 않습니다.

위 파일(files, Dockerfile, docker-compose.yml)을 새 폴더에 넣습니다.

메모리와 운영 및 유지 관리를 용이하게 하기 위해 이름 뒤에 질문 이름을 지정하는 것을 좋아합니다. 예를 들어 f12라고 합니다(질문의 소스 코드 보기).

이로써 웹 공모전을 위한 모든 파일이 준비되었습니다. f12 폴더를 터미널에 넣으세요.

먼저 CTF 경쟁 문제를 저장하기 위해 여기에 testctf 폴더를 만들었습니다.

새 폴더를 생성하는 명령

mkdir 文件夹名

파일을 전송할 때 xftp를 사용하여 직접 끌어오거나 붙여넣고 복사하는 것을 선호합니다.

2. Docker 환경 배포

f12 디렉터리를 입력하고 명령을 사용하여 이미지를 가져옵니다.

docker-compose up -d

가져오기가 성공한 후 명령을 사용하여 컨테이너를 확인합니다.

docker ps

질문이 있는 포트에 접속하세요. 여기는 8001입니다.

웹페이지 소스 코드에서 플래그를 찾으려면 F12를 사용하세요.

3. 경쟁 질문의 프런트엔드 배포

따라서 경쟁 질문을 넣는 방법, 사격장 프런트 엔드에 추가하는 방법, 플래그 설정 및 점수 등에 대한 자세한 내용은 내 블로그 "CTFtraining 기반 CTFd에 웹 질문 배포"에서 자세히 논의했기 때문에 저는 여기서는 자세히 다루지 않겠습니다.

http://t.csdnimg.cn/TRiOo

링크는 만료되어야 합니다. 제 블로그 이름으로 직접 검색하시거나, "사이트 구축" 항목에서 찾아보실 수 있습니다.

또한 여기에는 다른 유형의 웹 질문에 대한 소스 코드도 있습니다. 미니 게임, 기본 매개변수 전달, PHP 역직렬화, 명령 실행, 파일 업로드, PHP 우회 및 정보 유출과 같은 질문을 작성하는 것은 매우 쉽습니다. . 여러분을 환영합니다. 토론을 위해 저에게 오십시오.

SQL 인젝션을 위해서는 데이터베이스와 결합해야 하며, 일부 질문의 소스코드도 ChatGPT로 작성할 수 있습니다.

4. 단말기 공모전 운영 및 유지보수

접근성이 떨어지거나 일부 파일 정보가 수정되지 않았지만 주제의 이미지 환경이 풀링된 등 Docker 환경을 배포할 때 문제가 발생하는 경우 먼저 컨테이너를 삭제한 다음 다시 가져와야 합니다.

질문 컨테이너 이름 보기

docker ps

다음 명령을 사용하여 문제가 있는 컨테이너를 삭제합니다.

docker rm -f 容器名

현재 질문 페이지에 더 이상 접근할 수 없습니다.

하지만 여기서 요점이 나옵니다. 여전히 docker-compose up -d를 사용하여 직접 가져올 수 있습니까?

이 작업은 작동하지 않습니다. 풀링 후에는 파일 내용을 수정했더라도 삭제하기 전과 동일한 컨테이너를 얻게 됩니다.

이 질문에 대해서는 내 이전 블로그 "xinetd를 기반으로 pwn 질문 배포(100% 성공하고 사격장 주소를 찾을 수 있음)"를 읽어보실 수 있습니다.

http://t.csdnimg.cn/3QPno

docker는 컨테이너를 구축하기 때문에 독립적인 환경으로 이해할 수 있고, 내부의 파일 경로도 다릅니다. 왜 감히 자체 서버에 직접 취약점을 배포하는 걸까요? docker의 보안이 여전히 매우 강력하기 때문입니다. 물론 로컬로 탈출하는 docker 컨테이너도 있을 수 있지만 일반적으로 docker로 빌드한 것들은 여전히 ​​매우 안전합니다. 문제가 발생하더라도 서버의 로컬 항목에는 영향을 미치지 않으며 별도의 환경입니다.

질문 환경을 실제로 대체하려면 두 가지 올바른 작업이 있습니다.

방법 1: 질문 폴더의 이름을 바꾸고(예: F12를 F12로 변경) mv 명령을 사용합니다.

물론 이름을 바꾸는 이름이 아직 가져오지 않은 이미지의 이름, 즉 새로운 이름인지 확인해야 합니다.

mv f12 F12

이때 F12를 입력하여 이미지를 가져옵니다.

docker-compose up -d

방법 2: 사용되지 않는 네트워크를 모두 삭제합니다. 사용되지 않는 네트워크는 어떤 컨테이너에서도 참조되지 않는 네트워크입니다.

docker network prune

이 네트워크의 원래 컨테이너는 당사에 의해 삭제되었지만 해당 네트워크는 여전히 존재하지만 컨테이너에서 참조되지 않으므로 먼저 삭제해야 하며 그런 다음 이미지 가져오기를 사용하여 콘텐츠를 가져올 수 있습니다. 수정된 파일.

방법 2를 사용하는 것이 좋지만 이름 바꾸기 방법을 사용하고 일정 시간 동안 사용하지 않는 네트워크가 쌓일 때까지 기다렸다가 지울 수도 있습니다.

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

이상으로 글을 마치겠습니다. 읽으시면서 많은 이득이 되셨으면 좋겠습니다. 많은 관심과 응원 부탁드립니다◉ ‿ ◉

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~

♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♥ ♡ ♥ ♡ ♥ ♡ ♥ ♡ ♥ 

추천

출처blog.csdn.net/Myon5/article/details/134540207