데이터 추출 작업에 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임베디드 항목 도 처리합니다 \".

관련 정보