cve-search: una herramienta para realizar búsquedas de vulnerabilidades de forma local

Queramos o no, cuando buscamos vulnerabilidades conocidas en bases de datos de CVEs públicas estamos filtrando información sensible como los productos de software y plataformas que tenemos y/o estamos auditando. Llamarme paranoico pero cuando vi una herramienta que se bajaba las bases de datos de vulnerabilidades y permitía hacer búsquedas locales más rápidas y limitando las peticiones sensibles hacia Internet no dudé en probarla.

Se trata de cve-search, una herramienta para importar CVE (Common Vulnerabilities and Exposures) y CPE (Common Platform Enumeration) a una base de datos MongoDB para facilitar las búsquedas y el tratamiento de CVEs.

cve-search incluye un backend para almacenar vulnerabilidades e información relacionada, un interfaz web intuitivo para buscar y administrar vulnerabilidades, una serie de herramientas para realizar peticiones al sistema y un API web como interfaz.

cve-search lo utilizan ya muchas organizaciones incluyendo los servicios incluyendo el CIRCL (Computer Incident Response Center Luxembourg).

Bases de datos y recopilaciones

La base de datos MongoDB llamada cvedb tiene 11 recopilatorios:
  • cves (Common Vulnerabilities and Exposure items) - fuente NVD NIST
  • cpe (Common Platform Enumeration items) - fuente NVD NIST
  • vendor (Official Vendor Statements on CVE Vulnerabilities) - fuente NVD NIST
  • cwe (Common Weakness Enumeration items) - fuente NVD NIST
  • capec (Common Attack Pattern Enumeration and Classification) - fuente NVD NIST
  • ranking (reglas de ranking por grupo) - local cve-search
  • d2sec (referencias de exploiting de D2 Elliot Web Exploitation Framework) - fuente d2sec.com
  • vFeed (referencias cruzadas con ids CVE (e.g. OVAL, OpenVAS, ...)) - fuente vFeed - proprietary feed - MITRE Reference Key/Maps preferible
  • ms - (Microsoft Bulletin (Security Vulnerabilities and Bulletin)) - fuente Microsoft
  • exploitdb (Offensive Security - Exploit Database) - fuente offensive security
  • info (metadatos de cada recopilatorio como última modificación) - local cve-search
Redis tiene 3 base de datos:
  • El caché cpe (Common Platform Enumeration) - fuente MongoDB cvedb collection cpe
  • La base de datos de notificaciones - fuente cve-search
  • La base de datis de referencias CVInterfaz web
    E es una bd de referencias cruzadas de CVE ids contra IDs de fabricantes - source NVD NIST/MITRE
Instalación (en Ubuntu 16.04)

Primero clonamos el repositorio e instalamos las dependencias de Python:

https://github.com/cve-search/cve-search.git
sudo apt-get install python3-pip
sudo pip3 install -r requirements.txt


A continuación instalamos MongoDB y configuramos el servicio:

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.3 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
sudo apt-get update
sudo apt-get install -y mongodb

vi /etc/systemd/system/mongod.service


