Инструменты для сканирования уязвимостей хоста_Каковы инструменты сканирования уязвимостей?
Инструменты для сканирования уязвимостей хоста_Каковы инструменты сканирования уязвимостей?

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

0x00 Описание:

Это хостинглазейкисканированиеинструмент,Используйте многопоточность, чтобы обеспечить быстрый запрос данных.,Использование блокировки потоков можно использовать в sqliteбазе. данных Избегайте записи данных вdatabase is lockedошибка,использоватьmd5Алгоритм хеширования гарантирует, что данные не будут вставляться повторно.。

книгаинструмент Найдите, есть ли пабликexpВеб-сайтshodan,Этот веб-сайт ограничивает скорость отправки сетевых пакетов.,Поэтому применяется однопоточный подход.,И это занимает много времени.

Функция:

  • Найдите CVE, которые есть на вашем хосте
  • Найдите CVE с общедоступным опытом

0x01 Причина:

Поскольку мне нужно поработать над сканированием уязвимостей хоста, я написал этот простой инструмент. Раньше я также искал несколько подобных инструментов, а именно:

vulmap:

Инструмент с открытым исходным кодом, разработанный vulmon. Принцип состоит в том, чтобы определить наличие CVE и общедоступных EXP на основе названия и номера версии программного обеспечения. Этот инструмент для Linux очень прост в использовании, но он не подходит для системного уровня Windows.

windows-exp-suggester:

Этот инструмент имеет тот же принцип, что и этот инструмент. Попробовав его использовать, я обнаружил, что его база данных CVEKB была обновлена ​​только до 2017 года, и он не выдал, имеет ли CVE общедоступную информацию об опыте.

На основании вышеизложенного я написал вот этот простой инструмент,Этот проект находится вhttps://github.com/chroblert/WindowsVulnScan

0x02 Принцип:

1. Собрать переписку между CVE и KB. Сначала соберите соответствующие связи между CVE и KB на официальном сайте Microsoft, а затем сохраните их в базе данных.

2. Узнайте, есть ли общедоступный EXP на конкретном веб-сайте CVE.

3. Используйте сценарий PowerShell для сбора информации о версии системы и КБ хоста.

4. Используйте версию системы и информацию базы знаний для поиска CVE с общедоступным опытом на хосте.

Параметры 0x03:

Язык кода:javascript
копировать
# author: JC0o0l
# GitHub: https://github.com/chroblert/
Дополнительные параметры:
  -h, --help            show this help message and exit
  -u, --update-cve      Обновить данные CVEKB
  -U, --update-exp      Обновить данные CVEEXP
  -C, --check-EXP       Получить CVE с EXP
  -f FILE, --file FILE  Файл .json, созданный после запуска сценария ps1.

0x04 Пример:

1. Первый запускpowershell脚книгаKBCollect.psсобрать некоторую информацию

Язык кода:javascript
копировать
.\KBCollect.ps1

2. будет сгенерирован после запускаKB.jsonФайл перемещен вcve-check.pyкаталог

3. Установите несколько модулей Python3.

Язык кода:javascript
копировать
python3 -m pip install requirements.txt

4. бегатьcve-check.py -uсоздаватьCVEKBбаза данных

5. бегатьcve-check.py -UвозобновлятьCVEKBбаза данныхвhasPOCПоле

6. бегатьcve-check.py -C -f KB.jsonПосмотреть публикаEXPизCVE,следующее:

Исходный код 0x05:

KBCollect.ps1:

Язык кода:javascript
копировать
function Get-CollectKB(){ 

# 1. Соберите все патчи базы знаний.
$KBArray = @()
$KBArray = Get-HotFix|ForEach-Object { 
$_.HotFixId}
$test = $KBArray|ConvertTo-Json
return $test
}
function Get-BasicInfo(){ 

# 1. Операционная система
# $windowsProductName = (Get-ComputerInfo).WindowsProductName
$windowsProductName = (Get-CimInstance Win32_OperatingSystem).Caption
# 2. Операционная система版книга
$windowsVersion = (Get-ComputerInfo).WindowsVersion
$basicInfo = "{""windowsProductName"":""$windowsProductName"",""windowsVersion"":""$windowsVersion""}"
return $basicInfo
}
$basicInfo = Get-BasicInfo
$KBList = Get-CollectKB
$KBResult = "{""basicInfo"":$basicInfo,""KBList"":$KBList}"
$KBResult|Out-File KB.json -encoding utf8

