ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于Python的社会工程学攻击:邮件欺骗原理与实验复现

基于Python的社会工程学攻击:邮件欺骗原理与实验复现 简介基于Python的社会工程学攻击课程设计资源包面向网络安全方向学生及Python课程设计开发者系统演示社会工程学攻击的实施原理与防范要点适合作为课程设计、实验复现或安全入门参考。压缩包共2个文件包含1个py格式的源码文件和1个docx格式的实验报告整体仅1.09MB。py源码包含可运行的攻击脚本docx实验报告则完整记录实验环境、操作步骤、结果分析及防御建议两者对照学习可快速理解攻击链路细节。已有431人浏览学习该资源。内容覆盖信息收集、网络嗅探、邮件欺骗、语音交互模拟、恶意软件创建等关键知识点并结合源码逐一拆解攻击逻辑帮助读者深入理解攻击者思路提升网络安全防护意识与Python编程实战能力同时强调道德与法律边界避免非法使用。通过完成该实验既能掌握攻击原理也能明确防御重点可作为课程设计与安全入门的实用参考资料。1. 基于 Python 的社会工程学攻击别小看这个只有两个文件的 zip收件箱里躺着一封来自“IT管理员”的邮件标题写着“你的邮箱即将停用”落款是公司全称可发件地址跟平时的域名完全不一样——这是社会工程学攻击最常见的开场。如果你正在搜索“基于 Python 的社会工程学攻击”大概率是想找一份能跑通、能写进实验报告的课程设计资源。这份基于python的社会工程学攻击内含源码和实验报告.zip拆开只有两个文件一个youjian.py一份实验10.docx。它讲的是社会工程学里最经典的“邮件欺骗”链路适合有 Python 基础、正在做网络空间安全课程设计的学生。下面我按拆包、读源码、复现、避坑的顺序把它过一遍你拿到手之后能少走很多弯路。2. 拆包看资源一个邮件脚本加一份 Word 报告为什么够交课程设计先说结论这份资源适合做“邮件欺骗”方向的实验但不要指望它覆盖社会工程学攻击的所有技术点。压缩包里的代码量不大真正的分量在报告里。拿到压缩包后先别急着运行先把它当作一个完整的实验项目来拆。2.1 压缩包里到底有什么解压后就是一个 Word 文档加一个 Python 文件文件清单如下文件类型作用实验10.docxWord 实验报告记录实验目的、原理、步骤、结果与防御分析youjian.pyPython 脚本使用 smtplib 和 email 构造邮件头并提交到 SMTP 服务器youjian.py从命名就能猜到一个信息“youjian”就是“邮件”的拼音。这个脚本体量很小基本没有第三方依赖因为smtplib、email都是 Python 标准库。也就是说在一台装了 Python 3 的机器上不需要pip install任何东西就能跑。这对课程设计来说是很讨巧的选择机房演示时不用折腾网络和依赖。我拿到压缩包后的第一步是先在一个干净目录里解开它unzip 基于python的社会工程学攻击内含源码和实验报告.zip -d social_eng_lab cd social_eng_lab ls -l如果文件名或目录名带有中文命令里最好加引号避免 shell 解析出问题。解压后建议顺手建一个虚拟环境虽然这个项目不用第三方库但虚拟环境可以保证你后续补充 scapy、flask 等模块时不会污染系统 Python。实验10.docx的篇幅比代码长得多。从资源摘要看这个课程设计涉及信息收集、网络嗅探、邮件欺骗、语音交互模拟和恶意软件创建几个方向但 zip 里真正给了可运行代码的只有邮件欺骗这个点。报告里会把这些方向分别讲原理到了“实验过程”部分才落到youjian.py。你在写结论文档时也应当沿用这个结构先交代社会工程学整体威胁面再集中展示一个可复现的向量避免把每个方向都写成空谈。2.2 邮件欺骗在整条社会工程学攻击链中的位置社会工程学攻击不直接打系统漏洞打的是人的判断力。一条典型攻击链有五个环节侦察、伪装、诱导、投递、回收。youjian.py承担的是“伪装诱导投递”它把一个可信显示名和一段制造紧迫感的正文放进邮件让收件人产生信任感然后点击链接或下载附件。心理学上对应的就是三个要素权威IT管理员、紧迫12小时内不处理将停用、熟悉感落款与邮件模板尽量模仿真实通知。这三个要素只要有两个中招点击率就会明显升高。实验报告里如果能用两句话解释为什么这样设计文案比单纯贴代码要加分。用 Python 来实现这一段核心原因是标准库足够。你可以用smtplib提交邮件用email模块生成符合 RFC 5322 的邮件对象。如果后续想扩展信息收集部分可以用requests和beautifulsoup4去解析公开页面想替换邮件正文可以用jinja2做模板。Python 的库生态让每个环节都能单独拆出来实验这也是一线安全课程设计最常选择的形态。2.3 这份资源哪些地方需要你手动补全它毕竟是一个教学实验包不是现成的攻击框架。我在拆解时注意到几个必须在拿到后自行补全的点。第一没有钓鱼页面源码。邮件正文里的链接最终指向哪里、页面长什么样报告里可以用原型图描述源码里没有。第二没有点击率统计脚本。真实的攻击者会跟踪谁点了链接课程设计里一般手动记录即可。第三youjian.py没有把侦察环节自动化。信息收集部分可能是用表格记录你的“目标画像”而不是脚本自动抓取。所以这份资源的价值是帮你把“邮件欺骗”这一环完整跑通同时让你知道其他环节要自己扩展。交作业时如果直接用原样代码答辩老师一问“链接落地页在哪”很容易卡壳。建议至少补一个静态页面的截图或者干脆把链接改成http://localhost:8080/verify用本地页面演示点击行为这样既安全又能自圆其说。3. 源码解析smtplib 与 email 如何构造一封“假”邮件顺着youjian.py的命名可以看到它主要解决两个问题邮件内容怎么伪装得像真人发的邮件怎么交给 SMTP 服务器投出去。这一章把核心逻辑拆开每一段代码都对应一个可以在实验报告里展开写的知识点。3.1 构造邮件头与正文核心代码逐行读youjian.py剥开注释后正文构造部分基本是这个形态from email.mime.text import MIMEText from email.utils import formataddr, formatdate import smtplib sender_email adminexample.com # 发件人显示地址 sender_name IT管理员 # 显示名 receiver your_testexample.com # 测试收件人只能填你自己控制的邮箱 subject 【紧急】您的邮箱存储空间即将用尽 html html body p您好/p p系统检测到您的邮箱使用率已经超过95%请在12小时内完成扩容。/p pa hrefhttp://example.com/verify点击这里立即处理/a/p /body /html msg MIMEText(html, html, utf-8) msg[From] formataddr((sender_name, sender_email)) msg[To] receiver msg[Subject] subject msg[Date] formatdate(localtimeTrue)这段代码首先在MIMEText(html, html, utf-8)里显式声明 HTML 子类型和字符集。更重要的是formataddr((sender_name, sender_email))它会处理中文显示名的编码并在邮件头里生成类似?utf-8?q?...?的 encoded-word。如果你直接拼字符串中文在过 SMTP 时很容易变成乱码。接下来msg[Subject]是标准邮件头字段主题中的中文同样会被自动编码。formatdate(localtimeTrue)生成带时区的日期头这行不是可选项部分邮件服务器看到不合规范的 Date 头会直接提高垃圾邮件分数。注意sender_email不一定要填真实账号。你可以故意填一个不存在的域名然后用smtplib里的sendmail信封发件人送出去。这时收件人会看到 From 是某人信封发件人又是另一个人SPF 校验大概率过不了。这不是 bug而是邮件系统的设计。实验报告里的“结果分析”部分重点就写这个差异。3.2 发送逻辑SMTP_SSL 与 STARTTLS 的取舍构造完邮件对象下一步是投递。youjian.py里的发送分支大致长这样smtp_host smtp.example.com smtp_port 465 auth_code 你的SMTP授权码 try: server smtplib.SMTP_SSL(smtp_host, smtp_port, timeout10) server.login(sender_email, auth_code) server.sendmail(sender_email, receiver, msg.as_string()) print(邮件已提交) except smtplib.SMTPAuthenticationError: print(登录失败请检查 SMTP 授权码) except Exception as e: print(发送出错, e) finally: server.quit()SMTP_SSL默认走 465 端口一上来就套 SSL。另一种常见方式是走 587 端口先以明文建立连接再通过starttls()升级加密。两种方式都能避免用户名和授权码明文传输区别在于握手时机。在校园网或云主机上25 端口经常被运营商封禁所以优先选 465/587。代码里timeout10的作用是防止 SMTP 服务器不响应时程序挂死。很多教学代码没有超时参数一旦邮件服务器抽风终端就一直停在连接那一步看起来像程序死了实际上是 socket 在等一个永远不会来的响应。server.login(sender_email, auth_code)里的auth_code不是你邮箱的网页登录密码。不同服务商获取授权码的位置不一样但都在“SMTP服务”或“客户端授权”相关设置里。很多学生在这里翻车后面第 5 章我会单独拿出来讲。3.3 一封“假”邮件在服务器眼里是什么写到这里不妨看一眼msg.as_string()的实际输出结构。它大概是Content-Type: text/html; charsetutf-8 MIME-Version: 1.0 From: ?utf-8?q?ITE7AEA1E79086E59198? adminexample.com To: your_testexample.com Subject: ?utf-8?q?...? Date: Thu, ... html.../html接收方的邮件网关会同时看信封发件人和From头。如果Return-Path与From域名不一致SPF 结果常常是fail或softfailDKIM 则看有没有有效签名。youjian.py构造的邮件本身不会做 DKIM所以只要送到有校验的邮箱大概率进垃圾箱。这正好是课程设计可以深入分析的点不是这段代码“无效”而是它的无效证明了邮件欺骗在现代邮件体系中被拦截的机制。当然如果是在内网自己搭的 SMTP 服务器上测试没有 SPF/DKIM/DMARC 校验这封邮件会原样进入收件箱。也就是说攻击效果很大程度取决于目标邮件系统是否做了这些检查。把这个结论写进报告比单纯说“我发了一条钓鱼邮件”有价值得多。4. 复现实验把这份 Python 课程设计跑出可信的结果代码看完不跑等于没做。下面是从解压到出实验截图的标准过程每一步都对应实验报告里要写的内容。4.1 准备运行环境前面说过脚本只用标准库所以环境准备实际上就是准备一个可以接收测试邮件的 SMTP。推荐先在本机起一个调试服务器避免把实验邮件发给真实的人pip install aiosmtpd python -m aiosmtpd -n -l localhost:1025aiosmtpd是 Python 官方维护的本地 SMTP 服务会把收到的邮件打印在终端。它不会把信外发到互联网适合验证代码逻辑和邮件格式。如果你在 Windows 上跑需要确保防火墙没有拦截 localhost一般不会。如果要走真实邮箱你需要先在自己的邮箱里开启 SMTP 服务并拿到授权码。不同服务商的入口不同但注意一件事凡是要求“开启 POP3/SMTP/IMAP 服务”并给你一串授权码的地方就是你要找的。把授权码放到环境变量里不要写死在源码里。提示只想验证邮件格式时本地 SMTP 比真实邮箱更安全也更容易控制结果。先跑通本地再考虑接外部邮箱。4.2 修改参数并运行直接把youjian.py开头的配置区改成自己的值sender_email your_accountexample.com sender_name IT管理员 receiver your_second_mailexample.com smtp_host smtp.example.com smtp_port 465 auth_code 你的授权码然后在终端运行python youjian.py如果print输出“邮件已提交”说明提交成功。但这不代表对方一定收到。要打开邮箱看收件箱和垃圾箱分别截图。如果是本地 SMTP终端里会出现完整的邮件原文。这个阶段最重要的是保留“结果证据”。把收到的邮件保存为.eml方法是在邮件客户端里点“查看原始邮件”然后另存。demo.eml这一个文件就够你写满实验结果分析。4.3 实验报告怎么配合代码一起用打开实验10.docx把它当成一个模板。我会按五段补齐背景与原理、实验环境、实验过程、结果分析、防御建议。每写一段都回头对照你刚刚跑出来的实际输出。“实验过程”不要只写步骤要把sender_email、receiver、smtp_host、端口这些参数填上甚至粘贴msg.as_string()的一部分。这样答辩老师能直接看出你理解了哪些头字段。“结果分析”部分放两张截图一张收件箱一张垃圾箱。如果真实邮箱把伪造邮件扔进了垃圾箱这反而是好的实验结论说明 SPF/DKIM/DMARC 起了作用。报告里还要写道德边界。建议在“结论”之前加一段本实验仅在本人邮箱和本地 SMTP 环境中进行未向无关人员发送任何消息。这不算多余是社会工程学实验报告的必写项也能让评审看到你有安全意识。5. 避坑与排错邮件欺骗实验里最容易翻车的五个问题前面读代码、跑复现时会踩不少坑。这里按“现象→原因→解决”整理五个高频问题基本覆盖你复现时会撞上的情况。5.1 连不上 SMTP或者连上了登不进去坑一连接直接被拒偶尔还报超时。现象是在运行youjian.py时出现ConnectionRefused或长时间没有输出。原因有两个方向一是你用的端口比如默认 25被网络运营商或机房封了二是timeout没设程序卡在连接阶段。很多邮箱的公网 25 端口默认就是不通的因为反垃圾邮件策略不让随意中继。解决方法是把端口改为 465 或 587同时给SMTP_SSL加timeout10。如果你只是测试格式用本地aiosmtpd最简单还能避免被限流。我一般会把本地和真实两种方式都跑一遍确保不是代码写死导致的翻车。坑二报SMTPAuthenticationError。现象是登录阶段直接失败错误码一般带535或Login Fail。原因大多是把邮箱的网页登录密码填进了auth_code而 SMTP 要求的是独立的授权码。另外有的邮箱服务商新注册账户默认关闭 SMTP 服务没开启就去连自然被拒。解决方法是先去邮件设置里开启 SMTP 服务并生成授权码再把这个授权码贴进脚本。安全习惯是不要把授权码写在代码文件里而是用环境变量读import os auth_code os.getenv(SMTP_AUTH_CODE, )这样交代码的时候不会把个人信息一起交出去。5.2 信发出去了但结果不是你想看到的坑三收件箱里显示发件人但后面带着“代发”或直接进垃圾箱。现象是邮件收到了但发件人名旁边显示“由 xxx 代发”对方一眼就能识破或者信直接被丢进垃圾箱。原因是发件服务器做了 SPF 校验。当From地址的域名不在你提交服务器的允许发送名单里接收方就会给这封邮件打低分。实验中被系统识别为钓鱼邮件反而说明防御机制在起作用。解决方法是不要试图暴力绕过 SPF。课程设计的正确姿势是在报告里写出From与Return-Path不一致的邮件头差异并把垃圾箱截图作为证据。如果你想让它进收件箱那就用你自己域名且配置过 SPF 的邮箱来做实验但这已经超出了社会工程学攻击本身的技术范畴。坑四中文主题和正文乱码。现象是邮件能发出但标题显示为?UTF-8?B?...或者正文在客户端里变成一排问号。原因是构造MIMEText时没有指定编码或者手动用msg[Subject] subject直接赋值中文字符串而没让库去编码。解决方法是构造时写MIMEText(content, html, utf-8)显示名用formataddr主题通过email.header处理。如果你拿不准用前面 3.1 节的代码结构就足够稳。坑五发完没反应再跑一次就报端口被占用。现象是脚本执行后卡住CtrlC 杀掉再跑程序提示端口被占用或连接数过多。原因是上一次 SMTP 连接没有正常关闭socket 处于TIME_WAIT如果是在本地 SMTP 调试上一个aiosmtpd进程没退干净。解决方法是给脚本补finally: server.quit()并且用ps -ef | grep aiosmtpd杀掉残留进程再重跑。这个小问题在教学电脑频繁跑实验时特别常见属于经验大于技术的部分。6. 进阶把实验邮件改造成邮件安全体检工具如果你不想停留在“跑通代码交作业”这个层面可以往防御侧再走一步。我把这个实验的进阶做法叫“邮件头体检”把youjian.py构造出来的邮件发到本地 SMTP 沙箱用另一个脚本解析原始邮件头里最关键的几个字段。一个eml_parser.py就够了import sys, email from email import policy with open(sys.argv[1], rb) as f: msg email.message_from_binary_file(f, policypolicy.default) print(From:, msg[From]) print(Subject:, msg[Subject]) print(Return-Path:, msg.get(Return-Path)) print(Received:, msg.get_all(Received)) print(SPF状态:, msg.get(Received-SPF, 未标注))运行方式很简单先启动本地 SMTP再让youjian.py投到localhost:1025然后保存收到的.eml文件最后对文件跑这段解析代码。你会看到Received字段一步步记录了邮件从客户端到本地 SMTP 的路径From和Return-Path不一致时这就是典型的欺骗特征。还可以顺手查一下目标邮箱的 DMARC 策略看它在钓鱼邮件面前是选择拒收还是隔离nslookup -typeTXT _dmarc.example.com输出里vDMARC1; pquarantine代表可疑邮件会被丢进垃圾箱preject代表直接拒收。这个结果可以直接写进实验报告的“防御策略”一节。这个进阶方向最大的价值是让你从“怎么发”转向“怎么验证”。从那以后我每次拆安全课程设计都会先改配置把 SMTP 指到本地沙箱确认不会发到任何真实邮箱再把收到的.eml逐字段看一遍。这个习惯帮我在答辩现场避免了不止一次尴尬。希望帮到你。本文还有配套的精品资源点击获取
返回列表