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) 🙇
Desactivar ipv6Reemplazar la librear libjpeg-dev por libjpeg62Agregar soporte de ssh-rsa en openssh del servidor destino (horrendo agregar ciphersuite deprecadas)Cambio de localhost por 127.0.0.1Reemplazo libssh2 (recompilarlo)- Detecte que falta el conector de ssh (libguac-client-ssh.so) al ver el syslog
- Instale con apt-get install libguac-client-ssh0 , pero no carga el archivo en la ruta /usr/local/lib/
Copio el archivo- 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