从零搭建钓鱼网站:渗透测试与安全意识演练实战指南
2026/6/23 18:10:22 网站建设 项目流程

1. 项目概述与核心价值

最近在和一些做安全测试的朋友交流,发现大家对于“钓鱼网站”这个话题,既充满好奇,又有些讳莫如深。好奇是因为它在渗透测试、安全意识演练中扮演着关键角色,讳莫如深则是因为它总带着一丝“灰色”的意味。实际上,在合法授权和明确目的的前提下,了解钓鱼网站的搭建原理,是每一位安全从业者、企业安全负责人乃至普通用户提升防御能力的必修课。这就像医生需要了解病毒如何传播,才能更好地开出处方一样。

今天,我就以一个从业者的角度,抛开那些故弄玄虚的术语,带你从零开始,彻底搞懂几种主流、简单且高效的钓鱼网站搭建方法。我们的目标不是教你去做坏事,而是让你深刻理解攻击者的思路和工具,从而在自己的岗位上,无论是加固系统、设计安全策略,还是培训员工,都能做到有的放矢。这篇文章会非常详细,从环境准备、工具选择、配置细节到注意事项,一步步拆解,确保即使你没有任何编程或服务器基础,也能跟着操作并成功复现。收藏这一篇,相当于拥有了一份从“知道是什么”到“亲手做出来”的完整指南。

2. 钓鱼网站的本质与合法应用场景

在动手之前,我们必须先划清红线,明确边界。钓鱼网站的本质是“仿冒”,通过复制一个可信度高的网站(如公司登录页、银行页面、社交平台),诱导用户输入敏感信息(账号、密码、银行卡号)。从技术上讲,它涉及前端界面克隆、后端数据接收和转发(或存储)几个核心环节。

2.1 为什么我们需要学习搭建?

  1. 安全渗透测试(红队评估):在获得书面授权的前提下,安全工程师模拟攻击者对自家或客户系统进行测试。钓鱼演练是评估员工安全意识脆弱性的最有效手段之一。通过量化有多少员工点击了链接、提交了凭证,企业可以精准定位安全培训的盲区。
  2. 内部安全意识培训:与其枯燥地宣讲,不如进行一次“无害”的实战演练。让员工亲身体验一次“险些中招”,其记忆效果远超十次培训。搭建一个逼真的内部系统登录页进行演练,是很多大型企业安全部门的常规操作。
  3. 安全技术研究:作为防御者,只有深入了解攻击链的每一个环节,才能设计出更有效的检测和防御规则。分析钓鱼网站所用的技术、混淆手法、通信方式,有助于提升威胁情报的质量和自动化检测系统的准确性。

2.2 绝对禁止的行为

注意:任何未经明确授权,对第三方网站进行仿冒并用于窃取信息的行为,都是非法的,且将面临严厉的法律制裁。本文所有内容仅限用于合法授权的安全测试、教育与研究目的。请务必遵守您所在地区的法律法规,坚守职业道德底线。

3. 环境准备与核心思路

无论采用哪种方法,搭建一个钓鱼网站都离不开几个核心要素:一台服务器(用于托管网站)、一个域名(让链接看起来更可信)、钓鱼页面源码、以及一个用于接收和记录用户提交数据的后端。

3.1 服务器选择:轻量、匿名与可控

对于实验和学习,我们不需要昂贵的配置。重点考虑以下几点:

  • 成本:选择按小时或按月计费的VPS(虚拟专用服务器),初期选择最低配置(1核1G)即可完全胜任。
  • 地理位置:根据你的目标受众模拟选择,但用于学习则任意。
  • 操作系统:推荐Ubuntu 20.04/22.04 LTS或CentOS 7/8。它们资料丰富,社区支持好。本文将以Ubuntu为例。
  • 匿名性:对于合法的渗透测试,使用可追溯的真实账户和服务即可,这本身就是合规要求的一部分。切勿追求无法追溯的“匿名”服务,那通常与非法活动关联。

你可以从各大主流云服务商获取VPS。初始化后,你会获得一个公网IP地址(如123.123.123.123)和SSH登录密钥。

