基於Python的郵件檢測工具

ddvv發表於2021-01-03

郵件快速檢測工具

概要介紹

mmpi,是一款使用python實現的開源郵件快速檢測工具庫,基於community框架設計開發。mmpi支援對郵件頭、郵件正文、郵件附件的解析檢測,並輸出json檢測報告。

mmpi,程式碼專案地址:https://github.com/a232319779/mmpi,pypi專案地址https://pypi.org/project/mmpi/

mmpi,郵件快速檢測工具庫檢測邏輯:

    1. 支援解析提取郵件頭資料,包括收件人、發件人的姓名和郵箱,郵件主題,郵件傳送時間,以及郵件原始傳送IP。通過檢測發件人郵箱和郵件原始傳送IP,實現對郵件頭的檢測。
    1. 支援對郵件正文的解析檢測,提取texthtml格式的郵件正文,對text郵件正文進行關鍵字匹配,對html郵件正文進行解析分析檢測,實現探針郵件檢測釣魚郵件檢測垃圾郵件檢測等其他檢測。
    1. 支援對郵件附件等解析檢測
    • ole檔案格式:如doc、xls等,提取其中的vba巨集程式碼、模板注入連結
    • zip檔案格式:提取壓縮檔案列表,統計檔名、檔案格式等
    • rtf檔案格式:解析內嵌ole物件等
    • 其他檔案格式:如PE可執行檔案
    1. 檢測方式包括
    • 基礎資訊規則檢測方式
    • 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原生emailhtmlzip庫進行解析,基於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:核心解析模組,實現emlhtmlzip等檔案格式的解析
  • 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文件,屬於惡意郵件。

  • 包括收發件人資訊、主題資訊、傳送時間,郵件正文,以及附件資訊。
  • vbartf欄位為附件檢測基本資訊。
  • 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
        }
    ]
}

相關文章