第一关:RE库的使用
任务描述
本关任务:编写一个能正则匹配出 ip 地址的小程序。
相关知识
为了完成本关任务,你需要掌握:
- re 的主要功能函数;
- re.search 函数;
- 例子。
re 的主要功能函数
常用的功能函数包括: compile、search、match、split、findall(finditer)、sub(subn)。
re.search 函数
re.search 扫描整个字符串并返回第一个成功的匹配。
函数语法:
- re.search(pattern, string, flags=0)
函数参数说明:
| 参数 | 含义 | 
|---|---|
| pattern | 匹配的正则表达式 | 
| string | 要匹配的字符串。 | 
| flags | 标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。 | 
例子
- import re
- line='www.python.org'
- trueIp =re.search('python',line)
- print(trueIp)
输出: www.python.org <_sre.SRE_Match object; span=(0, 11), match='192.168.1.1'>
编程要求
根据提示,在右侧编辑器 begin-end 内补充代码,使用 re.search 匹配出 IP 地址。
测试说明
平台会对你编写的代码进行测试: 代码请写在 Evidence 函数里,path 为存放 IP 的文件路径,文件内容为:192.168.1.1 请读取出文件内容,并用 re.search 匹配并输出结果;
预期输出: <re.Match object; span=(0, 11), match='192.168.1.1'>
import redef Evidence(path):with open(path, 'r') as file:content = file.read()ip_pattern = r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}'ip_match = re.search(ip_pattern, content)print(ip_match)第2关:pcap 包的读取
任务描述
本关任务:编写一个能读取 pcap 文件的程序
相关知识
为了完成本关任务,你需要掌握:如何读取 pcap 文件。
pcap 文件是常用的数据报存储格式,可以理解为就是一种文件格式,只不过里面的数据是按照特定格式存储的,所以我们想要解析里面的数据,也必须按照一定的格式。
编程要求
根据提示,在右侧编辑器 begin-end 内补充代码,读取 pcap 文件,并对其进行解析,输出要求的内容。
测试说明
要求输出以 192.168.8.130 为源地址和目标地址的包出现的次数; 预期输出: IP:192.168.8.130发了10次包,接收了9次包
from scapy.all import *
from scapy.layers.inet import *
from scapy.layers.l2 import *def Evidence(path):packets = rdpcap(path)src_ip = "192.168.8.130"count_sent = 0count_received = 0for packet in packets:if IP in packet:if packet[IP].src == src_ip:count_sent += 1if packet[IP].dst == src_ip:count_received += 1print(f"IP:{src_ip}发了{count_sent}次包,接收了{count_received}次包")
第三关:pcap包的使用
任务描述
本关任务:编写一个能从 pcap 包检测 XSS 和 SQL 注入攻击的小程序。
相关知识
为了完成本关任务,你需要掌握:1.re库的使用,2.pcap包的读取。
re.compile 函数
compile 函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,供 match() 和 search() 这两个函数使用。
语法格式为:
- re.compile(pattern[, flags])
| 参数 | 含义 | 
|---|---|
| pattern | 一个字符串形式的正则表达式 | 
| flags | 可选,表示匹配模式,比如忽略大小写,多行模式等 | 
flag 具体参数为:
| 属性和方法 | 描述 | 
|---|---|
| re.S(DOTALL) | 使.匹配包括换行在内的所有字符 | 
| re.I(IGNORECASE) | 使匹配对大小写不敏感 | 
| re.L(LOCALE) | 做本地化识别(locale-aware)匹配,法语等 | 
| re.M(MULTILINE) | 多行匹配,影响^和$ | 
| re.X(VERBOSE) | 该标志通过给予更灵活的格式以便将正则表达式写得更易于理解 | 
| re.U | 根据Unicode字符集解析字符,这个标志影响\w,\W,\b,\B | 
例子
- pattern = re.compile('匹配XSS攻击的正则表达式', flags=re.)
- result_list = pattern.findall(data)
- for x in result_list:
- print ('恶意攻击序号:'+str(count_bad))
- print ('检测到XSS(跨站脚本攻击)!')
- print (data)
编程要求
有一个 pcap 文件 src/step3/1.pcap,需要检测其中的恶意流量。 请对其进行检测并按返回测试说明的格式返回。检测到一次攻击将记录一次序号,先检测 XSS 再检测 SQL 注入。 测试数据由评测系统读取并传递给 Evidence 函数,期间产生的输出将会与规定的输出进行比较,详细要求请见测试说明。 提示: 其中 XSS 攻击使用的 payload 有:
- <script>alert(1)</script>
- <iMg src=x onError=Alert(1) />
其中 SQL 注入使用的 payload 有:
- admin' union select user,password from users--+
- -3 uNion SeleCt user(),database(),3,4\`\`\`
同时在 pcap 解析出的数据中,特殊符号是经过浏览器 url 编码的,如:
- "<"号会变成%3C
- admin' union select user,password from users--+会变成
- admin%27+union+select+user%2Cpassword+from+users--%2B
测试说明
测试输入:无; 预期输出: 恶意攻击序号:1 检测到XSS(跨站脚本攻击)! username=%3CiMg+src%3Dx+onError%3DAlert%281%29+%2F%3E&password=123&Login=Login 恶意攻击序号:2 检测到SQL注入攻击! username=-3+uNion+SeleCt+user%28%29%2Cdatabase%28%29%2C3%2C4&password=123&Login=Login
from scapy.all import *
import redef Evidence(pcap_path):# 请在此添加实现代码 ## ********** Begin *********#datas = []count_bad = 0  # 检测到的攻击数量packets = rdpcap(pcap_path)  # 读取pcap文件for packet in packets:if 'TCP' in packet:datas = str(packet['TCP'].payload).split('\r\n')for data in datas:# 检测XSS onerror/**/= onerror=pattern = re.compile('(\\%3C|<)(body|layer|div|meta|style|base|object|input|img|a|iframe|svg|textarea)(.*?)(onmouseover|onerror|onload|onfocus)(\\=|%3D)|(\\%3C|<)script(\\%3E|>)(javascript:|alert|confirm|prompt|autofocus)(\\%28|())', flags=re.IGNORECASE)result_list = pattern.findall(data)for x in result_list:count_bad += 1print('恶意攻击序号:' + str(count_bad))print('检测到XSS(跨站脚本攻击)!')print(data)# 检测SQL注入pattern = re.compile('(?:(union(.*?)select))|select.+(from|limit)|(?:from\\W+information_schema\\W)|(?:((?:current_)(user|database|schema|connection_id)))\\s*\$|into(\\s+)+(?:dump|out)file\\s*|group\\s+by.+\\(|sleep\\((\\s*)(\\d*)(\\s*)\$|(having|rongjitest)', flags=re.IGNORECASE)result_list = pattern.findall(data)for x in result_list:count_bad += 1print('恶意攻击序号:' + str(count_bad))print('检测到SQL注入攻击!')print(data)# ********** End **********#