Descubre vulnerabilidades conocidas explotadas en tu red con la API de Tenable

Descubre vulnerabilidades conocidas explotadas en tu red con la API de Tenable

Hoy vamos a ver un ejemplo práctico de uso de el endpoint Analysis de la API de Tenable.sc. Usaremos la lista de vulnerabilidades conocidas explotadas(known exploited vulnerabilities) distribuida por CISA y la compararemos con los resultados de nuestros escaneos. Esto nos dará una lista de CVEs activos sin parchear en nuestra red y que debería ser priorizada, ya que están siendo usados en ataques.

Known Exploited Vulnerabilities(KEV)

CISA publica un archivo CSV con todas las vulnerabilidades en su catálogo, y podemos descargarlo aquí

Tenable.sc Analysis API Endpoint

Como ya vimos en entradas previas, podemos interactuar con el endpoint de Analysis a través de la API, simplemente necesitamos generar las claves access y secret como expliqué aquí y construir los headers de autenticación. Como en los posts anteriores, voy a usar PowerShell para trabajar con la API:

$accessKey = 'ACCESS_KEY_HERE'
$secretKey = 'SECRET_KEY_HERE'
#$headers = @{'x-apikey'=@{'accesskey'=$accessKey;'secretkey'=$secretKey}}
$headers = @{}
$headers.Add("x-apikey", "accessKey=$accessKey;secretKey=$secretKey")

Filtros

Voy a usar solo 2 filtros para esta petición:

# Filters applied:
# 	Last observed: within the last 7 days
# 	Severity: Medium, High, Critical
$filters = @(

    @{"filterName"="lastSeen"; "operator"="="; "value"="0:7"},
    @{"filterName"="severity"; "operator"="="; "value"="2,3,4"}
)

Esto nos devolverá todas las vulnerabilidades Medium, High y Critical observadas en los últimos 7 días.

Query

El siguiente paso es construir la petición con el filtro que acabamos de definir y usando la tool vulndetails que nos devuelve los campos que necesitamos:

$query = @{"tool"="vulndetails";
            #"sourceType"="patched";
            "createdTime"=0;
            "modifiedTime"=0;
            "name"="";
            "description"="";
            "type"="vuln";
            "sortDir"="desc";
            "context"="";
            "startOffset"=0;
            "endOffset"=99999;
            "sortField"="severity";
            "filters"=$filters
}

Petición

Construimos el body para la petición POST:

$body = @{"sourceType"="cumulative";"type"="vuln";"query"=$query} | ConvertTo-Json -Compress -Depth 5

Hacemos la petición al endpoint analysis :

#Tenable.sc URL
$scURL = 'https://192.168.12.11'

#Get results from query
$result = Invoke-RestMethod -Uri $scURL/rest/analysis -Method Post -Headers $headers -Body $body -UseBasicParsing 
$queryResult = $result.response

Esto nos da todos los datos de vulnerabilidades de los últimos 7 días en la variable $queryResult.

Informe con las KEV no parcheadas

Vamos a hacer un informe en CSV con todas vulnerabilidades explotadas y todavía no parcheadas en nuestra red. Extraemos los campos que necesitamos y los formateamos para compararlos con el archivo CSV que bajamos de CISA.

# We get all vulnerabilities IP, CVEs, Name and pluginID
$resultFormatted = @()
foreach ($record in $queryResult.results) {
    $ip = $record.ip
    $cve = $record.cve
    $name = $record.pluginName
    $pluginID = $record.pluginID
    $resultFormatted += New-Object psobject -Property @{
        'IP' = $ip
        'CVE' = $cve
        'pluginID' = $pluginID
        'Name' = $name
    } | Select-Object IP,CVE,pluginID,Name
}

A continuación obtenemos la lista de CVEs que aparecen en la list KEV y en nuestra base de datos:

# Get contents of KEV from CISA file
$kev = Import-Csv 'C:\KEV\known_exploited_vulnerabilities.csv'

# Get list of CVEs matching in our DB
$kevMatch = @()
foreach ( $vuln in $resultFormatted ) {
	# Some records have multiple CVEs in a single vulnerability
    $individualCVE = $vuln.CVE -split ","
    foreach ($i in $individualCVE) {
        if ( $i -in $kev.cveID) {
            $kevMatch += $vuln
        }
    }
}

Y esto nos da una lista de CVEs no parcheados en nuestra base de datos.

KEV

Finalmente, generamos un informe CSV con nuestros hallazgos:

#Prepare outputfile
$outputFile = 'C:\KEV\active_kev.csv'
#export to CSV all hosts with active CVEs from the KEV list
$kevMatch | Export-Csv -path $outputFile -NoTypeInformation 

Conclusión

Todas las entradas en el informe deberían ser marcadas como prioritarias para actualización, ya que están siendo activamente explotadas.

Esto es solo un ejemplo rápido de como usar la API en nuestro beneficio y aportar mayor valor a nuestro informes de vulnerabilidades.

¡Espero que te haya gustado y te de ideas para otros usos de la API de Tenable.sc!