3.2 域名与“伪装”

一个看起来可信的域名能极大提高钓鱼成功率。在测试中,我们通常使用:

  1. 子域名:如果你拥有一个合法域名(如yourcompany.com),可以创建一个用于测试的子域名,如login.yourcompany.comsecure.yourcompany-lab.com。这是企业内最合规的做法。
  2. 相似域名(Typosquatting):注册与目标域名极其相似的域名,例如将example.com仿冒为examp1e.com(数字1代替字母l)或example-login.com请注意,出于恶意目的注册此类域名可能侵犯商标权并构成欺诈,仅可在拥有目标方明确授权的研究中使用。
  3. 免费或廉价域名:用于纯技术学习,可以注册一个无关的廉价新域名。

域名需要配置DNS解析,将你的域名(如phish-test.com)指向你服务器的公网IP地址。这个过程在域名注册商的后台完成,称为添加“A记录”。

3.3 核心架构思路

一个最简单的钓鱼网站工作流程如下:

  1. 用户访问你的钓鱼域名(如fake-login.com)。
  2. 服务器返回一个与真实网站(如real-login.com)外观一模一样的页面。
  3. 用户在页面上输入用户名和密码,点击“登录”。
  4. 表单数据被提交到你的服务器上的一个处理脚本(如login.php)。
  5. 该脚本将窃取的凭证记录到服务器上的一个文件或数据库中,同时,为了不引起用户怀疑,会透明地将用户重定向到真实的官方网站。这样用户可能只会觉得是自己输错了密码,而不会立即察觉被钓鱼。

接下来,我们将介绍三种实现上述思路的具体方法,难度从低到高,功能从简到繁。

4. 方法一:使用Social-Engineer Toolkit (SET) —— 全自动化利器

Social-Engineer Toolkit(SET)是用Python编写的开源渗透测试框架,专为社会工程学设计。它最大的优点就是高度自动化,内置了大量模板,几乎可以“一键”生成克隆网站并启动服务,非常适合快速搭建和演示。

4.1 SET的安装与初始化

在你的Ubuntu服务器上,打开终端,依次执行以下命令:

# 更新系统包列表 sudo apt-get update # 安装必要的依赖,包括Git和Python sudo apt-get install -y git python3 python3-pip # 从GitHub克隆SET仓库 git clone https://github.com/trustedsec/social-engineer-toolkit.git # 进入SET目录 cd social-engineer-toolkit # 运行SET的安装脚本,它会自动处理Python依赖 pip3 install -r requirements.txt # 或者使用Python直接安装 python3 setup.py install

安装完成后,通过python3 setoolkit命令启动SET。首次运行会有一个许可协议,输入y同意即可进入主菜单。

4.2 使用SET创建网站克隆攻击

  1. 启动与选择:在主菜单中,选择1) Social-Engineering Attacks
  2. 选择攻击向量:接着选择2) Website Attack Vectors
  3. 选择克隆方式:选择3) Credential Harvester Attack Method
  4. 选择克隆站点:选择2) Site Cloner。这是最常用的功能,它会自动克隆一个你指定的网站。
  5. 输入参数
    • 系统会询问你的公网IP地址(ifconfig命令查看),输入你服务器的IP,如123.123.123.123
    • 接着,输入你想要克隆的完整URL,例如https://www.gmail.comhttps://your-target-internal-portal.com
  6. 自动处理:SET会自动开始工作。它会尝试克隆目标网站的登录页面,并生成一个用于接收凭证的PHP脚本(index.phppost.php)。所有文件会默认放在/var/www/html/目录下。

4.3 配置Web服务器并启动

SET通常需要配合Apache运行。安装并启动Apache:

sudo apt-get install -y apache2 sudo systemctl start apache2 sudo systemctl enable apache2

由于SET生成的文件可能在/var/www/html/,你需要确保Apache有权限读取。你可以将SET生成的文件复制过去,或者直接让SET输出到该目录。更简单的方法是,在SET运行时,它会提示你服务已经启动在某个端口(如8080)。你可以使用Python的简易HTTP服务器快速启动:

