本文仅供合法授权的安全研究与学习使用,请勿用于非法用途。读者应确保行为符合当地法律法规。
前言
在红队社工攻击演练中,”联系人注入”是一种高效的攻击前置手段。攻击者通过生成包含大量虚假联系人的vCard文件(.vcf),导入到目标手机或通讯录中,为后续的钓鱼攻击、水坑攻击建立信任基础。当目标手机通讯录中存在”张主任”、”李局长”等联系人时,攻击者便可以冒充这些身份发送钓鱼短信或诱导转账。
此外,在物理渗透场景中,红队成员可以将生成的联系人文件预装在丢弃的U盘或手机中,当目标拾取并导入联系人后,攻击者可以通过预设的号码进行后续社工攻击。本文基于真实Python项目源码,深入讲解批量vCard联系人生成技术,涵盖姓名生成、号码模拟、关系建模和vCard格式规范。
技术背景
1. vCard格式规范
vCard是电子名片的行业标准格式(RFC 6350),一个典型的vCard条目如下:
1 | BEGIN:VCARD |
N:结构化姓名(姓氏;名字;中间名;前缀;后缀)FN:格式化显示名称TEL;TYPE=CELL:手机号码BDAY:生日UID:唯一标识符(UUID)EMAIL:电子邮箱ADR:地址
2. 社工攻击中的联系人建模
为了让生成的联系人看起来真实可信,需要模拟真实通讯录的结构分布:
- 家庭关系(约20%):爸爸、妈妈、爷爷、奶奶、叔叔、舅舅等
- 领导关系(约10%):张主任、李局长、王总等
- 同事关系(约15%):同事、客户、供应商等
- 朋友关系(约15%):朋友、同学、战友等
- 服务人员(约10%):快递员、外卖员、医生等
- 随机联系人(约30%):普通姓名
3. 关键技术点
- random模块:随机选择姓氏、名字、号段等
- uuid模块:为每个联系人生成唯一标识符
- 百家姓数据:完整的中国姓氏库,包含单姓和复姓
- 号段模拟:基于真实运营商号段分布生成手机号
- vCard 3.0格式:遵循RFC 6350标准,确保兼容性
实现思路
项目采用分层建模策略,从简单到复杂分为四个版本:
1 | ┌────────────────────────────────────────────┐ |
核心代码解析
1. 基础版——亲戚与领导建模
基础版本聚焦于社交关系建模,通过称谓生成联系人:
1 | import random |
代码讲解:
generate_name():从完整百家姓中随机选取姓氏,再从名字用字池中随机选取1-2个字组成名字。百家姓数据包含单姓和复姓(如”司马”、”欧阳”),增加了真实性。generate_phone():从中国大陆三大运营商的真实号段中随机选择前缀,后8位随机生成。generate_relative_contacts():模拟真实通讯录中亲属称谓的分布规律。直系亲属必定存在,旁系亲属带排行前缀(”大叔叔”、”二舅舅”),这符合中国人的命名习惯。
2. 进阶版——多关系类型与性别区分
进阶版本引入了性别区分、年龄生成和生日计算:
1 | from datetime import datetime |
代码讲解:
进阶版本的关键改进是引入了关系属性建模。family_relations字典不仅定义了关系名称,还包含性别和年龄范围。例如”爷爷”的年龄范围是60-90岁,”表弟”是5-30岁。这样生成的联系人不仅有合理的称谓,还有匹配的性别和生日,大大提高了真实感。
3. 虚拟号段版——避免真实号码冲突
为了避免生成的手机号与真实用户号码冲突,虚拟号段版使用了虚拟运营商号段:
1 | # 虚拟手机号段(避免与现实中使用的号码冲突) |
代码讲解:
虚拟号段版使用了170/171等虚拟运营商号段,并在号码第4位固定为0或9进行额外区分。这种设计在红队演练中非常重要——避免生成的号码恰好属于某个真实用户,造成误打扰。
4. vCard生成与输出
所有版本最终都通过以下模式生成vCard文件:
1 | # 生成 vCard |
代码讲解:
- 比例分配:总1540个联系人按比例分配到不同关系类型,模拟真实通讯录的分布。
- UUID生成:每个联系人都使用
uuid.uuid4()生成唯一标识符,防止导入时重复。 - 顺序打乱:
random.shuffle()打乱联系人顺序,避免同类联系人聚集在一起。 - 编码选择:使用
utf-8-sig编码(带BOM),确保Windows系统和手机端正确识别中文。 - 换行符:使用
\r\n换行,符合vCard RFC 6350标准要求。
5. 服务人员联系人生成
虚拟号段版新增了服务人员联系人,进一步增加真实感:
1 | def generate_service_contacts(count): |
代码讲解:服务人员联系人的设计非常贴近生活。例如”张快递员(顺丰科技有限公司)”、”李医生(人民医院)”等,这些联系人在日常通讯录中非常常见。当目标手机中出现这样的联系人时,攻击者可以冒充快递员发送钓鱼链接,或冒充医生进行社工诈骗,成功率较高。
使用方法与运行效果
环境准备
1 | # 仅需Python标准库,无需额外安装 |
运行效果
运行后会在桌面生成Decontacts.vcf文件,包含1540个联系人。将此文件导入手机通讯录后,联系人列表中会出现:
1 | 张三(爸爸) - 17012349876 |
在红队演练中的应用场景
- 预置联系人注入:在钓鱼U盘中放置vCard文件,诱导目标导入。
- 水坑攻击前置:在目标常用网站上植入vCard下载链接。
- 社工信任建立:当目标通讯录中存在”张主任”时,攻击者冒充该身份发送信息。
- 钓鱼短信铺垫:利用预置的”银行客服”联系人发送钓鱼短信。
防御对策
通讯录导入审计:企业应管控员工手机通讯录的导入行为,对批量导入操作进行审计。
陌生号码预警:在即时通讯和邮件系统中,对不在企业通讯录中的联系人进行标记预警。
安全意识培训:教育员工不要轻易导入来源不明的vCard文件,对陌生联系人保持警惕。
社工演练:定期开展社工攻击演练,测试员工对虚假联系人的识别能力。
验证机制:涉及转账、授权等敏感操作时,通过多渠道(电话、视频)验证对方身份,不仅仅依赖通讯录中的联系人信息。
设备管理:对企业发放的移动设备实施MDM(移动设备管理)策略,限制通讯录的批量修改操作。
总结
本文基于真实项目源码,系统地讲解了批量vCard联系人生成技术。从基础版的亲戚与领导建模,到进阶版的性别区分与生日生成,再到虚拟号段版的服务人员模拟,展现了红队工具的迭代演进过程。
关键要点:
- 关系建模是核心:真实的通讯录不是随机姓名的堆砌,而是有结构的关系网络。家庭、领导、同事、朋友、服务人员的比例分配直接影响可信度。
- 号段选择需谨慎:在红队演练中应使用虚拟号段,避免与真实用户号码冲突。
- vCard格式规范要严格:正确的编码(utf-8-sig)、换行符(\r\n)和UUID标识是确保跨平台兼容的关键。
- 多字段增强真实感:除姓名和电话外,添加邮箱、地址、生日等字段,使联系人看起来更加真实。
联系人注入是红队社工攻击的重要前置手段,也是蓝队需要重点防范的攻击向量。理解这一技术的原理和实现,有助于双方在社工攻防中取得优势。