Пишем сценарий для определения уязвимого ПО на Python

Пишем сценарий для определения уязвимого ПО на Python

@webware

t.me/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!

На этом все.

Спасибо за внимание!

Источник codeby.net

Report Page