Gophish: Tự xây dựng hệ thống mô phỏng Phishing để kiểm tra và đào tạo bảo mật nội bộ trên Linux

Security tutorial - IT technology blog
Security tutorial - IT technology blog

Bối cảnh: Khi “tấn công thật” hiệu quả hơn slide training

Sau mấy năm làm sysadmin, mình nhận ra một sự thật khá phũ: nhân viên có thể ngồi nghe 2 tiếng về bảo mật, nhưng 2 tuần sau vẫn click vào link giả mạo gửi qua email. Training lý thuyết không đủ — người ta cần trải nghiệm thật để nhớ.

Vì lý do đó mình bắt đầu dùng Gophish — công cụ open-source để tự tổ chức phishing simulation nội bộ. Thay vì thuê dịch vụ bên ngoài tốn vài ngàn đô mỗi năm, bạn hoàn toàn có thể tự deploy và chạy campaign ngay trên VPS của công ty.

Với Gophish, bạn có thể làm được những việc khá thực dụng:

  • Tạo email phishing giả mạo có kiểm soát
  • Dựng landing page clone từ các trang login thật
  • Track ai click, ai submit form, ai chủ động báo cáo email đáng ngờ
  • Xuất báo cáo để phân tích điểm yếu theo từng phòng ban

Disclaimer: Chỉ dùng cho nội bộ, phải có văn bản cho phép từ ban lãnh đạo. Dùng ngoài phạm vi này là vi phạm pháp luật.

Cài đặt Gophish trên Linux

Yêu cầu hệ thống

  • Ubuntu 20.04+ hoặc Debian 11+ (distro nào có systemd đều được)
  • Tối thiểu 1 CPU, 1GB RAM — nhưng 2GB cho thoải mái hơn
  • Domain hoặc subdomain riêng (khuyến nghị để campaign trông thuyết phục hơn)
  • Port 3333 (admin panel), 80/443 (phishing server)

Download và cài đặt

Gophish phân phối dạng binary — không cần cài runtime hay dependency gì thêm:

# Tạo user riêng để chạy Gophish (nguyên tắc least privilege)
sudo useradd -r -s /bin/false gophish

# Tạo thư mục
sudo mkdir -p /opt/gophish
cd /opt/gophish

# Download binary (kiểm tra phiên bản mới nhất tại github.com/gophish/gophish/releases)
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
rm gophish-v0.12.1-linux-64bit.zip

# Phân quyền
sudo chown -R gophish:gophish /opt/gophish
sudo chmod +x /opt/gophish/gophish

Chỉnh config.json trước khi chạy

Mở config.json và chỉnh lại để bind đúng interface:

{
  "admin_server": {
    "listen_url": "127.0.0.1:3333",
    "use_tls": true,
    "cert_path": "gophish_admin.crt",
    "key_path": "gophish_admin.key"
  },
  "phish_server": {
    "listen_url": "0.0.0.0:80",
    "use_tls": false,
    "cert_path": "example.crt",
    "key_path": "example.key"
  },
  "db_name": "sqlite3",
  "db_path": "gophish.db"
}

Mình bind admin server vào 127.0.0.1 — chỉ truy cập được qua SSH tunnel. Không bao giờ expose admin panel ra ngoài internet. Truy cập từ máy local bằng cách tunnel qua SSH:

ssh -L 3333:127.0.0.1:3333 user@your-server-ip

Tạo systemd service

sudo nano /etc/systemd/system/gophish.service
[Unit]
Description=Gophish Phishing Framework
After=network.target

[Service]
Type=simple
User=gophish
WorkingDirectory=/opt/gophish
ExecStart=/opt/gophish/gophish
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable gophish
sudo systemctl start gophish

# Lần đầu chạy, lấy mật khẩu tạm thời từ log
sudo journalctl -u gophish | grep -i "password"

Sau khi đăng nhập lần đầu, đổi mật khẩu admin ngay. Mình thường dùng password generator tại toolcraft.app để tạo mật khẩu mạnh cho server — công cụ này 100% chạy trên trình duyệt nên không lo lộ mật khẩu qua mạng khi generate.

Cấu hình chi tiết: Dựng campaign phishing đầu tiên

1. Sending Profile — Cấu hình SMTP

Cấu hình SMTP sai là lý do số một khiến campaign thất bại ngay từ đầu — email không đến được inbox, hoặc bị lọc spam trước khi người dùng nhìn thấy. Các lựa chọn thực tế:

  • Mailgun/SendGrid: Dễ setup, có trial miễn phí, deliverability tốt
  • SMTP nội bộ: Nếu công ty có mail server riêng — email trông đáng tin cậy hơn nhiều
  • VPS + Postfix: Tự kiểm soát hoàn toàn, nhưng cần cấu hình SPF/DKIM cẩn thận tránh vào spam

Trong admin panel: Sending Profiles → New Profile

Name: Internal SMTP
Interface Type: SMTP
Host: smtp.mailgun.org:587
Username: [email protected]
Password: [SMTP password]
From: IT Security Team <[email protected]>

Click Send Test Email để verify trước khi tạo campaign thật.

2. Landing Page — Trang giả mạo

