Como montar un Homelab
En un servidor Proxmox, vamos a crear nuestro propio laboratorio purple team para aprender a gestionar y detectar incidentes de ciberseguridad.
Nuestro entorno tendrá los siguientes sistemas:
- Router/Cortafuegos con:
- pfBlocker (limitará el acceso por dominios y listas de IP)
- Snort (como IPS)
- Servidor Ubuntu con los siguientes servicios:
- InfluxDB
- Grafana
- Kibana
- Elastic
- Máquina Windows Flare
- Servidor Windows Server 2012
- Kali Linux Purple
- Kali Linux Estándar

Instalación de pfSense
Necesitamos una máquina virtual pfsense con dos tarjetas de red (o una tarjeta si disponemos de switch inteligentes con soporte VLAN).
1) Descarga de la ISO.
- Desde la web oficial y subirla a proxmox.
- Descargar por URl desde proxmox.
- Si ya la tenemos en nuestro equipo, subirla por sftp con
sftp /var/lib/vz/template/iso.
2) Creamos una máquina virtual con 4 GB de RAM, 20 GB de disco y 4 núcleos. La configuramos para que arranque con la ISO.
3) Una tarjeta de red irá al bridge donde está la interfaz física (vmbr0 por ejemplo).
4) Ponemos una segunda tarjeta de red a un switch virtual (OVS Bridge).
Configuración de pfSense
Desde la terminal configuramos que boca será la WAN y cuál la LAN, la IP de cada uno, el servicio DHCP en la LAN y habilitamos la interfaz web.
Vía web, configuramos la contraseña de acceso para admin (por defecto es pfsense), los DNS del sistema operativo, puerta de enlace, servicio de DNS, servidores DNS para el servicio DNS.
A continuación instalamos los siguientes paquetes:
- Snort: Conocido IDS (Sistema de detección de intrusiones) e IPS (Sistema de prevención de intrusiones). IPS cuando activamos el bloqueo de IPS que ofenden reglas.
- pfBlockerNG: Bloqueador de contenido basándose en dominios y direcciones IP. Cargamos listas negras desde Internet y así bloqueamos contenido como: anuncios, pornografía, contenido ofensivo, páginas de apuestas, juegos, etc.
- Darkstat: Genera estadísticas de direcciones IP, MAC, protocolos y puertos.
- ntopng (puerto 3000): Monitor de red. Nos permite ver flujos de red y hacer capturas en tiempo real.
Configuración de Snort
Vamos a “System” > “Package Manager” > “Available Packages”, buscamos e instalamos “snort”.
Una vez finalizado el proceso, nos movemos a “Services” -> “Snort” -> “Global Settings”. Marcamos la casilla de “Enable Snort VRT” y se nos solicita un “Snort Oinkmaster Code”, este código podemos obtenerlo gratuitamente si nos registramos en la página oficial de Snort. Cuando ya tengamos nuestra cuenta, debemos acceder a “My Account” -> “Oinkcode” y copiar el código que nos dan.
Ahora que tenemos nuestro “Oinkcode” podemos pegarlo dentro de pfSense.
Configuramos Snort.

Configuración de pfBlockerNG
Vamos a “System” > “Package Manager” > “Available Packages”, buscamos e instalamos “pfBlockerNG”.
Una vez finalice el proceso, iremos a “Firewall” > “Feeds” y habilitamos listas de pri1, pri4, pri5.
También accederemos al apartado “DNSBL” y lo activaremos.

Configuración de Darkstat
Vamos a “System” > “Package Manager” > “Available Packages”, buscamos e instalamos “darkstat”.
Iremos a “Services” > “darkstat”, lo activamos y le configuramos una contraseña.

Para entrar al servicio, iremos a “Diagnostics” > “darkstat”.

Configuración de ntopng
Vamos a “System” > “Package Manager” > “Available Packages”, buscamos e instalamos “ntopng”.
Nos movemos a “Diagnostics” > “ntopng” y configuramos su contraseña.

Como usar una OVA en proxmox
Para usar una OVA en proxmox, subimos por SSH el archivo a nuestro servidor. En este caso, tenemos la OVA de un Windows 10.
Desde nuestro servidor desempaquetamos la OVA con tar -xf 'nombrearchivo.ova'. Buscamos el archivo VMDK, que será el disco de Windows 10.
Creamos una VM para Windows 10. No le ponemos CDROM ni disco duro. Le añadimos 12 GB de RAM, 6 cores y BIOS normal. Esta máquina virtual la convertiremos en plantilla para poder clonarla tantas veces como necesitemos.

