스트림에서 특정 문자열 추출

스트림에서 특정 문자열 추출

snort 서명을 저장하는 파일이 있고 해당 서명에서 굵은 "sid"와 CVE 번호를 추출해야 합니다. 여기에 샘플 서명이 있습니다.

alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"ET ACTIVEX Possible Microsoft WMI Administration Tools WEBSingleView.ocx ActiveX Buffer Overflow Attempt"; flow:established,to_client; file_data; content:"2745E5F5-D234-11D0-847A-00C04FD7BB08"; nocase; distance:0; pcre:"/]classid\s=\s*[\x22\x27]?\sclsid\s\x3a\s*\x7B?\s*2745E5F5-D234-11D0-847A-00C04FD7BB08.+(AddContextRef|ReleaseContext)/smi"; reference:url,xcon.xfocus.net/XCon2010_ChenXie_EN.pdf; reference:url,wooyun.org/bug.php?action=view&id=1006; reference:bid,45546; reference:cve,CVE-2010-3973; classtype:attempted-user; sid:2012158; rev:2; metadata:affected_product Windows_XP_Vista_7_8_10_Server_32_64_Bit, attack_target Client_Endpoint, deployment Perimeter, tag ActiveX, signature_severity Major, created_at 2011_01_06, updated_at 2016_07_01;)

출력: 2012158 [공간] CVE-2010-3973

답변1

$ grep -E -o -e 'sid:[^;]+' -e 'reference:cve,[^;]+' file | awk -F '[:,]' '{ sid=$2; getline; print sid, $3 }'
2012158 CVE-2010-3973

grep우리가 관심 있는 데이터에서 2비트의 정보를 추출하는 데 사용됩니다 . -o이는 주어진 표현식과 일치하는 행의 비트만 반환하고 필드를 sid올바른 필드와 reference일치시켜 이를 수행합니다 . 이 명령의 출력은 grep다음과 같습니다.

sid:2012158
reference:cve,CVE-2010-3973

그러면 프로그램은 awk첫 번째 줄을 읽고 grep, 숫자를 변수로 추출하고 sid, 다음 줄을 읽고, 저장된 세 번째 필드를 인쇄합니다 sid(여기서 필드는 쉼표나 콜론으로 구분됩니다).

답변2

grep@Kusalananda의 답변을 약간 수정하여 표현식 출력을 파이핑하면 cut내 셸에서 완벽하게 작동하는 것 같습니다.zsh

grep -o -E -e 'sid:[^;]+' -e 'reference:cve,[^;]+' file | cut -d':' -f2 | cut -d',' -f2

답변3

j=`awk '{print NF}' filename`
[root@praveen_linux_example ~]# for ((i=1;i<=$j;i++)); do awk -v   i="$i" '$i ~ /CVE-2010-3973/||$i ~ /^sid/{print $i}' filename;done| awk -F [,:] '{print $NF}'| sed "s/;//g"| sed -n -e '1h' -e '2{p;g;p}'| sed "N;s/\n/ /g"

산출

2012158 CVE-2010-3973

관련 정보