Construção de campo de tiro CTF, produção de questões de competição na Web e implantação de ambiente de terminal docker

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

 escreva na frente

╔════════════════════════════════════════ ═════════ ═════════════════════════╗

Olá pessoal! Eu sou Myon. Embora meu servidor em nuvem não tenha expirado, darei a vocês um tutorial muito detalhado sobre como configurar o campo de tiro para a competição CTF, bem como a produção de perguntas da competição na Web e a implantação do ambiente docker. Devido ao meu capacidade limitada, só posso dizer algumas coisas básicas e simples. Vocês são bem-vindos para se comunicar e aprender uns com os outros na área de comentários. Espero que vocês possam aprender algo novo através deste blog. Também aguardo sua atenção e apoiar!

╚════════════════════════════════════════ ═════════ ═════════════════════════╝

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

Porque eu já construí esse tipo de campo de tiro CTF antes. Se você leu o blog que escrevi antes, saberá que o anterior era puramente baseado em CTFd, mas desta vez é baseado em H1ve (este parece melhor). Fui responsável pela construção, operação e manutenção da última competição CTF em nossa escola, bem como pela implantação do ambiente das questões da competição Pwn e Web. Apresentarei-as posteriormente.

Deixe-me mostrar primeiro as renderizações do produto acabado.

primeira página:

classificação:

desafios:

anúncio:

Escrevo este blog principalmente para complementar e resumir parte do conteúdo anterior. Se você não entender nada durante o processo de leitura, fique à vontade para consultar meus artigos anteriores. Na coluna "Construção de sites", obrigado novamente por sua apoio e atenção!

 Antes de começar o artigo, deixe-me compartilhar com vocês um site para aprender inteligência artificial, fácil de entender e bem humorado.

Inteligência Artificial icon-default.png?t=N7T8https://www.captainbed.cn/myon/

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

Usar servidor: centos8 OK texto começa ◉ ‿ ◉

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

Índice

Parte 1, construção do campo de tiro CTF

1. Clone H1ve do github

2. Instale a janela de encaixe

3. Instale python-pip 

4. Instale o docker-compose 

5. Puxe a imagem e inicie o Modo Único

6. Defina todos os contêineres em todo o diretório H1ve para inicialização automática

Parte 2, produção de questões de competição na Web e implantação de ambiente docker de terminal

1. Preparação de documentos de perguntas

(1) pasta de arquivos

(2) Dockerfile

(3)docker-compose.yml

2. Implantação do ambiente Docker

3. Implantação inicial de questões de concorrência

4. Concorrência terminal questiona operação e manutenção


Parte 1, construção do campo de tiro CTF

Se for um servidor novo e não houver comando git, nós o instalamos primeiro.

yum install git

1. Clone H1ve do github

Você pode colocá-lo onde quiser. Criei uma pasta Myon no diretório raiz e clonei-a nela.

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

Após a clonagem, ainda precisamos instalar algumas coisas primeiro

Configurar fonte yum

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

2. Instale a janela de encaixe

yum install -y docker-ce

 Ver concluído significa que a instalação está concluída.

Vamos verificar a versão do docker e configurá-lo para iniciar automaticamente na inicialização

docker version

systemctl start docker

systemctl enable docker

Então instalamos o docker-compose

(Este comando docker-compose será frequentemente usado posteriormente ao extrair imagens e ambiente de competição)

3. Instale python-pip 

✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧

Observe que a instalação padrão do pip aqui causará um erro. Não execute o seguinte comando primeiro, primeiro leia a explicação do erro mais tarde.

A instalação padrão é a versão Python2.7, e aqui precisamos da versão Python3 do pip

✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧ ✦ ✧

yum -y install epel-release

yum -y install python-pip

Se você vir completo, significa que a instalação foi bem-sucedida. Também podemos verificar usando o comando

pip -V

Mas quando tentarmos instalar o docker-compose, encontraremos um erro

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