Una vez tenemos la plantilla, hacemos un clonado de ella. Buscamos el ID de la VM clonada (120 en este caso) y desde línea de comandos en proxmos hacemos:
qm disk import 120 'MSEdge - Win10-disk001.vmdk' local-lvm --format qcow2

Esto importa el disco ‘MSEdge - Win10-disk001.vmdk’ en la máquina 120 y lo guarda en el espacio de almacenamiento local.lvm (en esa partición). Una vez acaba el proceso, el disco aparece en la máquina pero sin conectar. Hacemos doble clic en él y lo añadimos como SATA 0.

Antes de arrancar el sistema, debemos asegurarnos de cambiar el modo de arranque al nuevo disco.

La máquina viene con 40 GB, así que necesitaremos añadirle 30 GB más. Pulsamos en “Hardware” -> “Disk Action” -> “Resize”.

Desde Windows vamos al administrador de discos, hacemos clic derecho en la partición actual y pulsamos en la opción “Extend Volume”. Con esto extendemos la partición hasta el final del disco.

Vemos como se ha actualizado el espacio.

Crear Windows Flare
Para realizar la instalación de Windows Flare, necesitamos desactivar el windows defender y la protección en tiempo real. Si una de estas cosas está activa, no se realizará la instalación correctamente.

También lo desactivamos de las políticas de grupo. Abrimos “Local Group Policy Editor”, nos movemos a “Computer Configuration” -> “Administrative Templates” -> “Windows Components” -> “Windows Defender Antivirus”, allí hacemos doble clic en “Turn off Windows Defender Antivirus” y marcamos la casilla de “Enable”. Para guardar los cambios pulsamos en Aplicar.

Además, será necesario desactivar las actualizaciones automáticas desde los ajustes de Windows.
Una vez hemos preparado el entorno, seguiremos los pasos de instalación que vienen en el repositorio de Windows Flare. Nos descargaremos el archivo install.ps1 en una PowerShell como root, y ejecutamos los siguientes comandos:
(New-Object net.webclient).DownloadFile('https://raw.githubusercontent.com/mandiant/flare-vm/main/install.ps1',"$([Environment]::GetFolderPath("Desktop"))\install.ps1")
Unblock-File .\install.ps1
Set-ExecutionPolicy Unrestricted -Force
.\install.ps1
Una vez finalice el proceso, tendremos instalado Windows Flare.
Conectarnos a nuestro laboratorio por VPN
Desde pfSense, exportamos el cliente OpenVPN a nuestro Windows y lo pasamos por SSH a proxmox. Pasamos el archivo ovpn a nuestro servidor proxmox con el comando:
scp MIARCHIVO.ovpn root@192.168.32.13:/root

Para descargarlo en nuestra máquina local ejecutamos:
scp root@192.168.32.13:/root/naranja.ovpn /home/usuario/

Por último, solo nos queda importar el archivo ovpn en la configuración VPN de nuestro equipo.
Instalación y configuración de Ubuntu Server + ELK
Instalaremos un Ubuntu Server 22.04 para crear nuestra pila ELK. El sistema tendrá 10 GB de RAM, 16 cores, 80 GB de disco y deberá estar conectada a la red de pfsense.

Cuando finalicemos la instalación, nos aseguramos de tener ip estática en esta máquina. Modificamos fichero /etc/netplan/00-installer-config.yaml y añadimos la siguiente configuración (asignamos la ip de la red que tenga nuestro pfsense):

Aplicamos los cambios con el comando:
sudo netplan apply
A continuación, vamos a añadir el Ubuntu al DNS de nuestro pfsense.

El siguiente paso, será realizar la instalación de la pila ELK. Ejecutamos los siguientes comandos:
#!/bin/bash
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
sudo apt-get install apt-transport-https
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt-get update
sudo apt-get install elasticsearch
sudo apt-get install kibana
sudo apt-get install logstash
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
sudo /bin/systemctl enable kibana.service
sudo systemctl start elasticsearch.service
sudo systemctl start kibana.service
IMPORTANTE: Guardar la contraseña que se genera automáticamente al instalar elasticsearch. Si en algún momento la perdemos podemos resetearla con sudo /usr/share/elasticsearch/bin/elasticsearch-reset-password -a -u elastic.
Una vez hayamos finalizado la instalación, debemos crear un túnel SSH para poder acceder a Kibana. Usamos el comando:
ssh -L 5601:localhost:5601 usuario@IP_UBUNTU_SERVER
Ahora ya podemos acceder a Elastic por http://localhost:5601.

