10 diciembre, 2024

Haciendo Guacamole (apache)

Como parte del laboratorio de malware en equipos virtuales me toco configurar un Apache Guacamole para gestionarlos, aislarlos y evitar abrir la consola desde el hypervisor. 




Intro

Apache Guacamole es un software desarrollado por la organización Apache para la utilización de escritorio remoto sin cliente (Lo llamamos sin cliente porque no se requieren complementos ni software de cliente). Admite protocolos estándar como VNC, RDP y SSH.

Gracias a HTML5, una vez que Guacamole está instalado en un servidor, todo lo que necesita para acceder a sus escritorios es un navegador web.

 

Es una excelente opción para el bastionado de RDP, SSH y VNC


Instalación base

Partiendo de un servidor de Linux, en mi caso un Ubuntu 22.4, comienzo con la instalación de paquetes:

sudo apt install libcairo2-dev libjpeg-turbo8-dev libjpeg-dev libpng-dev libtool-bin libossp-uuid-dev -y

sudo apt install libavcodec-dev libavformat-dev libavutil-dev libswscale-dev freerdp2-dev libssh2-1-dev libtelnet-dev libvncserver-dev libpulse-dev libssl-dev libvorbis-dev libwebp-dev -y

 

------------- Paso particular -------------

 

Pero necesito configurar el wget para que use proxy (es un ambiente de prueba y esta controlado), para ello necesito editar el archivo su configuración:

 sudo nano /etc/wgetrc

 

Descomentar las siguiente líneas y completar con los valores correspondientes:

https_proxy = http://ip_proxy:puerto_proxy/
http_proxy = http://ip_proxy:puerto_proxy/

use_proxy = on

 

------------- FIN Paso particular -------------

 

Descargo el Guacamole de su server (en este caso la versión 1.5.5) y descomprimo (siempre parado en mi home)

wget https://downloads.apache.org/guacamole/1.5.5/source/guacamole-server-1.5.5.tar.gz

tar -xvf guacamole-server-1.5.5.tar.gz


Reconfiguro y compilo

cd guacamole-server-1.5.5/
sudo ./configure --with-init-dir=/etc/init.d
sudo make

 

Instalo lo compilado

sudo make install

 

Actualizo la configuración de librerías y recargo los daemons

sudo ldconfig
sudo systemctl daemon-reload

 

Inicio y activo el servicio de Guacamole

sudo systemctl start guacd && sudo systemctl enable guacd

Verifico el estado que este todo OK

systemctl status guacd

Valido que se haya levantado el proceso con el puerto escuchando

sudo ss -lnpt | grep guacd

Tendría que ver algo así:


Instalo el Tomcat para poder acceder por web

sudo apt install tomcat9 tomcat9-admin tomcat9-common tomcat9-user -y

Compruebo el estado

sudo ss -lnpt | grep java

Tendría que ver algo así:


Descargo paquete binario webapp para tomcat, lo muevo y recargo servicios

wget https://downloads.apache.org/guacamole/1.5.5/binary/guacamole-1.5.5.war

sudo mv guacamole-1.5.5.war /var/lib/tomcat9/webapps/guacamole.war

sudo systemctl restart tomcat9 guacd

 

Creo las carpetas para los archivos de configuración

mkdir /etc/guacamole/
mkdir /etc/guacamole/extensions

mkdir /etc/guacamole/lib


Autenticación

Tiene varios modos como integrar con LDAP, autenticación básica (user-mapping.xml) o mediante una base de datos.

En mi caso uso la validación mediante base de datos, ya que el básico es muy básico y rígido (ademas de quedar todo en texto plano)


Instalación MariaDB

 Descargamos e instalamos

sudo apt install mariadb-server -y
sudo mysql_secure_installation

Respondemos lo sigueinte a las preguntas

  • Enter current password for root:  ➡️ le damos enter ya que es instalación nueva
  • Switch to unix_socket authentication  ➡️ Y
  • Change the root password? ➡️  Y (para configurar la clave de root de la base)
  • Remove anonymous users? ➡️ Y
  • Disallow root login remotely?  ➡️ (no lo pienso editar remotamente la base)
  • Remove test database and access to it? ➡️ Y
  • Reload privileges tables now? ➡️ Y


Listo la instalación de la base!


Instalo conector de la base MySQL/J library 

(descarga, descomprimir y mover)

