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使用新浪微博API发送微博的例子
Apr 10 Python
Python实现端口复用实例代码
Jul 03 Python
python对指定目录下文件进行批量重命名的方法
Apr 18 Python
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
django Serializer序列化使用方法详解
Oct 16 Python
python抓取京东小米8手机配置信息
Nov 13 Python
python定时复制远程文件夹中所有文件
Apr 30 Python
ipython和python区别详解
Jun 26 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
pandas 空数据处理方法详解
Nov 02 Python
python中Pyqt5使用Qlabel标签播放视频
Apr 22 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
Yii扩展组件编写方法实例分析
2015/06/29 PHP
php远程下载类分享
2016/04/13 PHP
PHP根据session与cookie用户登录状态操作类的代码
2016/05/13 PHP
CakePHP框架Model函数定义方法示例
2017/08/04 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
JS 字符串连接[性能比较]
2009/05/10 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
jQuery EasyUI API 中文文档 - MenuButton菜单按钮使用介绍
2011/10/06 Javascript
使用JS画图之点、线、面
2015/01/12 Javascript
JavaScript获取URL汇总
2015/06/08 Javascript
用jQuery向div中添加Html文本内容的简单实现
2016/07/13 Javascript
浅析Node.js:DNS模块的使用
2016/11/23 Javascript
js 中文汉字转Unicode、Unicode转中文汉字、ASCII转换Unicode、Unicode转换ASCII、中文转换
2016/12/06 Javascript
JS实现获取来自百度,Google,soso,sogou关键词的方法
2016/12/21 Javascript
tab栏切换原理
2017/03/22 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
浅析JS中回调函数及用法
2018/07/25 Javascript
Vue slot用法(小结)
2018/10/22 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
对node通过fs模块判断文件是否是文件夹的实例讲解
2019/06/10 Javascript
Vue发布项目实例讲解
2019/07/17 Javascript
layui 数据表格 点击分页按钮 监听事件的实例
2019/09/02 Javascript
Bootstrap简单实用的表单验证插件BootstrapValidator用法实例详解
2020/03/29 Javascript
python模块之StringIO使用示例
2015/04/08 Python
Python编程给numpy矩阵添加一列方法示例
2017/12/04 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
女装和独特珠宝:Sundance Catalog
2018/09/19 全球购物
乌克兰设计师和品牌的服装:Love&Live
2020/04/14 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
下面这个程序执行后会有什么错误或者效果
2014/11/03 面试题
幼儿园亲子活动方案
2014/01/29 职场文书
就业协议书怎么填
2014/04/11 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
带你学习MySQL执行计划
2021/05/31 MySQL