Vemos que se nos solicita un token para hacer el enrolment de kibana a elastic. Podemos generarlo ejecutando:
sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
Una vez introducimos el token que se ha generado, se nos solicita un codigo de verificación. Lo obtenemos con:
sudo /usr/share/kibana/bin/kibana-verification-code
Finalmente, accedemos con el usuario elastic y la contraseña que genera elastic.

A continuación, añadiremos la integración de Sysmon para Linux. Nos vamos a “Add Integrations” -> Buscamos “sysmon for Linux” -> “Add Sysmon for Linux”

Añadimos la integración y creamos un nuevo agente.

Telegraf
En pfsense buscamos e instalamos el paquete telegraf.

Nos movemos a “Services” > “Telegraf” y marcamos las casillas de “Enable Telegraf” y “Skip SSL Verify”.

A continuación, accedemos a la consola de nuestra máquina pfsense y editamos el fichero telegraf.conf con el siguiente comando:
vi /usr/local/etc/telegraf.conf
Añadimos la siguiente configuración (importante usar la ip de nuestro Ubuntu server y contraseña de elastic):
[[inputs.net]]
interfaces = ['em*']
[[inputs.processes]]
[[inputs.swap]]
[[inputs.system]]
[[inputs.pf]]
[[outputs.elasticsearch]]
enable_sniffer = false
health_check_interval = "10s"
index_name = "telegraf-%Y.%m.%d"
manage_template = false
overwrite_template = true
template_name = "telegraf"
urls = ["https://192.168.99.10:9200"]
# timeout = "5s"
username = "elastic"
password = "jqmIi0pdlo3d9HVS+MsQ"
# health_check_timeout = "1s"
# auth_bearer_token = "Vzlld3FJNEIyWFMyUG80US12RGc6aGVPQ2ZqR01Rc1M1cjJiTkZNOEdQQQ=="
# force_document_id = false
default_pipeline = "logs-pfsense.log-1.19.0"
Cuando terminemos de modificar el fichero, debemos parar y volver a arrancar el servicio.
/usr/local/etc/rc.d/telegraf.sh stop
/usr/local/etc/rc.d/telegraf.sh start
Veremos que nos da un error de conexión debido a que no reconoce el certificado digital. Para solucionar esto, debemos importar el certificado de elastic a pfsense. Accedemos a elastic y descargamos el certificado.

Si abrimos el certificado, podemos ver su contenido.

El siguiente paso será ir a nuestro pfsense y acceder a “System” > “Certificates”. Añadimos un nuevo certificado, le damos un nombre, marcamos la casilla de “Confiar en este certificado”, seleccionamos la opción de “Importar una autoridad” y pegamos el contenido del certificado que hemos descargado.

Ahora podemos volver reiniciar el servicio y conseguiremos conectar con elastic.
Teniendo acceso a los logs, el siguiente paso será crear un data view que recoja toda la información de Telegraf. Iremos a “Stack Management” > “Data views” > “Create Data view”.

Para seleccionar que registro deseamos ver, tenemos que pulsar en “Add field”. Introduciendo “telegraf-*” obtendremos todos sus datos.

Para poder visualizar estos datos, debemos generar una nueva visualización. Tenemos que ir a “Dashboard” > “Create Dashboard” > “Create Visualization”, seleccionar los datos que deseemos y vemos la gráfica correspondiente. Una vez tengamos la información que necesitemos, guardaremos la visualización