Gophish có tính năng import landing page từ URL thật — cực kỳ tiện:

  1. Vào Landing Pages → New Page
  2. Nhập URL trang login muốn giả mạo (VD: trang login Office 365 hoặc hệ thống nội bộ)
  3. Click Import Site
  4. Bật Capture Submitted DataCapture Passwords
  5. Redirect URL sau khi submit: trỏ về trang login thật để người dùng không nghi ngờ ngay

3. Email Templates

Template phải trông thuyết phục nhưng vẫn có một vài dấu hiệu để người dùng cẩn thận có thể nhận ra:

<!-- Ví dụ: giả mạo email HR thông báo xác nhận lương -->
Subject: [Quan trọng] Xác nhận thông tin lương tháng 6 trước ngày 30/06

<p>Kính gửi {{.FirstName}},</p>
<p>Phòng HR cần bạn xác nhận thông tin tài khoản để xử lý
lương tháng 6. Vui lòng đăng nhập và cập nhật trước
<strong>30/06/2026</strong>.</p>
<p><a href="{{.URL}}">Xác nhận ngay tại đây</a></p>

Gophish tự động thay {{.URL}} bằng tracking link cá nhân hóa và {{.FirstName}} từ danh sách target của bạn.

4. Users & Groups — Danh sách mục tiêu

Import danh sách nhân viên qua CSV:

First Name,Last Name,Email,Position
Nguyen,Van A,[email protected],Developer
Tran,Thi B,[email protected],Accountant
Le,Van C,[email protected],Manager

Vào Users & Groups → New Group → Upload CSV.

5. Khởi động Campaign

  1. Vào Campaigns → New Campaign
  2. Điền tên, chọn Email Template, Landing Page, Sending Profile, User Group
  3. Launch Date: Nên schedule vào sáng thứ 2 đầu tuần — mọi người mới vào làm, tâm lý còn chưa alert
  4. URL: nhập domain phishing server của bạn (http://phish.yourdomain.com)
  5. Click Launch Campaign

Kiểm tra & Monitoring kết quả

Dashboard real-time

Mở dashboard lên là thấy ngay mọi thứ diễn ra theo từng giây — từ lúc email đến inbox cho đến khi ai đó nhập mật khẩu vào trang giả mạo. Cụ thể có 5 sự kiện được theo dõi:

  • Email Sent: Email đã gửi thành công
  • Email Opened: Người dùng mở email (qua tracking pixel ẩn)
  • Clicked Link: Click vào link trong email
  • Submitted Data: Nhập thông tin vào landing page
  • Email Reported: Chủ động báo cáo email đáng ngờ

Một campaign mình từng chạy cho team ~50 người cho ra kết quả khá giật mình:

  • ~70% mở email
  • ~35% click link
  • ~20% submit form (nhập thông tin vào trang giả mạo)
  • Chỉ 3 người chủ động báo cáo email đáng ngờ

Con số này không phải ngoại lệ — theo nhiều khảo sát bảo mật doanh nghiệp, tỉ lệ click trong lần chạy đầu tiên thường rơi vào 20–40%. Đó là lý do cần làm simulation định kỳ, không phải chỉ 1 lần rồi thôi.

Pull dữ liệu qua API để phân tích sâu

# Gophish có REST API đầy đủ
curl -k -H "Authorization: Bearer YOUR_API_KEY" \
  https://127.0.0.1:3333/api/campaigns/1/results

Với JSON trả về, bạn có thể viết script Python để phân tích theo phòng ban, vị trí, hay thời điểm click trong ngày — rất có giá trị khi báo cáo lên ban lãnh đạo.

Sau campaign: Bước quan trọng nhất

Simulation chỉ có giá trị nếu có follow-up đúng cách. Sau khi campaign kết thúc:

  1. Gửi email thông báo cho toàn bộ nhân viên: đây là bài test bảo mật — ai bị dính, ai không
  2. Training ngay cho nhóm bị dính: chỉ ra đúng dấu hiệu trong email đó, không để chung chung
  3. Ghi nhận người báo cáo đúng: tạo văn hóa khen thưởng cho hành vi bảo mật tốt, quan trọng không kém việc kỷ luật
  4. Lên lịch campaign tiếp theo: lý tưởng mỗi quý 1 lần, đổi template để nhân viên không quen mặt

Kinh nghiệm thực tế: đừng cố làm template quá tinh vi ngay từ đầu. Campaign đầu tiên nên dùng template dễ nhận ra để xây baseline — sau đó mới tăng độ khó dần theo thời gian.

Bảo mật chính Gophish server

Đừng để server chạy campaign lại trở thành điểm yếu bảo mật:

# Firewall: chỉ mở port cần thiết
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Block admin panel từ ngoài
sudo ufw deny 3333/tcp
# Giới hạn SSH chỉ từ IP văn phòng
sudo ufw allow from YOUR_OFFICE_IP to any port 22
sudo ufw enable

Sau khi campaign kết thúc, tắt phishing server hoặc chuyển landing page về trang thông báo “Đây là hệ thống test bảo mật nội bộ” để tránh nhầm lẫn cho người truy cập muộn.

Share: