Skip to content

使用Zeek解析POP3协议(1)

  • by

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_requestpop3_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_requestpop3_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(字符串)的形式输出,如下图:


Zeek POP3 API解析内容输出

所以开发脚本对POP3协议进行解析,实质上是要基于API的解析内容,在多行字符串中分析邮件内容的pattern,并对相应邮件信息的字段进行解析。

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *