Vuls: Escáner de vulnerabilidades sin agente para Linux/FreeBSD
Nos ponemos el "sombrero azul"
No todo es disfrutar de la shell escribiendo scripts en vim para un administrador de GNU/Linux, siempre hay que estar preparado y revisar la vulnerabilidades que se publican para tener, en la medida de lo posible, los servidores y equipos lo más robustamente asegurados, con las menores vulnerabilidades y la menor zona de exposición posible.
Blue Team (Equipo azul)
Un equipo azul es un grupo de personas que realizan un análisis de sistemas de información para garantizar la seguridad, identificar fallas de seguridad, verificar la efectividad de cada medida de seguridad y asegurarse de que todas las medidas de seguridad continúen siendo efectivas después de la implementación.
Sin embargo, si administras un gran número de servidores, o son heterogeneos (tanto en Sistema Operativo, como en la paquetería instalada), la situación se puede volver un poco caótica para revisar y tener todo controlado.
Para ayudar a los administradores de sistemas y a los "Blue Team" existen herramientas Open-Source que facilitan el seguimiento de las diferentes vulnerabilidades, tanto las ya publicadas como las recientes, y te permite localizarlas en los servidores administrados generando informes sobre ellos.
¡ Una de estas herramientas que facilitan todo es Vuls !
La página oficial de Vuls es:
Y el repositorio de Vuls lo puedes encontrar en:
Características de Vuls
Algunas de las caracteristicas y ventajas de Vuls frente a otras herramientas son:
- Es Open Source y Gratuita.
- Permite auditar cualquier S.O. GNU/Linux ó FreeBSD.
- No necesita disponer de un agente ejecutándose en el equipo a auditar.
- S puede usar en modo Cloud, On-Premise (auto-alojada) o con Docker.
- Detecta vulnerabilidades que el fabricante del S.O. aun no ha publicado.
- Detecta vulnerabilidades en todo el software instalado, aunque no sea propio de la distribución o del Sistema Operativo en uso .
- Permite escaneos Locales, Remotos y de Contenedores.
- Varios modos de escaneo: Rápido ó Profundo e incluso modo "desconectado".
- Genera informes simples o detallados de las vulnerabilidades encontradas.
- Dispone de un analizador/visualizador de vulnerabilidades que se puede usar tanto en modo texto (consola)
- Dispone de una analizador/visualizador en modo Web con filtrado
- Permite exportar los resultados en varios formatos.
- Permite notificaciones vía eMail o Slack.
Fuentes de Análisis de Vuls
Algunas de las fuentes que utiliza vuls para detectar vulnerabilidades son:
- Diccionarios CVE genericos y de CTI (Cyber Threat Intelligence) Mitre/CAPEC.
- Diccionarios OVAL (Open Vulnerability and Assessment Language) para multiples Sistemas Operativos.
- Exploits de ExplitDB y MetaSploit.
- Datos del catálogo KEV (Known Exploited Vulnerabilities).
- Vulnerabilidades explotables de la CISA (Cybersecurity and Infrastructure Security Agency).
- Otras fuentes: RedHat Errata, Debian Security Tracker, US-Cert, JPCert-CC, Wordfence Intelligence para WordPress, etc.
Sistemas Soportados para instalación On-Premise
Actualmente en la pagina oficial de Vuls se indica que se puede instalar de forma auto alojada en los siguientes Sistemas Operativos:
Distribución | Versión/Release |
---|---|
Alpine | 3.3 y posteriores |
Ubuntu | 14, 16, 18, 20, 21, 22 |
Debian | 8, 9, 10, 11 |
RHEL | 5, 6, 7, 8, 9 |
Fedora | 32, 33, 34, 35 |
Oracle Linux | 5, 6, 7 |
CentOS | 6, 7, 8, stream8, stream9 |
AlmaLinux | 8, 9 |
Rocky Linux | 8, 9 |
Amazon Linux | All |
FreeBSD | 10, 11 |
openSUSE | tumbleweed |
openSUSE Leap | 15.2, 15.3 |
SUSE Enterprise | 11, 12, 15 |
Raspbian | Jessie, Stretch, Buster |
Si no dispones de un equipo o servidor que cumpla estas versiones exactas, puedes usar Docker sobre cualquier equipo Linux para disponer de esta herramienta, aunque la forma de instalarlo y trabajar con esta herramienta difiere un poco.
Instalación y Uso de Vuls mediante Docker
En la Documentación del proyecto disponeis de una información extensa de cómo instalarlo, configurarlo y usarlo.
Entonces... ¿porqué este artículo?
Me he encontrado con alguna pequeña discrepancia entre la documentación de la Web y lo documentado en GitHub, que hace que no todo funcione a la primera.
Para evitar que tengas que estar revisando y comparando configuraciones, os dejo un manual simplificado, sobre como dejarlo todo funcionando.
Paso 1: Docker
El primer requisito es tener instalado Docker en el equipo que vayas a usar como Analizador de Vulnerabilidades de los otros equipos, si no lo tienes instalado puedes leer mi artículo para instalarlo paso a paso:
Además, te recomiendo dejar configurado tu usuario para no tener que ser root para poder usar Docker. Puedes realizarlo siguiendo el artículo:
Paso 2: Creación de Directorio de trabajo
Vamos a crear un directorio para vuls, en el que dejaremos los scripts necesarios para su uso, plantillas para diferentes tipos de configuraciones y un directorio extra para guardar las Bases de Datos de Vulnerabilidades, Logs de ejecución de Vuls, Informes y/o ficheros de exportación.
Se puede generar todo en el propio Home de nuestro usuario, ya que no nos va a hacer falta privilegios de root para realizar la instalación y configuración de vuls al usar Docker.
En la directorio home de nuestro usuario se habrá creado la siguiente estructura de directorios:
Contenido que tendrá cada directorio:
- vuls: Scripts para el uso de Vuls.
- config: Dejaremos la configuración para el correcto funcionamiento y además aqui se descargarán las base de datos de vulnerabilidades en formato sqlite.
- log: Logs de la ejecución de los procesos de escaneado por vuls.
- results: Almacén de los resultados del escanea por fechas (en formato json) para cada una de las máquinas. Lo utiliza la herramienta tui (modo consola) y VulsRepo (modo Web).
Paso 3: Descarga de las imagenes Docker
El conjunto completo de todas las herramientas y utilidades de vuls para usarlo mediante Docker, son un total de 9 imágenes, puedes realizarlo ejecutando los siguientes comandos:
# Imagenes para Vuls:
docker pull vuls/go-cve-dictionary
docker pull vuls/goval-dictionary
docker pull vuls/gost
docker pull vuls/go-exploitdb
docker pull vuls/go-msfdb
docker pull vuls/go-kev
docker pull vuls/go-cti
docker pull ishidaco/vulsrepo
docker pull vuls/vuls
También puedes descargar el script de Descarga y Actualización de las imágenes, con control de errores y dejarlo en el directorio vuls:
Nota: Recuerda dar permisos de ejecución a los scripts para que funcionen:
chmod +x nombre_script.sh
Puedes ejecutar el script simplemente desde la terminal, escribiendo:
Paso 4: Descargar BBDD de Vulnerabilidades
En este paso vamos a descargarnos todos los datos actuales de los repositorios de vulnerabilidades. Para ello he modificado algunos de los scripts oficiales, ajustando las rutas de los volumenes Docker al destino de la estructura que definimos previamente.
Hay 7 scripts para descargas individualizadas y uno que realiza una descarga masiva de todo.
Nota: El proceso de descarga de todas las vulnerabilidades es un proceso lento, hay algunos de ellos que incluso pueden durar entre 5 a 10 minutos. Se paciente y ten calma y espera hasta que finalice.
Scripts de Descarga para cada tipo de Vulnerabilidad:
- datos_cti.sh
- datos_cvedb.sh
- datos_exploitdb.sh
- datos_gost.sh
- datos_kev.sh
- datos_msfdb.sh
- datos_oval.sh
Script que lanza la descarga de todos:
- ActualizarVulnerabilidades.sh
Puedes descargarte cada uno de los scripts aquí:
Descarga y deja todos los scripts en la ruta que definimos en el paso 2 y luego dales permisos de ejecución. Ahora desde la terminal ejecuta:
Paso 5: Configuración para Escaneado
Para usar Vuls hay que crear una configuración minima, vamos a dejarla en el directorio 'config' que creamos, el fichero de configuración tiene por nombre config.toml
Veremos algunos puntos que hay que tener en cuenta al estar ejecutándose Vuls dentro de un contenedor.
Vamos a explicarlo paso a paso, viendo lo que sucede al ejecutar Vuls.
Crea el fichero de configuración config.toml con el siguiente contenido:
config.toml
[servers]
[servers.localhost]
host = "127.0.0.1"
port = "local"
scanMode = ["fast"]
Paso 6: Lanzar el Escaneado con Docker
Para realizar el escaneado simplemente llamaremos al contenedor de Vuls para ejecutar el escaneo. Incluiremos algunos ajustes (-v para volumen persistente) y para que pueda leer nuestro propio fichero de configuración.
Forma basica de llamar a Vuls desde el contenedor:
# Definimos ubicación de los ficheros de configuracion y datos
RUTA=${HOME}/vuls/config
# LLamada al contenedor de Vuls
docker run --rm -it \
-v $RUTA:/vuls \
vuls/vuls scan -config=/vuls/config.toml localhost
Veamos que es lo que obtenemos tras la ejecución:
[Feb 4 09:56:54] INFO [localhost] vuls--build-20240202_064315_b9ebcf3
[Feb 4 09:56:54] INFO [localhost] Start scanning
[Feb 4 09:56:54] INFO [localhost] config: /vuls/config.toml
[Feb 4 09:56:54] INFO [localhost] Validating config...
[Feb 4 09:56:54] INFO [localhost] Detecting Server/Container OS...
[Feb 4 09:56:54] INFO [localhost] Detecting OS of servers...
[Feb 4 09:56:54] INFO [localhost] (1/1) Detected: localhost: alpine 3.16.9
[Feb 4 09:56:54] INFO [localhost] Detecting OS of containers...
[Feb 4 09:56:54] INFO [localhost] Checking Scan Modes...
[Feb 4 09:56:54] INFO [localhost] Detecting Platforms...
[Feb 4 09:56:54] INFO [localhost] (1/1) localhost is running on other
[Feb 4 09:56:54] INFO [localhost] Scanning OS pkg in fast mode
[Feb 4 09:56:55] INFO [localhost] Scanning listen port...
[Feb 4 09:56:55] INFO [localhost] Using Port Scanner: Vuls built-in Scanner
Scan Summary
================
localhost alpine3.16.9 34 installed, 0 updatable
To view the detail, vuls tui is useful.
To send a report, run vuls report -h.
Resulta que 'localhost' (127.0.0.1) no es nuestro propio host (nuestro equipo) como podríamos suponer, sino que como el escaneo se ha realiza dentro del contenedor, localhost es el propio contenedor (Linux con SO alpine).
Paso 7: Configuracion para escaneo del propio equipo
Al usar docker, todos los escaneos los vamos a tener que considerar como escaneos remotos, debido a esto, hay que usar una clave pública-privada de SSH para poder realizarlo.
Puedes ver si dispones de ella mirando en tu directorio .ssh:
# Listar contenido de .ssh del usuario:
ls -l ~/.ssh/
Deberías tener 2 ficheros: id_rsa (clave privada) y id_rsa.pub (clave pública)
Si no tienes creadas tus claves publica-privada en tu propio equipo puedes crearla mediante el comando:
Con el conjunto de clave publica-privada, vamos a auto-autorizarnos, para ello escribe lo siguiente en tu terminal:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
Nota: Puedes ser que en algunas distribuciones de GNU/Linux, tengas problemas al usar el escaneo remoto mediante docker. La solución es tan simple como crear un fichero 'config' en nuestro directorio .ssh
Creamos fichero vacio:
touch ~/.ssh/config
Editamos el fichero e incluimos el siguiente contenido:
Host miequipo
HostName miequipo
IdentityFile ~/.ssh/id_rsa
Fijamos los permisos:
chmod 600 ~/.ssh/config
Editamos el fichero config.toml e incluiremos nuestro equipo (y nuestra IP) en la configuración, deberá quedarte así:
config.toml
[servers]
[servers.localhost]
host = "127.0.0.1"
port = "local"
scanMode = ["fast"]
[servers.miequipo]
host = "192.168.1.82"
port = "22"
user = "luisgulo"
sshConfigPath = "/root/.ssh/config"
keyPath = "/root/.ssh/id_rsa"
scanMode = ["fast"]
Escaneando el equipo
Escanemos nuestro equipo que hemos identificado como miequipo, para ello puedes escribir lo siguiente en tu terminal:
# Definimos ubicación de los ficheros de configuracion y datos
RUTA=${HOME}/vuls/config
# LLamada al contenedor de Vuls
docker run --rm -it \
-v ${HOME}/.ssh:/root/.ssh:ro \
-v $RUTA:/vuls \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/timezone:/etc/timezone:ro \
vuls/vuls scan \
-log-dir=/vuls/log \
-config=/vuls/config.toml miequipo
Como verás es un poco pesado estar cada poco escribiendo esa cantidad de parámetros y no olvidarnos de nada. Así que lo transformamos en un script que vamos a llamar vuls_scan.sh, que nos permita lanzar los escaneos simplemente indicandole la máquina a escanear.
Puedes descargarlo y copiarlo en tu equipo (recuerda fijar permisos de ejecución):
La forma de usarlo es muy sencilla:
./vuls_scan.sh miequipo
Verás que al ejecutarse salen bastantes líneas de texto:
Using default tag: latest
latest: Pulling from vuls/vuls
Digest: sha256:7c30e40f0b13ec76df3c61ba630de4210767dfcec1ae57d082e247391a19cbb4
Status: Image is up to date for vuls/vuls:latest
docker.io/vuls/vuls:latest
[Feb 4 14:03:47] INFO [localhost] vuls--build-20240202_064315_b9ebcf3
[Feb 4 14:03:47] INFO [localhost] Validating config...
[Feb 4 14:03:47] INFO [localhost] Detecting Server/Container OS...
[Feb 4 14:03:47] INFO [localhost] Detecting OS of servers...
[Feb 4 14:03:53] INFO [localhost] (1/1) Detected: miequipo: debian 12
[Feb 4 14:03:53] INFO [localhost] Detecting OS of containers...
[Feb 4 14:03:53] INFO [localhost] Checking Scan Modes...
[Feb 4 14:03:53] INFO [localhost] Checking dependencies...
[Feb 4 14:03:54] WARN [miequipo] reboot-notifier is not installed. Install it if you want to detect whether not rebooted after kernel update. To install `reboot-notifier` on Debian, see https://feeding.cloud.geek.nz/posts/introducing-reboot-notifier/
[Feb 4 14:03:54] INFO [miequipo] Dependencies... Pass
[Feb 4 14:03:54] INFO [localhost] Checking sudo settings...
[Feb 4 14:03:54] INFO [miequipo] sudo ... No need
[Feb 4 14:03:54] INFO [localhost] It can be scanned with fast scan mode even if warn or err messages are displayed due to lack of dependent packages or sudo settings in fast-root or deep scan mode
[Feb 4 14:03:54] INFO [localhost] Scannable servers are below...
miequipo
[Feb 4 15:03:57] INFO [localhost] vuls--build-20240202_064315_b9ebcf3
[Feb 4 15:03:57] INFO [localhost] Start scanning
[Feb 4 15:03:57] INFO [localhost] config: /vuls/config.toml
[Feb 4 15:03:57] INFO [localhost] Validating config...
[Feb 4 15:03:57] INFO [localhost] Detecting Server/Container OS...
[Feb 4 15:03:57] INFO [localhost] Detecting OS of servers...
[Feb 4 15:04:04] INFO [localhost] (1/1) Detected: miequipo: debian 12
[Feb 4 15:04:04] INFO [localhost] Detecting OS of containers...
[Feb 4 15:04:04] INFO [localhost] Checking Scan Modes...
[Feb 4 15:04:04] INFO [localhost] Detecting Platforms...
[Feb 4 15:04:07] INFO [localhost] (1/1) miequipo is running on other
[Feb 4 15:04:08] INFO [miequipo] Scanning OS pkg in fast mode
[Feb 4 15:04:10] INFO [miequipo] Scanning listen port...
[Feb 4 15:04:10] INFO [miequipo] Using Port Scanner: Vuls built-in Scanner
Scan Summary
================
miequipo debian12 5812 installed
To view the detail, vuls tui is useful.
To send a report, run vuls report -h.
Paso 8: Informe del escaneo de Vulnerabilidades
Perfecto, equipo escaneado, ahora vamos a ver que ha detectado, para ello podemos generar un informe (sencillo o detallado) simplemente ejecutando:
RUTA=${HOME}/vuls/config
docker run --rm -i \
-v $RUTA:/vuls \
vuls/vuls report \
-log-dir=/vuls/log \
-format-list \
-config=/vuls/config.toml \
-refresh-cve
Si lo quieres detallado, simplemente cambia -format-list por -format-full-text
Puedes descargar los scripts que te generan ambos informes:
Paso 9: Revisión del informe mediate TUI
Vuls dispone de una herramienta que funciona desde la terminal y que te permite navegar en modo texto por las vulnerabilidades detectadas, puedes cambiar de zona simplemente con la tecla TAB. Te muestra si está disponible como mitigar el problema localizado.
Como en los pasos anteriores, te dejo el script para que lo descargues y dejes en la ruta vuls de HOME (recuerda como siempre darle permisos de ejecución con el comando: chmod +x vuls_tui.sh):
Paso 10: Revisión vía Web con VulsRepo
Otra herramienta de la que dispone Vuls es de VulsRepo que funciona en modo web, te permite mostrar un informe de todos los servidores escaneados, pivotar datos (como en cualquier hora de cálculo).
Tras realizar todos los escaneos que desees a los servidores, puedes iniciar esta herramienta y analizar los resultados aplicando los filtros que desees.
Puedes descargarte el script para iniciar el servicio web:
Por defecto se inicia en el puerto 5111, una vez iniciado, puedes verlo acccediendo desde tu navegador a: http://localhost:5111/
Una vez que lo lances, se queda iniciado, tras cada nuevo análisis lo puedes ver al momento en VulsRepo.
Para detener el servidor web de VulsRepo, simplemente abre el terminal y ejecuta:
Historial de Escaneos
Puedes ver el historial de equipos escaneados y en que fecha directamente escribiendo en la terminal:
RUTA=${HOME}/vuls/config
docker run --rm -i \
-v $RUTA:/vuls \
vuls/vuls history \
-results-dir=/vuls/results
También te dejo el script para que lo puedas usar las veces que quieras:
Configuración para multiples escaneos Remotos
En el fichero config.toml, podemos definir todos los servidores que queramos escanear, cada equipo se diferencia e identificará por:
[servers.nombre_equipo]
host = "ip-del-equipo"
user = "usuario"
En el equipo remoto deberás tener permisos para conectarte vía SSH y realizar el escaneo con tu usuario.
Una forma sencilla de autorizar tu usuario en los equipos remotos es incluir tu clave publica de tu equipo, en el fichero de claves autorizadas en el equipo remoto.
Copia el contenido del fichero id_rsa.pub (de tu PC) en el fichero authorized_keys del servidor al que quieras conectarte.
Hasta ahora en el fichero config.toml, hemos usado la opción 'Fast Scan':
Este tipo de escaneado es un "escaneado simple" y no es necesario usar privilegios de root para ejecutarlo.
Otros modos de Escaneado
Además del modo 'fast' en el que no necesitas privilegios de root para detectar un conjunto de vulnerabilidades, existen otros modo avanzados que permiten un mayor detalle:
Fast-Root Scan (necesita usuario root)
'''
scanMode = ["fast-root"]
'''
Sin conexión a Internet (offline)
(incluir separado por coma, al scanMode actual)
scanMode = ["fast", "offline"]
scanMode = ["fast-root", "offline"]
En el caso de querer realizar un análisis más detallado (fast-root), ten en cuenta que el fichero de claves publico-privadas a usar será el del usuario root y fijar en el fichero de configuración config.toml el modo fast-root y cambiar el usuario por user = "root"
Documentación Oficial
Puedes ver toda la documentación en detalle sobre vuls en su página web, allí encontrarás información sobre como realizar 'Automatic Discover' para chequear todo el conjunto de equipos de tu red y otra serie de información: