.

.

─────────[ ★ $Docker for Bug Bounty$ ★ ]─────────

Autor: @ferreiraklet


─────────[ ★  Beginning ★ ]─────────



                ;'-. 
    `;-._       )  '---.._
      >  `-.__.-'          `'.__
     /_.-'-._         _,   ^ ---)
jgs  `       `'------/_.'----```
                     `


                ★★★★★★
┌───────────────Sumário────────────────┐
│                                      │
│  1. Um pouco sobre o Docker          │
│     - Para que usar?                 │
│  2. H4nds 0n (criando o d0cker) ->   │
│      - C0nfig files?                 │
│      - D0ckerfile e docker-compose   │
│      - Rodando nosso Docker          │
│                                      │
└──────────────────────────────────────┘


──[ Um pouco sobre o D0cker ]──

O que é o docker?

Bom, para aqueles que nunca tiveram contato com o docker, aqui está um pequeno resumo:

Docker é uma plataforma de código aberto projetada para facilitar o desenvolvimento, implantação e execução de aplicativos usando contêineres. 
Um contêiner é uma unidade isolada e auto-suficiente que encapsula todo o ambiente necessário para que um aplicativo funcione, incluindo o código, as bibliotecas, as dependências e as configurações.
Isto é, o container ou maquina criada, pode ser utilizada com um conjunto de configurações pré setadas, assim, 
possibilitando o uso de códigos, scripts, e até mesmo install_tools (que irei abordar aqui), para agilizar o processo de "arrumar" a maquina.

Além do docker, neste paper irá ser usado o Docker Compose

-> O Docker Compose é uma ferramenta que permite definir e gerenciar aplicativos multi-contêiner em um ambiente Docker. 
Ele utiliza arquivos de configuração YAML para descrever os serviços, redes e volumes necessários para o funcionamento do aplicativo.

Por conseguinte, facilitaremos um pouco o processo de geração de um container para nós, por meio do docker-compose.

Para que usar?

O Docker possui um amplo uso em diversas áreas, e seus principais benefícios estão relacionados à sua capacidade de trabalhar com configurações pré-definidas. 
Um dos aspectos mais incríveis é a capacidade de iniciar um contêiner que instala automaticamente todas as dependências e configurações desejadas, de forma flexível e dinâmica.

Vamos considerar um cenário hipotético em que você adquire uma nova VPS e precisa rapidamente reproduzir o seu ambiente para bug bounty e/ou pentest. 
Ao invés de ter que preparar manualmente todo o ambiente e copiá-lo, 
o Docker permite iniciar um contêiner que automaticamente instala todas as dependências, organiza os diretórios conforme suas preferências e inclui as ferramentas que você utiliza.

Essa abordagem traz muitos benefícios, como a economia de tempo e a garantia de que o ambiente será configurado de forma consistente, 
independentemente da máquina em que estiver sendo executado. Além disso, essa solução oferece portabilidade, 
pois os contêineres podem ser facilmente compartilhados e executados em diferentes plataformas.

Com o Docker, você pode criar imagens personalizadas que encapsulam todo o ambiente necessário para o seu trabalho, 
desde bibliotecas e dependências até scripts e ferramentas específicas. 
Dessa forma, você tem a flexibilidade de configurar e personalizar seu ambiente de trabalho de maneira eficiente e reproduzível.

Em resumo, o Docker permite criar contêineres que fornecem configurações pré-definidas, 
permitindo iniciar rapidamente ambientes de trabalho personalizados com todas as dependências e ferramentas desejadas. 
Essa abordagem oferece praticidade, portabilidade e consistência na configuração do ambiente de desenvolvimento ou produção.


──[ H4nds 0n ]──

Primeiramente, certifique-se de ter instalado o docker e o docker-compose em seu sistema
sudo apt install docker docker-compose

Antes de rodar o container, iremos criar (ou mover) nesse mesmo diretório arquivos de configuração de ferramentas.

!papers@ferreira ~/docker-para-bug-bounty$ ls

.tmux.conf
.zshrc
Dockerfile
config.sh
docker-compose.yaml
install_hacktools.sh
provider-config.yaml
zsh_instalation.sh

Um pouco sobre esses arquivos ==>

!papers@ferreira ~/docker-para-bug-bounty$ cat .tmux.conf # -> Aqui deixo um arquivo para setar algumas coisas personalizadas no tmux como cor e scroll do mouse, que gosto de alterar.
######################
### DESIGN CHANGES ###
######################

# loud or quiet?
set -g visual-activity off
set -g visual-bell off
set -g visual-silence off
setw -g monitor-activity off
set -g bell-action none
set-option -g default-shell /bin/zsh
#  modes
setw -g clock-mode-colour colour5
setw -g mode-style 'fg=colour1 bg=colour18 bold'

