Usando Docker Para Implementar Web Hacking Labs

O que você vai aprender?

Neste post, vou ensinar como utilizar o Docker para implementar seu próprio laboratório para prática e estudo de web hacking.

Estudar teoria é importante, mas o diferencial entre saber o que é web hacking e ser capaz de comprometer uma aplicação reside em um fator: prática, o bom e velho conhecido “Hands On”.

Você vai aprender:

  • Sobre alternativas de laboratório para web hacking
  • Por que criar / implementar seus próprios labs em vez de apenas usar o que já está pronto
  • Conceito sobre container e docker
  • Requisitos para o laboratório
  • Colocando a mão na massa — requisitos e instalação do Docker
  • Sobrevivendo na interface do Docker — comandos básicos para interagir com a cli
  • Baixar imagens de aplicações vulneráveis para laboratório e subir os containers

Premissas

Para implementação do que vou ensinar aqui, parto da premissa de que você vai usar um servidor virtual linux (baseado em Debian ou CentOS) e que tem ao menos conhecimentos básicos de linux — nível LPIC1.

Como praticar web hacking de forma legal?

Existem várias alternativas. Você pode criar uma conta no Hack The Box?—?HTB, onde existem diversas máquinas para praticar web hacking, reversing, forensics, crypto, stego … pode jogar em CTFs como por exemplo o da Hacker Security ou pode também utilizar as VMs do Vulnhub. Estas são apenas algumas opções. Se você fizer uma rápida busca no google conforme mostro abaixo, você obtém uma lista de sites que podem ser usados para prática legal de web hacking.

1*7dRzYrJCGvVnnD4gVbsZgw.png?q=20 Figura 1 — Web hacking sites

Por que implementar seu próprio laboratório se já existem tantas opções prontas?

Uma boa razão para isso é você entender melhor sobre como as “engrenagens” funcionam, como funciona uma aplicação web por dentro. “Learn by Making”, já ouviu falar disso? Você aprende através de esperiências práticas. Vamos utilizar aplicações propositalmente vulneráveis e que rodam em containeres. Posteriormente, você pode estudar sobre como criar suas próprias aplicações web vulneráveis e como fazê-las rodar em containeres porque isso vai te trazer muito mais conhecimento e habilidade.

O que é um container?

Se não sabe o que é, dá uma olhada aqui. Em linhas gerais, container é uma unidade de software que empacota código e todas as dependências necessárias para o funcionamento de uma aplicação. Não é um servidor virtual — VM. Uma VM é um kernel de sistema operacional que é virtualizado por um hypervisor (VMware Player, Virtualbox, Hyper-V, KVM …). Já o container funciona sob uma plataforma, como por exemplo Docker, que pode ser instalada em um host de controle físico ou virtual. Geralmente, usamos hosts virtuais para aproveitar todos os conhecidos benefícios que um ambiente virtualizado propicia. Aconselho que você implemente este laboratório em um host virtual.

Portanto, uma VM possui um kernel de sistema dedicado para ela enquanto que o container utiliza, de forma compartilhada, o kernel do host no qual a plataforma de container está instalada. Container representa agilidade e economia de recursos. Para você ter ideia, uma VM representa alguns gigabytes de dados enquanto que um container costuma representar apenas alguns megabytes, uma ótima economia de recursos tais como espaço em disco. Veja o exemplo abaixo.

1*gp6zlKCwyt1S-ch-kv-khw.png?q=20 Figura 2 — Container x VM

Quais os requisitos para montar o lab?

Vamos precisar do seguinte:

  • Uma VM linux — vou usar o Debian buster 10 64-bit (stable);
  • Docker-ce na última versão estável — instalação para Debian;
  • Imagens de container para aplicações web vulneráveis — Vou usar imagens para DVWA e Web Goat 7.1.

Colocando a mão na massa (finalmente) ?

1?—?Baixe o Debian, instale e configure conectividade de rede e acesso aos repositórios;

[!] Se precisar de ajuda com o Debian, dá uma olhada na documentação oficial aqui.

2 — Execute os pré-requisitos para instalar o Docker — conforme falei, vou adotar o procedimento de instalação indicado para sistemas Debian, diretamente dos repositórios, pois isto facilita a instalação e futuras rotinas de atualização.

2.1 — Atualize a lista de pacotes.

$ sudo apt update

2.2 — Remova qualquer versão antiga de docker

$ sudo apt-get remove docker docker-engine docker.io containerd runc

2.3?—?Instale os pacotes necessários para permitir que o utilitário ‘apt’ use repositórios sobre HTTPS.

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common  

