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 ⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⣿⡿⣸⣔⣿⣿⡄⣿⠀⠀ ⠀⠀⠀⠀⢀⣠⣶⣿⣿⣿⣿⣿⣿⣧⣼⣿⣿⣿⣿⡏⠀⠀ ⠐⠶⠶⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⠇⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⢠⢤⢤⠤⡤⡤⠄⢠⣤⡄⠠⠄⡤⣤⣤⡠⠄