#Hackeando con docker

#Introducción

En este post principalmente voy a mostrar mi configuraciones de docker, la mayoría son sacadas de Docker Hub ya que considero que están muy bien hechas y si nos podemos ahorrar trabajo mucho mejor. Pero si que voy hablar de la docker que he creado para mi, para poder hacer los retos de HackTheBox, TryHackMe, Atenea,…
Primero voy a empezar explicando donde utilizo la docker, ya que si alguien le interesa puedo compartir como tengo hecha mi distribución. Así que, si únicamente te interesa como tengo mi docker recomiendo que saltes la primera parte.

#Mi distribución

Personalmente soy una persona que siempre me gustado Linux, así que era muy habitual para mi ir cambiando de distribuciones, me gustaba ver y entender porque eran distintas.
Al final he visto que algunas están mas enfocadas en sus respectivos temas, pero no quiero enfocar ese post en compararlas.
Primero me gustaría compartir un poco mi experiencia con las distribuciones dedicadas al pentesting.
Des de hace un par de años descubrí el mundo de la ciberseguridad me podría gustar, así que empecé a buscar en google como empezar y en todos los sitios me aparecía que tenia que usar Kali Linux, estoy seguro que sabes cual es. Después cuando sabia un poco más me pase a BlackArch ya que había estado con Majaro anteriormente y entendía como funcionaba la distribución de Arch. Y desde hace 1 año he estado trabajando con Parrot OS, personalmente es la que más me ha gustado y más cómodo he podido trabajar. Pero tener un único ordenador y dedicarlo el Pentesting sin verlo, se me llenaba de cosas que solo utilizaba una única vez y a veces solamente lo tenia porque creía que me ayudaría en un CTF. Por suerte soy una persona muy organizada y me gusta tenerlo todo en su sitio, aun así tenia el ordenador lleno. Mi única solución era virtualizar pero mi pc no es suficiente bueno como para tener el host y otra maquina virtualizada corriendo, y que no se congele o le pase algo que no pudiera trabajar cómodamente.
Así que al final me decidir hacer un cambio de nuevo. Actualmente estoy trabajando con Arch Linux, configurado con el entorno de bspwm. Mi intención no era tener de nuevo un host pentesting, pero si buscaba algo muy ligero y que menos que Arch linux.
Ahora la pregunta seria y, ¿Y como lo hago para dedicarme al pentest?
Y aquí el nombre del título. Recientemente aprendí a usar docker y me gusto mucho su funcionamiento así que decidir aprender mas y eso también ha sido uno de los motivos que he ha hecho cambiar de distribución.

Para quién no conozca docker, aquí os dejo una pequeña idea sacado de la Wikipedia.

Docker es un proyecto de código abierto que automatiza el despliegue de aplicaciones dentro de contenedores de software, proporcionando una capa adicional de abstracción y automatización de virtualización de aplicaciones en múltiples sistemas operativos.​ Docker utiliza características de aislamiento de recursos del kernel Linux, tales como cgroups y espacios de nombres (namespaces) para permitir que “contenedores” independientes se ejecuten dentro de una sola instancia de Linux, evitando la sobrecarga de iniciar y mantener máquinas virtuales.

Y si aun no sabés que és aqui te comparto unos enlaces la web oficial donde puedes encontrar que és un contenedor y aprofundir más.
https://www.docker.com/resources/what-container

#Mi configuración de docker

Ahora ya sabiendo un poco de mis problemas con los recursos de mi ordenador empezemos como tengo configurado mi docker.
Actualmente tengo varias imagenes pero algunas son temporales. Asi que me voy a centrar con las que más utilizo.

Como se puede apreciar una és la kali linux la core y la de bugbounty és inspirada con hackersploit/bugbountytoolkit.
Como he dicho la primera tiene referencia a la kali linux core, donde no hay nada instalado. Así que decidí montarlo a mi gusto.
Para crear un contenidor docker a tu gusto simplemente necessitas saber como funciona el archivo Dockerfile.

Poco a poco iré añadiendo herramientas nuevas que vaya viendo a lo largo del tiempo, pero actualmente mi docker cuenta con:

#Tools

#Wordlist

#Scripts

