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 PATCHED
IPアドレスと最初のドライブ文字()の間の[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変数を印刷します。