[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf

[Install]
WantedBy=multi-user.target

sudo service mongobd start

Inicializando la base de datos

./sbin/db_mgmt.py -p

Importing CVEs for year 2002
Importing CVEs for year 2003
Importing CVEs for year 2004
Importing CVEs for year 2005
Importing CVEs for year 2006
Importing CVEs for year 2007
Importing CVEs for year 2008
Importing CVEs for year 2009
Importing CVEs for year 2010
Importing CVEs for year 2011
Importing CVEs for year 2012
Importing CVEs for year 2013
Importing CVEs for year 2014
Importing CVEs for year 2015
Importing CVEs for year 2016

./sbin/db_mgmt_cpe_dictionary.py
Preparing [##################################################] 115175/115175

./sbin/db_updater.py -c

INFO:root:Starting cves
Preparing [##################################################] 241/241
INFO:root:cves has 79360 elements (18 update)
INFO:root:Starting cpe
Preparing [##################################################] 115175/115175


INFO:root:cpe has 115102 elements (55151 update)
INFO:root:Starting vfeed
Traceback (most recent call last):
  File "/home/vmotos/Vicente/tools/cve-search/sbin/db_mgmt_vfeed.py", line 46, in <module>
    t.extract('vfeed.db', path=tmppath)
  File "/usr/lib/python3.5/tarfile.py", line 2027, in extract
    tarinfo = self.getmember(member)
  File "/usr/lib/python3.5/tarfile.py", line 1736, in getmember
    tarinfo = self._getmember(name)
  File "/usr/lib/python3.5/tarfile.py", line 2317, in _getmember
    members = self.getmembers()
  File "/usr/lib/python3.5/tarfile.py", line 1747, in getmembers
    self._load()        # all members, we first have to
  File "/usr/lib/python3.5/tarfile.py", line 2340, in _load
    tarinfo = self.next()
  File "/usr/lib/python3.5/tarfile.py", line 2271, in next
    self.fileobj.seek(self.offset - 1)
  File "/usr/lib/python3.5/gzip.py", line 366, in seek
    return self._buffer.seek(offset, whence)
  File "/usr/lib/python3.5/_compression.py", line 143, in seek
    data = self.read(min(io.DEFAULT_BUFFER_SIZE, offset))
  File "/usr/lib/python3.5/gzip.py", line 480, in read
    raise EOFError("Compressed file ended before the "
EOFError: Compressed file ended before the end-of-stream marker was reached
INFO:root:vfeed has 0 elements (0 update)
INFO:root:Starting vendor
Cannot open url https://nvd.nist.gov/download/vendorstatements.xml.gz. Bad URL or not connected to the internet?
INFO:root:vendor has 0 elements (0 update)
INFO:root:Starting cwe
Preparing [##################################################] 719/719
INFO:root:cwe has 719 elements (719 update)
INFO:root:Starting capec
Preparing [##################################################] 463/463
INFO:root:capec has 463 elements (463 update)
INFO:root:Starting redis-cache-cpe
Redis server not running on localhost:6379
INFO:root:redis-cache-cpe updated
INFO:root:Starting d2sec
{'url': 'http://www.d2sec.com/exploits/lionwiki_3.0.3_lfi.html', 'id': 'CVE-2009-3534', 'name': 'LionWiki 3.0.3 LFI'}
.....

Preparing [##################################################] 304/304
INFO:root:d2sec has 265 elements (265 update)
INFO:root:Starting ms
INFO:root:ms has 815 elements (815 update)
INFO:root:Starting redis-nist-ref
Redis server not running on localhost:6379
INFO:root:redis-nist-ref has 0 elements (0 update)
INFO:root:Starting exploitdb

Indexación

./sbin/db_fulltext.py

Interfaz web

pip install Flask-PyMongo

cd ./web
 python3 ./index.py




Uso

Puedes buscar en la base de datos con search.py:

./bin/search.py -p cisco:ios:12.4
./bin/search.py -p cisco:ios:12.4 -o json
./bin/search.py -f nagios -n
./bin/search.py -p microsoft:windows_7 -o html


Si quieres buscar todas las vulnerabilidades de WebEx y sólo mostrar las referencias oficiales del fabricante:

./bin/search.py -p webex: -o csv  -v "cisco"

También es posible volcar un json para un ID CVE específico:

./bin/search.py -c CVE-2010-3333

O puedes usar un bot XMPP:

./bin/search_xmpp.py -j mybot@jabber.org -p strongpassword

Volcar los dos últimos CVEs en formato RSS o ATOM:

./bin/dump_last.py -f atom -l 2

O mezclarlo con expresiones regulares y comandos. Como por ej.

Sacar los CPEs de un fichero XML de salida de nmap:

rgrep -Eio ".*?" escaneo.xml --color | awk -F'>' '{print $2}' | cut -d '<' -f1 | sort -u

U obtener el número de vulnerabilidades con CVSS mayor que 6:

./bin/search.py -p cisco | grep "CVSS" | cut -d ":" -f 2 | sort | cut -d "." -f1 | egrep "10|[6-9]" | grep -v "0|1||2||3||4||5" | wc -l

Ya véis la flexibilidad y el juego que da esta herramienta. Podéis encontrar más información y funcionalidades en su Github:

https://github.com/cve-search/cve-search

2 comentarios :

  1. Ya lo probe!!! esta muy bueno, sobre todo para tener un ambiente controlado.

    Me gusto!!!

    Saludos y gracias por el aporte

    ResponderEliminar
    Respuestas
    1. me alegra que te haya gustado como a mí. La verdad es que la veo una herramienta bastante útil que, además de darte un plus de privacidad, te permite cierta flexibilidad a la hora de integrarlo con tus propias herramientas.

      Un saludo!

      Eliminar