CTF射撃場構築、Webコンペ問題制作、ターミナルDocker環境導入

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

 前に書く

============================== ═════════ ═=============================

こんにちは、みんな!みょんです。クラウドサーバーの有効期限が切れていないうちに、CTF コンテスト用の射撃場のセットアップ、Web コンテストの問題の作成、Docker 環境のデプロイメントについて、非常に詳細なチュートリアルを提供します。能力が限られているので、基本的かつ簡単なことしかお伝えできません。コメント欄でお互いにコミュニケーションを取り、学び合うことを歓迎します。このブログを通じて何か新しいことを学んでいただければ幸いです。また、ご注目とご期待をお待ちしております。サポート!

╚======================================= ═════════ ═=============================

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

以前にこの種の CTF 射撃場を構築したことがあるので、以前に書いたブログを読んでいただければわかると思いますが、前回は純粋に CTFd に基づいていましたが、今回は H1ve に基づいています (こちらの方が見栄えが良いです)。本校最後のCTF大会の構築・運営・保守と、Pwn大会とWeb大会の問題の環境展開を担当しましたので、後ほど紹介します。

まずは完成予想図をお見せします。

表紙:

ランキング:

課題:

発表:

このブログは、前回の内容の補足やまとめを中心に書いておりますが、読んでいて分からないことがあれば、過去の記事を参照していただければ幸いです。サポートと注目!

 記事を始める前に、わかりやすくてユーモアのある人工知能について学ぶための Web サイトを紹介します。

人工知能icon-default.png?t=N7T8https://www.captainbed.cn/myon/

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

使用サーバー: centos8 OK テキストが始まります ◉ ‿ ◉

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

目次

Part1、CTF射撃場の建設

1.github から H1ve をクローンします。

2.ドッカーをインストールする

3. Python-pipをインストールする 

4. docker-compose をインストールする 

5. イメージをプルしてシングルモードを開始します

6. H1ve ディレクトリ全体のすべてのコンテナを自動起動に設定します。

Part2、Webコンペ問題作成とターミナルDocker環境導入

1. 質問書類の作成

(1) ファイルフォルダー

(2)Dockerfile