sudo wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-8.0.26.tar.gz
sudo tar -xf mysql-connector-java-8.0.26.tar.gz

sudo cp mysql-connector-java-8.0.26/mysql-connector-java-8.0.26.jar /etc/guacamole/lib/

 

Instalo el plugin de autenticación Guacamole JDBC 

(descarga, descomprimir y mover)

sudo wget https://downloads.apache.org/guacamole/1.5.5/binary/guacamole-auth-jdbc-1.5.5.tar.gz
sudo tar -xf guacamole-auth-jdbc-1.5.4.tar.gz
sudo mv guacamole-auth-jdbc-1.5.5/mysql/guacamole-auth-jdbc-mysql-1.5.5.jar /etc/guacamole/extensions/

 

Creo la Base de Datos

sudo mysql -u root -p

 

MariaDB [(none)]> CREATE DATABASE guac_db;
MariaDB [(none)]> CREATE USER 'guac_user'@'localhost' IDENTIFIED BY 'password';
MariaDB [(none)]> GRANT SELECT,INSERT,UPDATE,DELETE ON guac_db.* TO 'guac_user'@'localhost';
MariaDB [(none)]> FLUSH PRIVILEGES;

 donde password colocar la clave del usuario de servicio

Salgo de la base

MariaDB [(none)]> EXIT;

 

Importo el archivo de esquema (schema) de SQL

cd guacamole-auth-jdbc-1.5.4/mysql/schema
cat *.sql | mysql -u root -p guac_db

 

Creo el archivo de configuración de Guacamole

sudo nano /etc/guacamole/guacamole.properties

 Con el siguiente contenido

# MySQL properties
mysql-hostname: 127.0.0.1
mysql-port: 3306
mysql-database: guac_db
mysql-username: guac_user
mysql-password: password

donde password colocar la clave del usuario de servicio

 

Reinicio servicios  para que tome los cambios

sudo systemctl restart tomcat9 guacd mysql


Prueba

Si todo esta OK, se puede ingresar a http://server-ip:8080/guacamole

 

Para loguear por primera vez es con: 

username: guacadmin
password: guacadmin

 

Cambio clave guacadmin

Para ello es necesario crear un usuarios con privilegios para gestionar usuarios

Superior Derecha (guacadmin) -> click -> Configuración -> seleccionar solapa Usuarios -> Botón "Nuevo usuario "-> completamos datos del usuario -> Tildar los permisos correspondientes -> Botón Guardar

Salimos de Guacamole Superior Derecha (guacadmin) -> Cerrar sesión  

Al ingresar con el nuevo usuario nos permite el cambio de clave editando el usuario guacadmin

 

Alternativa

Lo vi después de instalar todo

Superior Derecha (guacadmin)  -> seleccionar solapa Preferencias -> Cambiar contraseña

 

Configurando Terminales

RDP

Superior derecha -> Configuracion -> seleccionar solapa Conexiones -> botón Nueva Conexión  

Completo únicamente los siguientes campos:

 

 En nombre es el nombre a mostrar en Guacamole para que lo identifiquemos.

Ignorar el certificado y el modo de seguridad es necesario seleccionarlos para que conecte, de otras formas dan fallo. Donde dice nombre de Host va la IP (o nombre dns) del equipo a donde nos queremos conectar.

Resto de los campos los dejo como viene. Se puede personalizar algunos comportamientos como redireccionar el audio, pero no me interesa por el momento.


SSH

Superior derecha -> Configuración -> seleccionar solapa Conexiones -> botón Nueva Conexión  

Completar los campos correspondiente a la ip de server y puerto

En lo particular no lo logre hacer andar, usando usuario y clave como autenticación, hasta el momento probe (con reiterados FAIL) 🙇

  1. Desactivar ipv6
  2. Reemplazar la librear libjpeg-dev por libjpeg62
  3. Agregar soporte de ssh-rsa en openssh del servidor destino (horrendo agregar ciphersuite deprecadas)
  4. Cambio de localhost por 127.0.0.1
  5. Reemplazo libssh2 (recompilarlo)
  6. Detecte que falta el conector de ssh (libguac-client-ssh.so) al ver el syslog
    1. Instale con apt-get install libguac-client-ssh0 , pero no carga el archivo en la ruta /usr/local/lib/
    2. Copio el archivo
  7. Pendiente probar usar sshkey

 Excedí el tiempo dedicado para esta parte de la investigación por lo que lo retomaré en otro momento

 

