python 邮件检测工具mmpi的使用


Posted in Python onJanuary 04, 2021

概要介绍

mmpi,是一款使用python实现的开源邮件快速检测工具库,基于community框架设计开发。mmpi支持对邮件头、邮件正文、邮件附件的解析检测,并输出json检测报告。

mmpi,代码项目地址:https://github.com/a232319779/mmpi,pypi项目地址https://pypi.org/project/mmpi/

mmpi,邮件快速检测工具库检测逻辑:

  • 支持解析提取邮件头数据,包括收件人、发件人的姓名和邮箱,邮件主题,邮件发送时间,以及邮件原始发送IP。通过检测发件人邮箱和邮件原始发送IP,实现对邮件头的检测。
  • 支持对邮件正文的解析检测,提取text和html格式的邮件正文,对text邮件正文进行关键字匹配,对html邮件正文进行解析分析检测,实现探针邮件检测、钓鱼邮件检测、垃圾邮件检测等其他检测。
  • 支持对邮件附件等解析检测

ole文件格式:如doc、xls等,提取其中的vba宏代码、模板注入链接
zip文件格式:提取压缩文件列表,统计文件名、文件格式等
rtf文件格式:解析内嵌ole对象等
其他文件格式:如PE可执行文件

  • 检测方式包括

基础信息规则检测方式
yara规则检测方式

适用前提

mmpi的分析判定检测前提:邮件系统环境。脱离邮件环境上下文,检测规则的依据就不可靠了。

使用方式

1. 安装

$ pip install mmpi

备注:windows安装yara-python,可以从这里下载

2. 命令执行

$ mmpi-run $email_path

3. 快速开始

from mmpi import mmpi


def main():
  emp = mmpi()
  emp.parse('test.eml')
  report = emp.get_report()
  print(report)


if __name__ == "__main__":
  main()

4. 输出格式

{
	 // 固定字段
  "headers": [],
  "body": [],
  "attachments": [],
  "signatures": []
  // 动态字段
  "vba": [],
  "rtf": [],
}

工具特色

mmpi完全基于python开发,使用python原生email、html、zip库进行解析,基于oletool做定制化修改,支持对office文档和rtf文档的解析,再结合yara实现对其他文件的检测。

项目代码结构

.
├── mmpi
│   ├── common
│   ├── core
│   ├── data
│   │   ├── signatures
│   │   │   ├── eml
│   │   │   ├── html
│   │   │   ├── ole
│   │   │   ├── other
│   │   │   ├── rtf
│   │   │   └── zip
│   │   ├── white
│   │   └── yara
│   │     ├── exe
│   │     ├── pdf
│   │     └── vba
│   └── processing
└── tests
  └── samples
  • mmpi/common:基础模块,实现基本流程功能
  • mmpi/core:核心调度模块,实现插件的加载及相关模块的初始化
  • mmpi/data:核心检测模块,实现基本检测规则及yara检测规则
  • mmpi/processing:核心解析模块,实现eml、html、zip等文件格式的解析
  • tests:测试模块

检测规则示例说明

1. PE文件伪装文档类检测
检测规则:压缩包中文件名以.exe结尾,并且中间插入20个以上空格的

class PEFakeDocument(Signature):
  authors = ["ddvv"]
  sig_type = 'zip'
  name = "pe_fake_document"
  severity = 9
  description = "PE File Fake Document"

  def on_complete(self):
    results = self.get_results()
    for result in results:
      if result.get('type', '') == self.sig_type:
        infos = result.get('value', {}).get('infos', [])
        for info in infos:
          file_type = info.get('type')
          file_name = info.get('name')
          space_count = file_name.count(' ')
          if 'exe' == file_type and space_count > 20:
            self.mark(type="zip", tag=self.name, data=info.get('name'))
            return self.has_marks()
    return None

2. DLL劫持检测
检测规则:压缩包中同时存在exe和dll文件

class DLLHijacking(Signature):
  authors = ["ddvv"]
  sig_type = 'zip'
  name = "dll_hijacking"
  severity = 9
  description = "DLL Hijacking"

  def on_complete(self):
    results = self.get_results()
    for result in results:
      if result.get('type', '') == self.sig_type:
        infos = result.get('value', {}).get('infos', [])
        file_types = [info.get('type') for info in infos]
        if set(['exe', 'dll']).issubset(file_types):
          self.mark(type="zip", tag=self.name)
          return self.has_marks()
    return None

3. RTF漏洞利用检测
检测规则:RTF文档中存在OLE对象,并且class_name是OLE2Link或者以equation开头

class RTFExploitDetected(Signature):
  authors = ["ddvv"]
  sig_type = 'rtf'
  name = "rtf_exploit_detected"
  severity = 9
  description = "RTF Exploit Detected"

  def on_complete(self):
    results = self.get_results()
    for result in results:
      if result.get('type', '') == self.sig_type:
        infos = result.get('value', {}).get('infos', [])
        for info in infos:
          if info.get('is_ole', False):
            class_name = info.get('class_name', '')
            if class_name == 'OLE2Link' or class_name.lower().startswith('equation'):
              self.mark(type="rtf", tag=self.name)
              return self.has_marks()
    return None

结果示例

