本文旨在分析mailoney如何实现对于邮件系统的模拟,以及对于邮件和邮箱系统交互命令的记录;
mailoney开源项目中,一共有三种不同的工作模式,分别为:1 作为开放中继;2 只记录认证信息;3 记录所有的内容(包括认证信息和邮件内容);
由于第三个模式对前两种有包含的关系,并且现在该项目主要维护的也是第三种模式,因此,本文只针对modules中的schizo_open_relay.py进行分析;
项目结构
此开源项目实现的是一个模拟邮件系统的开源邮箱蜜罐,代码分为mailoney.py以及支持的三个module,即mailoney为主程序,modules中为mailoney中选定的具体运行类型;
邮件系统模拟
项目代码阅读如下:
mailoney.py主要功能:
- 定义命令参数的形式及功能(IP,端口,模块,域名等等信息)
使用库argparse进行参数的划分
- 定义日志存放位置,建立socket连接
- 定义hpfeeds服务器用来进行捕获信息的传输
- main函数中进行运行模块的选择
下面主要讲述schizo_open_relay.py,这个程序实现了邮箱模拟以及数据记录的功能:
程序开始部分:
自定义函数
- log_to_file()功能:将日志存储到文件,存储的信息有IP,port和data三个部分,这个函数的功能即为所有记录功能的实现;
- log_to_hpfeeds()功能:将日志通过hpfeed服务发送出去
- process_packet_for_shellcode()功能:使用python的libemu对shellcode进行检测,然后进行shellcode的记录
自定义类
class SMTPChannel(asynchat.async_chat)
此类为实现邮箱的主要类,包括了对于邮箱模拟的各种操作,其中有一些具体的函数内容- push():重载基础类
- collect_incoming_data():按1MB的大小切分流量数据进行保存
- found_terminator():分析流量数据进行切分保存
- __getaddr():拿到发送者IP及端口信息
以下的函数为smtp邮箱服务器支持的命令类型,全部使用自己的函数进行相关的模拟
- smtp_HELO():模拟helo后台,输出服务器信息
- smtp_EHLO():模拟helo后台,输出服务器信息
- smtp_QUIT():模拟quit后台,退出socket连接
- smtp_AUTH():模拟auth后台,实现账户登录操作
- smtp_MAIL():模拟mail后台,实现发送邮件开始指令
- smtp_RCPT():模拟rcpt后台,实现邮件接收地址的传入
- smtp_DATA():模拟data后台,实现邮件内容的传入
class SMTPServer(asyncore.dispatcher)
此类为实现邮箱服务的类,主要功能为与连接者建立socket连接,其中有一些具体的函数- handle_accept():建立socket连接
- handle_close():关闭socket连接
- process_message():该部分内容作者未完善
module函数
- class SchizoOpenRelay(SMTPServer)此类为该模块的类名
- process_message():实现命令记录以及邮件记录的操作
- run():实现最终的整体功能操作
阅读小结
综合来看,mailoney是自己搭建了一个服务器用来进行与攻击者进行交互,其中用代码实现了大部分的smtp协议的操作,包括helo,ehlo,auth等等一些指令,具有一定的真实性,但是它存在一些很大的缺点。
- 对于收发地址没有做检查
- 不能真实地进行邮件收发操作