#Web shells

Esta es mi imagen y a partir de aquí creo los contenedores, y voy borrando y creando nuevos en función de lo que necesite. Así siempre esta organizado y cuando acabo tomo mis apuntes y elimino el contenido.

El contenido de mi Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
FROM kalilinux/kali-rolling
LABEL maintainer="Jack21"

ENV HOME /root
ENV DEBIAN_FRONTEND=noninteractive

#Working Directory
WORKDIR /root
RUN mkdir ${HOME}/toolkit && \
mkdir /work && \
mkdir ${HOME}/wordlists && \
mkdir -p ${HOME}/scripts/Enumeration && \
mkdir ${HOME}/scripts/PrivEsc && \
mkdir ${HOME}/scripts/Web

# Install Essentials
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
tmux \
gcc \
iputils-ping\
git \
vim \
wget \
awscli \
tzdata \
curl \
make \
nmap \
whois \
python \
python-pip \
python3 \
python3-pip \
perl \
nikto \
dnsutils \
net-tools \
neovim\
zsh\
nano\
libzip-dev \
nodejs \
npm \
pkg-config \
openssh-client \
rlwrap \
&& rm -rf /var/lib/apt/lists/*

#Install Dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends \
# sqlmap
sqlmap \
# dnsenum
cpanminus \
# wpcscan
libcurl4-openssl-dev \
libxml2 \
libxml2-dev \
libxslt1-dev \
ruby-dev \
libgmp-dev \
zlib1g-dev \
# dnsrecon
dnsrecon \
#crackmapexe
libssl-dev \
libffi-dev\
python-dev \
build-essential \
#netcat
netcat \
#enum4linux
enum4linux \
#dnsenum
dnsenum \
#hashcat
hashcat \
#JohnTheRipper
john \
# hash-identifier
hash-identifier \
# hydra
hydra \
#tcpdump
tcpdump \
#openvpn
openvpn \
&& rm -rf /var/lib/apt/lists/*

# configure python(s)
RUN python -m pip install --upgrade setuptools && python3 -m pip install --upgrade setuptools && python3 -m pip install --upgrade setuptools

# wpscan
RUN cd ${HOME}/toolkit && \
git clone https://github.com/wpscanteam/wpscan.git && \
cd wpscan/ && \
gem install bundler && bundle install --without test && \
gem install wpscan

# go
RUN cd /opt && \
wget https://dl.google.com/go/go1.13.3.linux-amd64.tar.gz && \
tar -xvf go1.13.3.linux-amd64.tar.gz && \
rm -rf /opt/go1.13.3.linux-amd64.tar.gz && \
mv go /usr/local
ENV GOROOT /usr/local/go
ENV GOPATH /root/go
ENV PATH ${GOPATH}/bin:${GOROOT}/bin:${PATH}

# dirsearch
RUN cd ${HOME}/toolkit && \
git clone https://github.com/AlexisAhmed/dirsearch.git && \
cd dirsearch && \
chmod +x dirsearch.py && \
ln -sf ${HOME}/toolkit/dirsearch/dirsearch.py /usr/local/bin/dirsearch

# ffuf
RUN go get github.com/ffuf/ffuf

# zsh
COPY config/zsh/.oh-my-zsh/themes/oxide.zsh-theme ${HOME}/.zshrc
RUN chsh -s /bin/zsh && \
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git "$HOME/.zsh-syntax-highlighting" --depth 1 && \
echo "source $HOME/.zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" >> "$HOME/.zshrc"

# whatweb
RUN cd ${HOME}/toolkit && \
git clone https://github.com/urbanadventurer/WhatWeb.git && \
cd WhatWeb && \
chmod +x whatweb && \
ln -sf ${HOME}/toolkit/WhatWeb/whatweb /usr/local/bin/whatweb

# Crackmapexe

RUN git clone --recursive https://github.com/byt3bl33d3r/CrackMapExec && \
cd CrackMapExec && \
python3 setup.py install

#r2frida

RUN git clone https://github.com/radareorg/radare2.git /opt/radare2 && \
cd /opt/radare2 && \
sys/install.sh && \
r2pm init && \
r2pm -ci r2frida

#evil-winrm
RUN gem install evil-winrm

# JohnTheRipper
RUN git clone https://github.com/magnumripper/JohnTheRipper.git "${HOME}/toolkit/JohnTheRipper"
ENV PATH ${HOME}/toolkit/JohnTheRipper/run:${PATH}

# Download wordlist
# SecList
RUN cd ${HOME}/wordlists && \
git clone --depth 1 https://github.com/danielmiessler/SecLists.git && \
tar -zxvf SecLists/Passwords/Leaked-Databases/rockyou.txt.tar.gz

# Donwload scripts
# LinEnum
RUN wget https://raw.githubusercontent.com/rebootuser/LinEnum/master/LinEnum.sh -o ${HOME}/scripts/Enumeration/LinEnum.sh && \
rm LinEnum.sh

# pspy64 - big
COPY config/scripts/pspy64 ${HOME}/scripts/Enumeration/pspy64

# php-reverse-shell
RUN wget https://raw.githubusercontent.com/pentestmonkey/php-reverse-shell/master/php-reverse-shell.php -o scripts/Web/php-reverse-shell.php && \
rm php-reverse-shell.php
# simple-php-shell

RUN wget https://raw.githubusercontent.com/artyuum/Simple-PHP-Web-Shell/master/index.php -o scripts/Web/simple-webshell.php && \
rm index.php

# Simple Backdoor
RUN echo '<?php system($_GET['cmd']); ?>' > scripts/Web/basic-shell.php

# Add alias
RUN echo -n "\n\n#Alias\n" >> .zshrc && \
echo 'alias ls="lsd"' >> .zshrc && \
echo 'alias ll="ls -l"' >> .zshrc && \
echo 'alias la="ls -a"' >> .zshrc && \
echo 'alias lla="ls -la"' >> .zshrc && \
echo 'alias cme="cracmapexe"' >> .zshrc

Lo comparto por aqui porque aun no és descargable ya que solamente funciona en mi pc, de momento o si eliminas los copy.
Decir que mi archivo .zshrc lo tengo personalizado ya que me gusta ver el nombre de la maquina, donde lo estoy haciendo(HTB,THM,..), su ip y mi ip de la vpn. El thema es oxide.zsh-theme. Las linias que he añadido para lograr el siguiente resultado:

Lineas añadidas

1
2
3
4
5
if [[ $(ifconfig tun0 2> /dev/null ) ]]; then
VPN=$(echo -e " [ $(ifconfig tun0 | grep inet | head -1 | awk '{print $2}') ] ")
else
VPN=""
fi

Y el prompt se ha quedado asi

1
PROMPT=$'\n%{$oxide_orange%} USER_NAME%{$oxide_reset_color%}@%{$oxide_limegreen%}DOMAIN_NAME %{$oxide_reset_color%}%{$oxide_fuego%} [ MACHINE_IP ] %{$oxide_reset_color%}%{$oxide_turquoise%} ${VPN} %{$oxide_reset_color%}%{$oxide_limegreen%}%~%{$oxide_reset_color%} ${vcs_info_msg_0_}\n%(?.%{%F{white}%}.%{$oxide_red%})%(!.#.❯)%{$oxide_reset_color%} '

A continuación hago el siguiente comando y ya tengo la imagen creada.

1
sudo docker build -t marchortelano/pentestkali -f- /mnt/docker < Dockerfile

Por acabar solo falta correr la imagen, como vemos aqui modificamos el prompt y le ponemos los datos que queremos. En la imagen anterior se puede apreciar que no coje el usuario de la maquina sino he modificado lo que quiero ver en mi prompt.

1
2
3
4
sudo docker run -ti --name HTB_$name --cap-add=NET_ADMIN --device /dev/net/tun \       
--sysctl net.ipv6.conf.all.disable_ipv6=0 \
-v /mnt/docker/kali/HTB_$name/work:/work \
marchortelano/pentestkali bash -c "cp ~/.zshrc ~/.zshrc.temp; cat ~/.zshrc.temp | sed 's/USER_NAME/$name/g;s/DOMAIN_NAME/$type/g;s/MACHINE_IP/$ip_machine/g' > ~/.zshrc; zsh"