首页 > 技术文章 > 正则表达式——maltrail工程项目中使用

sailorlee11 2020-11-10 20:15 原文

1. 正则表达所需语法

\ 正则表达式使用反斜杠字符 ('') 来表示特殊形式或是允许在使用特殊字符时不引发它们的特殊含义。 转义特殊字符(允许你匹配 '*', '?', 或者此类其他)

\A 只匹配字符串开始。

[] 用于表示一个字符集合。在一个集合中除了^、-以外,如果把其它任何特殊符号放到[]里,那么就自动去掉特殊意义,只表示符号本身的含义,如.在[]里只表示.点号的意思,没有了通配符的功能。可以表示字符范围,通过用 '-' 将两个字符连起来。比如 [a-z] 将匹配任何小写ASCII字符, [0-5][0-9] 将匹配从 00 到 59 的两位数字, [0-9A-Fa-f] 将匹配任何十六进制数位。 如果 - 进行了转义 (比如 [a-z])或者它的位置在首位或者末尾(如 [-a] 或 [a-]),它就只表示普通字符 '-'。

\Z 只匹配字符串尾

\w 对于 Unicode (str) 样式:匹配Unicode词语的字符,包含了可以构成词语的绝大部分字符,也包括数字和下划线。如果设置了 ASCII 标志,就只匹配 [a-zA-Z0-9_] 。对于8位(bytes)样式:匹配ASCII字符中的数字和字母和下划线,就是 [a-zA-Z0-9_] 。如果设置了 LOCALE 标记,就匹配当前语言区域的数字和字母和下划线。

  • 对它前面的正则式匹配0到任意次重复, 尽量多的匹配字符串。 ab* 会匹配 'a', 'ab', 或者 'a'后面跟随任意个 'b'。

/d 匹配任何十进制数,就是 [0-9]

^ (插入符号) 匹配字符串的开头, 并且在 MULTILINE 模式也匹配换行后的首个符号。
如果是其他的一些 正则表达式可参考https://xie.infoq.cn/article/19c87fc0786f32fa8266ece39还有官方文档:https://docs.python.org/zh-cn/3/library/re.html

re函数库

re.sub(pattern, repl, string, count)
第一个参数为正则表达式需要被替换的参数,第二个参数是替换后的字符串,第三个参数为输入的字符串,第四个参数指替换个数。默认为0,表示每个匹配项都替换。

checks = [path.rstrip('/')]
返回删除 string 字符串末尾的指定字符后生成的新字符串。

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

urlencode的参数是词典,它可以将key-value这样的键值对转换成我们想要的格式。当urlencode之后的字符串传递过来之后,接受完毕就要解码了,urllib提供了unquote()这个函数将流量中的:status=False&msg=%E8%AF%B7%E5%85%88%E7%99%BB%E9%99%86%E5%AE%9D%E5%A1%94%E5%AE%98%E7%BD%91%E7%94%A8%E6%88%B7解码为:status=False&msg=请先登陆宝塔官网用户

rfind('/') 返回字符串最后一次出现的位置

any() 函数用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。

re.I 进行忽略大小写匹配;表达式如 [A-Z] 也会匹配小写字符。Unicode匹配(比如 Ü 匹配 ü)同样有用,除非设置了 re.ASCII 标记来禁用非ASCII匹配。当前语言区域不会改变这个标记,除非设置了 re.LOCALE 标记。这个相当于内联标记 (?i) 。

2. maltrail语法匹配

1 VALID_DNS_NAME_REGEX = r"\A[a-zA-Z0-9.-]*.[a-zA-Z0-9-]+\Z"
只匹配字符串开始,在这些 a-z A-Z 0-9 中任意选取一个 选取其中任意1个字符串,

2 WHITELIST_UA_REGEX = r"AntiVir-NGUpd|TMSPS|AVGSETUP|SDDS|Sophos|Symantec|internal dummy connection|Microsoft-CryptoAPI"
匹配AntiVir-NGUpd、TMSPS、AVGSETUP、SDDS、Sophos、Symantec、internal dummy connection、Microsoft-CryptoAPI这些字串的任意一个

3 SUSPICIOUS_DIRECT_IP_URL_REGEX = r"/[\w.]*\b(arm|m68k|mips|mpsl|powerpc|ppc|x86|x32|x64|i586|i686|sparc|sh\b|yarn|zte)"
第一个字符.任意一个字符出现无数多次 ;选取arm、m68k、mips、mpsl、powerpc、ppc、x86、x32、x64、i586、i686、sparc、sh(\b这边是一个空格)、yarn、zte任意一种型号

4 re.search(r"\A\d+.[0-9.]+\Z", host or "")
匹配IP地址

5 trail = re.sub(r"(http://[^/]+/)(.+)", r"\g<1>(\g<2>)", path)
http:// [^/]+/只匹bai配到http://www.baidu.com/ 后面的.+ 任意 ;前面的分为两个括号 ,给第二个括号加上表达式加上阔号 ,最后的结论是 http://www.baidu.com/(1234/test.txt/)

附:maltrail配置文件

这里是config里面的内容,在read_config这个函数中生成

{

'HTTPADDRESS': '0.0.0.0', 

'HTTPPORT': 8338,

 'USESSL': False, 

'USERS': ['admin:9ab3cd9d67bf49d01f6a2e33d0bd9bc804ddbe6ce1ff5d219c42624851db5dbc:0:                        # changeme!'], 

'ENABLEMASK_CUSTOM': True, 

'USE_SERVERUPDATETRAILS': False, 

'PROCESSCOUNT': 1, 

'DISABLECPU_AFFINITY': False,

'USE_FEEDUPDATES': False, '

DISABLEDFEEDS': 'turris, ciarmy, policeman, myip, alienvault', '

IPMINIMUMFEEDS': 3, 

'UPDATEPERIOD': 86400, 

'CUSTOMTRAILSDIR': '/root/maltrail-master/trails/custom', '

CAPTUREBUFFER': 192730720, 

'MONITORINTERFACE': 'any', 

'CAPTUREFILTER': 'udp or icmp or (tcp and (tcp[tcpflags] == tcp-syn or port 80 or port 1080 or port 3128 or port 8000 or port 8080 or port 8118))', 

'SENSORNAME': 'iZ2zea82zco7i0nr4vpmmvZ', 

'LOGSERVER': '129.211.138.204:8337', 

'DISABLELOCALLOG_STORAGE': False, 

'USE_HEURISTICS': True,

 'CHECKMISSINGHOST': False, 

'CHECKHOSTDOMAINS': False, 

'SHOWDEBUG': False, 

'LOGDIR': '/var/log/maltrail', 

'TRAILSFILE': '/root/.maltrail/trails.csv', 

'configfile': '/root/maltrail-master/maltrail.conf'

}

打印的packet如下
传入的包 打印出来如下:

b'\x00\x04\x00\x01\x00\x06\x00\x16>\x10\x1d>SW\x08\x00E\x00\x00\xbf\xb3\x1a@\x00@\x06\x03\xac\xac\x18\x0e.ddd\xc8\xed\xea\x00P\x04FF\xfa\x97\xc3\x8a\xedP\x18\x00\xe5\x84$\x00\x00GET /latest/meta-data/region-id HTTP/1.1\r\nHost: 100.100.100.200\r\nAccept: /\r\nContent-Type: application/json; charset=utf-8\r\nAgent: linux/1.0.2.580\r\n\r\n'
前面的maltrail的对于DPI的解析就是对这个包的解析。

b'\x00\x04\x00\x01\x00\x06\x00\x16>\x10\x1d>\x00\x00\x08\x00E\x00\x01r=+@\x00@\x06\xde\xf0\xac\x18\x0e.g\xe0\xfbC\xb3\xf0\x00P\xf8\x07\xe1\xb8L\x99d\xcb\x80\x18\x00\xe5\x1e\xcf\x00\x00\x01\x01\x08\n8J\xdc\xdd\xf41\xb1\xf1POST /api/panel/get_soft_list_test HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 107\r\nHost: www.bt.cn\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nUser-Agent: Python-urllib/2.7\r\n\r\nstatus=False&msg=%E8%AF%B7%E5%85%88%E7%99%BB%E9%99%86%E5%AE%9D%E5%A1%94%E5%AE%98%E7%BD%91%E7%94%A8%E6%88%B7'

对于maltrail主函数的逻辑处理如下:

在DPI中的TCP部分解析过程:

UDP解析部分:

推荐阅读