Zeek(原名Bro)是一款历史悠久的开源网络协议解析软件,最早由Vern Paxson于95年设计实现1,目前被广泛应用在各种网络、安全软件中。
Zeek的核心功能是解析各种网络协议,并将解析内容写入log日志。当前Zeek lts 4.0.0版本没有提供默认的POP3协议解析脚本,本文讨论如何使用Zeek解析POP3协议。
Zeek虽然没有提供解析POP3的默认脚本,但是提供了解析POP3的API 2,其中主要有:
pop3_request
: 用于解析client向server提交的请求命令pop3_reply
: 用于解析server收到请求后的响应命令pop3_data
: 解析server响应的数据内容
首先看看以上API的解析结果,编写脚本,打印request和reply解析参数内容:
event pop3_request(c: connection, is_orig: bool, command: string, arg: string)
{
print fmt("request: cmd: %s, arg: %s", command, arg);
}
event pop3_reply(c: connection, is_orig: bool, cmd: string, msg: string)
{
print fmt("reply: cmd: %s, msg: %s", cmd, msg);
}
使用脚本解析包含一封pop3测试邮件的pcap文件,测试API实际解析的结果:
$ zeek -Cr pop3.pcap ../../script/pop3/
结果如下:
reply: cmd: OK, msg: Dovecot ready.
request: cmd: CAPA, arg:
reply: cmd: OK, msg:
request: cmd: AUTH, arg: PLAIN
reply: cmd: OK, msg: Logged in.
request: cmd: STAT, arg:
reply: cmd: OK, msg: 2 1242
request: cmd: LIST, arg:
reply: cmd: OK, msg: 2 messages:
request: cmd: UIDL, arg:
reply: cmd: OK, msg:
request: cmd: RETR, arg: 2
reply: cmd: OK, msg: 760 octets
request: cmd: QUIT, arg:
reply: cmd: OK, msg: Logging out.
可以看出,pop3_request
和pop3_reply
按时序解析了POP3请求和响应的命令以及参数,其中值得注意的几对:
request: cmd: LIST, arg:
reply: cmd: OK, msg: 2 messages:
- 请求列出用户的邮件,响应当前共有2封邮件。
request: cmd: RETR, arg: 2
reply: cmd: OK, msg: 760 octets
- 请求获取第2封邮件,响应获取成功,共760 byte数据。
pop3_request
和pop3_reply
是对POP3命令的解析,接下来测试对邮件内容的解析,在脚本添加打印出pop3_data的语句:
event pop3_data(c: connection, is_orig: bool, data: string)
{
print fmt("data: %s",data);
}
解析结果:
…
request: cmd: RETR, arg: 2
reply: cmd: OK, msg: 760 octets
data: Return-Path: lisi@localdomain.com
data: X-Original-To: zhangsan@localdomain.com
data: Delivered-To: zhangsan@localdomain.com
data: Received: from [192.168.153.18] (unknown [192.168.153.18])
data: by localhost.localdomain.com (Postfix) with ESMTP id 3B96EA37B5
data: for zhangsan@localdomain.com; Fri, 5 Mar 2021 23:00:46 -0500 (EST)
data: To: zhangsan@localdomain.com
data: From: lisi lisi@localdomain.com
data: Subject: This is a test mail
data: Message-ID: 7ea7b5a3-3e76-ceee-2a49-a9ab81d5cc4c@localdomain.com
data: Date: Fri, 5 Mar 2021 23:00:37 -0500
data: User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101
data: Thunderbird/78.7.1
data: MIME-Version: 1.0
data: Content-Type: text/plain; charset=utf-8; format=flowed
data: Content-Transfer-Encoding: 7bit
data: Content-Language: en-US
data:
data: Hello zhangsan
data:
request: cmd: QUIT, arg:
reply: cmd: OK, msg: Logging out.
可以看出,pop3_data
以多行string的形式完整的解析了获取的邮件内容,包括各种字段信息以及正文等。
综合3个API的解析结果,可以发现Zeek API对POP3的解析内容,是按照时序以多行String(字符串)的形式输出,如下图:
所以开发脚本对POP3协议进行解析,实质上是要基于API的解析内容,在多行字符串中分析邮件内容的pattern,并对相应邮件信息的字段进行解析。