SMTP协议状态机(有限状态机)

最近在研究协议状态机,之前并没有接触过,写这篇文章记录一下协议状态机的要点。如果有什么错误的地方,还请各位大佬指正。

定义

有限状态机(finite-state machine,缩写FSM),又叫有限状态机自动机,简称状态机。是能够表示有限个状态以及这些状态之间的转移和动作等行为的数学模型。在计算机科学中,有限状态机被广泛用于建模应用行为、硬件电路系统设计、软件工程、编译器、网络协议和计算与语言的研究。本文主要研究的是协议状态机,协议状态机可以描述一个网络协议的行为,帮助理解协议的行为逻辑。

协议状态机的要素

一个协议状态机可以用一个六元组来表示,M = (Q、s_0、δ、λ、X、Y) 

Q有限状态集合,其中包含协议中的不同协议状态

s_0 :初始状态

δ状态转移函数,δ(s_i,x) = s_ j,x∈X,表示从s_i出发,输入x则转移的状态s_ j

λ:输出函数,y = λ(s_i,x),x∈X,表示从状态s_i出发,输入x则得到响应y ,y∈Y

X输入字典

Y:输出字典,包含状态机会出现的所有响应

下面我们以SMTP协议为例子,具体的了解一下SMTP协议的状态机

SMTP协议

首先我们简单了解一下SMTP协议

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议)是用来传输电子邮件的一个协议,基于TCP协议,主要用于系统之间的邮件信息传递,并提供有关的来信通知。

SMTP有两种工作情况:

  • 用户使用客户机向发送方邮件服务器发送邮件
  • 发送方邮件服务器向接受方邮件服务器发送邮件

 

 

 

SMTP是文本类协议:

SMTP是请求/响应协议,命令和响应都是基于ASCII文本,并且以CR和LF符结尾,响应包括一个表示返回状态的三位数字代码。

SMTP协议基于TCP:

SMTP是基于TCP协议的,并且在25号端口监听链接请求。

SMTP命令

SMTP是基于C/S模式的,所以通信过程实质上就是客户与服务器之间的请求和应答,这就涉及到一些请求和应答命令、状态码。下面是SMTP的一些基本命令集:

命令描述
HELO 向服务器标识用户身份信息,用户可以进行欺骗攻击,但是一般服务器都可以检测到。
MAIL FROM: 后面跟的是发送者邮箱地址,用来初始化邮件传输,即用来对所有的状态和缓冲区进行初始化。
RCPT TO: 后面跟的是接收者邮箱地址,用来标识接受者地址,常用在MAIL FROM之后,可以有多个RCPT TO
DATA 在单个或者多个RCPT TO 命令之后,表示所有接受者已经标识,并进行数据传输,数据传输以 ‘.’ 结束。
VRFY 用于验证指定的用户/邮箱是否存在,由于安全问题通常会禁用此命令。
EXPN 用于验证给定的邮箱列表是否存在,扩充邮箱列表,该命令也常被禁用
HELP 查询服务器支持什么命令
NOOP 无操作,服务器影响应OK
QUIT 结束会话
REST 重置会话,当前传输被取消

因为SMTP是文本类协议,所以一般这些命令在报文中都以可打印的ASCII码方式存在,我们可以根据这一点来提取出报文中的命令,将这些命令作为语义关键字,也就是SMTP协议状态机六元组中的输入X

SMTP响应码

响应码描述
211 系统状态或显示系统帮助
214 帮助信息
220 服务就绪
221 服务关闭
250 要求的邮件操作完成
251 用户非本地,将转发向<forward-path>
354 开始邮件输入,以"."结束
421 服务未就绪,关闭传输信道
450 要求的邮件操作未完成,邮箱不可用
451 放弃要求的操作;处理过程中出错
452 系统存储不足,要求的操作未执行
500 命令格式错误,不可识别。当命令行太长时也会发生这样的错误。
501 参数格式错误
502 命令不可实现
503 错误的命令序列
504 命令参数不可实现
551 用户非本地,请尝试<forward-path>
552 过量的存储分配,要求的操作未执行
553 邮箱名不可用,要求的操作未执行
554 操作失败

SMTP协议的通信过程

SMTP协议正常的通信过程可以分为三个部分:

建立连接:

1. 客户端通过25端口与服务端建立TCP连接,服务端返回应答码220,并提供服务端的域名;
2. 客户端收到应答码,发送HELO命令,启动SMTP会话,通过HELo命令,客户端向服务端提供标识信息;
3. 服务端响应应答码250,通知客户端建立会话成功。

邮件传送:

1. 客户端发送“MAIL FROM”通知服务端发信人的邮箱与域名;
2. 服务端向客户端响应“250”;
3. 客户端发送“RCPT; TO”命令向服务端告知收信人的邮箱与域名;
4. 服务端向客户端响应“250”;
5. 客户端发送“DTAT”命令进行报文传送初始化;
6. 服务端响应“354”,表示可以进行邮件输入了;
7. 客户端发送报文内容,每行以CR与LF终止,报文以只有一个“.”的行终止;
8. 服务端向客户端响应“250”。

连接释放:

1. SMTP客户端发送“QUIT”命令;
2. 服务端响应“221”;
3. 关闭TCP连接。

 SMTP协议状态机

协议状态机的构建步骤可以用下面的流程图表示:

前面提到的SMTP命令都会出现在通信过程中的报文中,所我们把SMTP协议命令作为报文的协议关键字,然后包含对应的关键字的报文标记为不同类型的报文;吧SMTP状态码作为协议状态机的状态标记,不同的状态码代表不同的状态,根据SMTP命令和状码构建状态机,最后我得出了下面这个简单的SMTP协议状态机。

References

跟着白泽读论文丨Protocol state machine fuzzing of TLS*

013 Rust 网络编程,SMTP 介绍

SMTP状态码

基于状态标注的协议状态机逆向方法

posted @ 2020-09-14 15:13  s1awwhy  阅读(2266)  评论(0编辑  收藏  举报