结果说明:邮件包含漏洞利用的RTF文档,属于恶意邮件。

  • 包括收发件人信息、主题信息、发送时间,邮件正文,以及附件信息。
  • vba和rtf字段为附件检测基本信息。
  • signatures字段说明命中规则。
{
  "headers": [
    {
      "From": [
        {
          "name": "Mohd Mukhriz Ramli (MLNG/GNE)",
          "addr": "info@vm1599159.3ssd.had.wf"
        }
      ],
      "To": [
        {
          "name": "",
          "addr": ""
        }
      ],
      "Subject": "Re: Proforma Invoice",
      "Date": "2020-11-24 12:37:38 UTC+01:00",
      "X-Originating-IP": []
    }
  ],
  "body": [
    {
      "type": "text",
      "content": " \nDEAR SIR, \n\nPLEASE SIGN THE PROFORMA INVOICE SO THAT I CAN PAY AS SOON AS POSSIBLE.\n\nATTACHED IS THE PROFORMA INVOICE,\n\nPLEASE REPLY QUICKLY, \n\nTHANKS & REGARDS' \n\nRAJASHEKAR \n\n Dubai I Kuwait I Saudi Arabia I India I Egypt \nKuwait: +965 22261501 \nSaudi Arabia: +966 920033029 \nUAE: +971 42431343 \nEmail ID: help@rehlat.co [1]m\n \n\nLinks:\n------\n[1]\nhttps://deref-mail.com/mail/client/OV1N7sILlK8/dereferrer/?redirectUrl=https%3A%2F%2Fe.mail.ru%2Fcompose%2F%3Fmailto%3Dmailto%253ahelp%40rehlat.com"
    }
  ],
  "attachments": [
    {
      "type": "doc",
      "filename": "Proforma Invoice.doc",
      "filesize": 1826535,
      "md5": "558c4aa596b0c4259182253a86b35e8c",
      "sha1": "63982d410879c09ca090a64873bc582fcc7d802b"
    }
  ],
  "vba": [],
  "rtf": [
    {
      "is_ole": true,
      "format_id": 2,
      "format_type": "Embedded",
      "class_name": "EQUATion.3",
      "data_size": 912305,
      "md5": "a5cee525de80eb537cfea247271ad714"
    }
  ],
  "signatures": [
    {
      "name": "rtf_suspicious_detected",
      "description": "RTF Suspicious Detected",
      "severity": 3,
      "marks": [
        {
          "type": "rtf",
          "tag": "rtf_suspicious_detected"
        }
      ],
      "markcount": 1
    },
    {
      "name": "rtf_exploit_detected",
      "description": "RTF Exploit Detected",
      "severity": 9,
      "marks": [
        {
          "type": "rtf",
          "tag": "rtf_exploit_detected"
        }
      ],
      "markcount": 1
    }
  ]
}

以上就是python 邮件检测工具mmpi的使用的详细内容,更多关于python mmpi库实现邮件检测的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
用Python制作简单的朴素基数估计器的教程
Apr 01 Python
python从sqlite读取并显示数据的方法
May 08 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
Python TestCase中的断言方法介绍
May 02 Python
python 进程的几种创建方式详解
Aug 29 Python
Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法
Sep 17 Python
pyhton中__pycache__文件夹的产生与作用详解
Nov 24 Python
Python 实现取多维数组第n维的前几位
Nov 26 Python
Python实现查找数据库最接近的数据
Jun 08 Python
django教程如何自学
Jul 31 Python
Python实现爬取网页中动态加载的数据
Aug 17 Python
解决Ubuntu18中的pycharm不能调用tensorflow-gpu的问题
Sep 17 Python
Python3中的tuple函数知识点讲解
Jan 03 #Python
python中pivot()函数基础知识点
Jan 03 #Python
python regex库实例用法总结
Jan 03 #Python
Python爬虫之Selenium库的使用方法
Jan 03 #Python
学会迭代器设计模式,帮你大幅提升python性能
Jan 03 #Python
Python编写万花尺图案实例
Jan 03 #Python
Python 实现一个简单的web服务器
Jan 03 #Python
You might like
PHP利用str_replace防注入的方法
2013/11/10 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
php session_decode函数用法讲解
2019/05/26 PHP
EXT中xtype的含义分析
2010/01/07 Javascript
jQuery EasyUI 的EasyLoader功能介绍
2010/09/12 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
javascript 处理null及null值示例
2014/06/09 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
javascript实现下雪效果【实例代码】
2016/05/03 Javascript
Angularjs 实现动态添加控件功能
2017/05/25 Javascript
jQuery ajax动态生成table功能示例
2017/06/14 jQuery
JS简单实现动态添加HTML标记的方法示例
2018/04/08 Javascript
JS实现按比例缩小图片宽高
2020/08/24 Javascript
微信小程序之高德地图多点路线规划过程示例详解
2021/01/18 Javascript
[01:03:22]LGD vs OG 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python使用py2exe打包程序介绍
2014/11/20 Python
Windows下Eclipse+PyDev配置Python+PyQt4开发环境
2016/05/17 Python
python如何查看系统网络流量的信息
2016/09/12 Python
python批量添加zabbix Screens的两个脚本分享
2017/01/16 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
python读写配置文件操作示例
2019/07/03 Python
django admin.py 外键,反向查询的实例
2019/07/26 Python
django 简单实现登录验证给你
2019/11/06 Python
基于梯度爆炸的解决方法:clip gradient
2020/02/04 Python
python IP地址转整数
2020/11/20 Python
python生成word合同的实例方法
2021/01/12 Python
咖啡为什么会有酸味?你喝到的咖啡為什麼是酸的?
2021/03/17 冲泡冲煮
在校生党员自我评价
2013/09/25 职场文书
建筑工程专业毕业生自荐信
2013/10/19 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
2014年庆祝国庆65周年演讲稿
2014/09/21 职场文书
异地年检委托书范本
2014/09/24 职场文书
运动会加油稿50字
2015/07/21 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书