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中取整的几种方法小结
Jan 06 Python
Python实现 多进程导入CSV数据到 MySQL
Feb 26 Python
Python数据结构之双向链表的定义与使用方法示例
Jan 16 Python
Python if语句知识点用法总结
Jun 10 Python
python保存数据到本地文件的方法
Jun 23 Python
python实现屏保计时器的示例代码
Aug 08 Python
Django3.0 异步通信初体验(小结)
Dec 04 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
Mar 19 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
CentOS 7如何实现定时执行python脚本
Jun 24 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 Python
用gpu训练好的神经网络,用tensorflow-cpu跑出错的原因及解决方案
Mar 03 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
PHP多线程批量采集下载美女图片的实现代码(续)
2013/06/03 PHP
php微信公众平台开发之获取用户基本信息
2015/08/17 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
PHP使用Nginx实现反向代理
2017/09/20 PHP
javascript测试题练习代码
2012/10/10 Javascript
jquery实现动态菜单的实例代码
2013/11/28 Javascript
jQuery中选择器小问题(新人难免遇到)
2014/03/31 Javascript
javascipt:filter过滤介绍及使用
2014/09/10 Javascript
node中socket.io的事件使用详解
2014/12/15 Javascript
JavaScript动态修改弹出窗口大小的方法
2015/04/06 Javascript
Javascript iframe交互并兼容各种浏览器的解决方法
2016/07/12 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
webstorm和.vue中es6语法报错的解决方法
2018/05/08 Javascript
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
Vue.js项目实战之多语种网站的功能实现(租车)
2019/08/07 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
python3序列化与反序列化用法实例
2015/05/26 Python
pycharm 解除默认unittest模式的方法
2018/11/30 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
python实现提取str字符串/json中多级目录下的某个值
2020/02/27 Python
python制作抽奖程序代码详解
2021/01/15 Python
Html5基于canvas实现电子签名并生成PDF文档
2020/12/07 HTML / CSS
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
加拿大当代时尚服饰、配饰和鞋类专业零售商和制造商:LE CHÂTEAU
2017/10/06 全球购物
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
阿迪达斯越南官网:adidas越南
2020/07/19 全球购物
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
2014/09/16 面试题
控制工程专业个人求职信
2013/09/25 职场文书
办理收楼委托书范本
2014/10/09 职场文书
2015年办公室文员工作总结
2015/04/24 职场文书
不同意离婚答辩状
2015/05/22 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
python使用openpyxl库读写Excel表格的方法(增删改查操作)
2021/05/02 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP
python中pycryto实现数据加密
2022/04/29 Python