2.4?—?Baixe e instale a chave GPG oficial para o Docker

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo apt-key add -

2.5?—?Verifique se após o passo anterior, seu sistema possui a chave com o seguinte fingerprint “9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88″. Você deverá ver uma saída igual a da figura 3.

$ sudo apt-key fingerprint 0EBFCD88
1*drc39zialxT26-yIVNouPw.png?q=20 Figura 3— Docker GPG fingerprint

2.6 — Use este comando para adicionar o respositório oficial.

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"

3 — Instale o Docker-ce

3.1 — Atualize novamente o índice de pacotes.

$ sudo apt update

3.2 — Instala a última versão do Docker engine e containerd.

$ sudo apt-get install docker-ce docker-ce-cli containerd.io -y

3.3?—?Adicione seu usuario ao grupo docker.

$ sudo usermod -aG docker ${USER}

[!] O passo 3.3 é necessário para o gerenciamento do Docker por usuários que não tenham privilégios de root. Mais informações, consulte a documentação aqui.

[!] Caso o grupo docker não exista, adicione um, usando o comando groupadd.

4 — Teste sua instalação — Execute o nosso já conhecido “hello.world” e observe se o resultado é conforme a figura 4.

[!] Docker é uma aplicação cliente-servidor. A parte do servidor é o Docker daemon ou “dockerd”. A parte cliente é o que chamamos de “docker-cli” que provê a interface de comando para gerenciamento do Docker.

$ sudo docker run hello-world
1*etjUwWQiA7fPWl7RGUtOrw.png?q=20 Figura 4 — Docker Hello World Test

[!] Aqui cabe uma explicação. Quais passos o docker executou até exibir a mensagem da figura acima?

I — O docker busca a imagem da aplicação em seu cache local;

II — O docker daemon faz o download da imagem no Docker Hub — um repositório de imagens conhecido como “Registry”, caso não a encontre em seu cache local;

III — O Docker daemon cria um novo container a partir da imagem que ele baixou e este container roda o código executável da aplicação, provendo assim um ambiente para o seu funcionamento;

IV — O Docker daemon repassa a saída da aplicação para o Docker client que então a envia para o terminal.

Sobrevivendo na interface do Docker

Aqui, vou dar apenas uma visão geral sobre como baixar imagens, criar containers, verificar o funcionamento, checar configuraçao e etc. Para maiores informações, sugiro que leia a documentação oficial — “Learn by making”, lembra? ?

  • Checando o status do serviço
$ systemctl status docker.service
1*V9BpFEdsA-uS9OjXKYWtgA.png?q=20 Figura 5 — Checando status do docker daemon
  • Checando a versão do Docker
$ docker version
1*Sb83TRrCx1aY-q5zksC2Fg.png?q=20 Figura 6 — Checando versão do cliente e servidor Docker
  • Obtendo ajuda
$ docker help
1*afyKhRbTZttf-kiBPFAokw.png?q=20 Figura 7 — Obtendo ajuda no prompt de comando
  • Checando o cache local de imagens. Lembra daquela imagem hello world que baixamos? Antes ela não estava no cache, foi baixada e agora está.
$ docker image ls
1*3HtgW2DZTELusMlsCRr2jg.png?q=20 Figura 8 — Checando o cache de imagens
  • Deletando uma imagem. A imagem pode ser deletada ao usar o comando abaixo e especificar o nome ou ID da imagem.
$ docker image rm vulnerables/web-dvwa

[!] Antes de deletar uma imagem, certifique-se de deletar o container associado a ela, usando o comando docker container rm <nome / ID>.

  • Baixando e criando um container
$ docker container run --publish 8090:80 --detach --name vuln-dvwa vulnerables/web-dvwa
1*Jvn5wb0afINiQzfsWt5S2w.png?q=20 Figura 9 — Subindo um novo container

[!] Aqui algumas explicações se fazem necessárias:

docker container run => esta instrução diz ao docker daemon que você deseja executar um container — o que na prática faz o download da imagem caso ela não exista no cache local (caso acima), cria e executa o container.

docker pull => usado para fazer o download (pulling) de uma imagem.

docker container create => cria um container a partir de uma imagem.

docker container run => ativa um container e o coloca em estado “running”.

[!] No exemplo da figura 9, mostrei como executar essas três operações apenas com uma linha de comando.

[!] A partir daqui, é importante entender que imagem é um modelo. Container é uma instância de uma imagem. Você pode ter uma ou mais instâncias de uma mesma imagem. Cada uma delas será associada a um ID, PID e fará uso de uma porta exposta no host.

–detach ou -d instrui docker a executar o container em background.