# 在SET生成文件的目录下(可能是 /root/.set/reports/...) cd /path/to/generated/files python3 -m http.server 80

注意:在Linux上使用1024以下端口(如80)需要root权限,可以改用sudo python3 -m http.server 80,但更生产化的做法是配置Apache或Nginx虚拟主机。

此时,访问你的服务器IP或绑定的域名,就能看到克隆的登录页面了。用户提交的数据会被记录在服务器上的一个文本文件中(如harvester.txt)。

实操心得

  • SET的克隆并非百分百完美,对于依赖复杂JavaScript动态加载的现代单页面应用(如某些使用React/Vue的登录页),克隆效果可能不佳,只得到一个静态外壳。
  • SET生成的页面可能包含原网站的绝对链接(如指向真实官网的CSS、JS文件),这会导致页面样式错乱或行为异常。你需要手动检查页面源码,将这些链接修改为相对路径或指向你的服务器。
  • 这是最“快餐式”的方法,适合快速验证想法或进行简单的演示,但定制化程度低,容易被熟悉安全的人从页面细节上识破。

5. 方法二:手动克隆与PHP后端处理 —— 理解原理与深度定制

如果你想完全控制钓鱼页面的每一个细节,或者目标网站结构复杂,手动克隆是更可靠的选择。这种方法能让你深刻理解钓鱼网站的数据流。

5.1 前端页面克隆

  1. 保存目标页面:在浏览器中打开目标登录页(必须在授权范围内),按下Ctrl+S(Windows)或Cmd+S(Mac)将网页“另存为”到本地。选择“网页,完整”格式。你会得到一个.html文件和一个同名的资源文件夹。
  2. 分析表单结构:用文本编辑器打开保存的.html文件。找到<form>标签。关键信息包括:
    • action属性:表单提交的地址。我们需要把它改成我们自己的处理脚本,例如将action="https://real-site.com/login"改为action="login.php"
    • method属性:通常是POST
    • 输入框的name属性:如<input name="username"><input name="password">。这些name值就是我们后端脚本要接收的参数名。

5.2 编写PHP数据收集脚本

在服务器上,与你的index.html同级目录下,创建一个名为login.php的文件。

<?php // 禁用错误显示,避免暴露信息给访问者 error_reporting(0); // 获取用户提交的用户名和密码,参数名对应表单中input的name属性 $username = $_POST['username']; $password = $_POST['password']; // 获取一些额外信息,增加情报价值 $ip_address = $_SERVER['REMOTE_ADDR']; $user_agent = $_SERVER['HTTP_USER_AGENT']; $timestamp = date('Y-m-d H:i:s'); // 拼接要记录的信息 $log_entry = "时间: $timestamp | IP: $ip_address | 代理: $user_agent | 用户名: $username | 密码: $password\n"; // 指定日志文件路径 $log_file = "stolen_credentials.log"; // 将信息追加写入日志文件 file_put_contents($log_file, $log_entry, FILE_APPEND | LOCK_EX); // 为了不引起怀疑,在此处透明地将用户重定向到真实的官方网站登录页 // 请将下面的URL替换成真实的登录地址 header('Location: https://real-company.com/login'); exit(); // 确保重定向后立即停止脚本执行 ?>

