Powershell - Сравните два сканирования уязвимостей и выведите ОБА дубликаты и различия в новый CSV - PullRequest
0 голосов
/ 23 января 2020

У меня есть рабочий скрипт для сравнения 2 csvs и вывода дубликатов. Однако я хочу сравнить old.csv с new.csv и вывести все из new.csv с примечанием в столбце «Комментарии», указывающим, является ли это дублирующейся уязвимостью.

Вот примеры CSV:

old.csv:

First_Seen,Occurences,Scan Date / Last Seen,Vendor_Severity,Vulnerability Signature,Vulnerability_ID,Vulnerability_Description,Remediation,Comments
10/14/19,1,12/9/19,5,This is an old vulnerability #1,fixthis#1,this is bad,developers to implement patch,
10/13/19,4,12/9/19,5,This is also an old vuln.,fixthis#2,this will melt your computer,False-positive,False-Positive
10/13/19,4,12/9/19,5,This vulnerability was fixed later,fixthis#3,don't even…,Exception filed,Exception filed

new.csv

First_Seen,Occurences,Scan Date / Last Seen,Vendor_Severity,Vulnerability Signature,Vulnerability_ID,Vulnerability_Description,Remediation,Comments
10/14/20,1,12/9/19,5,This is an old vulnerability #1,fixthis#1,this is bad,,
10/13/19,4,12/9/19,5,This is also an old vuln.,fixthis#2,this will melt your computer,,
10/13/19,4,12/9/19,5,This is a new vulnerability!,never seen before vuln,wow!,,

Если на форматирование сложно смотреть, вот как выглядит new.csv в Excel :

new.csv

Ожидаемые:

Ожидаемые результаты

"Исправление" и " Комментарии »заполняются вручную в old.csv. Я хочу, чтобы скрипт переносил оба этих поля из old.csv в new.csv для любых дубликатов.

Q: Как определить дубликаты?

A: Мой скрипт соответствует «First_Seen» (столбец A) И «Подпись уязвимости» (столбец E) от обоих csv. Если какая-либо строка, содержащая дублирующиеся объекты в обоих этих полях, считается уязвимостью с дублированием.

Любые новые уязвимости в new.csv, которых не было в old.csv, я хочу, чтобы это было указано в комментариях. поле "Это новая вильня". Это упрощенный пример, я удалил множество ненужных столбцов, и каждый файл обычно содержит сотни строк.

Вот мой сценарий:

$oldfile = import-csv -Path "/Users/Larbear/Documents/Test/old.csv" 
$newfile = import-csv -Path "/Users/Larbear/Documents/Test/new.csv"
Compare-Object -ReferenceObject $oldfile -DifferenceObject $newfile -Property 'Vulnerability Signature',First_Seen -PassThru -includeequal | Where SideIndicator -EQ "==" | Select * -ExcludeProperty SideIndicator |
Export-Csv -Path .\comparison.csv -NoTypeInformation

Что это только делает:

  1. Вывод дубликатов из обоих файлов
  2. Перенос объектов "Комментарии" и "Исправление" из old.csv

Что мне еще нужно:

  1. Вывести все строки из new.csv
  2. Переносить объекты "Комментарии" и "Исправление" из old.csv для любых дубликатов
  3. Для любых строк которые не найдены в old.csv / уникальны для new.csv, укажите в поле «Комментарий»: «Это новый vuln»

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

1 Ответ

0 голосов
/ 23 января 2020

Во-первых, преобразуйте данные $oldfile в хеш-таблицу, в которой есть ключи с сочетанием «First_Seen» и «Подпись уязвимости». Затем обновите каждую строку $newFile соответствующими $oldfile данными.

$h = $oldfile | Group-Object First_Seen,"Vulnerability Signature" -AsHashTable -AsString

$newfile | foreach {
    $oldData = $h[$_.First_Seen,$_."Vulnerability Signature" -join ", "]
    $_.Remediation = $oldData.Remediation
    $_.Comments = if ($oldData) { $oldData.Comments } else { "This is a new vuln" }
}

$newfile | Export-Csv .\comparison.csv -NoTypeInformation

Предполагая, что существует столбец «Серьезность», значение которого равно «Высокий», «Средний» "или" Низкий ", способ добавить" Срок исполнения "заключается в следующем:

$h = $oldfile | Group-Object First_Seen,"Vulnerability Signature" -AsHashTable -AsString
$limit = @{ High = 60; Medium = 90; Low = 180 }

$newfile | foreach {
    $oldData = $h[$_.First_Seen,$_."Vulnerability Signature" -join ", "]
    $_.Remediation = $oldData.Remediation
    $_.Comments = if ($oldData) { $oldData.Comments } else { "This is a new vuln" }
    $_ | Add-Member "Due Date" ([datetime]$_.First_Seen).AddDays($limit[$_.Severity]).ToString("MM/dd/yy")
}

$newfile | Export-Csv .\comparison.csv -NoTypeInformation
...