PatchChecker es un comprador, basado en la web, de las vulnerabilidades de escalada de los privilegios (PrivEsc) de Windows.
En resumen, PatchChecker es una aplicación web (que se ejecuta en Flask) que proporciona una salida similar a la de Watson (https://github.com/rasta-mouse/Watson/). Sin embargo, al usar PatchChecker, no se requiere ejecutar un binario en la máquina destino. En este proyecto también se incluye un raspador web que actualizará automáticamente la base de datos de PatchChecker utilizando la información presente en los sitios de Microsoft, lo que permite una solución más escalable y fácil de usar para el problema de encontrar CVEs a los que un sistema Windows está (o no) parcheado. Además, se puede añadir cualquier otro CVE a la entrada del colector de datos y comprobarlo siempre que tenga una entrada en https://portal.msrc.microsoft.com. También se puede usar esto para obtener los datos para actualizar Watson.
Usar PatchChecker para verificar vulnerabilidades
Para usar patchchecker, puedes ir al sitio web alojado públicamente aquí en patchchecker.com o puedes clonar este repositorio, instalar las bibliotecas necesarias, asegurarte de que patches.db esté en el mismo directorio que app.py y luego iniciar el aplicación con python3 ./app.py
. Una vez que se inicia la aplicación, puedes abrir el archivo “index.html” en un navegador para usar el servicio y obtener la lista de parches a los que el sistema que se está probando es vulnerable.
Obtener Datos KB
Cada parche nuevo sirve para solucionar un problema conocido y, por lo tanto, es una solución. Cada par de solución de problemas se documentará en la Knowledge Base / Base de Conocimiento (algunas veces interno, a veces externo). De ahí el término KB para parches.
El siguiente comando servirá para obtener una lista de todas las actualizaciones instaladas en Windows, filtradas por HotFixID:
wmic qfe list full | findstr /i hotfix
A continuación, vamos a revisar la build que tenemos instalada actualmente:
systeminfo | findstr /i build
*Si tu sistema está en idioma español, el filtro debería ser “compilación”, así:
systeminfo | findstr /i compilación
Entrada esperada
Con los datos obtenidos anteriormente, accedemos a patchchecker.com y colocamos los datos correspondientes:
Salida esperada de la página web
Salida esperada de la página web cuando se encuentran vulnerabilidades:
Alternativamente, puedes usar un comando curl y hacer algo como esto:
Request: (Puedes usar cualquier delimitador que desees, estoy usando espacios aquí)
curl 'https://patchchecker.com/checkprivs/' --data-raw 'wmicinfo=KB1231411 KB1231441 KB1234141&build_num=17763'
Response:
{
"total_vuln": 9,
"kbs_parsed": [
"KB1231411",
"KB1231441",
"KB1234141"
],
"total_kbs_parsed": 3,
"build": "17763",
"results": [
{
"refs": [
"https://exploit-db.com/exploits/46718",
"https://decoder.cloud/2019/04/29/combinig-luafv-postluafvpostreadwrite-race-condition-pe-with-diaghub-collector-exploit-from-standard-user-to-system/"
],
"name": "CVE-2019-0836",
"vulnerable": true
}
]
}
Para ejecutar el código en este repositorio, no olvides ejecutar: (Usar Python 3)
python3 -m pip install -r requirements.txt
Recopilar datos: patchdata_collector.py
El script patchdata_collector.py es el raspador/scraper de pyppeteer que recorre varios sitios de Microsoft para obtener los datos deseados para las CVEs especificadas en el arg –cve-list. Para ver un ejemplo del formato esperado, consulta el archivo cves.txt dentro de la carpeta samples. Básicamente es un archivo separado por líneas, con cada línea que contiene el siguiente CVE-XXXX-XXXX|https://website.com/resource-pertaining-to-CVE,http://second_resource.com te haces una idea. Un ejemplo de la salida resultante se puede encontrar en el archivo patches.db incluido.
El código no es perfecto, pero obtiene los datos y funciona por el momento. Como referencia, con 9 CVE, debería llevar unos 11 minutos completar, YMMV.
Uso de patchdata_collector.py:
usage: patchdata_collector.py [-h] --cve-list CVE_LIST [--db DB] [--new-db] [-v]
[-vv] [--no-headless] [--json JSON]
optional arguments:
-h, --help show this help message and exit
--cve-list CVE_LIST line and pipe separated list containing CVEs and
related-URLs with information example: CVE-2020-1048|https://github.com/ionescu007/faxhell,https://github.com/ionescu007/PrintDemon
--db DB sqlite database filename
--new-db erases old database (if exists)
-v set output to debug (verbose)
-vv set output to annoying
--no-headless run browser with headless mode disabled
--json JSON json format output, argument should be json filename
Ejemplo de ejecución
time ./patchdata_collector.py --cve-list cves.txt --db antest.db --new-db
La ejecución anterior produce el siguiente resultado:
2020-06-05 20:38:49.292 | INFO | __main__:main:181 - Loaded 10 CVEs
2020-06-05 20:38:49.430 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-0836
2020-06-05 20:40:27.183 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1064
2020-06-05 20:41:07.158 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-0841
2020-06-05 20:41:31.675 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1130
2020-06-05 20:42:58.527 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1253
2020-06-05 20:43:25.069 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1315
2020-06-05 20:44:57.974 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1385
2020-06-05 20:45:22.026 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1388
2020-06-05 20:46:48.407 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2019-1405
2020-06-05 20:48:07.026 | INFO | __main__:parsekb:33 - Parsing KBs for: CVE-2020-1048
finished
real 11m27.793s
user 1m21.632s
sys 0m14.559s
¡Comparte esta excelente herramienta y deja tu reacción! 😀