!/空/配布

!/空/配布

正規表現

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\プログラムファイル\マイクロソフトSQLサーバー\MSSQL12.ACT7\MSSQL\BINN\SQLSERVR.EXE



これまで私のスクリプトは次のようになりました。

!/空/配布

*もし["$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 はファイルパスを印刷します。

!/空/配布

* 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 "まだパッチされていません。" |

2番目のawkパイプライン

* awk '{ は ($0,/([0-9]+.[0-9]+.[0-9]+.[0-9]+)] と一致します。[参照]:\(。)がある。 */ *

必要な出力に一致する正しい正規表現がありますが(図を参照)、正規表現出力を印刷する際に問題があります。

これはどの行ですか?

* ip=substr $0,RSART,RLENGTH);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に制限してください。

答え1

sed解決策:

sed -E 's/^(([0-9]+\.){3}[0-9]+).*(C:\\.+) *HAS NOT BEEN PATCHED.*/\1 - \3/' reportfile

答え2

$ 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 PATCHEDIPアドレスと最初のドライブ文字()の間の[A-Z]:すべてのエントリを削除します。 「IPアドレス」は、行の先頭の角かっこ内のすべての項目として定義されます(閉じ括弧([^]]*)ではない)。次に、HAS NOT BEEN PATCHEDその行から最後まですべての内容を削除し、変更された行を印刷します。

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

正規表現には、/ HAS NOT BEEN.../出力にスペース文字が残らないように、先頭にスペースが含まれています。

答え3

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

「非パッチ」項目に焦点を合わせ、必要な文字列部分(括弧内)を取り出し、2つの部分(IPアドレスとファイル名)をテキストに置き換えます。

IP アドレスは常に角かっこ内にあると仮定します。そうでない場合は、IPアドレスとパターンマッチングが必要です。

答え4

奇妙な解決策:

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

「HAS NOT BEEN PATCHED」とパターンマッチングを行い、awkのマッチング機能を使用してIPアドレスとファイル名を抽出します。返されたRSTART変数とRLENGTH変数とawkのsubstr関数を使用して、IPアドレスとファイル名に関連する文字列のサブ部分を取得します。生成されたipadおよびfle変数を印刷します。

関連情報