O significado geral é que nossa versão pip é muito antiga e não conseguimos encontrar uma versão docker-compose adequada para satisfazer

 Tente atualizar a versão do pip 

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

Mas há uma grande probabilidade de você encontrar o seguinte relatório de erro:

Não foi possível encontrar uma versão que satisfaça o requisito docker-compose (das versões:)
Nenhuma distribuição correspondente encontrada para docker-compose

Você está usando o pip versão 8.1.2, porém a versão 23.3.1 está disponível.
Você deve considerar a atualização através do comando 'pip install --upgrade pip'.

Solução: instale o pip do python3

Pelo pip -v acima, sabemos que a versão padrão do Python2.7 está instalada

Então aqui instalamos o pip do Python3 e o atualizamos

yum install python3-pip

pip3 install --upgrade pip

Você pode ver que o pip foi atualizado com sucesso para 21.3.1 

 Todas as operações pip subsequentes serão substituídas por pip3.

4. Instale o docker-compose 

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

Você pode ver que a instalação foi bem-sucedida. Quanto ao aviso, não se preocupe.

Em seguida, entramos no diretório H1ve que clonamos antes.

Modificar arquivo de configuração

(É melhor não executar esta etapa primeiro, porque não tenho certeza se o erro subsequente está relacionado a esta etapa. Recomenda-se tentar a operação de extração de imagem subsequente diretamente. Se houver algum problema, você pode tentar excluir H1ve e clonar novamente)

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. Puxe a imagem e inicie o Modo Único

docker-compose -f single.yml up

Encontrou o seguinte erro:

ERRO: manifesto para mariadb:10.4.12.12.12.12 não encontrado: manifesto desconhecido: manifesto desconhecido 

Esta situação significa que o docker precisa que especifiquemos o número da versão da imagem baixada.

Mas não encontrei uma solução, então substituí seu arquivo single.yml

Então você pode puxá-lo (suspeito que seja causado pela modificação anterior do arquivo de configuração)

Então acesse a porta 8000

Após preencher as informações básicas, a página mostrada abaixo poderá ser carregada.

Então excluí o H1ve e o clonei novamente para teste.

Determine se há um problema com single.yml devido à modificação do arquivo de configuração

Após a clonagem, você não precisa fazer nada, basta ir até o diretório e puxar diretamente, e ele realmente se torna

Em seguida, tente puxar o modo Single-Nginx 

docker-compose -f single-nginx.yml up

 Ele pode ser extraído com sucesso, mas não pode ser acessado aqui

Modifique o arquivo de configuração para verificação e descubra que ele pode ser extraído com sucesso.

É muito estranho. Claro, não posso descartar que quando retirei a versão anterior, isso teve um impacto no ambiente da versão que acabei de clonar do github.

Em geral, minha sugestão para você é tentar extrair a imagem diretamente após cloná-la (para testes posteriores, você pode extraí-la com sucesso sem configurar um arquivo de configuração. Os detalhes ainda dependem da configuração do ambiente do seu próprio servidor) . também são possíveis. Tente excluir o H1ve e cloná-lo novamente.

A propósito, você também precisa se certificar de que as portas utilizadas são permitidas e definidas nas regras do grupo de segurança do servidor.

Claro, se você quiser acessar diretamente o endereço IP e ir para o campo de tiro, pode ser necessário configurar um encaminhamento de proxy para encaminhar a porta 80 para 8000.

(Não é necessário aquele de que falei antes que foi construído inteiramente baseado em CTFd. O acesso direto ao IP é a página inicial do campo de tiro)

Para conteúdo específico, consulte meu blog anterior: "Blog baseado em servidor em nuvem e construção de campo de tiro - experiência e lições"

Precisamos abrir todos os contêineres relacionados ao H1ve e configurá-los para inicialização automática

Ver contêiner

docker ps -a

Iniciar contêiner 

docker start 容器名

6. Defina todos os contêineres em todo o diretório H1ve para inicialização automática

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

 Ver contêineres abertos

docker ps

Agora não precisamos mais extrair a imagem, podemos acessar diretamente o endereço do campo de tiro + número da porta, e o campo de tiro estará sempre aberto.

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

Em seguida vem a segunda parte ◉ ‿ ◉

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

Parte 2, produção de questões de competição na Web e implantação de ambiente docker de terminal

Para facilitar os testes, abri aqui todas as portas do servidor, você pode adicionar a sua própria de acordo com a porta onde a questão está localizada.

1. Preparação de documentos de perguntas

Cada página da web deve conter pelo menos um index.php ou index.html (arquivo da página inicial)

Vamos fazer primeiro a pergunta mais simples da web, como ocultar o sinalizador no código-fonte de uma página da web

O arquivo é denominado index.php e seu conteúdo é mostrado abaixo

O conteúdo pode parecer complicado, mas na verdade é apenas uma página. 

(1) pasta de arquivos

Então temos o arquivo de perguntas, crie uma nova pasta de arquivos e coloque esse arquivo index.php no diretório de arquivos.

(Por que a pasta se chama arquivos? Porque darei a vocês dois arquivos de modelo mais tarde, basta seguir o que eu disse)

Claro, se você mesmo pode escrever Dockerfile e docker-compose.yml, poderá fazê-lo como quiser.

Pedi ao ChatGPT para escrevê-lo e é viável, mas aqui estou falando principalmente de rotinas básicas, então vou lhe dar um modelo, siga o que eu disse e você poderá implantar questões simples de competição na web.

Além dos arquivos, também precisamos de outros dois arquivos:

(2) Dockerfile

(Você pode usar este arquivo diretamente sem modificação)

O conteúdo é o seguinte:

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

(Este arquivo precisa alterar a porta para a porta onde sua própria pergunta está implantada)

O conteúdo é o seguinte:

version: "2"

services:

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

Explicação do conteúdo do segundo arquivo:

0.0.0.0:8001:80 # A pergunta é implantada na porta 8001. Os jogadores podem acessar o ambiente da pergunta acessando a porta 8001.

80 é a porta onde o ngnix está localizado. Depende do seu ambiente. Geralmente é 80. Claro, já encontrei outros problemas ao implantar questões de competição Pwn antes. Preciso modificar o arquivo de configuração. Para obter detalhes, você pode consultar meu blog anterior:

"Implantando questões da Web no CTFd com base no CTFTraining"  e

"Implementar pergunta pwn com base no xinetd (100% bem-sucedido e pode detectar o endereço do campo de tiro)"

FLAG=Myon{s0_eaSyest_wEb_fl2} # Na verdade, descobri mais tarde que parece não ter impacto, porque o sinalizador correto é colocado no arquivo, a menos que a questão esteja relacionada a variáveis ​​​​de ambiente que podem afetá-la, por assim dizer pelo lado seguro, você pode alterar o valor FLAG aqui para o valor do sinalizador de sua própria pergunta, apenas para garantir ainda mais a consistência.

Todo o resto permanece inalterado.

Coloque os arquivos acima: files, Dockerfile, docker-compose.yml em uma nova pasta

Para facilitar a memória e operação e manutenção, gosto de nomear a pergunta pelo nome, por exemplo, chama-se f12 (veja o código fonte da pergunta)

Desta forma, todos os arquivos do nosso concurso web estão prontos, coloque a pasta f12 no terminal.

Primeiro criei uma pasta testctf aqui para armazenar questões de competição CTF.

Comando para criar uma nova pasta

mkdir 文件夹名

Ao transferir arquivos, prefiro usar xftp, puxar ou colar e copiar diretamente.

2. Implantação do ambiente Docker

Entre no diretório f12 e use o comando para extrair a imagem

docker-compose up -d

