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

Приветствую всех! Сегодня с утра пришла идея к написанию данного сценария. Я смог написать его и решил поделиться с вами, возможно он будет вам полезен.
Он будет получать список установленных программ в 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')

Весь скрипт:
Код:
from subprocess import check_output
import argparse
from termcolor import *
import colorama

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"])
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)

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
        break

if vulnvers <= vers:
    cprint (namepo + ' - Vuln!' ,'green')
else:
    cprint (namepo + ' - Not Vuln!' ,'red')
На этом все.
Спасибо за внимание!
PS Как я и говорил выше, я планирую усовершенствовать скрипт, исправить баги, добавить полную автоматизацию и т.п.
 
Последнее редактирование:

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Надо код поправить, он с ошибками. Некоторые параметры заключить в str и т.д.
И ещё после выполнения кода запись идёт в одну строку, конечно это очень не удобно. Нужно записи в столбик делать.
Задумка замечательная, буду ждать исправления и продолжения.

Вот скрин - во всю длину монитора даже 2 записи не вписались.

wind.png
 
Последнее редактирование:

Tayrus

Red Team
13.04.2017
365
787
BIT
6
Надо код поправить, он с ошибками. Некоторые параметры заключить в str и т.д.
И ещё после выполнения кода запись идёт в одну строку, конечно это очень не удобно. Нужно записи в столбик делать.
Задумка замечательная, буду ждать исправления и продолжения.

Вот скрин - во всю длину монитора даже 2 записи не вписались.

Посмотреть вложение 22758
Я не отрицаю наличие багов, но по крайней мере мои тесты он прошел.
Вы меня не правильно поняли. Вывод уязвима программа или нет идет в консоль, а запись в .txt идет как костыль(для работы программы).
Мы можем поработать над этим скриптом вместе, если хочешь конечно.
 
  • Нравится
Реакции: Tihon49

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Я не отрицаю наличие багов, но по крайней мере мои тесты он прошел.
Вы меня не правильно поняли. Вывод уязвима программа или нет идет в консоль, а запись в .txt идет как костыль(для работы программы).
Мы можем поработать над этим скриптом вместе, если хочешь конечно.

И всё же - у меня в отчёте 10853 знака вывалило, строка реально длинная.
Спасибо за предложение, воздержусь. Я сейчас работаю над двумя криптошифрами, скоро статью выложу )
 
  • Нравится
Реакции: Tihon49

Tayrus

Red Team
13.04.2017
365
787
BIT
6
И всё же - у меня в отчёте 10853 знака вывалило, строка реально длинная.
Спасибо за предложение, воздержусь. Я сейчас работаю над двумя криптошифрами, скоро статью выложу )
2018-10-12_23-19-00.png

Вот пример работы программы(Выбрал для примера Python как софт и уязвимую версию 2.5). Те .txt файлы не нужны, когда обнову подкачу, уберу их.
 
  • Нравится
Реакции: Tihon49

Tayrus

Red Team
13.04.2017
365
787
BIT
6
Обновил скрипт!
Теперь вам не надо указывать через аргументы версию уязвимой программы и имя программы, которую надо искать.
После обновления в коде есть словарь, в него и будут наполняться уязвимые программы и их версии.
Т.е показываться будут сразу все уязвимые программы(если вы их забили в словарь)

Код:
Код:
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!
 
  • Нравится
Реакции: Tihon49

dark2strike

Green Team
16.04.2017
43
42
BIT
0
Странный скрипт.
Где функция получения всего установленного в системе ПО?
Где функция скачивания какой-либо базы уязвимостей для сравнения с установленным ПО?

Без этих двух функция это абсолютно бесполезный скрипт.
 

InFace

One Level
22.07.2019
1
1
BIT
0
Здравствуй, вот у меня ошибка, пытался пофиксить, но он находил новые траблы, которые не фиксились, в чём дело?
Снимок.JPG


Сним2ок.JPG
 

FantomDragon

Green Team
18.12.2017
120
46
BIT
7
А мне интересно может ти попробуеш сделать таблицу. Например:
Возмем базу exploits для метасплойто и он будет автоматично проверять всю систему на откритие порти и т.д.
1. Found - EternalBlue
2. Found - BlueKeep
3. .......
Ну и так дальше
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!