# panes
set -g pane-border-style 'fg=colour19 bg=colour0'
set -g pane-active-border-style 'bg=colour0 fg=colour9'

# statusbar
set -g status-position bottom
set -g status-justify left
set -g status-style 'bg=colour18 fg=colour137 dim'
set -g status-left ''
set -g status-right '#[fg=colour233,bg=colour19] %d/%m #[fg=colour233,bg=colour8] %H:%M:%S '
set -g status-right-length 50
set -g status-left-length 20

setw -g window-status-current-style 'fg=colour1 bg=colour19 bold'
setw -g window-status-current-format ' #I#[fg=colour249]:#[fg=colour255]#W#[fg=colour249]#F '

setw -g window-status-style 'fg=colour9 bg=colour18'
setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F '

setw -g window-status-bell-style 'fg=colour255 bg=colour1 bold'
setw -g mouse on
# messages
set -g message-style 'fg=colour232 bg=colour16 bold'



!papers@ferreira ~/docker-para-bug-bounty$ cat .zshrc # -> Recomendo muito que voce crie um rc para bug bounty/pentest, com alias e funções personalizadas do seu gosto, você nao precisa usar zsh, pode usar bash, é de sua preferência.
export ZSH="$HOME/.oh-my-zsh"
source ~/tools/pdiscovery-bot/func.sh 2>/dev/null
ZSH_THEME="spaceship"
export GOPATH=$HOME/go
export PATH=$GOPATH/bin:/usr/local/go/bin:$PATH:$HOME/.local/bin
export PATH="$PATH:$HOME/.axiom/interact"
alias d='docker-compose'
alias faraday='faraday-cli tool report -w asm --plugin-id nuclei'
alias t='tmux new -s'
alias ccat='pygmentize -g'
alias awk1="awk '{print $1}'"
export GO111MODULE=on
alias www='python3 -m http.server '
alias py='python3 '
alias c='clear'
alias urldecode='python3 -c "import sys, urllib.parse as ul; \
  print(ul.unquote_plus(sys.argv[1]))"'
alias urlencode='python3 -c "import sys, urllib.parse as ul; \
  print(ul.quote_plus(sys.argv[1]))"'
export WEBPASTE_TOKEN=iloveweb
cert(){
  curl -s "https://crt.sh/?q=%.$1&output=json" | jq -r '.[].name_value' | sed 's/\*\.//g' | anew $2
 }
export GOROOT=/usr/local/go
export GOPATH=~/go
export PATH=~/go/bin:/bin:~/go/bin:/usr/local/go/bin:~/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:~/.local/bin:~/.axiom/interact:~/.local/bin:~/.axiom/interact
source ~/tools/pdiscovery-bot/func.sh 2>/dev/null
alias go='/usr/local/go/bin/go'
alias scon='/usr/bin/scon'
plugins=(git)
source $ZSH/oh-my-zsh.sh
alias gf='~/go/bin/gf'
alias vim="nvim"
alias v="nvim"
eval $(dircolors ~/.dircolors)

!papers@ferreira ~/docker-para-bug-bounty$ cat config.sh # -> Um arquivo que move esses outros arquivos, como o .tmux.conf, para suas devidas localizações.
#!/bin/bash

