我有一个存储 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
从我们感兴趣的数据中提取两位信息。它通过使用-o
(仅返回与给定表达式匹配的行的位)并将字段sid
与正确的reference
字段进行匹配来实现此目的。该命令的输出grep
将是
sid:2012158
reference:cve,CVE-2010-3973
然后,程序awk
将从 读取第一行grep
,将数字提取到变量 中sid
,读取下一行并打印存储的sid
第三个字段(此处的字段是由逗号或冒号分隔的任何内容)。
答案2
grep
对 @Kusalananda 的答案进行一个小修改,将表达式的输出通过管道传输到似乎在我的shellcut
上完美工作。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