Instalación de FIR
FIR (Fast Incident Response) es una plataforma de gestión de incidentes de ciberseguridad. Permite crear, rastrear y reportar fácilmente incidentes de ciberseguridad. Nosotros la utilizaremos para crear ticket cuando detectemos una alerta de seguridad. Podemos encontrar la herramienta en su repositorio oficial https://github.com/certsocietegenerale/FIR.
Para instalar FIR utilizaremos un contenedor LXC en nuestro proxmox.
https://github.com/certsocietegenerale/FIR
Para instalar FIR utilizaremos contenedores. Necesitaremos tres servidores para los servicios de MySQL, Redis y Django. Generaremos una plantilla para cada servicio, vamos a “Local(prxmx)” > “CT Templates” > “Templates” y descargamos MySQL, Redis y Django.
Una vez hayamos descargado las plantillas, pulsamos en “Create CT” para hacer un nuevo contenedor. Seleccionamos la plantilla de MySQL y le asignamos 4 GB de RAM, 2 cores, 15 GB de disco y la interfaz red de pfsense.
Cuando finalicemos, iniciamos la máquina y configuramos una contraseña para el servicio.
Repetimos este paso con Redis y Django.
Ahora que ya tenemos todos los servicios que necesitamos, desplegaremos el contenedor docker de FIR dentro del linux container Django. Para acceder a él mediante línea de comandos, debemos acceder por ssh a proxmox y después entrar a esa máquina virtual.
ssh root@$IP_PROXMOX
lxc-attach $ID_CONTENEDOR_DJANGO
Descargamos el repositorio de FIR haciendo un git clone.
git clone https://github.com/certsocietegenerale/FIR.git
Creamos un entorno virtual con python y entramos en él.
apt-get install python3-venv
python3 -m venv venv
. ./venv/bin/activate
Instalamos las siguientes dependencias.
apt-get install python3-dev python3-pip python3-lxml git libxml2-dev libxslt1-dev libz-dev build-essential default-libmysqlclient-dev pkg-config
pip3 install celery abuse-finder
Ahora, nos movemos al directorio de FIR e instalamos los requerimientos.
cd FIR
pip3 install -r requirements.txt
Continuamos ejecutando los comandos que vienen en la guía de instalacion de FIR.
cp fir/config/installed_apps.txt.sample fir/config/installed_apps.txt
./manage.py migrate
./manage.py loaddata incidents/fixtures/01_seed_data.json
./manage.py loaddata incidents/fixtures/02_dev_users.json
./manage.py runserver
Editamos el fichero /etc/ssh/sshd_config.d/turnkey.conf y cambiamos “AllowTcpForwarding yes”.
vi /etc/ssh/sshd_config.d/turnkey.conf

Reiniciamos el servicio.
systemctl restart sshd
./manage.py runserver
Abrimos tunel a la máquina.
ssh -L 8000:localhost:8000 root@192.168.99.23
Podemos acceder a la web de FIR desde http://localhost:8000 con las credenciales admin/admin.

Para crear un nuevo ticket, debemos pulsar en “New event”.

Comprobamos como se ha creado correctamente.


Kali Linux Purple
Nuestro Homelab va a necesitar un Kali Linux Defensivo (Purple). El sistema tendrá 10 GB de RAM, 6 cores, 50 GB de disco y estará conectado a la red de pfSense.







Análisis de malware con Windows Flare
Con este laboratorio, podemos explotar malware y analizar cuál es su comportamiento. Es importante que creemos una instantánea de la máquina Windows para poder recuperar su estado tras ejecutar programas maliciosos.
Primero deberemos de tener instalada la herramienta git en el sistema. Después, descargamos el repositorio de Malware Analysis Techniques mediante un git clone. Una vez el proceso, descomprimimos el zip de “Chapter 2”.
Podemos observar como hay una imagen llamada 8888888.png, la cual contiene malware, por lo que es importante no abrirla ni ejecutarla.

Si hacemos un filetype vemos que es un archivo ejecutable.

A continuación, comprobaremos como VirusTotal es capaz de analizar el hash de la foto y detectar que es malicioso. Ejecutamos Get-FileHash para obtener su SHA256.

Se lo pasamos a VirusTotal y nos informa de que se trata de un virus.

Si miramos las cadenas de caracteres imprimibles usando strings, observaremos varios indicadores de compromiso.



Además, podemos escanear el hash que genera el comando ssdeep.

Conclusiones
Tras crear todo nuestro Homelab, nos quedará un entorno con las siguientes características.

Ahora, tenemos un potente entorno donde vamos a poder explotar malware para analizarlo y así aprender a como defendernos del mismo. También hemos conseguido aprender a como se recogen y procesan los logs en un SIEM.
Esta práctica se llevó a cabo durante el ciclo de especialización en ciberseguridad del IES Virgen del Carmen, haciendo uso de los servidores del centro.