如何从蜜罐事件日志文件中提取指定协议数据?
修复蜜罐日志指定协议数据提取Python代码
修复后的代码
import re # 定义需要提取的目标协议集合 TARGET_PROTOCOLS = {"HTTP", "MODBUS", "SNMP", "FTP", "Bacnet"} def extract_honeypot_logs(log_lines): extracted_data = [] # 构建正则匹配规则:兼容目标协议,忽略大小写,捕获指定字段 log_pattern = re.compile( r"^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \| (\d+\.\d+\.\d+\.\d+) \| ([A-Z]{2}) \| ((?:%s).*)$" % "|".join(TARGET_PROTOCOLS), re.IGNORECASE ) for line in log_lines: line = line.strip() if not line: continue # 跳过空行 match = log_pattern.match(line) if match: extracted_data.append({ "Timestamp": match.group(1), "IP": match.group(2), "IP Country": match.group(3), "Request": match.group(4).strip() }) return extracted_data # 测试示例(替换为你的实际日志行) sample_logs = [ "2024-05-20 14:30:01 | 192.168.1.100 | US | HTTP GET /admin.php | 200 OK", "2024-05-20 14:31:05 | 10.0.0.5 | CN | MODBUS Read Holding Registers | Function Code 03", "2024-05-20 14:32:10 | 172.16.0.3 | DE | SNMP GET sysDescr.0 | Community public", "2024-05-20 14:33:15 | 185.199.108.153 | FR | FTP USER anonymous | 331 Please specify the password.", "2024-05-20 14:34:20 | 192.168.2.20 | JP | bacnet Who-Is Request | Device ID 1234" ] # 执行提取并输出结果 for entry in extract_honeypot_logs(sample_logs): print(entry)
关键修复点说明
协议匹配范围扩展
原代码仅针对HTTP协议编写正则,未覆盖MODBUS、SNMP等目标协议。修复后通过TARGET_PROTOCOLS集合动态生成匹配规则,同时启用re.IGNORECASE兼容协议名大小写差异(比如bacnet小写场景)。Request字段完整捕获
原正则仅截取HTTP开头的片段,修复后调整分组规则((?:%s).*)$,确保捕获从协议名到行尾的完整请求内容,包含后续状态码、功能码等细节。日志鲁棒性优化
添加空行跳过逻辑,避免处理空白或无效日志行导致的匹配失败。
适配不同日志格式的注意事项
如果你的原始日志分隔符不是|、字段顺序不同,或者是JSON/CSV格式,需要对应调整:
- 若为JSON格式:替换正则为
json.loads(line)直接解析字段 - 若分隔符为空格/制表符:修改正则中的分隔符部分(比如将
\|改为\s+) - 若字段顺序变化:调整正则分组的索引位置(比如
group(3)对应国家码,需与实际位置匹配)
内容的提问来源于stack exchange,提问作者Its OK
相关产品推荐
相关产品推荐