cve-check.py:

Язык кода:javascript
копировать
import requests
import sqlite3
import json
import hashlib
import math
import re
import threading
import time
import argparse
from pathlib import Path
# удалить немного SSL Сертифицированная предупреждающая информация
requests.packages.urllib3.disable_warnings()
ThreadCount=20
DBFileName="CVEKB.db"
TableName="CVEKB"
insertSQL = []
updateSQL = []
lock = threading.Lock()
KBResult = { 
}
parser = argparse.ArgumentParser()
parser.add_argument("-u","--update-cve",help="Обновить данные CVEKB",action="store_true")
parser.add_argument("-U","--update-exp",help="Обновить данные CVEEXP",action="store_true")
parser.add_argument("-C","--check-EXP",help="Получить CVE с EXP",action="store_true")
parser.add_argument("-f","--file",help="файл .json, созданный после запуска сценария ps1")
args = parser.parse_args()
class CVEScanThread(threading.Thread):
def __init__(self,func,args,name="",):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name 
self.result = None
def run(self):
print("thread:{} :start scan page {}".format(self.args[1],self.args[0]))
self.result = self.func(self.args[0],)
print("thread:{} :stop scan page {}".format(self.args[1],self.args[0]))
class EXPScanThread(threading.Thread):
def __init__(self,func,args,name="",):
threading.Thread.__init__(self)
self.func = func
self.args = args
self.name = name 
self.result = None
def run(self):
print("thread:{} :start scan CVE: {},xuehao:{}".format(self.args[1],self.args[0],self.args[2]))
self.result = self.func(self.args[0],)
print("thread:{} :stop scan CVE: {}".format(self.args[1],self.args[0]))
def get_result(self):
threading.Thread.join(self)
try:
return self.result
except Exception:
return "Error"
def get_page_num(num=1,pageSize=100):
url = "https://portal.msrc.microsoft.com/api/security-guidance/en-us"
payload = "{\"familyIds\":[],\"productIds\":[],\"severityIds\":[],\"impactIds\":[],\"pageNumber\":" + str(num) + ",\"pageSize\":" + str(pageSize) + ",\"includeCveNumber\":true,\"includeSeverity\":false,\"includeImpact\":false,\"orderBy\":\"publishedDate\",\"orderByMonthly\":\"releaseDate\",\"isDescending\":true,\"isDescendingMonthly\":true,\"queryText\":\"\",\"isSearch\":false,\"filterText\":\"\",\"fromPublishedDate\":\"01/01/1998\",\"toPublishedDate\":\"03/02/2020\"}"
headers = { 

'origin': "https//portal.msrc.microsoft.com",
'referer': "https//portal.msrc.microsoft.com/en-us/security-guidance",
'accept-language': "zh-CN",
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
'accept': "application/json, text/plain, */*",
'accept-encoding': "gzip, deflate",
'host': "portal.msrc.microsoft.com",
'connection': "close",
'cache-control': "no-cache",
'content-type': "application/json",
}
response = requests.request("POST", url, data=payload, headers=headers, verify = False)
resultCount = json.loads(response.text)['count']
return math.ceil(int(resultCount)/100)
def update_cvekb_database(num=1,pageSize=100):
pageCount = get_page_num()
#for i in range(1,pageCount+1):
i = 1
pageCount=524
tmpCount = ThreadCount
while i <= pageCount:
tmpCount = ThreadCount if (pageCount - i) >= ThreadCount else pageCount - i
print("i:{},pageCount-i:{},ThreadCount:{},PageCount:{}".format(i,pageCount-i,ThreadCount,pageCount))
time.sleep(0.5)    
threads = []
print("===============================")
for j in range(1,tmpCount + 1):
print("Обновить страницу {}".format(i+j-1))
t = CVEScanThread(update_onepage_cvedb_database,(i+j-1,j,),str(j))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
# update_onepage_cvedb_database(num=i)
i = i + tmpCount
conn = sqlite3.connect(DBFileName)
for sql in insertSQL:
conn.execute(sql)
conn.commit()
conn.close()
if tmpCount != ThreadCount:
break
def check_POC_every_CVE(CVEName=""):
#apiKey = ""
#url = "https://exploits.shodan.io/api/search?query=" + CVEName + "&key=" + apiKey
url = "https://exploits.shodan.io/?q=" + CVEName
try:
response = requests.request("GET",url=url,verify=False,timeout=10)
#total = json.loads(response.text)
except Exception as e:
print("Error,{}".format(CVEName))
print(e)
return "Error"
if "Total Results" not in response.text:
return "False"
else:
return "True"
def update_onepage_cvedb_database(num=1,pageSize=100):
url = "https://portal.msrc.microsoft.com/api/security-guidance/en-us"
payload = "{\"familyIds\":[],\"productIds\":[],\"severityIds\":[],\"impactIds\":[],\"pageNumber\":" + str(num) + ",\"pageSize\":" + str(pageSize) + ",\"includeCveNumber\":true,\"includeSeverity\":false,\"includeImpact\":false,\"orderBy\":\"publishedDate\",\"orderByMonthly\":\"releaseDate\",\"isDescending\":true,\"isDescendingMonthly\":true,\"queryText\":\"\",\"isSearch\":false,\"filterText\":\"\",\"fromPublishedDate\":\"01/01/1998\",\"toPublishedDate\":\"03/02/2020\"}"
headers = { 

'origin': "https//portal.msrc.microsoft.com",
'referer': "https//portal.msrc.microsoft.com/en-us/security-guidance",
'accept-language': "zh-CN",
'user-agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",
'accept': "application/json, text/plain, */*",
'accept-encoding': "gzip, deflate",
'host': "portal.msrc.microsoft.com",
'connection': "close",
'cache-control': "no-cache",
'content-type': "application/json",
}
try:
response = requests.request("POST", url, data=payload, headers=headers, verify = False)
resultList = json.loads(response.text)['details']
except :
print(response.text)
conn = sqlite3.connect(DBFileName)
create_sql = """Create Table IF NOT EXISTS {} ( hash TEXT UNIQUE, name TEXT, KBName TEXT, CVEName TEXT, impact TEXT, hasPOC TEXT)""".format(TableName)
conn.execute(create_sql)
conn.commit()
conn.close()
for result in resultList:
KBName = result['articleTitle1'] + ";" if (result['articleTitle1'] !=  None) and result['articleTitle1'].isdigit() else ""
KBName += result['articleTitle2'] + ";" if (result['articleTitle2'] != None) and result['articleTitle2'].isdigit() else ""
KBName += result['articleTitle3'] + ";" if (result['articleTitle3'] != None) and result['articleTitle3'].isdigit() else ""
KBName += result['articleTitle4'] + ";" if (result['articleTitle4'] != None) and result['articleTitle4'].isdigit() else ""
if KBName == "":
continue
h1 = hashlib.md5()
metaStr = result['name'] + KBName + result['cveNumber'] + result['impact']
h1.update(metaStr.encode('utf-8'))
#hasPOC = check_POC_every_CVE(result['cveNumber'])
# Собрав все КБ, найдите любой общедоступный опыт.
hasPOC = ""
sql = "INSERT OR IGNORE INTO "+TableName+" VALUES ('" + h1.hexdigest() + "','" + result['name'] + "','" + KBName + "','" + result['cveNumber'] + "','" + result['impact'] + "','" + hasPOC+"')"
with lock:
global insertSQL
insertSQL.append(sql)
# conn.execute(sql)
# conn.commit()
# conn.close()
# pass
def select_CVE(tmpList=[],windowsProductName="",windowsVersion=""):
conn = sqlite3.connect(DBFileName)
con = conn.cursor()
intersectionList = []
count = 0
for i in tmpList:
sql = 'select distinct(CVEName) from '+ TableName+' where (name like "'+ windowsProductName+'%'+ windowsVersion + '%") and ("'+ i +'" not in (select KBName from '+ TableName +' where name like "'+ windowsProductName+'%'+windowsVersion+'%")); '
cveList = []
for cve in con.execute(sql):
cveList.append(cve[0])
if count == 0:
intersectionList = cveList.copy()
count +=1
intersectionList = list(set(intersectionList).intersection(set(cveList)))
intersectionList.sort()
for cve in intersectionList:
sql = "select CVEName from {} where CVEName == '{}' and hasPOC == 'True'".format(TableName,cve)
# print(sql)
con.execute(sql)
if len(con.fetchall()) != 0:
print("{} has EXP".format(cve))
# print(intersectionList)
def update_hasPOC(key = "Empty"):
conn = sqlite3.connect(DBFileName)
con = conn.cursor()
if key == "All":
sql = "select distinct(CVEName) from {}".format(TableName)
else:
sql = "select distinct(CVEName) from {} where (hasPOC IS NULL) OR (hasPOC == '')".format(TableName)
con.execute(sql)
cveNameList = con.fetchall()
i = 0
count = 1
while i < len(cveNameList):
print("|=========={}============|".format(i))
# tmpCount = ThreadCount if (len(cveNameList) - i) >= ThreadCount else len(cveNameList) - i
# threads = []
# for j in range(1,tmpCount+1):
# t = EXPScanThread(check_POC_every_CVE,(cveNameList[i+j][0],j,i+j,),str(j))
# threads.append(t)
# for t in threads:
# t.start()
# for t in threads:
# t.join()
# j = 1
# for t in threads:
# hasPOC = t.get_result()
# print(hasPOC)
# update_sql = "UPDATE "+TableName+" set hasPOC = '" + hasPOC + "' WHERE cveName == '" + cveNameList[i+j][0] +"';"
# conn.execute(update_sql)
# print("[+] update:{}".format(update_sql))
# j += 1
# i=i+ThreadCount
# conn.commit()
hasPOC = check_POC_every_CVE(cveNameList[i][0])
time.sleep(0.3)
update_sql = "UPDATE "+TableName+" set hasPOC = '" + hasPOC + "' WHERE cveName == '" + cveNameList[i][0] +"';"
conn.execute(update_sql)
print(update_sql)
count += 1
i += 1
if count == 10:
conn.commit()
print("[+]update")
count = 1
conn.commit()
conn.close()
print("Over")
if __name__ == "__main__":
banner = """ ========CVE-EXP-Check=============== | author:JC0o0l | | wechat:JC_SecNotes | | version:1.0 | ===================================== """
print(banner)
if (not args.check_EXP ) and (not args.update_cve) and (not args.update_exp) and args.file is None:
parser.print_help()
if args.update_cve:
update_cvekb_database()
if args.update_exp:
dbfile=Path(DBFileName)
if dbfile.exists():
update_hasPOC(key="Empty")
else:
print("Пожалуйста, сначала используйте -u создать базу данных")
parser.print_help()
if args.check_EXP:
dbfile=Path(DBFileName)
if not dbfile.exists():
print("Пожалуйста, сначала используйте -u создать базу данные, используйте позже -U Обновите, есть ли EXP")
parser.print_help()
exit()
if args.file:
with open(args.file,"r",encoding="utf-8") as f:
KBResult = json.load(f)
windowsProductName = KBResult['basicInfo']['windowsProductName']
windowsProductName = ((re.search("\w[\w|\s]+\d+[\s|$]",windowsProductName).group()).strip()).replace("Microsoft","").strip()
windowsVersion = KBResult['basicInfo']['windowsVersion']
print("Информация о системе следующая:")
print("{} {}".format(windowsProductName,windowsVersion))
tmpKBList = KBResult['KBList']
KBList = []
for KB in tmpKBList:
KBList.append(KB.replace("KB",""))
print("Информация о КБ следующая:")
print(KBList)
print("Информация об опыте следующая:")
select_CVE(tmpList=KBList,windowsProductName=windowsProductName,windowsVersion=windowsVersion)
else:
print("Пожалуйста, введите файл .json")    

Заявление об авторских правах: Содержание этой статьи добровольно предоставлено пользователями Интернета, а мнения, выраженные в этой статье, представляют собой только точку зрения автора. Данный сайт лишь предоставляет услуги по хранению информации, не имеет никаких прав собственности и не несет соответствующей юридической ответственности. Если вы обнаружите на этом сайте какое-либо подозрительное нарушение авторских прав/незаконный контент, отправьте электронное письмо, чтобы сообщить. После проверки этот сайт будет немедленно удален.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/194610.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose