Vuls: Escáner de vulnerabilidades sin agente para Linux/FreeBSD

CiberSeguridad 3 de feb. de 2024

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:

Vuls · Agentless Vulnerability Scanner for Linux/FreeBSD
Agentless Vulnerability Scanner for Linux/FreeBSD
Pagina Oficial de Vuls

Y el repositorio de Vuls lo puedes encontrar en:

GitHub - future-architect/vuls: Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices
Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices - GitHub - future-architect/vuls: Agent-less vulnerability scanner for Lin…
Repositorio oficial de Vuls

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ónVersión/Release
Alpine3.3 y posteriores
Ubuntu14, 16, 18, 20, 21, 22
Debian8, 9, 10, 11
RHEL5, 6, 7, 8, 9
Fedora32, 33, 34, 35
Oracle Linux5, 6, 7
CentOS6, 7, 8, stream8, stream9
AlmaLinux8, 9
Rocky Linux8, 9
Amazon LinuxAll
FreeBSD10, 11
openSUSEtumbleweed
openSUSE Leap15.2, 15.3
SUSE Enterprise11, 12, 15
RaspbianJessie, 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:

Instalar Docker en Debian
Instalar docker usando el repositorio oficial de docker.com Debian es uno de los sistemas operativos más fiables y con la paquetería más estable. En este caso vamos a usar la paquería oficial de docker, para disponer de las últimas versiones y parches de seguridad directamente de los fabricantes d…
Artículo sobre cómo instalar Docker

Además, te recomiendo dejar configurado tu usuario para no tener que ser root para poder usar Docker. Puedes realizarlo siguiendo el artículo:

Ejecutar Docker sin ser root
Docker sin sudo Pasos para habilitar docker para que ciertos usuarios puedan usar los comandos de docker sin necesidad de ser root. Debido a que Docker accede a ciertos recursos privilegiados del sistema (red, memoria, reglas de iptables, rutas de directorios restringidas, etc), sólo se permite…

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.

# Creacion de Directorios y subdirectorios
mkdir -p ~/vuls/{config,config/log,config/results}
Creacion de directorios en el home de nuestro usuario

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:

./DescargarImagenesVuls.sh
Lanzar proceso de Descargar y Actualizar

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:

./ActualizarVulnerabilidades.sh
Iniciar proceso de Descarga y/o Actualización de BBDD de Vulnerabilidades

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:

ssh-keygen -t rsa
Crear conjunto de clave publica-privada

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.

VulsRepo (analizador web)

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:

docker stop $(docker ps|grep 'vulsrepo-server'| awk '{print $1}')
Detener VulsRepo

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':

scanMode           = ["fast"]
Modo "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:

Abstract · Vuls
For a system administrator, having to perform security vulnerability analysis and software updates on a daily basis can be a burden.
Documentación Oficial sobre Vuls

Etiquetas

Luis GuLo

🐧 SysAdmin GNU/Linux - 🐳 Docker - 🖥️ Bash Scripting - 🐪 Perl - 🐬 MySQL - 👥 Formador de TI - 👥 Formador de SysAdmin's - 💢 Ansible - ☁️ Cloud Computing - ❤️ Debian GNU/Linux