1. 程式人生 > >基於Python的郵件檢測工具

基於Python的郵件檢測工具

# 郵件快速檢測工具 ## 概要介紹 `mmpi`,是一款使用python實現的開源郵件快速檢測工具庫,基於[`community`](https://github.com/cuckoosandbox/community)框架設計開發。`mmpi`支援對郵件頭、郵件正文、郵件附件的解析檢測,並輸出json檢測報告。 `mmpi`,程式碼專案地址:[https://github.com/a232319779/mmpi](https://github.com/a232319779/mmpi),pypi專案地址[https://pypi.org/project/mmpi/](https://pypi.org/project/mmpi/) `mmpi`,郵件快速檢測工具庫檢測邏輯: * 1. 支援解析提取郵件頭資料,包括收件人、發件人的姓名和郵箱,郵件主題,郵件傳送時間,以及郵件原始傳送IP。通過檢測發件人郵箱和郵件原始傳送IP,實現對郵件頭的檢測。 * 2. 支援對郵件正文的解析檢測,提取`text`和`html`格式的郵件正文,對`text`郵件正文進行關鍵字匹配,對`html`郵件正文進行解析分析檢測,實現`探針郵件檢測`、`釣魚郵件檢測`、`垃圾郵件檢測`等其他檢測。 * 3. 支援對郵件附件等解析檢測 * ole檔案格式:如doc、xls等,提取其中的vba巨集程式碼、模板注入連結 * zip檔案格式:提取壓縮檔案列表,統計檔名、檔案格式等 * rtf檔案格式:解析內嵌ole物件等 * 其他檔案格式:如PE可執行檔案 * 4. 檢測方式包括 * 基礎資訊規則檢測方式 * yara規則檢測方式 ## 適用前提 `mmpi`的分析判定檢測前提:郵件系統環境。脫離郵件環境上下文,檢測規則的依據就不可靠了。 ## 使用方式 ### 1. 安裝 ``` $ pip install mmpi ``` 備註:`windows`安裝`yara-python`,可以從[這裡](https://github.com/VirusTotal/yara-python/releases)下載 ### 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. 輸出格式 ```json { // 固定欄位 "headers": [], "body": [], "attachments": [], "signatures": [] // 動態欄位 "vba": [], "rtf": [], } ``` ## 工具特色 `mmpi`完全基於`python`開發,使用`python`原生`email`、`html`、`zip`庫進行解析,基於[`oletool`](https://github.com/decalage2/oletools)做定製化修改,支援對`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": "[email protected]" } ], "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: [email protected] [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 }