Depois que o pull for bem-sucedido, use o comando para visualizar o contêiner

docker ps

Acesse a porta onde está a pergunta, aqui é 8001

Use F12 para encontrar o sinalizador no código-fonte da página da web

3. Implantação inicial de questões de concorrência

Então, como colocar as questões da competição, adicioná-las ao front-end do nosso campo de tiro, definir a bandeira e pontuar, etc., foi discutido em detalhes em meu blog "Implementando questões da Web no CTFd com base no CTFTraining", então eu não entrarei em detalhes aqui.

http://t.csdnimg.cn/TRiOo

O link deve expirar. Você pode pesquisar diretamente pelo nome do meu blog para encontrá-lo ou na coluna "Construção do site"

Além disso, também tenho aqui o código-fonte de alguns outros tipos de questões da Web. É muito fácil construir essas questões, como minijogos, passagem de parâmetros básicos, desserialização de PHP, execução de comandos, upload de arquivos, desvio de PHP e vazamento de informações ... Bem-vindos a todos. Venham até mim para discussão.

Para injeção de SQL, ele precisa ser combinado com o banco de dados. O código-fonte de algumas questões também pode ser escrito pelo ChatGPT.

4. Concorrência terminal questiona operação e manutenção

Se encontrarmos problemas ao implantar o ambiente docker, como inacessibilidade, ou algumas informações do arquivo não foram modificadas, mas o ambiente de imagem do tópico foi extraído, precisamos primeiro excluir o contêiner e depois extraí-lo novamente:

Ver o nome do contêiner de perguntas

docker ps

Exclua o contêiner problemático usando o comando

docker rm -f 容器名

A página de perguntas não está mais acessível no momento

Mas aí vem a questão: ainda podemos usar docker-compose up -d para puxar diretamente?

Esta operação não funcionará. Após extrair, você obterá o mesmo contêiner de antes de excluí-lo, mesmo que tenha modificado o conteúdo do arquivo.

Para esta pergunta, você ainda pode ler meu blog anterior "Implementar pergunta pwn com base no xinetd (100% bem-sucedido e pode encontrar o endereço do campo de tiro)"

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

Como o docker constrói um contêiner, você pode entendê-lo como um ambiente independente e os caminhos dos arquivos dentro dele são diferentes. Por que ousamos implantar vulnerabilidades diretamente em nossos próprios servidores? É porque a segurança do docker ainda é muito forte. Claro, pode haver contêineres do docker escapando para o local, mas geralmente as coisas construídas com o docker ainda são muito seguras, mesmo se algo estiver quebrado, isso não afetará as coisas locais no seu servidor. É um ambiente separado.

Para realmente substituir o ambiente de perguntas, existem duas operações corretas:

Método 1: renomeie a pasta de perguntas (por exemplo, altere F12 para F12) e use o comando mv

Claro, você precisa ter certeza de que o nome que você renomeou é o nome da imagem que não foi extraída, ou seja, um nome totalmente novo.

mv f12 F12

Neste momento, entramos em F12 para puxar a imagem, também usando

docker-compose up -d

Método 2: Exclua todas as redes não utilizadas. Redes não utilizadas são redes que não são referenciadas por nenhum contêiner.

docker network prune

Como o contêiner original desta rede foi excluído por nós, mas sua rede ainda existe, mas não é referenciada pelo contêiner, portanto, ela precisa ser limpa primeiro e, em seguida, o pull de imagem pode ser usado para extrair o conteúdo do seu arquivo modificado.

Recomenda-se usar o método 2, mas você também pode usar o método renomear e esperar que as redes não utilizadas se acumulem por um período de tempo antes de eliminá-las.

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

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

O artigo termina aqui. Espero que você ganhe algo com a leitura. Aguardo sua atenção e apoio◉ ‿ ◉

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

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

Acho que você gosta

Origin blog.csdn.net/Myon5/article/details/134540207
Recomendado
Clasificación