{"id":237,"date":"2018-08-22T13:41:02","date_gmt":"2018-08-22T11:41:02","guid":{"rendered":"https:\/\/tiraquelibras.com\/blog\/?p=237"},"modified":"2019-12-26T17:00:52","modified_gmt":"2019-12-26T16:00:52","slug":"gophish-instalacion-con-docker","status":"publish","type":"post","link":"https:\/\/blog.tiraquelibras.com\/?p=237","title":{"rendered":"Gophish &#8211; instalaci\u00f3n con Docker"},"content":{"rendered":"<p><a href=\"https:\/\/getgophish.com\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">Gophish<\/a> es una es una plataforma para el env\u00edo de campa\u00f1as de <em>concienciaci\u00f3n<\/em> muy completa e intuitiva. Con ella podremos realizar env\u00edo de campa\u00f1as de phising para la obtenci\u00f3n de credenciales, permitiendo identificar a los usuarios susceptibles de ser realmente enga\u00f1ados. Es una herramienta realmente \u00fatil para las corporaciones, tanto grandes como peque\u00f1as, que destinan esfuerzos en la educaci\u00f3n de sus empleados\/colaboradores con el fin de evitar fugas de informaci\u00f3n.<\/p>\n<p>La herramienta permite realizar campa\u00f1as de emailing usando ingenier\u00eda social con el fin de obtener informaci\u00f3n de las v\u00edctimas a las que van dirigidas. Para ello se crea un mensaje en donde se solicita al usuario que ingrese en un enlace para facilitar cierta informaci\u00f3n (credenciales u otro tipo de datos). En este enlace se puede configurar una web est\u00e1tica con un formulario en donde se puede simular la apariencia de un webmail cuya identidad queramos suplantar, incluso nos permite la importaci\u00f3n de una URL para obtener los elementos HTML\/CSS y facilitarnos un poco la labor, aunque ya adelanto que a\u00fan as\u00ed tendremos que tocar algo el c\u00f3digo. Una vez la v\u00edctima env\u00ede los datos del formulario podemos configurar una redirecci\u00f3n a otro portal, por ejemplo el leg\u00edtimo o una web en donde se muestre que ha sido enga\u00f1ada. Posteriormente podremos identificar el estado de los buzones en cada campa\u00f1a, si han recibido el email, si lo han abierto, si han picado en el enlace o no, los datos que han enviado en el formulario (ojo que las contrase\u00f1as se almacenan y muestran en texto plano), &#8230; una herramienta realmente completa y en continuo desarrollo.<\/p>\n<p>En la actualidad se encuentra en la versi\u00f3n 0.6.0. Para su actualizaci\u00f3n basta con copiar el archivo de configuraci\u00f3n <strong>config.json<\/strong>, copiar el directorio de instalaci\u00f3n, descargar el nuevo y recuperar el archivo de configuraci\u00f3n anterior (recuerda hacer una nueva copia del descargado).Tienes toda la informaci\u00f3n en la web oficial.<\/p>\n<p>En mi caso he optado por la instalaci\u00f3n de esta plataforma en un contenedor de <strong><em>Docker<\/em><\/strong>, evitando errores de compatibilidad con versiones o dependencias, sistemas operativos, &#8230; Por ejemplo, si tienes un Centos 6 vas a tener problemas con la versi\u00f3n del compilador <strong>gcc,<\/strong>\u00a0ya que requiere una versi\u00f3n que solo se puede usar en un Centos 7 si no quieres generar problemas al sistema. Con <strong><em>Docker<\/em> <\/strong>no tendr\u00e1s obst\u00e1culo alguno en este sentido.<\/p>\n<p>Tambi\u00e9n he optado por utilizar la base de datos fuera del contenedor, bien en otro contenedor o en el host anfitri\u00f3n, ya que toda la informaci\u00f3n se guarda en esta y un reinicio del host sin un backup previo del contenedor borrar\u00e1 toda la informaci\u00f3n volviendo al estado inicial tras su arranque. Tambi\u00e9n he cambiado el motor de base de datos que usa por defecto <em><strong>SQLite<\/strong><\/em> por <em><strong>MySQL\/Mariadb<\/strong><\/em> y apuntando al motor instalado en el host que contiene los contenedores.<\/p>\n<p>Los requisitos m\u00ednimos necesarios para usar este programa en nuestro escenario son:<\/p>\n<ul>\n<li>Docker instalado.<\/li>\n<li>MySQL\/Mariadb instalado.<\/li>\n<li>Puertos 3333 de administraci\u00f3n accesible pero no p\u00fablico (se puede cambiar).<\/li>\n<li>Puerto 8080 de acceso al phising accesible p\u00fablico (se puede cambiar).<\/li>\n<li>Conocimientos b\u00e1sico de HTML\/CSS.<\/li>\n<li>Servidor de correo o cuenta en servidor externo que no bloquee tus env\u00edos.<\/li>\n<\/ul>\n<p>Los puertos se pueden cambiar tanto en el host anfitri\u00f3n como en el contenedor a partir de un contenedor inicial arrancado, como veremos m\u00e1s adelante.<\/p>\n<p>Damos por supuesto que tanto <em><strong>Docker<\/strong><\/em> como <em><strong>MySQL\/Mariadb<\/strong><\/em> est\u00e1n instalados en el sistema. Hay mucha documentaci\u00f3n al respecto en Internet sobre como hacerlo, pero este no es el objetivo de esta entrada.<\/p>\n<p>Al l\u00edo!!!!!<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_76 counter-hierarchy ez-toc-counter ez-toc-grey ez-toc-container-direction\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Tabla de contenidos<\/p>\n<label for=\"ez-toc-cssicon-toggle-item-69d0d4617c37f\" class=\"ez-toc-cssicon-toggle-label\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/label><input type=\"checkbox\"  id=\"ez-toc-cssicon-toggle-item-69d0d4617c37f\"  aria-label=\"Alternar\" \/><nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Descarga\"  rel=\"nofollow\" target=\"_blank\">Descarga<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Arranque_del_contenedor\"  rel=\"nofollow\" target=\"_blank\">Arranque del contenedor<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Acceso\"  rel=\"nofollow\" target=\"_blank\">Acceso<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Cambio_de_puertos\"  rel=\"nofollow\" target=\"_blank\">Cambio de puertos<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Puertos_origen\"  rel=\"nofollow\" target=\"_blank\">Puertos origen<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Puertos_destino\"  rel=\"nofollow\" target=\"_blank\">Puertos destino<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-7 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Cambiar_el_motor_de_DB\"  rel=\"nofollow\" target=\"_blank\">Cambiar el motor de DB<\/a><ul class='ez-toc-list-level-3' ><li class='ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8 external external_icon\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\/#Recomendaciones_de_seguridad\"  rel=\"nofollow\" target=\"_blank\">Recomendaciones de seguridad<\/a><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h2><span class=\"ez-toc-section\" id=\"Descarga\"><\/span>Descarga<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Lo primero que tenemos que hacer es acceder a la secci\u00f3n de <em><strong>Gophish<\/strong><\/em>\u00a0en <em><strong>GitHub<\/strong><\/em>, pinchando <a href=\"https:\/\/github.com\/gophish\/gophish\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>, en donde nos remite al enlace del <strong>hub<\/strong> de <em><strong>Docker<\/strong><\/em>, pinchando <a href=\"https:\/\/hub.docker.com\/r\/matteoggl\/gophish\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>. La versi\u00f3n que contiene es la <em><strong>0.6.0<\/strong><\/em>, las m\u00e1s reciente en este momento, creado en un <em><strong>Debian Jessie<\/strong><\/em>.<\/p>\n<p>Nos descargamos la imagen con el siguiente comando:<\/p>\n<pre class=\"EnlighterJSRAW\">docker pull matteoggl\/gophish<\/pre>\n<p>Siendo el resultado:<\/p>\n<pre>Using default tag: latest\r\nTrying to pull repository docker.io\/matteoggl\/gophish ...\r\nlatest: Pulling from docker.io\/matteoggl\/gophish\r\n3d77ce4481b1: Pull complete\r\n24071f356e70: Pull complete\r\n6ff8c180320c: Pull complete\r\n7403558d9197: Pull complete\r\na850c9f0aa43: Pull complete\r\nDigest: sha256:d29c352e7d305b85f2c084070d5eda2fa821586cda51866ef88da5490686fdc2\r\nStatus: Downloaded newer image for docker.io\/matteoggl\/gophish:latest<\/pre>\n<p>Comprobamos que la imagen se descarg\u00f3 correctamente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker images\r\nREPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE\r\ndocker.io\/matteoggl\/gophish   latest              43a7c6101591        3 months ago        248 MB<\/pre>\n<h2><\/h2>\n<hr \/>\n<h2><span class=\"ez-toc-section\" id=\"Arranque_del_contenedor\"><\/span>Arranque del contenedor<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>A continuaci\u00f3n podemos arrancar el contenedor en modo pruebas:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">docker run -ti --name gophish -p 3333:3333 -p 8083:80 matteoggl\/gophish<\/pre>\n<p>O en modo demonio:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">docker run -d --name gophish -p 3333:3333 -p 8083:80 matteoggl\/gophish<\/pre>\n<p>Te recomiendo probar con el primero y cuando hayas comprobado que no devuelve ning\u00fan error durante las pruebas dejarlo en producci\u00f3n como demonio.<\/p>\n<p>En ambos comandos se redirigen los puertos del host anfitri\u00f3n al contenedor, del <strong>3333<\/strong> origen al <strong>3333<\/strong> destino y del <strong>8083<\/strong> al <strong>80<\/strong>. Esto quiere decir que en el FW se deben de abrir los puertos origen, aunque no te recomiendo hacerlo para el de gesti\u00f3n y acceder a trav\u00e9s de un acceso privado o local.<\/p>\n<h2><\/h2>\n<hr \/>\n<h2><span class=\"ez-toc-section\" id=\"Acceso\"><\/span>Acceso<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Una vez arrancado en modo pruebas veremos la siguiente informaci\u00f3n:<\/p>\n<pre>time=\"2018-08-22T12:11:19Z\" level=info msg=\"Background Worker Started Successfully - Waiting for Campaigns\"\r\ngoose: migrating db environment 'production', current version: 0, target: 20180223101813\r\nOK 20160118194630_init.sql\r\nOK 20160131153104_0.1.2_add_event_details.sql\r\nOK 20160211211220_0.1.2_add_ignore_cert_errors.sql\r\nOK 20160217211342_0.1.2_create_from_col_results.sql\r\nOK 20160225173824_0.1.2_capture_credentials.sql\r\nOK 20160227180335_0.1.2_store-smtp-settings.sql\r\nOK 20160317214457_0.2_redirect_url.sql\r\nOK 20160605210903_0.2_campaign_scheduling.sql\r\nOK 20170104220731_0.2_result_statuses.sql\r\nOK 20170219122503_0.2.1_email_headers.sql\r\nOK 20170827141312_0.4_utc_dates.sql\r\nOK 20171027213457_0.4.1_maillogs.sql\r\nOK 20171208201932_0.4.1_next_send_date.sql\r\nOK 20180223101813_0.5.1_user_reporting.sql\r\ntime=\"2018-08-22T12:11:19Z\" level=info msg=\"Starting phishing server at http:\/\/0.0.0.0:80\\n\"\r\ntime=\"2018-08-22T12:11:19Z\" level=info msg=\"Creating new self-signed certificates for administration interface\"\r\ntime=\"2018-08-22T12:11:19Z\" level=info msg=\"TLS Certificate Generation complete\"\r\ntime=\"2018-08-22T12:11:19Z\" level=info msg=\"Starting admin server at https:\/\/0.0.0.0:3333\\n\"<\/pre>\n<p>En donde se crean dentro del contenedor las bases de datos <strong>SQLite<\/strong>, se levanta el puerto <strong>80<\/strong> para publicar la\/s p\u00e1gina\/s de phising, se genera el certificado autofirmado gen\u00e9rico para el acceso al portal de gesti\u00f3n y se levanta el puerto para este en el <strong>3333<\/strong>. Recuerda que los puertos a abrir son los origen indicandos en el apartado anterior.<\/p>\n<p>Probamos el acceso al portal de administraci\u00f3n:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-244\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2018\/08\/gophish1-300x196.jpg\" alt=\"\" width=\"300\" height=\"196\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>Y a la interfaz de publicaci\u00f3n del phising:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-medium wp-image-243\" src=\"https:\/\/blog.tiraquelibras.com\/wp-content\/uploads\/2018\/08\/gophish2-300x269.jpg\" alt=\"\" width=\"300\" height=\"269\" \/><\/p>\n<p>En ambos casos el acceso es correcto, y la ventana del contenedor muestra los logs con ambos accesos. Esto nos indica que todo est\u00e1 funcionando correctamente.<\/p>\n<p>Paramos el contenedor con las teclas <strong>Ctrl + C<\/strong>\u00a0y observamos que el contenedor est\u00e1 parado.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker ps -a\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES\r\n0967258c3849        matteoggl\/gophish   \".\/gophish\"         29 minutes ago      Exited (2) About a minute ago                       gophish\r\n<\/pre>\n<p>Podemos proceder al borrado del contenedor que hemos utilizado para las pruebas.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker rm 0967\r\n\r\n# docker ps -a\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES\r\n<\/pre>\n<p>Ahora podemos arrancar el contenedor como demonio para utilizarlo en producci\u00f3n.<\/p>\n<h2><\/h2>\n<hr \/>\n<h2><span class=\"ez-toc-section\" id=\"Cambio_de_puertos\"><\/span>Cambio de puertos<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<h4><span class=\"ez-toc-section\" id=\"Puertos_origen\"><\/span><span style=\"text-decoration: underline;\">Puertos origen<\/span><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Si queremos cambiar los puertos origen del host anfitri\u00f3n bastar\u00eda con indicar en el comando <strong>docker run<\/strong>\u00a0los puertos origen deseados, por ejemplo levantamos los puertos origen 3331 y 8081:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">docker run -d --name gophish -p 3331:3333 -p 8081:80 matteoggl\/gophish\r\n<\/pre>\n<p>El contenedor muestra la redirecci\u00f3n de puertos configurada:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES\r\nfab32aa8313c        matteoggl\/gophish   \".\/gophish\"         3 seconds ago       Up 3 seconds        0.0.0.0:8081-&gt;80\/tcp, 0.0.0.0:3331-&gt;3333\/tcp   gophish<\/pre>\n<p>Y en el equipo vemos los puertos levantados:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># netstat -an | grep -E \"3331|8081\"\r\ntcp6       0      0 :::8081                 :::*                    LISTEN\r\ntcp6       0      0 :::3331                 :::*                    LISTEN\r\n<\/pre>\n<p>Todo funcionar\u00eda correctamente.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Puertos_destino\"><\/span><span style=\"text-decoration: underline;\">Puertos destino<\/span><span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Sin embargo, si lo que queremos es cambiar los puertos destinos del contenedor\u00a0debemos de acceder a este y modificar el archivo de configuraci\u00f3n de <em><strong>Gophish,<\/strong><\/em>\u00a0 salir de este y hacer una copia de la imagen con el estado actual que ser\u00e1 la que usaremos para arrancar el contenedor.<\/p>\n<p>Para ello arrancamos el contenedor descargado en modo demonio y accedemos a su la consola:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES\r\nbd83393f40cd        matteoggl\/gophish   \".\/gophish\"         3 seconds ago       Up 2 seconds        0.0.0.0:3333-&gt;3333\/tcp, 0.0.0.0:8083-&gt;80\/tcp   gophish\r\n\r\n# docker exec -ti bd83393f40cd bash\r\nroot@bd83393f40cd:\/opt\/gophish-v0.6.0-linux-64bit#<\/pre>\n<p>Una vez dentro hacemos una copia del archivo de configuraci\u00f3n <em><strong>config.json<\/strong><\/em>\u00a0de <em><strong>Gophish<\/strong><\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">root@bd83393f40cd:\/opt\/gophish-v0.6.0-linux-64bit# ls\r\nLICENSE  README.md  VERSION  config.json  db  gophish  gophish.db  gophish_admin.crt  gophish_admin.key  static  templates\r\n\r\nroot@bd83393f40cd:\/opt\/gophish-v0.6.0-linux-64bit# cp -pr config.json config.json.bkp\r\n\r\nroot@bd83393f40cd:\/opt\/gophish-v0.6.0-linux-64bit# ls\r\nLICENSE  README.md  VERSION  config.json  config.json.bkp  db  gophish  gophish.db  gophish_admin.crt  gophish_admin.key  static  templates\r\n<\/pre>\n<p>Lo editamos y modificamos con los datos que queremos.<\/p>\n<p>Contenido original:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># cat config.json\r\n{\r\n        \"admin_server\" : {\r\n                \"listen_url\" : \"0.0.0.0:3333\",\r\n                \"use_tls\" : true,\r\n                \"cert_path\" : \"gophish_admin.crt\",\r\n                \"key_path\" : \"gophish_admin.key\"\r\n        },\r\n        \"phish_server\" : {\r\n                \"listen_url\" : \"0.0.0.0:80\",\r\n                \"use_tls\" : false,\r\n                \"cert_path\" : \"example.crt\",\r\n                \"key_path\": \"example.key\"\r\n        },\r\n        \"db_name\" : \"sqlite3\",\r\n        \"db_path\" : \"gophish.db\",\r\n        \"migrations_prefix\" : \"db\/db_\"\r\n}<\/pre>\n<p>Cambiamos los puertos, por ejemplo del 80 al 81:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">root@bd83393f40cd:\/opt\/gophish-v0.6.0-linux-64bit# sed -i \"s|:80|:81|g\" config.json<\/pre>\n<p>Contenido nuevo:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\">root@bd83393f40cd:\/opt\/gophish-v0.6.0-linux-64bit# cat config.json\r\n{\r\n        \"admin_server\" : {\r\n                \"listen_url\" : \"0.0.0.0:3333\",\r\n                \"use_tls\" : true,\r\n                \"cert_path\" : \"gophish_admin.crt\",\r\n                \"key_path\" : \"gophish_admin.key\"\r\n        },\r\n        \"phish_server\" : {\r\n                \"listen_url\" : \"0.0.0.0:81\",\r\n                \"use_tls\" : false,\r\n                \"cert_path\" : \"example.crt\",\r\n                \"key_path\": \"example.key\"\r\n        },\r\n        \"db_name\" : \"sqlite3\",\r\n        \"db_path\" : \"gophish.db\",\r\n        \"migrations_prefix\" : \"db\/db_\"\r\n}\r\n<\/pre>\n<p>Salimos del contenedor con el comando <strong>exit<\/strong> y creamos una imagen de este con el nombre que queramos. Observamos que se crea una imagen nueva pero no se levanta ning\u00fan contenedor:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES\r\nbd83393f40cd        matteoggl\/gophish   \".\/gophish\"         9 minutes ago       Up 9 minutes        0.0.0.0:3333-&gt;3333\/tcp, 0.0.0.0:8083-&gt;80\/tcp   gophish\r\n\r\n# docker commit bd83393f40cd matteogg\/gophish-81\r\nsha256:4202ce9c9bcac2f84819c47812ccbc734b9d36fbd157d1d7db6fe1016614a349\r\n\r\n# docker images\r\nREPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE\r\nmatteogg\/gophish-81           latest              4202ce9c9bca        2 seconds ago       248 MB\r\ndocker.io\/matteoggl\/gophish   latest              43a7c6101591        3 months ago        248 MB\r\n\r\n# docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES\r\nbd83393f40cd        matteoggl\/gophish   \".\/gophish\"         10 minutes ago      Up 10 minutes       0.0.0.0:3333-&gt;3333\/tcp, 0.0.0.0:8083-&gt;80\/tcp   gophish<\/pre>\n<p>Ahora paramos el contenedor actual y borramos, si no lo vamos a utilizar m\u00e1s, para liberar los puertos ocupados, y procedemos a levantar el nuevo contenedor:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker ps\r\nCONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                                          NAMES\r\nbd83393f40cd        matteoggl\/gophish   \".\/gophish\"         12 minutes ago      Up 12 minutes       0.0.0.0:3333-&gt;3333\/tcp, 0.0.0.0:8083-&gt;80\/tcp   gophish\r\n\r\n# docker stop bd83393f40cd\r\nbd83393f40cd\r\n\r\n# docker rm bd83393f40cd\r\nbd83393f40cd\r\n# docker run -d --name gophish-81 -p 3333:3333 -p 8083:81 matteogg\/gophish-81\r\n33715710ae8aea013555df74066f7a4aa03bd2265afecd3196c4c7b7ae9e7011\r\n\r\n# docker ps\r\nCONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                                  NAMES\r\n33715710ae8a        matteogg\/gophish-81   \".\/gophish\"         31 seconds ago      Up 29 seconds       80\/tcp, 0.0.0.0:3333-&gt;3333\/tcp, 0.0.0.0:8083-&gt;81\/tcp   gophish-81\r\n<\/pre>\n<h2><\/h2>\n<hr \/>\n<h2><span class=\"ez-toc-section\" id=\"Cambiar_el_motor_de_DB\"><\/span>Cambiar el motor de DB<span class=\"ez-toc-section-end\"><\/span><\/h2>\n<p>Por defecto el contenedor viene con el motor de DB <strong><em>SQLite<\/em><\/strong>, pero si queremos cambiarlo a <strong><em>MySQL\/Mariadb<\/em><\/strong> tendremos que realizar los siguientes pasos. Te recomiendo alojarlo bien en el host anfitri\u00f3n, en otro contenedor o en un host externo.<\/p>\n<p>Crear la DB en el host destino, cambiando los valores de DBNAME, USER y PWD:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\">MariaDB [(none)]&gt; create database DBNAME;\r\nQuery OK, 1 row affected (0.00 sec)\r\n\r\nMariaDB [(none)]&gt; create user 'USER'@'%' identified by 'PWD';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nMariaDB [(none)]&gt; grant all privileges on DBNAME.* to 'USER'@'%';\r\nQuery OK, 0 rows affected (0.00 sec)\r\n\r\nMariaDB [(none)]&gt; flush privileges;\r\nQuery OK, 0 rows affected (0.00 sec)<\/pre>\n<p>Ahora tendremos que seguir exactamente el mismo procedimiento que el indicado en el apartado anterior, pero en lugar de cambiar los puertos en el contenedor vamos a especificar el nuevo acceso a la DB en el archivo de configuraci\u00f3n.<\/p>\n<p>Nos conectamos al contenedor (docker exec -ti ID bash), hacemos un backup del archivo de configuraci\u00f3n (cp -pr config.json config.json.bkp) y agregamos el nuevo contenido en donde XX.XX.XX.XX es la IP del host que contiene la DB, USER y PWD el usuario y pasword , DBNAME el nombre de la base de datos indicados en su creaci\u00f3n previa (echo &#8216;&#8230;.&#8217; &gt; config.json):<\/p>\n<pre>{\r\n        \"admin_server\" : {\r\n                \"listen_url\" : \"0.0.0.0:3333\",\r\n                \"use_tls\" : true,\r\n                \"cert_path\" : \"gophish_admin.crt\",\r\n                \"key_path\" : \"gophish_admin.key\"\r\n        },\r\n        \"phish_server\" : {\r\n                \"listen_url\" : \"0.0.0.0:80\",\r\n                \"use_tls\" : false,\r\n                \"cert_path\" : \"example.crt\",\r\n                \"key_path\": \"example.key\"\r\n        },\r\n        \"db_name\" : \"mysql\",\r\n        \"db_path\" : \"USER:PWD@(XX.XX.XX.XX:3306)\/DBNAME?charset=utf8&amp;parseTime=True&amp;loc=Local\",\r\n        \"migrations_prefix\" : \"db\/db_\"\r\n}<\/pre>\n<p>Salimos del contenedor (exit), creamos una imagen del contenedor actual (dicker commit ID nuevo), paramos el contenedor actual para liberar los puertos (docker ps; docker stop ID; y si no queremos usarlo m\u00e1s lo borramos con docker rm ID), y levantamos el nuevo contenedor como demonio.<\/p>\n<p><span style=\"color: #ff0000;\"><strong>OJO CUIDADO!!!<\/strong> <\/span>Si has parado los servicios de seguridad en tu servidor local o en el remoto (selinux, firewalld, ufw, &#8230;) puede que obtengas un error a la hora de levantar el contenedor, como el siguiente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker run -d --name gophish -p 3333:3333 -p 8083:80 gophis-image\r\n2024c1dcc8343e321a00d44b1af38a13885bb4ff906a5a0cdd43127b99fcf419\r\n\/usr\/bin\/docker-current: Error response from daemon: driver failed programming external connectivity on endpoint gophish-image (f7dead4f911baaf18fc5de7be87a5763c70349fe5fcff02c570befffc080938c):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0\/0 --dport 8083 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain\/target\/match by that name.\r\n (exit status 1)).\r\n<\/pre>\n<p>Esto es debido a que tras parar los elementos de seguridad es necesario reiniciar el demonio de <em><strong>Docker<\/strong><\/em>:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># service docker restart<\/pre>\n<p>Con esto ya se podr\u00eda levantar el contenedor sin problema alguno. Recuerda antes borrar el contenedor creado.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker ps -a\r\nCONTAINER ID        IMAGE                         COMMAND             CREATED             STATUS              PORTS                                          NAMES\r\nfb24e58546d0        docker.io\/matteoggl\/gophish   \".\/gophish\"         7 seconds ago       Up 6 seconds        0.0.0.0:3333-&gt;3333\/tcp, 0.0.0.0:8083-&gt;80\/tcp   gophish-mariadb\r\n\r\n# docker stop fb24e58546d0; docker rm fb24e58546d0\r\nfb24e58546d0\r\nfb24e58546d0\r\n\r\n# docker run -d --name gophish -p 3333:3333 -p 8083:80 gophish-image\r\nfed51a48ed742e66c2aa6939e382753f611ac5c0f7f68e4862188dcdfc45f917\r\n<\/pre>\n<p>Para confirmar que todo funciona correctamente podemos observar los logs tras levantar el contenedor y ver que tanto la creaci\u00f3n de las bases de datos como los puertos en las interfaces se levantaron correctamente:<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"null\"># docker logs 11c2085053ae\r\ntime=\"2018-08-23T11:25:27Z\" level=info msg=\"Background Worker Started Successfully - Waiting for Campaigns\"\r\ngoose: migrating db environment 'production', current version: 0, target: 20180223101813\r\nOK    20160118194630_init.sql\r\nOK    20160131153104_0.1.2_add_event_details.sql\r\nOK    20160211211220_0.1.2_add_ignore_cert_errors.sql\r\nOK    20160217211342_0.1.2_create_from_col_results.sql\r\nOK    20160225173824_0.1.2_capture_credentials.sql\r\nOK    20160227180335_0.1.2_store-smtp-settings.sql\r\nOK    20160317214457_0.2_redirect_url.sql\r\nOK    20160605210903_0.2_campaign_scheduling.sql\r\nOK    20161202153627_AttachmentFix.sql\r\nOK    20170104231222_0.2_result_statuses.sql\r\nOK    20170219122503_0.2.1_email_headers.sql\r\nOK    20170828220440_0.4_utc_dates.sql\r\nOK    20171027213457_0.4.1_maillogs.sql\r\nOK    20171208201932_0.4.1_next_send_date.sql\r\nOK    20180223101813_0.5.1_user_reporting.sql\r\ntime=\"2018-08-23T11:25:27Z\" level=info msg=\"Starting phishing server at http:\/\/0.0.0.0:80\\n\"\r\ntime=\"2018-08-23T11:25:27Z\" level=info msg=\"Starting admin server at https:\/\/0.0.0.0:3333\\n\"\r\n<\/pre>\n<p>&nbsp;<\/p>\n<hr \/>\n<h3><span class=\"ez-toc-section\" id=\"Recomendaciones_de_seguridad\"><\/span>Recomendaciones de seguridad<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Para mejorar la seguridad del servicio es recomendable realizar las siguientes tareas previas a levantar el contenedor en producci\u00f3n, es decir realizar estas durante el proceso de creaci\u00f3n y copia del contenedor original:<\/p>\n<ul>\n<li>Levantar la interfaz de gesti\u00f3n en una IP sin acceso p\u00fablico.<\/li>\n<li>Restringir el acceso a la interfaz de gesti\u00f3n identificando los or\u00edgenes permitidos.<\/li>\n<li>Instalar un certificado correcto en lugar de usar los de por defecto.<\/li>\n<li>Tras el cambio de Google sobre las p\u00e1ginas no seguras HTTP, levantar la p\u00e1gina de phising en un puerto seguro (cambiar la l\u00ednea del archivo de configuraci\u00f3n<strong> \u00abuse_tls\u00bb : false<\/strong> por <strong>\u00abuse_tls\u00bb : true<\/strong>).<\/li>\n<li>Hacer un backup diario o tras cada cambio en el contenedor para evitar problemas de p\u00e9rdida de datos tras un reinicio del host.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>Con estos pasos tendr\u00edamos nuestro entorno listo para comenzar a preparar las campa\u00f1as de env\u00edo, cuyos pasos mostraremos en pr\u00f3ximas entradas.<\/p>\n<p>Aaaadios!!!!<\/p>\n<p>&nbsp;<\/p>\n<hr \/>\n<p>Enlaces relacionados:<\/p>\n<p>Gophish sitio oficial pincha <a href=\"https:\/\/getgophish.com\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n<p>Docker contenedor oficial pincha <a href=\"https:\/\/hub.docker.com\/r\/matteoggl\/gophish\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n<p>Docker sitio oficial pincha <a href=\"https:\/\/www.docker.com\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n<p>Docker lista de comandos en Castellano pincha <a href=\"https:\/\/www.danielcastanera.com\/comandos-utiles-en-docker\/\" target=\"_blank\" rel=\"noopener noreferrer nofollow\" class=\"external external_icon\">aqu\u00ed<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Gophish es una es una plataforma para el env\u00edo de campa\u00f1as de concienciaci\u00f3n muy completa e intuitiva. Con ella podremos realizar env\u00edo de campa\u00f1as de<span class=\"read-more-link\"><a class=\"read-more\" href=\"https:\/\/blog.tiraquelibras.com\/?p=237\">Read More<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":238,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,10],"tags":[30,32,31],"class_list":["post-237","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ciberseguridad","category-sistemas","tag-concienciacion","tag-ingenieriasocial","tag-phising"],"post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/237","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=237"}],"version-history":[{"count":0,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/posts\/237\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=\/wp\/v2\/media\/238"}],"wp:attachment":[{"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=237"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=237"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.tiraquelibras.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=237"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}