郵件快速檢測工具
概要介紹
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
}
]
}