威胁情报与恶意样本分析:常用样本库及批量获取流程 搞威胁情报和恶意样本分析的朋友应该都有过这种经历一篇分析报告写到一半发现手头缺一个关键样本或者想对比某个APT组织最近在用的攻击手法却不知道该去哪里拉数据。我入这行头两年就是靠几个书签攒了个“土办法知识库”后面踩了不少坑才慢慢摸出一套相对顺手的检索、爬取、下载流程。这篇文章把这份站点清单和批量获取样本的方法完整记录下来适合做威胁狩猎、恶意软件逆向、蓝队溯源或者写论文需要样本支撑的同行参考新手也能照着操作。主标题定的范围比较广我拆成三条线来写一是常用到的恶意样本库和威胁情报站点清单二是快速批量获取元数据和文件的具体方法三是实操中容易踩的坑。这里面涉及的工具、脚本和参数都是我最近实跑过、确认能用的方案不同网络环境下可能需要微调但整体思路可以复用。1. 威胁情报与样本库大盘点常用站点记录1.1 为什么需要持续收集样本恶意样本是防守方的“练习题”。没有足够的样本量你写出来的检测规则、YARA签名和威胁狩猎假设都是空中楼阁——没见过真实载荷怎么知道该匹配哪些特征我在实际工作中接触到的样本来源主要有三类一是从蜜罐和自家产品里捕获的二是从各个公开样本库拉取的三是同行之间交换的私人样本集。其中公开样本库的积累最基础也最讲究方法因为你不仅要会下载还要会筛选知道哪个网站的哪个字段对应什么含义。另一个容易被忽略的点是APT组织信息的持续积累。安全圈从来不缺事件报告但大部分报告只看眼前这一个案例很少帮你把历史关联梳理清楚。这时候情报源的价值就体现出来了通过ATTCK编号、样本哈希、C2基础设施域名之间的交叉映射你才能把一个组织在不同时期的行为串起来。所以站点清单里头既要有样本库也要有情报平台和分析报告源。1.2 站点清单与定位以下表格里列的站点是我目前持续在用的。注意这不算“全部站点”只是经过我实测、确实能出东西的集合按用途分了四类站点类型主要用途访问方式注册要求MalwareBazaar样本库按标签/家族下载样本最新恶意样本更新快Web API免费注册VirusTotal聚合检测查询哈希、域名、URL的检测结果和关系图谱Web API免费API Key限配额VX Underground样本库报告大量论文级样本集打包下载样本量巨大Web直链无需注册VirusShare样本库历史样本和样本包需按hash搜索Web API免费注册审核制Abuse.ch URLhaus恶意URL正在传播的恶意URL适合IOC提取Web API免费Abuse.ch ThreatFox威胁情报指标分享IOC和恶意指标含家族标签Web API免费Hybrid Analysis沙箱报告在线分析样本获取行为报告和部分样本Web API免费APIANY.RUN交互沙箱动态分析可获取截图和网络流量信息Web API免费账户有限额MITRE ATTCK知识库APT组织和TTP映射战术技术信息Web STIX无需注册Malshare聚合样本按日提供样本和哈希免费APIWeb API免费注册把这几个站点放在一起用比单独指望某个单一平台靠谱得多。比如VirusTotal能告诉你一个文件“被多少家杀软标记为恶意”但样本本体不一定下得下来MalwareBazaar直接给你文件但标签粒度相对粗。VX Underground的包适合跑“历史同源”分析但它是静态打包你需要自己整理内部文件结构。每个平台都有自己的脾性先弄清楚它们各自擅长什么再组合作战。我个人的习惯是先通过MalwareBazaar和ThreatFox看最新的横向移动动向把这些IOC喂给安全设备做规则测试遇到特定家族就去VirusShare和VX Underground找历史包袱需要行为报告时再丢给Hybrid Analysis或ANY.RUN做动态验证。这套链路基本覆盖了从情报发现、样本采集到行为分析的完整过程。1.3 APT组织信息的关联获取单独说下APT组织信息这部分。MITRE ATTCK是绕不开的起点但如果你只盯着它的网站页面效率太低。我推荐用它的STIX 2.0数据源直接拉JSON格式的结构化数据一条记录里包含了组织编号、使用的技术、对应的软件工具、检测建议等内容。用脚本解析之后可以导入自己的知识库或者Elasticsearch里做关联查询。除了ATTCK实际威胁情报工作中还有一些私营厂商的开源情报API例如有些国内安全厂商提供免费的情报查询接口输入IOC可以返回关联的家族、组织和置信度评分。这类接口的好处是中文界面、对国内活跃威胁源覆盖更好缺点是免费额度普遍不大适合做交叉验证。把国际情报源和国内厂商情报源结合起来才能真正还原一个攻击组织的完整面貌——因为不同平台感知到的攻击面侧重点不一样。我不会在文章里列全所有厂商只强调一个原则跟着“组织编号—家族标签—样本哈希”这条主线去收集无论用哪些站点信息都能对得上。2. 核心思路拆解为什么优先用API而非网页爬虫2.1 网页爬虫的缺陷我看到很多新手一上来就写requests去扒HTML然后一边写正则一边骂页面结构总变。说实话纯网页爬虫这条路能跑通但维护成本高得离谱。现在的威胁情报站点基本都是前后端分离架构页面数据是JS动态加载的你拿到的HTML经常就是个空壳子真正有用的数据得从接口里取。更麻烦的是很多站点做了反爬策略请求频率稍微快一点直接给你弹验证码或者封IP段。我自己早期踩过这个坑写了个脚本去某样本库抓标签页抓了几百页以后对方服务器开始返回503连正常浏览器访问都不太稳定后来才意识到是触发风控了。从那以后我的原则就是“只要站点提供API就绝不碰网页”。API的好处是返回结构化的JSON字段命名统一不需要反复适配页面改动也方便直接入库。2.2 任务拆解元数据采集与样本下载分离批量获取样本这件事如果一口气“既要元数据又要文件”很容易被网络波动、存储空间和平台限速卡死。我现在的做法是把任务拆成两条完全独立的流水线元数据采集线跑得频繁、数据量小主要抓的是哈希、文件名、提交时间、标签、家族归属这类信息。每天定时跑一次入库之后用来做增量分析和预警。样本下载线跑得较少、数据量大只在需要复现分析、提取IOC或测试规则时才拉取文件本体。按需拉取不到处囤文件。这么拆的好处是你不需要对每个“可疑样本”都下载文件本体。很多时候我只需要元数据和沙箱报告就能完成初步判断真正需要下载文件的比例可能不到10%。如果一开始就无条件下载所有样本不仅浪费磁盘空间还会拖垮本地杀毒环境的性能。2.3 采集节奏与合规边界自动化采集不是不能做但要把“度”想清楚。这里所谓的“度”包括两个层面一是技术层面要遵循平台的速率限制Rate Limit别一上来就开100个线程去怼一个免费API二是合规层面样本文件本身带有恶意属性下载下来只能在隔离环境当中分析和存储绝对不能把未处理的病毒文件放到生产网络里更不可以随便二次分发。我在团队里定的规矩是所有爬取脚本统一设随机延时1到3秒之间请求头声明来源和用途每人每小时的请求上限写进配置文件下载到的样本统一存到专门的存储服务器权限收紧目录按“日期_家族_哈希前四位”命名。这样出了问题能快速定位也不会因为一次爬取行为把整个出口IP拖下水。3. 实操过程批量爬取信息与下载样本的完整方案3.1 第一步搭建隔离分析环境下载恶意样本之前先把环境准备到位。我在本地用VMware跑一个专门的分析虚拟机系统是Windows 10做快照后装在另一个物理机上跑和日常办公网络物理隔离。这个虚拟机里只装分析工具包括Process Monitor、ProcDot、Ghidra、x64dbg、沙箱软件这些不装任何办公软件不登个人账号也不配置内部文档访问权限。虚拟机外部还要做一个哈希校验区。下载完文件后的第一件事不是运行而是用Python计算SHA256跟情报平台上的哈希做比对。不一致的文件直接删除续传后重算二次校验不通过就放弃宁可重新下载也不留疑问。正因如此环境搭建这部分虽然不涉及具体爬虫代码但它决定了整个流程的可靠性值得多花时间。3.2 第二步用Python对接MalwareBazaar的查询与下载接口MalwareBazaar目前是我用的比较顺的样本库原因是它本身就面向自动化设计API接口文档很清晰。下面这段是基于requests对接的示例功能是按家族标签拉取近期的样本元数据和下载链接。import requests import json import time import hashlib import os API_URL https://mb-api.abuse.ch/api/v1/ def query_recent_samples(limit50): payload { query: get_recent, limit: limit } resp requests.post(API_URL, datapayload, timeout30) if resp.status_code 200: data resp.json() if data.get(query_status) ok: return data.get(data, []) else: print(查询失败:, data.get(query_status)) else: print(HTTP错误:, resp.status_code) return [] def download_sample_by_hash(file_hash, save_dirsamples): payload { query: get_file, hash: file_hash } resp requests.post(API_URL, datapayload, timeout60) if resp.status_code 200: # 注意这里返回的是文件内容不是JSON os.makedirs(save_dir, exist_okTrue) filepath os.path.join(save_dir, file_hash) with open(filepath, wb) as fp: fp.write(resp.content) print(下载完成:, filepath) else: print(下载失败:, resp.status_code, resp.text) if __name__ __main__: samples query_recent_samples(limit20) for s in samples: sha s.get(sha256_hash, ) tag s.get(signature, unknown) print(f{sha} - {tag}) # 默认先只打印元数据不下载 # 需要下载时手动调用 download_sample_by_hash(sha) time.sleep(1)需要提醒的是MalwareBazaar的回调中query为“get_recent”时返回的是JSON元数据query为“get_file”时返回的是“文件原始字节流”。如果你不区分这两种情况很容易在解析的时候踩空。还有一点下载接口返回的文件内容是原始二进制不要试图用text模式去读否则Windows下极易出现编码问题。3.3 第三步从VX Underground批量下载样本集VX Underground跟MalwareBazaar最大的区别是它提供历史批次包而且不需要注册。它的下载页面经常会给出一个“sample collection pack”的直链一般是ZIP或者7z格式有时候单文件就几个GB。批量下载这种大文件我比较喜欢用aria2做多线程配合重试机制命令行范例是这样aria2c -x 16 -s 16 -k 1M -o malware_collection_2025.7z https://vx-underground.s3.amazonaws.com/...7z参数说明-x 16表示单个服务器最大连接数-s 16指定每个文件下载的分片数-k 1M设置成1MB分片大小。跑完后记得校验文件完整性VX Underground通常会附带SHA256校验文件用sha256sum做全量校验。如果你不想下载整个大包只想抓某一份特定的样本可以用它的文件搜索页面按样本名或哈希定位到具体文件再下载。VX Underground的样本名格式通常包含年份和家族名比如“2025-06-01-Ransomware-XXXX.zip”这比杂乱的哈希名直观得多适合归档整理。3.4 第四步获取APT组织信息并做关联分析前面提到MITRE ATTCK提供STIX数据源我实际用的是它的Groups文档curl -X GET https://raw.githubusercontent.com/mitre-attack/attack-stix-data/master/groups/enterprise-attack-groups.json -o groups.json这份JSON文件里记录了每个组织的ID、名称、关联软件、使用的攻击技术和技术描述。我写了一个简单的Python脚本把它转换成Markdown表格方便阅读import json with open(groups.json, r, encodingutf-8) as fp: data json.load(fp) objects data.get(objects, []) for obj in objects: if obj.get(type) ! intrusion-set: continue name obj.get(name, ) id_val obj.get(id, ) aliases obj.get(aliases, []) desc obj.get(description, )[:200] print(f组织名: {name}) print(f对象ID: {id_val}) print(f别名: {, .join(aliases) if aliases else N/A}) print(f描述: {desc}) print(---)这种STIX数据的好处是结构完全统一不需要针对每个组织单独维护解析逻辑。如果想要更细粒度的组织-技术映射建议把relationship类型的对象也解析出来它记录了“哪个组织用了哪条技术”。把这些关系导入图数据库之后你就能很直观地看到某个组织的攻击链全貌。实际做APT组织分析的时候单纯看MITRE还不够我会把“组织名称”作为关键词去VirusTotal的API里查胶水记录看哪些样本哈希被多个检测引擎标记为与特定组织相关。这一步没法完全自动化因为各家厂商的命名体系不同需要靠人工判断但用脚本先把候选集拉下来能省去大量重复劳动。对新手来说先掌握MITRE数据源就已经能覆盖大部分需求。3.5 第五步按需补拉样本建立本地样本库有时候你手里只有一个文件哈希需要拉样本本体做逆向分析。这时可以把MalwareBazaar、VirusShare和Malshare串起来先问MalwareBazaar要文件要不到就到Malshare的API碰运气还是不行再去VirusShare的哈希搜索页确认是否存在。Malshare的API比较简单一个GET请求就行import requests API_KEY your_malshare_api_key file_hash 目标哈希 url fhttps://malshare.com/api.php?api_key{API_KEY}actiongetfilehash{file_hash} resp requests.get(url, timeout60) if resp.status_code 200 and len(resp.content) 100: with open(file_hash, wb) as fp: fp.write(resp.content) print(样本下载成功) else: print(未找到样本或下载失败)样本入库方面我坚持“一个文件一个目录”的归档方式目录名存档哈希里面放原始文件和所有附带报告、分析笔记。文件名不用原始文件名因为原始文件名往往是随机的不具备参考价值。元数据统一存到SQLite里字段包括sha256、md5、sha1、文件大小、标签、首次发现时间、来源、下载时间。这样无论是自动化检索还是人工回忆都能快速定位。如果你长期做检测规则开发这种本地样本库的价值会越来越大。每次新出报告都可以拿历史样本库做参照看新旧样本之间的差异提炼更精准的检测特征。4. 常见问题与排查技巧实录4.1 下载卡死、超时时要怎么处理在线下载样本最常遇到的问题是超时“能用浏览器下载但脚本总是断”。这里有几个排查思路加重试和断点续传我一般用requests的streamTrue配合循环重试每次判断返回字节数是否正常大文件交给aria2它能自动断点续传。控制并发数免费API普遍限速建议并发线程不要超过3个每个请求之间加随机延时。确认网络出口是否稳定如果企业网络有代理或防火墙需要确保代理配置正确。requests里的proxies参数可以指定代理但不要硬编码敏感信息。4.2 哈希不一致、文件损坏下载完成后一定要做本地哈希校验脚本里加一段def verify_sha256(filepath, expected_hash): h hashlib.sha256() with open(filepath, rb) as f: while chunk : f.read(65536): h.update(chunk) return h.hexdigest() expected_hash如果校验不通过大概率是传输丢包或者目标文件本身已损坏。我的习惯是直接把文件删掉重新下载而不是尝试修复因为样本文件一旦损坏分析出来的特征就不真实。4.3 杀毒软件拦截了你下载的样本很多安全分析机上装了杀毒软件刚下载完样本就触发拦截这其实是好事说明设备在工作。但要注意分析样本的环境里不应该装实时监控的杀毒软件因为很多恶意程序会检测杀软进程并改变行为。推荐的做法是分析虚拟机里关闭实时防护安装Process Monitor这类行为监控工具所有下载的样本统一放在带密码的ZIP压缩包中以“infected”作为后缀标签防止误操作双击运行。4.4 爬取频率过高被封禁被封IP有多痛苦不用多说我自己就吃过亏。解决方法是先把请求速度降下来跑批的时候看一眼响应头里的retry-after字段这个字段通常会在频率限制时出现说明要等多久才能继续请求。代码里最好封装一个统一的请求函数把所有站点的限速参数放到配置文件里统一管理。import time from functools import wraps def rate_limit(min_interval1.5): last_call {} def decorator(func): wraps(func) def wrapper(*args, **kwargs): now time.time() if now - last_call.get(func.__name__, 0) min_interval: time.sleep(min_interval - (now - last_call[func.__name__])) result func(*args, **kwargs) last_call[func.__name__] time.time() return result return wrapper return decorator4.5 平台接口变动导致脚本失效情报平台改接口是家常便饭尤其是免费平台。我的应对策略是给每个平台写一个单独的适配器Adapter统一对外暴露fetch_recent_metadata()和download_sample(hash)两个方法。这样平台接口变了只需要改对应适配器内部实现不需要动业务层代码。所有爬虫脚本部署时保留版本号每次调整时能回溯。4.6 样本磁盘空间规划样本库增长是很快的几个大样本包就能把1TB硬盘塞满。建议给样本存储单独建一个逻辑卷预留至少2倍预期容量并且定期做清理超过90天未命中任何IOC规则的可以直接归档压缩压缩率通常有5到10倍的收益。注意备份时样本包要加密存储这既是安全要求也是合规要求。5. 扩展方向把数据采集能力用到威胁建模里去这套“爬取情报源—解析结构化数据—批量入库—按需分析”的方法论不局限于恶意样本领域。比如你在做数据分析的时候要批量下载公共数据集思路一模一样先找官方API而不是刮网页再写适配器解析字段最后存数据库做特征工程。我最近就在把威胁情报元数据当成结构化训练数据来做家族分类实验。把每个样本的标签、文件大小、PE导入表哈希、可疑字符串特征做成特征向量尝试用贝叶斯方法建模。这需要大量高质量的历史样本数据正好可以用上面这套流程持续积累。实际的难点在于样本标签噪声大——同一类样本可能被不同平台归为不同家族需要靠多数投票或者人工复核来清洗。对想走这个方向的朋友建议是先别急着训练模型先把数据采集的管道跑通把“样本哈希—家族标签—时间戳—平台来源”这张宽表建起来。有了干净、稳定的底表后续建模都是水到渠成的事。结尾个人实操心得最后分享一个经验信息收集的价值不在于“多”而在于“能用”。我在很长一段时间里只顾着堆积样本数量看到标签就往硬盘里塞结果真正写报告的时候找不到合适的样本找得到又忘了是从哪儿下下来的。后来意识到这个领域最值钱的是“数据血缘”——你知道这个样本是从哪个平台、什么时间、通过什么规则下载的你才能在做判断时给出可信的结论。现在我每次下载样本都会同步记录来源URL、抓取时间和当时的判断依据宁可慢一点也要确保每次分析都能追溯到源头。工具层面的建议是别过度设计。爬虫脚本能跑通、能断点续传、能记录日志就够了不需要一开始就上分布式采集、消息队列那套架构。大部分个人分析者和中小企业安全团队的数据量用单机脚本加SQLite完全撑得住。先把这套“小而美”的流程跑起来等真正有业务需求的时候再逐步加复杂度这是我在实操中觉得最稳的前进方式。