Пишем сценарий для определения уязвимого ПО на Python
@webware
Приветствую всех! Сегодня с утра пришла идея к написанию данного сценария. Я смог написать его и решил поделиться с вами, возможно он будет вам полезен.
Он будет получать список установленных программ в windows и искать уязвимые версии.
Скрипт сыроват, но я планирую доделать его, добавить полную автоматизацию, чтобы он показывал сразу все уязвимое ПО.
Приступим к написанию.
Вот такие либы я буду юзать:
from subprocess import check_output import argparse from termcolor import * import colorama
Тк.к сценарий я пишу для windows, то чтобы был цветной текст в консоле, мы должны дописать: colorama.init()
Добавим свои аргументы:
parser = argparse.ArgumentParser(description='Find vuln PO')
parser.add_argument('-vs', help ='Vuln version PO')
parser.add_argument('-nm', help ='PO Name')
args = parser.parse_args()
vulnvers = args.vs
namepo = args.nm
Введем переменные:
count = 0 count2 = 0 s = [] s2 = [] a = check_output(["wmic", "product", "get", "name"]) # Имена софта b = check_output(["wmic", "product", "get", "version"]) # Версии софта
Список установленных программ будем получать через wmic.
Теперь вывод мы будем записывать в .txt файлы:
handle = open('pen.txt','w')
handle.write(a)
handle.close()
handle = open('pen2.txt','w')
handle.write(b)
handle.close()
Добавляем в список имена софта:
handle = open('pen.txt')
for x in handle:
s.append(x)
Очищаем от \n и ненужных элементов:
s = map(lambda m: m.strip(), s) s.pop(0) s.pop(-1)
Аналогично и с версиями софта:
handle = open('pen2.txt')
for x in handle:
s2.append(x)
s2 = map(lambda m: m.strip(), s2)
s2.pop(0)
s2.pop(-1)
Ищем в списке с именами софта, софт который указал пользователь для поиска:
for x in s:
count += 1 # Записуем его номер, чтобы найти его версию в другом списке
if namepo in x:
break
Если найдем искомый софт в списке с именами софта, то ищем в другом списке версию софта:
vers = 0
for x in s2:
count2 += 1
if count2 == count:
vers = x # После того как найдем версию искомого софта приравниваем vers к версии софта
break
Теперь будем сравнивать если версия уязвимого ПО равна версии установленного ПО или меньше, то пишем что уязвимо, если нет, то пишем не уязвимо:
if vulnvers <= vers:
cprint (namepo + ' - Vuln!' ,'green')
else:
cprint (namepo + ' - Not Vuln!' ,'red')
Весь скрипт:
P.S
Обновил скрипт!
Теперь вам не надо указывать через аргументы версию уязвимой программы и имя программы, которую надо искать.
После обновления в коде есть словарь, в него и будут наполняться уязвимые программы и их версии.
Т.е показываться будут сразу все уязвимые программы(если вы их забили в словарь)
from subprocess import check_output
from termcolor import *
import colorama
import os
colorama.init()
vuln = {'Python 2.7.15':'2.9','VMware Tools':'11'} # Тут дополнейте уязвимые программы и их версии
# Эти две программы добавлены для примера/теста
s = []
s2 = []
a = check_output(["wmic", "product", "get", "name"])
b = check_output(["wmic", "product", "get", "version"])
handle = open('pen.txt','w')
handle.write(a)
handle.close()
handle = open('pen2.txt','w')
handle.write(b)
handle.close()
handle = open('pen.txt')
for x in handle:
s.append(x)
s = map(lambda m: m.strip(), s)
s.pop(0)
s.pop(-1)
handle = open('pen2.txt')
for x in handle:
s2.append(x)
handle.close()
s2 = map(lambda m: m.strip(), s2)
s2.pop(0)
s2.pop(-1)
os.unlink('pen.txt')
os.unlink('pen2.txt')
dct = dict(zip(s,s2))
for x in dct.keys():
for j in vuln.keys():
if x == j:
if dct[x] <= vuln[j]:
cprint (x + ' ' + 'Vuln!','green')
Пример вывода программы:
C:\Users\Alex\Desktop>python main.py Python 2.7.15 Vuln! VMware Tools Vuln!
На этом все.
Спасибо за внимание!