(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 ソースをセットアップする

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

2.ドッカーをインストールする

yum install -y docker-ce

 「complete」と表示されている場合は、インストールが完了していることを意味します。

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

「complete」と表示された場合は、インストールが成功したことを意味します。次のコマンドを使用して確認することもできます。

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. docker-compose をインストールする 

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 がダウンロードしたイメージのバージョン番号を指定する必要があることを意味します。

しかし、解決策が見つからなかったので、single.yml ファイルを置き換えました。

その後、それをプルできます(以前に構成ファイルを変更したことが原因であると思われます)

次に、ポート8000​​にアクセスします

基本情報を入力すると、以下のページにアクセスできます。

そこで、テストのために H1ve を削除し、再度クローンを作成しました。

構成ファイルの変更によるsingle.ymlに問題があるかどうかを判断します。

クローン作成後は何もする必要はなく、ディレクトリに移動して直接プルするだけで、実際には次のようになります。

次に、Single-Nginx Mode をプルしてみます。 

docker-compose -f single-nginx.yml up

 正常に取得できますが、ここではアクセスできません

検証のために構成ファイルを変更し、正常にプルできることを確認します。

もちろん、以前のバージョンをプルしたときに、github からクローンしたばかりのバージョンの環境に影響を与えた可能性は否定できません。

一般に、イメージのクローンを作成した後、イメージを直接プルしてみることをお勧めします (後でテストする場合は、構成ファイルを設定せずに正常にプルできます。詳細は依然として独自のサーバーの環境構成に依存します)。 H1ve を削除して、再度クローンを作成してみてください。

ちなみに、使用するポートが許可されており、サーバーのセキュリティ グループ ルールに設定されていることを確認する必要もあります。

もちろん、IP アドレスに直接アクセスして射撃場に行きたい場合は、ポート 80 を 8000 に転送するプロキシ転送を設定する必要があるかもしれません。

(以前に話した完全に CTFd に基づいて構築されたものでは必要ありません。IP への直接アクセスは射撃場のホームページです)

具体的な内容については、以前のブログ「クラウドサーバーベースのブログと射撃場の構築 - 体験と教訓」を参照してください。

H1ve に関連するすべてのコンテナを開いて、自動起動するように設定する必要があります。

コンテナを表示する

docker ps -a

コンテナの起動 

docker start 容器名

6. H1ve ディレクトリ全体のすべてのコンテナを自動起動に設定します。

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

 開いているコンテナを表示する

docker ps

画像を取得する必要がなくなり、射撃場のアドレス + ポート番号に直接アクセスできるようになり、射撃場は常にオープンになります。

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

続いて後編です ◉ ‿ ◉

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

Part2、Webコンペ問題作成とターミナルDocker環境導入

テストを容易にするために、ここではサーバーのポートをすべて開いていますが、質問が存在するポートに応じて独自のポートを追加できます。

1. 質問書類の作成

各Webページには少なくとも1つのindex.phpまたはindex.html(ホームページファイル)が含まれている必要があります。

まず、Web ページのソース コード内のフラグを非表示にするなど、最も単純な Web の質問を実行してみましょう。

ファイルの名前はindex.phpで、その内容は次のとおりです。

コンテンツは複雑に見えるかもしれませんが、実際には単なるページです。 

(1) ファイルフォルダー

したがって、質問ファイルがあり、新しいフォルダー files を作成し、このファイルindex.phpをfiles ディレクトリに置きます。

(フォルダーがファイルという名前なのはなぜですか?後ほどテンプレート ファイルを 2 つ渡すので、そのとおりにしてください)

もちろん、Dockerfile と docker-compose.yml を自分で作成できる場合は、好きなように作成できます。

ChatGPT に書いてもらったので実現可能ですが、ここでは主に基本的なルーチンについて話しますので、テンプレートを渡しておきますので、これに従って簡単な Web コンペの問題を展開することができます。

ファイルに加えて、他に 2 つのファイルも必要です。

(2)Dockerfile

(このファイルは変更せずにそのまま使用できます)

内容は以下の通りです。

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}

2 番目のファイルの内容の説明:

0.0.0.0:8001:80 # 質問はポート 8001 にデプロイされます。プレイヤーはポート 8001 にアクセスすることで質問環境にアクセスできます。

80 は ngnix が配置されているポートです。環境によって異なります。通常は 80 です。もちろん、以前に Pwn コンペティションの質問をデプロイするときに他の問題に遭遇しました。設定ファイルを変更する必要があります。詳細については、私の以前のブログを参照してください:

「CTFTraining に基づいた CTFd での Web 質問の展開」 および

「xinetd に基づいて pwn の質問を展開します (100% 成功し、射撃場のアドレスを確認できます)」

FLAG=Myon{s0_eaSyest_wEb_fl2} # 実際、質問が影響する可能性のある環境変数に関連するものでない限り、正しいフラグがファイルに自分で配置されているため、影響はないようであることが後でわかりました。安全側として、一貫性をさらに確保するために、ここでの FLAG 値を独自の質問のフラグ値に変更できます。

それ以外はすべて変更されません。

上記のファイル、files、Dockerfile、docker-compose.yml を新しいフォルダーに配置します。

記憶と操作とメンテナンスを容易にするために、私は質問に名前にちなんで名前を付けるのが好きです。たとえば、f12 と呼ばれます (質問のソース コードを表示します)。

このようにして、Web コンテスト用のファイルがすべて準備できたので、f12 フォルダーをターミナルに置きます。

まず、CTF コンテストの質問を保存するために、ここに testctf フォルダーを作成しました。

新しいフォルダーを作成するコマンド

mkdir 文件夹名

ファイルを転送するときは、xftp を使用し、直接プルまたはペーストしてコピーすることを好みます。

2. Docker環境のデプロイメント

f12 ディレクトリに入り、コマンドを使用してイメージをプルします。

docker-compose up -d

プルが成功したら、コマンドを使用してコンテナーを表示します。

docker ps

質問があるポートにアクセスします。ここは 8001 です。

F12 を使用して Web ページのソース コード内のフラグを検索します。

3. コンテストの質問のフロントエンド展開

したがって、コンテストの質問を配置する方法、射撃場のフロントエンドに追加する方法、フラグを設定する方法、スコアを設定する方法などについては、私のブログ「CTFTraining に基づいた CTFd での Web 質問の展開」で詳しく説明されています。ここでは詳細には触れません。

http://t.csdnimg.cn/TRiOo

リンクは有効期限が切れていますので、ブログ名で直接検索していただくか、「Webサイト構築」の欄からご覧いただけます。

さらに、ここには他のタイプの Web 質問のソース コードもあります。ミニ ゲーム、基本的なパラメータの受け渡し、PHP デシリアライゼーション、コマンド実行、ファイル アップロード、PHP バイパス、情報漏洩など、これらの質問を非常に簡単に作成できます。皆さんようこそ、私のところに議論に来てください。

SQLインジェクションの場合はデータベースと組み合わせる必要がありますが、一部の質問はChatGPTでソースコードを記述することも可能です。

4. ターミナルコンペ問題の運用・保守

Docker 環境のデプロイ時に、アクセスできない、または一部のファイル情報が変更されていないがトピックのイメージ環境がプルされているなどの問題が発生した場合は、まずコンテナーを削除してから、再度プルする必要があります。

質問コンテナ名を表示する

docker ps

コマンドを使用して問題のあるコンテナを削除します。

docker rm -f 容器名

現在、質問ページにはアクセスできません

しかし、ここで重要なのは、docker-compose up -d を使用して直接プルできるかということです。

この操作は機能しません。プル後は、ファイルの内容を変更したとしても、削除する前と同じコンテナーが取得されます。

この質問については、以前のブログ「xinetd に基づいて pwn の質問を展開する (100% 成功し、射撃場のアドレスを nc できます)」を引き続き読むことができます。

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

dockerはコンテナを構築するため、独立した環境として理解でき、内部のファイルのパスも異なります。なぜあえて脆弱性を自分たちのサーバーに直接デプロイするのでしょうか?それは、docker のセキュリティがまだ非常に強力だからです。もちろん、ローカルにエスケープする docker コンテナもあるかもしれませんが、一般に docker で構築されたものは、たとえ何かが壊れても、サーバー上のローカルのものには影響せず、別の環境になります。

質問環境を実際に置き換えるには、次の 2 つの正しい操作があります。

方法 1: 質問フォルダーの名前を変更し (たとえば、F12 を F12 に変更)、mv コマンドを使用します。

もちろん、名前を変更する名前が、プルされていないイメージの名前、つまりまったく新しい名前であることを確認する必要があります。

mv f12 F12

この時点で、F12 を入力して画像を取得します。また、次のコマンドを使用します。

docker-compose up -d

方法 2: 未使用のネットワークをすべて削除する 未使用のネットワークとは、どのコンテナからも参照されていないネットワークです。

docker network prune

このネットワークの元のコンテナは当社によって削除されましたが、そのネットワークはまだ存在していますが、コンテナによって参照されていないため、最初にクリアする必要があります。その後、イメージ プルを使用してコンテンツをプルできるようになります。変更されたファイル。

方法 2 を使用することをお勧めしますが、名前変更方法を使用して、未使用のネットワークが一定期間蓄積されるのを待ってから消去することもできます。

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

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

この記事はここで終わります。読んで何かを得ることができれば幸いです。ご注目とサポートをお待ちしています◉ ‿ ◉

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

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

おすすめ

転載: blog.csdn.net/Myon5/article/details/134540207