データ抽出操作にawkを使用する

データ抽出操作にawkを使用する

snort.ruleファイルがあり、行からcve番号と参照キーを抽出して再追加する必要があります。MSG中かっこ内の同じ行にあるフィールド、下には前のログがあります。

警告 udp $HOME_NET 1900 -> すべて (msg: "ET INFO UPnP 検索検索応答脆弱な UPnP デバイス 2"; コンテンツ: "UPnP デバイス用 Intel SDK"; pcre: "/^Server\x3a[^\ r\n] *UPnP デバイス用 Intel SDK/mi"; リファレンス: /infosec/blog/2013/01/29; リファレンス: arch/UPnP-arch-DeviceArchitecture-v1.1.pdf; リファレンス: cve,2012 -5958; リファレンス: CVE 、2012-5959; SID: 2016303; 改訂: 4;

希望の出力は次のとおりです。新しい変更は太字で表示されます。

警告 udp $HOME_NET 1900 -> any any(msg:"ET INFO UPnP 検索応答 脆弱な UPnP デバイス 2{cve,2012-5958 cve,2012-5959}"; content:"UPnP デバイス用の Intel SDK"; pcre:"/^Server\x3a[^\r\n]*UPnP デバイス用の Intel SDK/mi"; 参照: /infosec/blog/2013/01/ 29;参照: Arch/UPnP-arch-DeviceArchitecture-v1.1.pdf; 参照: cve, 2012-5958; 参照: cve, 2012-5959;)

以下のawkコードに問題があります。結果を表示すると、すべてのキー間のセミコロンが削除され、最後のサブ機能が犯人です。次のコードを修正する必要があります。

awk -F\; '
{
  for ( i = 1 ; i <= NF ; i++ ) {
    if ( $i ~ "msg" )
      a = i
    if ( $i ~ "reference:cve," ) {
      b = $i
      sub ( ".*:" , "" , b )
      c = c " " b 
      }
    }
  sub ( "$" , "{" c "\"}" , $a )
} 1' snort.rule

答え1

perlここを利用します

perl -pe '$" = " "; @cves = /reference:\s*(cve,\d+-\d+)/g;
   s/msg:\s*"(?:\\.|[^\\"])*\K/ {@cves}/ if (@cves)'

また、msg埋め込み項目も処理します\"

関連情報