apt-get install gcc libpcap-dev zsh python3 python3-pip -y
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
export ZSH_CUSTOM=/root/.oh-my-zsh/custom
curl -OL https://golang.org/dl/go1.19.linux-amd64.tar.gz ; sudo tar -C /usr/local -xvf go1.19.linux-amd64.tar.gz ; cp /usr/local/go/bin/go /usr/bin
wget https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz ; tar xzvf nvim-linux64.tar.gz ; mv ./nvim-linux64/bin/nvim /usr/bin ; bash <(curl -s https://raw.githubusercontent.com/lunarvim/lunarvim/master/utils/installer/install.sh)
git clone https://github.com/spaceship-prompt/spaceship-prompt.git "$ZSH_CUSTOM/themes/spaceship-prompt" --depth=1 ; ln -s "$ZSH_CUSTOM/themes/spaceship-prompt/spaceship.zsh-theme" "$ZSH_CUSTOM/themes/spaceship.zsh-theme"
mv .zshrc ~/.zshrc
mv config.yaml ~/.config/nuclei/
mv provider-config.yaml ~/.config/notify/
mv .tmux.conf ~/.tmux.conf ; tmux source ~/.tmux.conf
wget https://raw.github.com/trapd00r/LS_COLORS/master/LS_COLORS -O ~/.dircolors
echo 'eval $(dircolors ~/.dircolors)' >> ~/.zshrc
source ~/.zshrc

!papers@ferreira ~/docker-para-bug-bounty$ cat Dockerfile # -> Aqui é onde a mágica acontece, irei falar mais sobre adiante.
...

!papers@ferreira ~/docker-para-bug-bounty$ cat docker-compose.yaml # -> Outro arquivo onde a mágica acontece, irei falar mais sobre adiante.
...

!papers@ferreira ~/docker-para-bug-bounty$ cat install_hacktools.sh # -> Responsável por instalar as tools que eu uso. (muito grande para colocar aqui)
...

!papers@ferreira ~/docker-para-bug-bounty$ cat provider-config.yaml # -> É o arquivo de configuração do notify, que serve para notificar para o meu slack (pode usar telegram), output de ferramentas ou scans.
slack:
  - id: "slack"
    slack_channel: "example"
    slack_username: "example_user"
    slack_format: "{{data}}"
    slack_webhook_url: "https://hooks.slack.com/services/x/y"

!papers@ferreira ~/docker-para-bug-bounty$ cat zsh_instalation.sh # -> Como eu gosto do zsh, criei um pequeno script para instalar ele.
#!/bin/bash
bash -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

<==


Sobre o Dockerfile e o docker-compose.yaml

!papers@ferreira ~/docker-para-bug-bounty$ cat Dockerfile

===>

FROM python:3.10.4-slim-buster
COPY --from=golang:1.18.2-bullseye /usr/local/go/ /usr/local/go/
WORKDIR /root

ENV PATH="/usr/local/go/bin:${PATH}"
ENV GOPATH /go
ENV PATH $GOPATH/bin:$PATH

RUN apt-get update
RUN apt-get -qq -y install vim tmux make gcc zsh
RUN apt-get -qq -y install curl unzip tar wget libpcap-dev
RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 777 "$GOPATH"
RUN mkdir /root/tools
RUN mkdir /root/setup
RUN echo "source ~/tools/pdiscovery-bot/func.sh" >> ~/.bashrc

COPY install_hacktools.sh /root/setup/install_hacktools.sh
COPY install.sh /root/setup/install.sh
COPY scon /usr/bin/scon
COPY pdiscovery-bot /root/tools/pdiscovery-bot
COPY config.sh /root/setup/config.sh
COPY provider-config.yaml /root/setup/provider-config.yaml
COPY config.yaml /root/setup/config.yaml
COPY .zshrc /root/setup/.zshrc
COPY .tmux.conf /root/setup/.tmux.conf
COPY zsh_instalation.sh /root/setup/zsh_instalation.sh

RUN chmod +x /root/setup/install* /root/setup/config.sh
RUN chmod +x /usr/bin/scon
RUN bash /root/setup/install.sh
RUN bash /root/setup/install_hacktools.sh

<===

1. Estou usando a imagem python:3.10.4-slim-buster
2. Tenho meu container fundamentado nos diretórios /root/tools, e /root/setup 
   -> /root/tools -> aqui ficam as tools que precisam ter um diretório, Ex: git_dumper
3. Será copiado os conteúdos do atual diretório para dentro do container e seus respectivos lugares,
   -> Note, "COPY scon /usr/bin/scon" => estou mandando aqui meu .sh que faz recon de subdominios para o /usr/bin
   -> Note, "COPY pdiscovery-bot /root/tools/pdiscovery-bot" => Envio o meu robo para a pasta tools
   -> e mando o resto como config.sh, provider-config.yaml, etc, para /root/setup.
4. Por fim irá rodar chmod +x nos arquivos em que eu instalo tools e no config.sh


!papers@ferreira ~/docker-para-bug-bounty$ cat docker-compose.yaml

version: '3.1'

services:
  app:
    image: ubuntu
    container_name: james_app
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    stdin_open: true
    tty: true


Observações:
 - Imagem = ubuntu
 - Nome do container = james_app
 - Builda-rá o container no diretório atual e usando o dockerfile


Rodando o docker

Dentro do diretório, rode

!papers@ferreira ~/docker-para-bug-bounty$ docker-compose up -d # -> Note que pode demorar um pouco

!papers@ferreira ~/docker-para-bug-bounty$ docker ps
CONTAINER ID   IMAGE     COMMAND     CREATED       STATUS       PORTS     NAMES
1e1feaf22096   ubuntu    "python3"   1 days ago   Up 1 days             james_app

Para entrar no docker ->

!papers@ferreira ~/docker-para-bug-bounty$ docker exec -it james_app bash
root@1e1feaf22096:~# ls
hacking setup tools dotfiles

GG! Docker montado com as ferramentas e preparado para a batalha.

──[ End ]──


Caro leitor, que você possa ter adquirido uma noção de como você pode estruturar o seu docker para bug bounty, assim como ele pode ser útil
Tamo junto !!!

Acha que acabou? Tome aqui um presente:

IyEvdXNyL2Jpbi9lbnYgYmFzaAoKREVCVUdfU1REPSImPi9kZXYvbnVsbCIKREVCVUdfRVJST1I9IjI+L2Rldi9udWxsIgoKIyBURVJNIENPTE9SUwpiYmx1ZT0nXDAzM1sxOzM0bScKCnByaW50ZiAiJHtiYmx1ZX0gUnVubmluZzogSW5zdGFsbGluZyBHb2xhbmcgdG9vbHMgKCR7I2dvdG9vbHNbQF19KSR7cmVzZXR9XG5cbiIKCmdvIGVudiAtdyBHTzExMU1PRFVMRT1hdXRvCgplY2hvICJJbnN0YWxsIGZmZiIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9mZmZAbGF0ZXN0CmVjaG8gImluc3RhbGwgc29uYXJieXRlIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vY2hhbm55ZWluMTMzNy9zb25hcmJ5dGVAbGF0ZXN0CmVjaG8gIkluc3RhbGwgaGFrcmF3bGVyIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vaGFrbHVrZS9oYWtyYXdsZXJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgdG9qc29uIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL2hhY2tzL3RvanNvbkBsYXRlc3QKZWNobyAiSW5zdGFsbCBnb3dpdG5lc3MiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9zZW5zZXBvc3QvZ293aXRuZXNzQGxhdGVzdAplY2hvICJJbnN0YWxsIHJ1c2giCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9zaGVud2VpMzU2L3J1c2hAbGF0ZXN0CmVjaG8gIkluc3RhbGwgbmFhYnUiCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L25hYWJ1L3YyL2NtZC9uYWFidUBsYXRlc3QKZWNobyAiSW5zdGFsbCBoYWtjaGVja3VybCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2hha2x1a2UvaGFrY2hlY2t1cmxAbGF0ZXN0CmVjaG8gIkluc3RhbGwgc2h1ZmZsZWRucyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Byb2plY3RkaXNjb3Zlcnkvc2h1ZmZsZWRucy9jbWQvc2h1ZmZsZWRuc0BsYXRlc3QKZWNobyAiSW5zdGFsbCByZXNjb3BlIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vcm9vdDRsb290L3Jlc2NvcGVAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZ3JvbiIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9ncm9uQGxhdGVzdAplY2hvICJJbnN0YWxsIGh0bWwtdG9vbCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9oYWNrcy9odG1sLXRvb2xAbGF0ZXN0CmVjaG8gIkluc3RhbGwgQ2hhb3MiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L2NoYW9zLWNsaWVudC9jbWQvY2hhb3NAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZ2YiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS90b21ub21ub20vZ2ZAbGF0ZXN0CmVjaG8gIkluc3RhbGwgcXNyZXBsYWNlIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL3FzcmVwbGFjZUBsYXRlc3QKZWNobyAiSW5zdGFsbCBBbWFzcyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL09XQVNQL0FtYXNzL3YzLy4uLkBsYXRlc3QKZWNobyAiSW5zdGFsbCBmZnVmIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZmZ1Zi9mZnVmQGxhdGVzdAplY2hvICJJbnN0YWxsIGFzc2V0ZmluZGVyIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL2Fzc2V0ZmluZGVyQGxhdGVzdAplY2hvICJJbnN0YWxsIGdpdGh1Yi1zdWJkb21haW5zIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZ3dlbjAwMS9naXRodWItc3ViZG9tYWluc0BsYXRlc3QKZWNobyAiSW5zdGFsbCBjZi1jaGVjayIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2R3aXNpc3dhbnQwL2NmLWNoZWNrQGxhdGVzdAplY2hvICJJbnN0YWxsIHdheWJhY2t1cmxzIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL2hhY2tzL3dheWJhY2t1cmxzQGxhdGVzdAplY2hvICJJbnN0YWxsIG51Y2xlaSIKZ28gaW5zdGFsbCAtdiBnaXRodWIuY29tL3Byb2plY3RkaXNjb3ZlcnkvbnVjbGVpL3YyL2NtZC9udWNsZWlAbGF0ZXN0CmVjaG8gIkluc3RhbGwgYW5ldyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9hbmV3QGxhdGVzdAplY2hvICJJbnN0YWxsIG5vdGlmeSIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Byb2plY3RkaXNjb3Zlcnkvbm90aWZ5L2NtZC9ub3RpZnlAbGF0ZXN0CmVjaG8gIkluc3RhbGwgbWlsZGV3IgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZGFlaGVlL21pbGRldy9jbWQvbWlsZGV3QGxhdGVzdAplY2hvICJJbnN0YWxsIGRpcmRhciIKZ28gaW5zdGFsbCBnaXRodWIuY29tL200ZG0wZS9kaXJkYXJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgdW5mdXJsIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vdG9tbm9tbm9tL3VuZnVybEBsYXRlc3QKZWNobyAiSW5zdGFsbCBodHRweCIKZ28gaW5zdGFsbCAtdiBnaXRodWIuY29tL3Byb2plY3RkaXNjb3ZlcnkvaHR0cHgvY21kL2h0dHB4QGxhdGVzdAplY2hvICJJbnN0YWxsIGdpdGh1Yi1lbmRwb2ludHMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9nd2VuMDAxL2dpdGh1Yi1lbmRwb2ludHNAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZG5zeCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Byb2plY3RkaXNjb3ZlcnkvZG5zeC9jbWQvZG5zeEBsYXRlc3QKZWNobyAiSW5zdGFsbCBzdWJmaW5kZXIiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L3N1YmZpbmRlci92Mi9jbWQvc3ViZmluZGVyQGxhdGVzdAplY2hvICJJbnN0YWxsIGdhdXBsdXMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9sYy9nYXUvdjIvY21kL2dhdUBsYXRlc3QKZ28gaW5zdGFsbCBnaXRodWIuY29tL2JwMGxyL2dhdXBsdXNAbGF0ZXN0CmVjaG8gIkluc3RhbGwgc3VianMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9sYy9zdWJqc0BsYXRlc3QKZWNobyAiSW5zdGFsbCBHeHNzIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vS2F0aGFuUDE5L0d4c3NAbGF0ZXN0CmVjaG8gIkluc3RhbGwgZ29zcGlkZXIiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9qYWVsZXMtcHJvamVjdC9nb3NwaWRlckBsYXRlc3QKZWNobyAiSW5zdGFsbCBjcm9iYXQiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9jZ2JvYWwvc29uYXJzZWFyY2gvY3JvYmF0QGxhdGVzdAplY2hvICJJbnN0YWxsIGNybGZ1enoiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kd2lzaXN3YW50MC9jcmxmdXp6L2NtZC9jcmxmdXp6QGxhdGVzdAplY2hvICJJbnN0YWxsIGRhbGZveCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2hhaHd1bC9kYWxmb3gvdjJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgcHVyZWRucyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2QzbW9uZGV2L3B1cmVkbnMvdjJAbGF0ZXN0CmVjaG8gIkluc3RhbGwgcmVzb2x2ZURvbWFpbnMiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9Kb3N1ZTg3L3Jlc29sdmVEb21haW5zQGxhdGVzdAplY2hvICJJbnN0YWxsIGludGVyYWN0c2gtY2xpZW50IgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vcHJvamVjdGRpc2NvdmVyeS9pbnRlcmFjdHNoL2NtZC9pbnRlcmFjdHNoLWNsaWVudEBsYXRlc3QKZWNobyAiSW5zdGFsbCBnb3RhdG9yIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vSm9zdWU4Ny9nb3RhdG9yQGxhdGVzdApnbyBpbnN0YWxsIC12IGdpdGh1Yi5jb20vcHJvamVjdGRpc2NvdmVyeS9uYWFidS92Mi9jbWQvbmFhYnVAbGF0ZXN0CmVjaG8gIkluc3RhbGwga3hzcyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9oYWNrcy9reHNzQGxhdGVzdAplY2hvICJJbnN0YWxsIEdldEpzIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vMDAzcmFuZG9tL2dldEpTQGxhdGVzdAplY2hvICJJbnN0YWxsIEdvb3AiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9kZWxldGVzY2FwZS9nb29wQGxhdGVzdAplY2hvICJJbnN0YWxsIE1lZyIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3RvbW5vbW5vbS9tZWdAbGF0ZXN0CmVjaG8gIkluc3RhbGwgRnJlcSIKZ28gaW5zdGFsbCBnaXRodWIuY29tL3Rha3NoYWwvZnJlcUBsYXRlc3QKZWNobyAiSW5zdGFsbCBTZGxvb2t1cCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2ozc3NpZS9zZGxvb2t1cEBsYXRlc3QKZWNobyAiSW5zdGFsbCBTaWd1cmxmaW5kZXIiCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9zaWduZWRzZWN1cml0eS9zaWd1cmxmaW5kM3IvY21kL3NpZ3VybGZpbmQzckBsYXRlc3QKZWNobyAiSW5zdGFsbCBDaHJvbWVkcCIKZ28gaW5zdGFsbCBnaXRodWIuY29tL2Nocm9tZWRwL2Nocm9tZWRwQGxhdGVzdAplY2hvICJJbnN0YWxsIEFpcml4c3MiCmdvIGluc3RhbGwgZ2l0aHViLmNvbS9mZXJyZWlyYWtsZXQvYWlyaXhzc0BsYXRlc3QKZWNobyAiSW5zdGFsbCBOaWxvIgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vZmVycmVpcmFrbGV0L25pbG9AbGF0ZXN0CmVjaG8gIkluc3RhbGwgaGFpcDJob3N0IgpnbyBpbnN0YWxsIGdpdGh1Yi5jb20vaGFrbHVrZS9oYWtpcDJob3N0QGxhdGVzdAplY2hvICJJbnN0YWxsIHNjb3BlaW4iCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9mZXJyZWlyYWtsZXQvc2NvcGVpbkBsYXRlc3QKCmRlY2xhcmUgLUEgcmVwb3MKcmVwb3NbImdmIl09InRvbW5vbW5vbS9nZiIKcmVwb3NbIkdmLVBhdHRlcm5zIl09IjFuZGlhbmwzM3QvR2YtUGF0dGVybnMiCnJlcG9zWyJMaW5rRmluZGVyIl09ImRhcmstd2FybG9yZDE0L0xpbmtGaW5kZXIiCnJlcG9zWyJJbnRlcmxhY2UiXT0iY29kaW5nby9JbnRlcmxhY2UiCnJlcG9zWyJKU1NjYW5uZXIiXT0iMHgyNDB4MjNlbHUvSlNTY2FubmVyIgpyZXBvc1siR2l0VG9vbHMiXT0iaW50ZXJuZXR3YWNoZS9HaXRUb29scyIKcmVwb3NbIlNlY3JldEZpbmRlciJdPSJtNGxsMGsvU2VjcmV0RmluZGVyIgpyZXBvc1siTTRsbDBrIl09Im00bGwway9CQlR6IgpyZXBvc1siR2l0LUR1bXBlciJdPSJhcnRoYXVkL2dpdC1kdW1wZXIiCnJlcG9zWyJDT1JTdGVzdCJdPSJSVUItTkRTL0NPUlN0ZXN0IgpyZXBvc1siS25vY2siXT0iZ3VlbGZvd2ViL2tub2NrIgpyZXBvc1siUGhvdG9uIl09InMwbWQzdi9QaG90b24iCnJlcG9zWyJTdWRvbXkiXT0ic2NyZWV0c2VjL1N1ZG9teSIKcmVwb3NbIkROU3ZhbGlkYXRvciJdPSJ2b3J0ZXhhdS9kbnN2YWxpZGF0b3IiCnJlcG9zWyJNYXNzZG5zIl09ImJsZWNoc2NobWlkdC9tYXNzZG5zIgpyZXBvc1siRGlyc2VhcmNoIl09Im1hdXJvc29yaWEvZGlyc2VhcmNoIgpyZXBvc1siS25veG5sIl09InhubC1oNGNrM3Iva25veG5sIgpyZXBvc1sieG5MaW5rRmluZGVyIl09InhubC1oNGNrM3IveG5MaW5rRmluZGVyIgpyZXBvc1siTVN3ZWxsRE9UUyJdPSJtc3dlbGwvZG90ZmlsZXMiCnJlcG9zWyJXYXltb3JlIl09InhubC1oNGNrM3Ivd2F5bW9yZSIKCmRpcj0iJEhPTUUvdG9vbHMiCgpta2RpciAtcCB+Ly5nZgpta2RpciAtcCB+L3Rvb2xzLwpta2RpciAtcCB+L3Rvb2xzL3dvcmRsaXN0cy8KbWtkaXIgLXAgfi8uY29uZmlnL25vdGlmeS8KbWtkaXIgLXAgfi8uY29uZmlnL2FtYXNzLwpta2RpciAtcCB+Ly5jb25maWcvbnVjbGVpLwoKZWNobyBld29nSUNBZ0ltWnNZV2R6SWpvZ0lpMXBSWFlpTEFvZ0lDQWdJQ0p3WVhSMFpYSnVjeUk2SUZzS0lpNG9hbkJuZkdwd1pXZDhaMmxtZkdOemMzeDBhV1o4ZEdsbVpueHdibWQ4ZEhSbWZIZHZabVo4YVdOdmJueHdaR1o4YzNabmZIUjRkSHhxYzN4M1pXSndmR0Y0WkNraUNsMEtmUW89IHwgYmFzZTY0IC1kID4+IH4vLmdmL2JsYWNrbGlzdC5qc29uCgpwaXAzIGluc3RhbGwgdXJvCnBpcDMgaW5zdGFsbCBiaGVkYWsKCmdvIGluc3RhbGwgLXYgZ2l0aHViLmNvbS9lZG9hcmRvdHR0L2NhcmlkZGkvY21kL2NhcmlkZGlAbGF0ZXN0CmdvIGluc3RhbGwgZ2l0aHViLmNvbS9wcm9qZWN0ZGlzY292ZXJ5L2thdGFuYS9jbWQva2F0YW5hQGxhdGVzdApnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2Fib3VsM2xhL1N1Ymxpc3Qzci5naXQgfi90b29scy9TdWJsaXN0M3IKcGlwMyBpbnN0YWxsIC1yIH4vdG9vbHMvU3VibGlzdDNyL3JlcXVpcmVtZW50cy50eHQKZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9nd2VuMDAxL2dpdGh1Yi1zZWFyY2guZ2l0IH4vdG9vbHMvZ2l0aHViLXNlYXJjaApnbyBpbnN0YWxsIC12IGdpdGh1Yi5jb20vcHJvamVjdGRpc2NvdmVyeS9uYWFidS92Mi9jbWQvbmFhYnVAbGF0ZXN0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvWFNTLU9GSkFBQUgudHh0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYW5pZWxtaWVzc2xlci9TZWNMaXN0cy9tYXN0ZXIvRnV6emluZy9YU1MvWFNTLU9GSkFBQUgudHh0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvcGFyYW1zLnR4dCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vczBtZDN2L0FyanVuL21hc3Rlci9hcmp1bi9kYi9wYXJhbXMudHh0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvcmFmdC1sYXJnZS1kaXJlY3Rvcmllcy1sb3dlcmNhc2UudHh0IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYW5pZWxtaWVzc2xlci9TZWNMaXN0cy9tYXN0ZXIvRGlzY292ZXJ5L1dlYi1Db250ZW50L3JhZnQtbGFyZ2UtZGlyZWN0b3JpZXMtbG93ZXJjYXNlLnR4dApldmFsIHdnZXQgLW5jIC1PIH4vLmdmL3BvdGVudGlhbC5qc29uIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kZXZhbnNoYmF0aGFtL1BhcmFtU3BpZGVyL21hc3Rlci9nZl9wcm9maWxlcy9wb3RlbnRpYWwuanNvbiAkREVCVUdfU1RECmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvaHR0cGFyY2hpdmVfYXBpcm91dGVzXzIwMjJfMDNfMjgudHh0IGh0dHBzOi8vd29yZGxpc3RzLWNkbi5hc3NldG5vdGUuaW8vZGF0YS9hdXRvbWF0ZWQvaHR0cGFyY2hpdmVfYXBpcm91dGVzXzIwMjJfMDNfMjgudHh0CmV2YWwgd2dldCAtbmMgLU8gfi90b29scy93b3JkbGlzdHMvcmFmdC1sYXJnZS1maWxlcy50eHQgaHR0cHM6Ly9naXRodWIuY29tL2RhbmllbG1pZXNzbGVyL1NlY0xpc3RzL2Jsb2IvbWFzdGVyL0Rpc2NvdmVyeS9XZWItQ29udGVudC9yYWZ0LWxhcmdlLWZpbGVzLnR4dApldmFsIHdnZXQgLW5jIC1PIH4vdG9vbHMvd29yZGxpc3RzL3JhZnQtbGFyZ2Utd29yZHMtbG93ZXJjYXNlLnR4dCBodHRwczovL2dpdGh1Yi5jb20vZGFuaWVsbWllc3NsZXIvU2VjTGlzdHMvYmxvYi9tYXN0ZXIvRGlzY292ZXJ5L1dlYi1Db250ZW50L3JhZnQtbGFyZ2Utd29yZHMtbG93ZXJjYXNlLnR4dApwcmludGYgIiR7YmJsdWV9XG4gUnVubmluZzogSW5zdGFsbGluZyByZXBvc2l0b3JpZXMgKCR7I3JlcG9zW0BdfSkke3Jlc2V0fVxuXG4iCgpjZCAiJGRpciIgfHwgewogICAgZWNobyAiRmFpbGVkIHRvIGNkIHRvICRkaXIgaW4gJHtGVU5DTkFNRVswXX0gQCBsaW5lICR7TElORU5PfSIKICAgIGV4aXQgMQp9CgojIFN0YW5kYXJkIHJlcG9zIGluc3RhbGxhdGlvbgpyZXBvc19zdGVwPTAKZm9yIHJlcG8gaW4gIiR7IXJlcG9zW0BdfSI7IGRvCiAgICByZXBvc19zdGVwPSQoKHJlcG9zX3N0ZXAgKyAxKSkKICAgIGV2YWwgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS8ke3JlcG9zWyRyZXBvXX0gJGRpci8kcmVwbyAkREVCVUdfU1RECiAgICBldmFsIGNkICRkaXIvJHJlcG8gJERFQlVHX1NURAogICAgZXZhbCBnaXQgcHVsbCAkREVCVUdfU1RECiAgICBleGl0X3N0YXR1cz0kPwogICAgaWYgWyAkZXhpdF9zdGF0dXMgLWVxIDAgXTsgdGhlbgogICAgICAgIHByaW50ZiAiJHt5ZWxsb3d9ICRyZXBvIGluc3RhbGxlZCAoJHtyZXBvc19zdGVwfS8keyNyZXBvc1tAXX0pJHtyZXNldH1cbiIKICAgIGVsc2UKICAgICAgICBwcmludGYgIiR7cmVkfSBVbmFibGUgdG8gaW5zdGFsbCAkcmVwbywgdHJ5IG1hbnVhbGx5ICgke3JlcG9zX3N0ZXB9LyR7I3JlcG9zW0BdfSkke3Jlc2V0fVxuIgogICAgZmkKICAgIGlmIFsgLXMgInJlcXVpcmVtZW50cy50eHQiIF07IHRoZW4KICAgICAgICBldmFsICRTVURPIHBpcDMgaW5zdGFsbCAtciByZXF1aXJlbWVudHMudHh0ICRERUJVR19TVEQKICAgIGZpCiAgICBpZiBbIC1zICJzZXR1cC5weSIgXTsgdGhlbgogICAgICAgIGV2YWwgJFNVRE8gcHl0aG9uMyBzZXR1cC5weSBpbnN0YWxsICRERUJVR19TVEQKICAgIGZpCiAgICBpZiBbIC1zICJNYWtlZmlsZSIgXTsgdGhlbgogICAgICAgIGV2YWwgJFNVRE8gbWFrZSAkREVCVUdfU1RECiAgICAgICAgZXZhbCAkU1VETyBtYWtlIGluc3RhbGwgJERFQlVHX1NURAogICAgZmkKICAgIGlmIFsgImdmIiA9ICIkcmVwbyIgXTsgdGhlbgogICAgICAgIGV2YWwgY3AgLXIgZXhhbXBsZXMvKi5qc29uIH4vLmdmICRERUJVR19FUlJPUgogICAgZWxpZiBbICJHZi1QYXR0ZXJucyIgPSAiJHJlcG8iIF07IHRoZW4KICAgICAgICBldmFsIG12ICouanNvbiB+Ly5nZiAkREVCVUdfRVJST1IKICAgIGZpCiAgICBjZCAiJGRpciIgfHwgewogICAgICAgIGVjaG8gIkZhaWxlZCB0byBjZCB0byAkZGlyIGluICR7RlVOQ05BTUVbMF19IEAgbGluZSAke0xJTkVOT30iCiAgICAgICAgZXhpdCAxCiAgICB9CmRvbmUKCmVjaG8gIkFkZCBteSBnZiB0ZW1wbGF0ZXMiCmNwIC1yICRIT01FL3Rvb2xzL01Td2VsbERPVFMvY29uZmlnL2hvbWUvLmdmLyouanNvbiAkSE9NRS8uZ2Yv

END


⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⣶⣾⣿⣿⣿⣿⣿⡏⡆⠀
⠀⠀⠀⠀⠀⠀⠀⣠⣾⠿⠛⠋⠉⠉⠉⠈⠉⠛⠛⢳⡇⠀
⠀⠀⠀⠀⠀⢀⠞⠋⠀⠀⣷⣤⣀⣀⣀⠀⠀⠀⠀⠸⡇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣢⠄⠀⠀⡇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⡀⠀⠀⡇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡇⠀⣀⣇⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣧⣴⣾⣻⡆
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣸⣿⡇
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⣿⣿⣭⣾⣿⣿⣿⠉⣛⢿⠿⠁
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣷⣶⣿⣻⣿⣆⠙⣿⠀⠀     "H4ck f0r l1v1ng" - ferreira
⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⡿⣸⣔⣿⣿⡄⣿⠀⠀
⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣧⣼⣿⣿⣿⣿⡏⠀⠀
⠐⠶⠶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠇⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢠⢤⢤⠤⡤⡤⠄⢠⣤⡄⠠⠄⡤⣤⣤⡠⠄