テキストハンドラーを使用してNessusレポートからIPアドレスとファイルパスを抽出する必要があります


1

正規表現

Grep / Awk / Sed / Trなどのテキストハンドラーを使用して、NessusレポートからIPアドレスとファイルパスを抽出する必要があります。

IPアドレスとファイルパスを分離するスクリプトがありますが、テキストをさらに処理し、「パッチが適用されていないリモートバージョン...」を削除する必要があります。

192.168.1.1   - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.2.9200.16384    SHOULD BE      : 6.2.9200.16859"

192.168.1.2 THE REMOTE HOST IS MISSING ONE OF THE FOLLOWING ROLLUP KBS :   - 4022719  - 4022722C:\WINDOWS\SYSTEM32\BCRYPT.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.1.7601.23796    SHOULD BE      : 6.1.7601.23816"

192.168.1.3   - C:\WINDOWS\SYSTEM32\GPPREF.DLL HAS NOT BEEN PATCHED.    REMOTE VERSION : 6.2.9200.16384    SHOULD BE      : 6.2.9200.16859"

192.168.1.4   - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE HAS NOT BEEN PATCHED.    REMOTE VERSION : 2014.120.5000.0    SHOULD BE      : 2014.120.5203.0"

したがって、最終結果は上記の例から次を出力するはずです。

192.168.1.1 \ WINDOWS \ SYSTEM32 \ GPPREF.DLL

192.168.1.2 \ WINDOWS \ SYSTEM32 \ BCRYPT.DLL

192.168.1.3 \ WINDOWS \ SYSTEM32 \ GPPREF.DLL

192.168.1.4 \ PROGRAM FILES \ MICROSOFT SQL SERVER \ MSSQL12.ACT7 \ MSSQL \ BINN \ SQLSERVR.EXE



これまでの私のスクリプト:

!/ bin / bash

* if ["$ 1" == ""]; それから

echo "No file specified."

echo "Usage: nesparse [filename.csv]"

他に

cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | grep "has not been patched." | sort -u | awk '{ match($0,/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).*[cC]:\\(.*) has.*/; ip=substr $0,RSTART,RLENGTH);print ipadd ip} '

*

以下のコードのセクションは、上記の例のテキストを処理し、$ 5がIPアドレスを出力し、$ 13がファイルパスを出力します。

!/ bin / bash

* if ["$ 1" == ""]; それから

echo "No file specified."

echo "Usage: nesparse [filename.csv]"

他に

cat $1 | tr -d "\n" | tr "\r" "\n" | awk -F '","' '{ print $5,$13 }' | 

grep「パッチは適用されていません。」| sort -u *

2番目のawkパイプ

* awk '{match($ 0、/([0-9] +。[0-9] +。[0-9] +。[0-9] +)。[cC]:\(。)has。* / *

私が必要とする出力と一致する正しい正規表現を持っています(写真を参照)が、正規表現の出力の印刷に問題があります

この行は次のとおりです。

* ip = substr $ 0、RSTART、RLENGTH); print ipadd ip} '*

ボーナスポイント:

IP正規表現は任意の数字と一致するため、192.168.1.1 / 1.1.1.1ですが、上記の例(2014.120.5203​​.0)のバージョン番号との一致も理想的です。この正規表現を修正する必要があります。* [0-9] +。[0- 9] +。[0-9] +。[0-9] + *

0.0.0.0に制限するには-> 255.255.255.255


問題の説明は、出力例と矛盾しています。ファイル名が「動的」である唯一の行は出力にリストされておらず(ロールアップKBSが欠落していることに関する行)、どちらもSQLSERVER.EXEの行ではありません。それらは出力されることになっていますか?質問に「動的な」コンポーネントが含まれていない場合、そのコンポーネントは含まれていないためだと思います。
cas

回答:



1
$ sed -E -n -e '/ HAS NOT BEEN PATCHED/ {
                  s/^(\[[^]]*\]).*([A-Z]:)/\1 - \2/;
                  s/ HAS NOT BEEN PATCHED.*//p}' nessus.log
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\WINDOWS\SYSTEM32\BCRYPT.DLL
[IP address] - C:\WINDOWS\SYSTEM32\GPPREF.DLL
[IP address] - C:\PROGRAM FILES\MICROSOFT SQL SERVER\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE

一致するすべての行についてHAS NOT BEEN PATCHED、IPアドレスと最初のドライブ文字([A-Z]:)の間のすべてを取り除きます。「IPアドレス」は、角かっこ([^]]*)以外の行の先頭にある角かっこ内のすべてとして定義されます。次にHAS NOT BEEN PATCHED、行の最後からすべてを削除し、変更された行を印刷します。

私の推奨事項は\t-(スペース、ダッシュ、スペース)の代わりにIPアドレスとパス名の間のフィールド区切り文字としてタブ文字を使用することです。これにより、後で作業しやすくなります。

/ HAS NOT BEEN.../正規表現は、出力上のダングリング空白文字を残さないために先頭にスペースが含まれます。


0
 sed -rn '/NOT BEEN PATCHED/ {s/(^\[.*\]).*C:(.*) HAS.*$/\1 - \2/p} ' filename

「NOT BEEN PATCHED」を持つエントリに集中してから、必要な文字列のセクションを(括弧内に)引き出し、セクションのテキストを2つ(IPアドレスとファイル名)に置き換えます

ここでは、IPアドレスは常に角括弧で囲まれていると想定しています。そうでない場合は、IPアドレスのパターンマッチが必要になります。


-r動作しますが、非推奨です。 -Eは、拡張正規表現のPOSIX標準ですsed。GNU&FreeBSDのsedサポート-r(FreeBSDのmanページでは、GNUの互換性のためにサポートしていると書かれています)。Mac OS sedはサポートしていません-r
cas

0

Awkソリューション:

awk '/HAS NOT BEEN PATCHED/ { match($0,/\[.*\]/);ipadd=substr($0,RSTART,RLENGTH);match($0,/C.* HAS/);fle=substr($0,RSTART,RLENGTH-4);print ipadd" - "fle }' filename

「パッチが適用されていません」に対するパターンマッチは、awkのマッチ機能を使用してIPアドレスとファイル名を抽出します。返されたRSTARTおよびRLENGTH変数とawkのsubstr関数を使用して、IPアドレスとファイル名に関連する文字列のサブセクションを取得します。作成されたipaddおよびfle変数を出力します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.