跳转到主要内容

Mwdb配置解析器

项目描述

mwdb-iocextract

Python 3库,用于从mwdb配置中获取结构化IOC数据。

为什么?

警告:此项目仅适用于mwdbmalduck用户。

Malduck配置(如mwdb中的配置)通常是未结构化的(它们只是带有一些附加元数据的JSON)。另一方面,自动处理通常需要结构化数据。

例如,URL处理和提取是分析师的常见用例。遗憾的是,每个模块都以略有不同的方式存储它们(并且由于向后兼容性,我们尚未准备好进行更改)。

例如,比较我们如何存储ISFB的URL

"domains": [
    {
        "cnc": "http://fantaniz.ru"
    },
    {
        "cnc": "http://snezhkaie.ru"
    }
]

Lokibot

"urls": [
    {
        "url": "http://hockvvee.com/chief4/five/fre.php"
    },
    {
        "url": "kbfvzoboss.bid/alien/fre.php"
    },
    {
        "url": "alphastand.top/alien/fre.php"
    }
]

和mirai

"cncs": [
    {
        "host": "107.160.244.5",
        "port": 1024
    }
]

使用mwdb-iocextract,您可以以相同的方式处理所有这些(以及更多)配置类型

from mwdb_iocextract import parse

config_family = "mirai"
config_data = {
    "cncs": [
        {
            "host": "107.160.244.5",
            "port": 1024
        }
    ],
    "table_key": "0xdedefbaf",
    "variant": "OWARI",
    "type": "mirai"
}

iocs = parse(config_family, config_data)
print(iocs.prettyprint())
> python test.py
NetLoc 107.160.244.5:1024

下面提供更多使用示例。

安装

$ pip install mwdb-iocextract

您可以在这里找到最新版本

https://pypi.ac.cn/project/mwdb-iocextract/

如何工作

大多数配置可以在不修改此库的情况下解析。标准键,如"urls",将自动识别和正确解析。

键名的复数形式无关紧要。当值是列表时,所有元素都将分别添加。例如,这两个是等效的

{
    "urls": "127.0.0.1"
}
{
    "url": ["127.0.0.1"]
}

目前此库支持

网络位置

"网络位置"可以是IP、域名、URL等。有多种可用格式。

    "hosts": [
        "127.0.0.1",  # format 1 - IP
        "http://malware.com",  # format 2 - URL
        { "cnc": "http://malware.com:1337" },  # format 3 - URL in a dict.
        # Allowed keys: "cnc", "url", "ip", "domain", "host" (all handled in the same way)
        { "cnc": "malware.com", "port": 1337 },  # format 4 - domain/port pair

        # NOT allowed: url + port
        # { "cnc": "http://malware.com:1337", "port": 1337 },

配置键:urlsc2ipsdomainsurlcnccncshostshostcncurl

密码

恶意软件中硬编码的密码。明文。

配置键:password

互斥锁

配置键:mtxmutex。明文。

电子邮件

恶意软件使用的电子邮件和源中硬编码的电子邮件。明文。

配置键:emailemails

勒索信息

源中硬编码的HTML或txt勒索信息。明文。

配置键:ransommessage

RSA密钥

二进制中硬编码的RSA公钥或私钥。

支持两种格式

  • 明文("-----BEGIN PUBLIC KEY-----..."
  • 解析后的格式 - 包含“n”、“e”和可选的“d”键的字典。

解析格式更确定,建议用于您的模块,但您可以使用两者。

配置键:publickeyrsapubrsakeypubkeyprivkey

AES密钥

二进制中硬编码的AES密钥。明文。

配置键:aeskey

XOR密钥

二进制中硬编码的XOR密钥。明文。

配置键:xorkey

Serpent密钥

二进制中硬编码的XOR密钥。明文。

配置键:serpentkey

加密密钥

在恶意软件中发现的其它密钥类型。提取为“未知”类型的密钥。明文。

配置键:encryptionkeykeykeys

释放的文件

恶意软件释放的文件的路径或文件名。明文。

配置键:drop_name

贡献

如果您想扩展此库或添加更多模块的支持,请随时为此存储库做出贡献。我们只对至少部分公开可访问的模块感兴趣。因此,可以合并mwcfg.info模块支持,但您的内部TLP:RED模块可能不行。

用法

扫描mwdb

如何从mwdb下载配置并解析它

from mwdb_iocextract import parse
from mwdblib import Malwarecage


def main():
    # See also https://mwdblib.readthedocs.io/en/latest/index.html
    mwdb = Malwarecage()
    mwdb.login("msm", "my_secret_password")

    for cfg in mwdb.recent_configs():
        if cfg.type != "static":
            # This library only works with configs of type "static" 
            # (default mwdb config type).
            continue
        iocs = parse(cfg.family, cfg.cfg)
        print(iocs.prettyprint())  # convert all IoCs to string


if __name__ == "__main__":
    main()

处理IOCs

parse()的结果是一个IocCollection对象。您可以使用它像正常Python对象一样,例如

iocs = parse(cfg.family, cfg.cfg)

for rsa_key in iocs.rsa_keys:
    e = rsa_key.e  # get e
    n = rsa_key.n  # get n

for netloc in iocs.network_locations:
    ip = netloc.ip  # get IP if known
    domain = netloc.domain  # get domain if known
    host = netloc.host  # get domain if known, otherwise IP
    port = netloc.port  # get port if known
    loctype = netloc.location_type  # get type (usually CNC)
    url = netloc.url  # get host + port + path

for key_type, key_data in iocs.keys:
    # key_type - for example "rc4"
    # key_data - hexencoded bytes, for example "6123541243"
    pass

iocs.passwords  # passwords or similar data found in the config
iocs.mutexes  # mutex names used by malware
iocs.dropped_filenames  # filenames dropped on the disk
iocs.emails  # emails used by malware

MISP集成

您可以将IocCollection转换为MISP对象

def upload_to_misp(family, config):
    iocs = parse(family, config)

    if not iocs:
        # Nothing actionable found - skip the config
        return

    # Be careful not to upload duplicated events.
    # We use uuid5s generated from mwdb dhash as unique deterministic UUIDs.
    event = MISPEvent()
    event.add_tag(f"mwdb:family:{family}")
    event.info = f"Malware configuration ({family})"

    for o in iocs.to_misp():
        event.add_object(o)

    misp = ExpandedPyMISP(MISP_URL, MISP_KEY, MISP_VERIFYCERT)
    misp.add_event(event)

项目详情


下载文件

下载适合您平台的文件。如果您不确定要选择哪个,请了解更多关于安装包的信息。

源分布

mwdb-iocextract-1.2.2.tar.gz (11.2 kB 查看散列)

上传时间:

构建分布

mwdb_iocextract-1.2.2-py3-none-any.whl (13.0 kB 查看散列)

上传时间: Python 3

支持