5.3 部署与测试

  1. 将修改好的index.html、资源文件夹和login.php一起上传到服务器的Web目录,例如/var/www/html/phish/
  2. 确保目录权限正确,让Web服务器(如www-data用户)能够写入日志文件。
    sudo chown -R www-data:www-data /var/www/html/phish/ sudo chmod 755 /var/www/html/phish/ touch /var/www/html/phish/stolen_credentials.log sudo chown www-data:www-data /var/www/html/phish/stolen_credentials.log
  3. 通过浏览器访问你的钓鱼页面(如http://your-server-ip/phish/),尝试输入测试账号密码并提交。
  4. 检查服务器上的stolen_credentials.log文件,确认数据是否被正确记录。
    tail -f /var/www/html/phish/stolen_credentials.log

注意事项

  • SSL/TLS证书:如果克隆的是https网站,你的钓鱼站最好也配置SSL证书(可以使用Let‘s Encrypt免费获取),否则浏览器会显示“不安全”警告,警觉性高的用户会立刻离开。
  • 重定向地址login.php中的重定向地址必须准确,且最好是登录后的默认页面,这样用户体验才更“顺滑”。
  • 日志安全stolen_credentials.log文件包含了敏感数据,务必将其存放在Web目录不可直接访问的位置(如上一级目录),并通过PHP脚本的绝对路径来引用。更好的做法是直接存入数据库。

6. 方法三:使用Gophish框架 —— 企业级钓鱼演练平台

如果你需要为整个企业组织进行定期、规模化、可度量的钓鱼安全意识演练,那么手动方法就力不从心了。Gophish是一个用Go语言编写的开源钓鱼演练框架,它提供了完整的Web管理界面,可以轻松地管理目标用户群、邮件模板、钓鱼页面和查看详细的数据报表。

6.1 Gophish的安装与配置

从Gophish的GitHub Releases页面下载对应操作系统的最新版本。以Linux 64位为例:

# 下载最新版本,请替换链接中的版本号 wget https://github.com/gophish/gophish/releases/download/v0.12.1/gophish-v0.12.1-linux-64bit.zip # 解压 unzip gophish-v0.12.1-linux-64bit.zip -d gophish # 进入目录 cd gophish

修改配置文件config.json,主要关注admin_serverphish_server的监听地址。为了能从外部访问管理界面,建议将admin_serverlisten_url127.0.0.1:3333改为0.0.0.0:3333phish_server是实际托管钓鱼页面的服务,监听在80端口。

6.2 启动与初始化

  1. 启动Gophish:sudo ./gophish。注意,如果要用80端口,需要root权限。
  2. 访问管理界面:浏览器打开https://你的服务器IP:3333。首次登录使用控制台输出的默认用户名和密码(通常是admin/gophish),登录后会强制要求修改。
  3. 配置发送配置(Sending Profile):这是最关键的一步。你需要一个用于发送钓鱼邮件的SMTP服务器。可以使用公司内部的邮件服务器(需获得授权),或者使用第三方服务如Amazon SES、SendGrid等。在Gophish界面中填写SMTP服务器地址、端口、用户名(通常是邮箱地址)、密码和发件人名称。

6.3 创建一次完整的钓鱼演练

  1. 用户和用户组(Users & Groups):导入或手动添加目标邮箱地址。可以创建不同的组,用于分批次测试。
  2. 邮件模板(Email Templates):Gophish强大的地方在于可以导入原始邮件,然后通过{{.URL}}等变量插入个性化的钓鱼链接。你可以先给自己发一封真实的通知邮件,然后将邮件源码导入Gophish进行编辑,替换链接。
  3. 着陆页面(Landing Pages):这里就是配置钓鱼页面。Gophish支持直接导入你手动克隆的HTML代码(方法二中的成果),也提供了一个编辑器。你需要指定提交数据后,是将用户重定向到真实网站,还是显示一个自定义的“错误页面”。同时,要勾选“捕获提交的数据”。
  4. 创建活动(Campaign):将以上元素组合起来。选择一个邮件模板、一个着陆页面、一个用户组,并设置发送邮件的时间(立即或定时)。启动活动后,Gophish会自动发送邮件,并实时监控谁点了链接、谁提交了数据。

6.4 Gophish的优势与进阶技巧

  • 数据仪表盘:活动概览一目了然,显示发送数、打开数、点击率、数据提交率,非常适合向管理层汇报安全意识现状。
  • 批量与定时:可以轻松对成千上万的员工进行分批测试,避免一次性造成太大影响。
  • 模板变量:支持在邮件和页面中插入目标的名字、公司等变量,提高欺骗性。
  • API支持:可以通过API与其他系统(如HR系统)集成,自动同步用户列表。

常见问题与排查

  • 邮件进入垃圾箱:确保发送配置(Sending Profile)正确,发件人域名有SPF/DKIM/DMARC记录。初期可以先用小规模测试,将Gophish的发送IP添加到邮件服务的白名单。
  • 页面加载样式丢失:导入的页面如果引用外部CSS/JS,需要下载到本地并修改链接路径,或者使用Gophish的“捕获文件”功能。
  • 数据没捕获到:检查着陆页面的表单action是否指向了Gophish的捕获端点(通常是#或留空,由Gophish自动处理),并确保“捕获提交数据”选项已勾选。

7. 关键问题排查与防御视角

搭建过程中会遇到各种问题,而从防御者角度理解这些,价值更大。

7.1 搭建过程常见坑点

  1. 页面显示错乱:99%的原因是相对路径问题。克隆的页面内链接、图片、CSS、JS文件可能还是指向原始网站的绝对路径(以http:////开头)。你需要用文本编辑器的查找替换功能,将它们改为相对路径(如./css/style.css)或指向你服务器上副本的路径。
  2. 表单提交后无反应或报错
    • 检查后端脚本路径:确保HTML表单的action属性指向正确的PHP脚本路径。
    • 检查文件权限:Web服务器进程(如www-data)需要对日志文件有写入权限。
    • 检查PHP错误:在测试阶段,可以在login.php开头临时添加ini_set('display_errors', 1); error_reporting(E_ALL);来显示错误信息。
    • 检查重定向:确保header('Location: ...')函数前没有任何输出(包括空格和空行),否则会报“headers already sent”错误。
  3. 域名解析不生效:添加DNS A记录后,全球生效需要时间(TTL),通常几分钟到几小时。可以使用ping your-domain.comnslookup your-domain.com命令检查是否已指向你的服务器IP。

7.2 从防御者角度看如何识别钓鱼网站

通过亲手搭建,你应该能轻易识别出钓鱼网站的破绽:

  1. 检查URL:仔细看地址栏。是否是官方域名?是否有拼写错误?是否使用了不常见的顶级域(如.xyz,.top)?
  2. 检查连接安全性:合法的登录页面几乎都使用HTTPS(地址栏有锁形图标)。如果一个“银行”或“大公司”的登录页是HTTP,那一定是假的。但注意,钓鱼网站也可以申请SSL证书(如Let‘s Encrypt),所以有锁不代表安全。
  3. 检查页面细节:鼠标悬停在链接上,看浏览器状态栏显示的真实跳转地址是否与显示的文字相符。检查页脚版权信息、隐私政策链接是否指向官方域名。
  4. 审视邮件来源:钓鱼邮件常伪造发件人。查看邮件头信息,检查“Return-Path”、“Received”字段里的真实服务器是否与声称的发件方一致。
  5. 使用密码管理器:正规的密码管理器(如Bitwarden、1Password)通常不会在非保存过的域名上自动填充密码。如果密码管理器不自动填充,就是一个警示信号。
  6. 启用双因素认证(2FA):这是最后也是最坚固的防线。即使密码被钓,没有第二重验证因子(如手机验证码、硬件密钥),攻击者也无法登录。

7.3 日志处理与数据安全

在授权的渗透测试中,捕获的凭证数据是高度敏感的测试结果,必须妥善处理:

  • 加密存储:日志文件应加密存放,测试结束后立即从服务器上彻底删除。
  • 最小化收集:只收集测试必需的数据(如用户名、点击时间),避免收集不必要的个人信息。
  • 合规报告:测试结果仅用于生成内部安全报告,指出风险所在,并立即通知“中招”的员工进行密码修改和安全教育。绝对禁止保留或滥用这些数据。

搭建一个钓鱼网站,从技术上看并不复杂,但其背后的社会工程学原理、人性弱点利用以及由此引发的安全思考,才是更值得深究的部分。通过这次从零到一的实践,我希望你收获的不仅仅是几条命令和脚本,而是一种“攻击者思维”。这种思维能让你在设计和评估安全体系时,提前一步想到威胁可能来自哪里,从而构建起更主动、更有效的防御。记住,工具本身无善恶,全在于使用者的意图。永远将你的技能用于建设性的、合规的领域,这才是安全从业者长久发展的正道。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询