Configurando Proxy Reverso (HTTPS)

Aunque esta la posibilidad de usar el Tomcat y reducir los puntos de falla, la verdad me llevo mejor con NGINX así que empece por este camino.

 

Instalo el NGINX para funcione como proxy reverso (en mi caso lo meto todo en el mismo server)

sudo apt install nginx


Genero un certificado autofirmado

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/guacd.key -out /etc/ssl/certs/guacd.crt

 

Genero los parámetros de DH (Diffie-Hellman) para evitar  ataques Logjam

sudo openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096

 

Genero la configuración del proxy reverso

 sudo nano /etc/nginx/sites-available/nginx-guacamole-ssl

 

*Consideración de los puertos, tener el cuenta que el tomcat va estar escuchando en el 8080 por lo cual este no lo podemos usar asi ques eleccionamos otro para el NGINX (en mi caso el 8088)

**Consideracion del certificado, para logar redirgir a https cuando se solicita http por el mismo puerto uso el mensaje de error para que haga un redirect (error_page 497 301 =307)

server {
listen 8088 ssl;
server_name ip_server;

root /var/www/html;

index index.html index.htm index.nginx-debian.html;


ssl_certificate /etc/ssl/certs/guacd.crt;

ssl_certificate_key /etc/ssl/private/guacd.key;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";

access_log /var/log/nginx/guac_access.log;
error_log /var/log/nginx/guac_error.log;

error_page 497 301 =307 https://ip_server:8088$request_uri;

location / {
proxy_pass http://127.0.0.1:8080/guacamole/;
proxy_buffering off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_cookie_path /guacamole/ /;
}

}

Los valores en magenta reeemplazar por la ip del servidor.

//El archivo de configuración puede mejorar//


 Genero el enlace simbolico para activar la configuración del sitio

 sudo ln -s /etc/nginx/sites-available/nginx-guacamole-ssl  /etc/nginx/sites-enabled/nginx-guacamole-ssl

 

Activo el servicio e inicio NGINX

sudo systemctl enable nginx
sudo systemctl start nginx 

Verifico que este OK el servicio

sudo systemctl status nginx 


Hago que el Tomcat escuche de forma local:

Edito el archivo de configuración de Tomcat

sudo nano  /etc/tomcat9/server.xml 

 

Busco la cadena

    <Connector port="8080" protocol="HTTP/1.1"

 

Adiciono address="localhost" quedando la cadena:

    <Connector port="8080" protocol="HTTP/1.1" address="localhost"
               connectionTimeout="20000"
               redirectPort="8443" />

Reinicio el servicio

sudo systemctl restart tomcat9

 

Verifico que el servicio este OK

sudo systemctl status tomcat9


Verifico que esten los servicios levantado escuchando los puertos

sudo ss -altnp


Debemos identificar que el Tomcat se encuentra corriendo en el puerto 8080 como localhost y el 8088 el NGINX [marcado en amarillo]


Si todo falla, a debuggear

Iniciar el daemon en modo debug:

/etc/nginx$ sudo systemctl stop guacd
/etc/nginx$ cd  /usr/local/sbin
/usr/local/sbin$  ./guacd -L debug -f

y a divertice con los mensajes en consola 😁

 

Otros logs que pueden se de utilidad:

  • /var/log/syslog
  • /var/log/tomcat/catalina.out

 

Referencias

  • https://guacamole.apache.org/doc/gug/reverse-proxy.html
  • https://downloads.apache.org/guacamole/
  • https://help.clouding.io/hc/es/articles/360019699179-C%C3%B3mo-instalar-y-configurar-Apache-Guacamole
  • https://medium.com/@anshumaansingh10jan/unlocking-remote-access-a-comprehensive-guide-to-installing-and-configuring-apache-guacamole-on-30a4fd227fcd 
  • https://stackoverflow.com/questions/11211705/how-can-i-set-a-proxy-for-wget 
  • https://5seomistakes.wordpress.com/2013/06/27/guacamole-html5-clientless-remote-desktop/
  • https://stackoverflow.com/questions/56803305/how-to-make-tomcat-accessible-only-localhost-except-one-app
  • https://kifarunix.com/configure-guacamole-ssl-tls-with-nginx-reverse-proxy/

0 comments:

Publicar un comentario