
Verificação web para vulnerabilidades de privesc no Windows
Esta é a base de código do serviço em execução em: https://patchchecker.com. Em resumo, o PatchChecker é uma aplicação web (executando em Flask) que fornece saída semelhante à do Watson. No entanto, ao usar o PatchChecker, não é necessário executar um binário na máquina alvo. Também está incluído neste projeto um web scraper que atualizará automaticamente o banco de dados do PatchChecker usando informações presentes em sites da Microsoft, permitindo uma solução mais escalável e fácil de usar para o problema de encontrar CVEs para as quais um sistema Windows está (ou não) corrigido. Além disso, quaisquer outros CVEs podem ser adicionados à entrada do coletor de dados e verificados, desde que tenham uma entrada em https://portal.msrc.microsoft.com. Você também pode usar isso para obter os dados e atualizar o Watson.
Mais informações sobre este projeto podem ser encontradas aqui.
Para usar o patchchecker, você pode acessar o site hospedado publicamente aqui em patchchecker.com ou pode clonar este repositório com git, instalar as bibliotecas necessárias, garantir que patches.db esteja no mesmo diretório que app.py e então iniciar a aplicação com python3 ./app.py.
Uma vez iniciada a aplicação, você pode abrir o arquivo "index.html" incluído em um navegador para realmente usar o serviço e obter a lista de patches aos quais o sistema sendo testado é vulnerável.




Alternativamente, você pode usar um comando curl e fazer algo como:
Solicitação:
nota: você pode usar qualquer delimitador que desejar, estou usando espaços aqui:
curl 'https://patchchecker.com/checkprivs/' --data-raw 'wmicinfo=KB1231411 KB1231441 KB1234141&build_num=17763'
Resposta:
nota: usei alguns KBs falsos, então está mostrando vulnerável a tudo, ou seja, não tenho nada instalado
nota: a saída está truncada
{
"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 executar o código neste repositório por conta própria, não se esqueça de executar: python3 -m pip install -r requirements.txt e executar com python3. Para referência, usei python 3.7.3.
O script patchdata_collector.py é o scraper pyppeteer que itera por vários sites da Microsoft para obter os dados desejados para os CVEs especificados no arquivo de argumento --cve-list.
Para um exemplo do formato esperado, veja o arquivo cves.txt dentro do diretório samples. Basicamente é um arquivo separado por linhas, onde cada linha contém o seguinte: CVE-XXXX-XXXX|https://website.com/resource-pertaining-to-CVE,http://second_resource.com. Você entendeu a ideia. Um exemplo da saída resultante pode ser encontrado no arquivo patches.db incluído.
O código não é perfeito, mas obtém os dados e funciona por enquanto. Como referência, com 9 CVEs, deve levar cerca de 11 minutos para concluir, os resultados podem variar.
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
Executar time ./patchdata_collector.py --cve-list cves.txt --db antest.db --new-db produz a seguinte saída:
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