简化snort签名工作的模块
snortsig的Python项目详细描述
使用 后端的pyparsing。你可以分析来自多个文件的签名, 或者只是通过一根绳子。解析后,可以使用search()方法 检索具有特定属性的签名。
已知错误
- snortsig目前不能很好地处理逃逸的分号。
- snortsig目前不能很好地处理引号内的双引号 领域。
- snortsig无法将签名写回字符串或文件。
示例
从下载的签名副本中获取启用和禁用签名的计数 VRT社区规则集:
In [1]: ss=snortsig.SnortSig() In [2]: ss.fromFile("community.rules") In [3]: len(ss.search("0",attribute='disabled')) Out[3]: 495 In [4]: len(ss.search("1",attribute='disabled')) Out[4]: 2507 In [5]: len(ss.search("", exact=False)) Out[5]: 3002
哪些签名是不可分割的?
In [11]: ss.unparsed() Out[11]: ['# alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:"SERVER-IIS Al ternate Data streams ASP file access attempt"; flow:to_server,established; conte nt:".asp|3A 3A 24|DATA"; nocase; http_uri; metadata:ruleset community, service h ttp; reference:bugtraq,149; reference:cve,1999-0278; reference:nessus,10362; ref erence:url,support.microsoft.com/default.aspx?scid=kb\\;EN-US\\;q188806; classty pe:web-application-attack; sid:975; rev:26;)', '']
在所有启用的签名中,哪些类类型最常见?
In [1]: enabled = ss.search("0",attribute='disabled') In [2]: collections.Counter([e['options']['classtype'][0] for e in enabled]) Out[2]: Counter({'trojan-activity': 451, 'attempted-recon': 27, 'misc-activity' : 10, 'attempted-admin': 4, 'bad-unknown': 1, 'network-scan': 1, 'unsuccessful-u ser': 1})
在所有禁用的签名中,哪些类类型最常见?
In [1]: disabled = ss.search("1",attribute='disabled') In [2]: collections.Counter([e['options']['classtype'][0] for e in disabled]) Out[2]: Counter({'web-application-activity': 479, 'attempted-user': 343, 'attem pted-recon': 332, 'web-application-attack': 267, 'attempted-admin': 220, 'misc-a ctivity': 164, 'trojan-activity': 155, 'protocol-command-decode': 112, 'misc-att ack': 101, 'rpc-portmap-decode': 83, 'attempted-dos': 60, 'policy-violation': 52 , 'bad-unknown': 44, 'shellcode-detect': 26, 'suspicious-login': 16, 'successful -admin': 9, 'unsuccessful-user': 9, 'network-scan': 6, 'suspicious-filename-dete ct': 6, 'default-login-attempt': 6, 'system-call-detect': 5, 'successful-recon-l imited': 4, 'unknown': 2, 'denial-of-service': 2, 'string-detect': 2, 'successfu l-user': 1, 'non-standard-protocol': 1})
有多少签名使用“itype”属性?
In [1]: len(ss.search("",attribute='itype',exact=False)) Out[1]: 123
如何使用
安装
pip install snortsig
导入
import snortsig
实例化
ss=snortsig.SnortSig() ss.fromFile("community.rules") ss.fromFile("emerging-all.rules") ss.fromString('alert tcp $HOME_NET any -> $EXTERNAL_NET $HTTP_PORTS (msg:"MALWARE-CNC Sality logo.gif URLs"; flow:to_server,established; content:"/logo.gif?"; fast_pattern:only; http_uri; pcre:"/\x2Flogo\.gif\x3F[0-9a-f]{5,7}=\d{5,7}/Ui"; metadata:policy balanced-ips drop, policy security-ips drop, ruleset community, service http; reference:url,www.microsoft.com/security/portal/Threat/Encyclopedia/Entry.aspx?name=Virus%3aWin32%2fSality.AT; classtype:trojan-activity; sid:24255; rev:3;)')
fromstring(字符串)
分析提供的字符串并提取snort签名
fromfile(文件)
读取提供的文件并将其馈送到fromstring()
getAll()
将所有解析的签名作为签名指令列表返回。
搜索(term,attribute=none,exact=false)
搜索所有导入的签名并返回与 作为签名指令列表进行查询。*术语是要匹配的字符串。* 属性是要搜索的选项或标题的名称。如果属性是 无,搜索所有选项和标题。*精确控制匹配类型, 精确或子串。
例如,使用pcre选项返回所有签名:
search("",attribute="pcre",exact=False)
未解析()
将解析失败的所有签名作为字符串列表返回
使用个人签名
与其创建一个对象来封装单个snort签名,不如 把签名塞进口述里。整个概念应该是 如果您理解snort签名语法,那么很容易理解,但是 是一些不明显的部分:
- “disabled”键表示存在(1)或不存在(0) 导入时签名前的哈希标记。
- options键保存所有规则选项。
- 对于采用修饰符的有效载荷检测选项,修饰符是 按应用选项分组
- 订单保留
- 所有值都是列表。其中选项有多个值(或 一个选项有多个实例),列表可以嵌套。 如果选项具有简单的字符串值,则顶级列表包含 一根弦。这样做是为了在 访问数据。
示例签名dict:
{'action': ['alert'], 'direction': ['->'], 'disabled': ['1'], 'dst': ['$SMTP_SERVERS'], 'dst_port': ['25'], 'options': {'classtype': ['attempted-admin'], 'content': ['|EB|E|EB| [|FC|3|C9 B1 82 8B F3 80|+', ['fast_pattern', 'only']], 'flow': ['to_server', 'established'], 'metadata': [['ruleset', 'community'], ['service', 'smtp']], 'msg': ['SERVER-MAIL x86 windows MailMax overflow'], 'reference': [['bugtraq', '2312'], ['cve', '1999-0404']], 'rev': ['13'], 'sid': ['310']}, 'protocol': ['tcp'], 'src': ['$EXTERNAL_NET'], 'src_port': ['any']}