¿Detecta tu herramienta de gestión de vulnerabilidades todas las de tu red?
La inspiración de este post viene después de leer esta entrada de Alexander Leonov. Alexander investiga los puntos ciegos en las bases de datos de los escáneres de vulnerabilidades, y cómo podemos asumir erróneamente que todas las vulnerabilidades publicadas pueden ser identificadas con nuestra lustrosa herramienta, por la que pagamos una generosa licencia. Como él mismo explica, esto no es cierto, y usa como referencia el catálogo de CISA de Vulnerabilidades Conocidas que están siendo explotadas.
Como tengo acceso a una instancia de Tenable.sc con plugins actualizados a diario, he usado una aproximación diferente a esta teoría. Accediendo directamente a la API, descargo todos los plugins de la base de datos de mi servidor y los cruzo con el catálogo de CISA KEV.
Plugins de Nessus
Nessus utiliza plugins para detectar vulnerabilidades, y todos ellos se pueden recuperar vía el endpoint de API llamado plugin. ¿Por qué no recuperarlos todos y extraer los CVEs a los que hacen referencia? Esto nos daría una lista completa de todos los CVEs que Nessus puede detectar en un momento concreto.
Uso PowerShell para trabajar con la API, en estos posts puedes ver una introducción de como hacerlo.
Y ahora vamos con ello; primero obtenemos todos los plugins de nuestro servidor Tenable.sc:
# Generate authentication headers
$accessKey = 'ACCESS_KEY_HERE'
$secretKey = 'SECRET_KEY_HERE'
$headers = @{}
$headers.Add("x-apikey", "accessKey=$accessKey;secretKey=$secretKey")
$scURL = 'https://192.168.23.12'
#Get all plugins with CVEs
$result = Invoke-RestMethod -Uri "$scURL/rest/plugin?fields=id,xrefs&endOffset=200000" -Method Get -Headers $headers -UseBasicParsing | select -ExpandProperty "response"
A continuación, extraemos todos los IDs de CVEs del campo xrefs con la ayuda de un poco de regex.
# Extract all CVEs covered by plugins.
$allCVE = @{}
# Regex expression to separate CVE IDs
$CVERegex = [regex]'CVE-\d+-\d+'
# Go over all plugins, extract CVE IDs and store them without duplicates
foreach ($xref in $result.xrefs) {
foreach ( $match in $CVERegex.matches($xref) ) {
if ( -not $allCVE.ContainsKey($match.value) ) {
$allCVE.Add($match.value, '')
}
}
}
Podemos guardar todos los CVEs en un archivo.
$outputFileAllCVE = 'C:\KEV\all_CVE.txt'
$allCVE | Out-File -FilePath $outputFileAllCVE
Así tenemos la bonita cantidad de 68466 CVEs diferentes a fecha de Abril de 2022.
Catálogo de CISA KEV
Ahora que ya sabemos que CVEs nuestro escáner puede identificar, vamos a ver si nos podríamos estar perdiendo algunos del catálogo de CISA. Recordemos que están identificados como activamente explotados en el mundo real. Descargamos el archivo CSV de aquí, y comprobamos cuáles no están en la base de datos de Nessus.
# Get KEV from file
$kev = Import-Csv 'C:\KEV\known_exploited_vulnerabilities.csv'
# Get CVEs in KEV and not covered by Nessus
$kevNOTMatch = @()
foreach ( $cve in $kev ) {
if ( $cve.cveID -notin $allCVE.Keys) {
$kevNOTMatch += $cve
}
}
Finalmente exporto los resultados a CSV para procesarlos posteriormente.
# Prepare outputfile
$outputFileKEVNotCovered = 'C:\KEV\KEV_notCovered.csv'
# export to CSV KEV not covered by Nessus
$kevNOTMatch | Export-Csv -path $outputFileKEVNotCovered -NoTypeInformation
Y conseguimos una lista muy apañada con las vulnerabilidades que nuestro escáner de vulnerabilidades no puede detectar actualmente. Puedes encontrar una copia del archivo para referencia aquí.
Podemos ver algunos productos como IBM o Citrix en la lista, así que no es descartable que un buen número de empresas los utilicen.
¿Debería preocuparme?
De momento, ya sabemos qué lagunas tiene nuestra herramienta y podemos asegurarnos si alguna de estas vulnerabilidades afectan a algún producto presente en nuestro entorno. Yo hago esto cada vez que CISA actualiza su lista, así me aseguro de evitar sorpresas 🙂.
La conclusión para mi es la misma que explica Alexander en su blog, no confíes a ciegas en tu herramienta de gestión de vulnerabilidades, y si es posible, usa más de una, como hago yo 😉.