Skip to main content

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

En el caso del bloque de server aparece un parámetro adicional que es api_key_init, el cual contiene la API KEY. Genere una nueva por temas de seguridad con el comando

TO-DO

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 HTTPS con Nginx ProxyPassReverseProxy 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.

TO-DOOs 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;
        }
}
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)