Instalación de Gophish
Para realizar la instalación de Gophish en sistema Docker es necesario tener docker instalado Instalar Docker en Debian 11/12.
Creación de directorio
Crear el directorio para la configuración del contenedor de docker. Puede cambiar la ruta al que más le convenga.
mkdir /docker/gophish -p
cd /docker/gophish
Ficheros de configuración para docker
Necesitaremos mínimo 2 ficheros para iniciarlizar el docker, el docker-compose y un fichero config.json
config.json
En este fichero se definen ciertas configuraciones respecto a la aplicación web gophish como los puertos de escucha, ips desde las cuales está permitido acceder, si usar conexión HTTPS (TLS) o HTTP plano y los certificados a usar.
{
"contact_address": "",
"db_name": "sqlite3",
"db_path": "gophish.db",
"migrations_prefix": "db/db_",
"admin_server": {
"api_key_init": "dba840fa0f7e03851ca695801f41c4a50fbbdb653ece0e2cdebbcb2977e5dfe1",
"cert_path": "/run/secrets/admin_fullchain.pem",
"key_path": "/run/secrets/admin_privkey.pem",
"listen_url": "0.0.0.0:3333",
"use_tls": false
},
"phish_server": {
"cert_path": "/run/secrets/phish_fullchain.pem",
"key_path": "/run/secrets/phish_privkey.pem",
"listen_url": "0.0.0.0:8080",
"use_tls": false
}
}
Como se puede ver, tanto para el bloque admin_server
como para phish_server
existen los campos
Parámetro | Valores | Descripción |
---|---|---|
listen_url | 0.0.0.0:8080 | Indica la ip desde la cual estará disponible la web y el puerto. En el caso de 0.0.0.0 indica que será accesible desde cualquiera de las interfaces de la máquina donde está montado el sistema. |
use_tls | true false |
Permite especificar si la web admin/phish va a hacer uso de certificado SSL (HTTPS). Si va a usar un nginx/apache como reverse-proxy, entonces lo puede dejar en false. |
cert_path | ruta al certificado tls | Solo es necesario si ha indicado el parámetro use_tls como true. Entonces ha de indicar la ruta donde estará el certificado. |
key_path | ruta al fichero .key tls | Solo es necesario si ha indicado el parámetro use_tls como true. Entonces ha de indicar la ruta donde estará el fichero .key |
docker-compose.yml
A continuación genere el fichero docker-compose.yml
con el siguiente contenido.
---
version: "3.7"
secrets:
config_json:
file: ./config.json
admin_fullchain_pem:
file: ./src/secrets/admin_fullchain.pem
admin_privkey_pem:
file: ./src/secrets/admin_privkey.pem
phish_fullchain_pem:
file: ./src/secrets/phish_fullchain.pem
phish_privkey_pem:
file: ./src/secrets/phish_privkey.pem
services:
gophish:
image: cisagov/gophish:0.0.8
ports:
- target: 3333
published: 3333
protocol: tcp
mode: host
- target: 8080
published: 3380
protocol: tcp
mode: host
secrets:
- source: config_json
target: config.json
# - source: admin_fullchain_pem
# target: admin_fullchain.pem
# - source: admin_privkey_pem
# target: admin_privkey.pem
# - source: phish_fullchain_pem
# target: phish_fullchain.pem
# - source: phish_privkey_pem
# target: phish_privkey.pem
En caso de que haya seleccionado en el fichero config.json use_tls a true
en alguno de los bloques de web, deberá añadir aquí el certificado de cada uno de ellos nombrandolos tal como se puede ver en el bloque secrets
superior y descomente la lineas acordes en el apartado secrets
inferior. Guarde los cambios y ejecute
docker-compose up
Podrá ver como se descarga la imagen, se crea el container y se inicializa el docker. Sin embargo se quedará como en la ventana de logs y si pulsa CTRL
+C
se detendrá el container. Puede realizar dos opciones:
docker container start gophish_gophish_1
El cual encenderá el docker o bien directamente lanzar el comando
docker compose up --detach
Accediendo al portal de administración
Una vez inicializado el docker, al intentar acceder nos faltará saber la contraseña que viene por defecto. Antiguamente el usuario era admin
y la contraseña gophish
, sin embargo aunque en la versión de docker el usuario admin
se ha mantenido, la contraseña se genera aleatoriamente. Para verla , deberá revisar los logs del docker con el comando.
docker logs gophish-gophish-1
Una vez obtenida la contraseña, acceda mediante el navegador a la web de administración con
http://IP_DEL_SERVIDOR:3333/
introduzca la contraseña y ya estará en el portal de administración.
Configurando Nginx ReverseProxy y HTTPS
Nginx va a ser el encargado de activar el TLS en la web de administración y la web de phishing.
Lo primero es disponer de un dominio contratado o contratarlo, en mi caso lo realizaré con un subdominio de un dominio existente.
gpad.driverlandia.com
Será el subdominio creado para el portal de administración. Obviamente este portal no debería ser accesible desde internet, asi que lo protegeremos poniendo un allow list. Lo ideal es que no tuviera ni el nginx forwarding accesible desde internet, pero para mostrar como se puede realizar os lo dejo a continuación.
Os pido que no intenteis acceder a este dominio...
Lo primero es tener instalado Apache o Nginx, en este manual se hará uso de Nginx. Así que instala Nginx en caso de que no lo tengas en tu sistema. La distribución donde se está realizando la instalación es una Debian.
apt install nginx
Crear el fichero virtualhost para el reverse proxy.
nano /etc/nginx/sites-available/gpad.driverlandia.conf
Añade el siguiente contenido
server {
listen 80;
server_name gpad.driverlandia.com;
location / {
# Bloqueo de IPs que pueden acceder a esta location
# allow 192.168.0.0/24;
# deny all;
# IP y puerto del servidor real
proxy_pass http://10.15.50.10:3333/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Cree el link symbolico de la configuración a la carpeta de sites-enabled
ln -s ruta_fichero_configuracion_existente carpeta_donde_alojar_link_simbolico
Antes de reiniciar o recargar el servicio Nginx, valide la configuración. Debería indicarle que la configuración es correcta.
nginx -t
Recargue el servicio de nginx
systemctl reload nginx
o reinicielo.
systemctl restart nginx
Si no ha creado el registro DNS anteriormente, es momento de crearlo en su proveedor de dominio, o si bien es para uso interno entonces en su servidor DNS. En este caso se realizará en un proveedor de DNS externo. Si dispone de IP dinámica, deberá crearse un DynDNS o DuckDNS, instalar el agente para que actualice la IP... pero eso no es un tema a tratar en este post.
Recuerda que una vez creado el registro DNS, este puede tardar hasta 48h en verse totalmente desplegado y replicado... por lo que si al momento de crearlo no te funciona.. simplemente tendrás que esperar. Eso o te creas el registro en tu fichero hosts apuntando a la IP de tu servidor.
Creado el registro y ya disponible desde su conexión, proceda accediendo a la web por el puerto 80.
Deberá poder visualizar correctamente que carga la página
Es momento de activar el HTTPS con Let's Encrypt. Instale certbot en el servidor donde ha instalado Nginx.
apt install certbot
Una vez instalado, ejecute el comando
certbot
Puede que le aparezcan mas dominios, seleccione solo el que desea que se instale el certificado proporcionado por Let's Encrypt. En este caso, al ser el único, pues seleccionare el 1.
Si le aparece el siguiente mensaje, recuerde que debe revisar que los firewalls o el NAT del router permitan navegar al puerto 80.
Una vez configurado el NAT o el firewall, deberá recibir un mensaje como el siguiente
Si revisa la configuración del virtualhost de nuevo, podrá ver como se le ha creado una seccione con listen 443 ssl y la que había definido antes (listen 80) ahora tiene una redirección a la de 443. Esto es correcto, puesto que todo el que intente navegar por su web mediante HTTP, automáticamente será redireccionado a la conexión HTTPS.
Al acceder a la web podrá ver como el certificado está firmado por let's encrypt.
Recuerde que todo certificado Let's Encrypt hay que renovarlo cada 3 meses. Puede poner una tarea en el cron de su sistema Linux para que se realice automáticamente.
30 0 * * * /usr/bin/certbot renew --deploy-hook 'systemctl restart nginx'
Para las campañas se verá en los siguientes posts (pero el procedimiento una vez exista la url o dominio creado para la campaña, el firmarlo con letsencrypt debería ser igual)