–publish ou -p especifica as portas. Aqui é importante entender que a ordem é porta_host:porta_container ou seja, em nosso exemplo “8090:80” temos a porta 8090 para nosso host VM.

— name <nome do container> é uma opção útil para que você possa identificar o container de forma mais intuitiva.

  • Outros comandos importantes e que você deve saber:

Para ou iniciar um container

$ docker container stop/start <ID /nome do container>

Exibir containeres ativos e inativos

$ docker ps -a

Criar uma nova rede chamada “rede_lab” e usar o driver bridge.

$ docker network create --driver bridge rede_lab

Instruir o docker a subir um novo container em uma rede que você criou, usando o parâmetro –net.

$ docker container run -p 8090:80 -d?--net rede_lab?--name vuln-dvwa vulnerables/web-dvwa

Exibir toda a configuração do container em formato JSON. Muito útil para checar atributos específicos do container ou fazer troubleshooting. Veja o output abaixo na figura 10.

$ docker container inspect <ID / nome do container>
1*e6_EUuPLB7hyctHTM6on7Q.png?q=20 Figura 10 — Arquivo JSON com as configurações do container
  • Conectando-se ao prompt shell do container
$ docker exec -it <nome ou ID do container> /bin/bash

[!] /bin/bash foi o comando que executei. Poderia ser também /bin/sh.

Resumindo, o Docker é uma plataforma versátil e flexível. Não tem como cobrir tudo. Apenas passei os elementos básicos para que você possa caminhar a partir daqui. Leia a documentação oficial para entender mais sobre como administrar o Docker e utilize o help para obter ajuda no prompt conforme necessário.

Baixando imagens para laboratório de web hacking

  • Subindo a aplicação DVWA
$ docker container run -p 8090:80 -d --net rede_lab --name vuln-dvwa vulnerables/web-dvwa
1*iMPauCDDnrjbjeSK9rqv9g.png?q=20 Figura 11 — Imagem DVWA
$ docker container run -p 9090:80 -d --net rede_lab --name vuln-webgoat webgoat/webgoat-7.1
1*b9OqlUyHZ2leVlv4DMPbKw.png?q=20 Figura 12 — Imagem Webgoat
  • Lista de containers em execução
$ docker container ls
1*Y_MTD8qEAesjMe3jnuT4DQ.png?q=20 Figura — 13 Lista de containers em execução
  • Na figura 14, você pode observar as aplicações up e prontas para acesso. Para efetuar tarefas de pós configuração para estas aplicações, pesquise nas documentações que passei aqui ou na infinidade de tutoriais que existem por aí. Para acessar a aplicação Web Goat: http://<ip sua vm>:porta/WebGoat/login.mvc
1*fQiAgE0wKRmyiHrg1V882A.png?q=20 Figura 14 — Aplicações lab web hacking em containeres

[!] Uma dica legal é que você pode subir um container de forma pontual a fim de validar uma hipótese, por exemplo, um teste de segurança em uma nova versão da aplicação que ainda está em fase de desenvolvimento, rodar um scan e validar uma vulnerabilidade, subir um ambiente POC e etc … Você faz isso, passando o parâmetro –rm.

  • Suba o container com parâmetro –rm e observe que ele vai ser ativado.
$ docker container run -d -p 90080:80 --rm --name vuln-bwapp raesene/bwapp
  • Observe o status dele
$ docker container ls
  • Observe os containeres existentes no host
$ docker container ps -a
  • Pare o container
$ docker container stop <nome / ID>

Execute novamente os comandos para listar e exibir os containeres existentes e repare que após dar o “stop”, o container foi excluído sem que você precisasse fazer isso manualmente. Ou seja, você sobe o container, testa, dá o stop e o Docker já exlui ele pra você.

CONCLUSÃO

Percebeu o quanto é simples subir aplicações e ambientes POC, usando Docker? Observe que usei a maior parte deste post para explicar sobre conceitos e sobre como gerenciar o Docker.

Se você ainda não tem intimidade com a plataforma, pode ser que tenha uma dificuldade aqui e outra ali, mas isso é perfeitamente normal. Depois que você dominar ao menos o que tentei passar aqui, você vai poder subir laboratórios ou ambientes de prova de conceito — “POC”, com praticidade e isso tende a dar um up na tua produtividade.

A partir daqui, procure estudar sobre como criar aplicações em versão container e crie laboratórios que atendam as suas necessidades de trabalho ou pesquisa.

 

https://medium.com/@P3tr0sBr/usando-docker-para-seu-web-hacking-lab-7ae3dd8dde9c