GitHub RadarRed team tool
Modern Docker-based phishing framework for authorized red team engagements. 8 pixel-perfect templates (Instagram, Facebook, Netflix, Twitter/X, LinkedIn, Snapchat, Microsoft, Gmail) + Cloudflare tunnel + SQLite capture. Primary language: Python. 7 stars.
Project links:Open GitHub projectBack to radar
<p align="center"> <img src="assets/banner.svg" alt="ghostphish — modern phishing framework for authorized red team engagements" width="100%"> </p>
<p align="center"> <a href="#quick-start"><img src="https://img.shields.io/badge/status-active-brightgreen?style=flat-square" alt="Status"></a> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue?style=flat-square" alt="License: MIT"></a> <img src="https://img.shields.io/badge/python-3.11+-3776ab?style=flat-square&logo=python&logoColor=white" alt="Python 3.11+"> <img src="https://img.shields.io/badge/FastAPI-0.104-009688?style=flat-square&logo=fastapi&logoColor=white" alt="FastAPI"> <img src="https://img.shields.io/badge/docker-ready-2496ED?style=flat-square&logo=docker&logoColor=white" alt="Docker"> <img src="https://img.shields.io/badge/templates-8-ff2a3d?style=flat-square" alt="8 templates"> <img src="https://img.shields.io/badge/tunnel-cloudflared-f38020?style=flat-square&logo=cloudflare&logoColor=white" alt="Cloudflared"> </p>
A modern, Docker-based phishing framework for authorized red team engagements and security research. Ships with 8 pixel-perfect login page replicas, one-command cloudflared tunneling, and structured credential capture in SQLite.
⚠️ AUTHORIZED USE ONLY — Ghostphish is intended for penetration testers, red teamers, and security researchers operating under a signed rules-of-engagement or explicit written permission. Using this tool against systems or people you do not own or lack authorization to test is illegal in most jurisdictions.
---
Most public phishing kits ship with outdated templates that no longer match the real login pages of their targets — a giveaway to any target who is even moderately observant. Ghostphish takes a different approach:
./start.sh spins up a Cloudflare quick-tunnel and prints every phishing URL, ready to send.Links no longer die when you close your terminal or if the app crashes:
./start.sh
# → Links work immediately and stay alive FOREVER
# → Even if you close terminal, SSH disconnects, or app crashes
# → Supervisor auto-restarts failed components in background
# → Same URL stays active (no regeneration needed per crash)What changed:
./start.sh as shown in videosIf something breaks:
./diagnose.sh # Quick health check
./launch-and-maintain.sh status # Current URL + all templates
./launch-and-maintain.sh logs # Watch live logsSee `TROUBLESHOOTING.md` for complete guide.
| # | Service | Route | Style | |---|-----------|--------------|-------| | 1 | Instagram | /instagram | Dark theme, "close friends" hero, real embedded photos | | 2 | Facebook | /facebook | White bg, photo collage, "Explore the things you love." | | 3 | Netflix | /netflix | Dark hero, red wordmark, floating labels | | 4 | Twitter/X | /twitter | Black bg, huge X logo, Google/Apple SSO buttons | | 5 | Snapchat | /snapchat | Yellow header, ghost logo, minimalist form | | 6 | LinkedIn | /linkedin | Beige bg, real logo, Google/Apple SSO | | 7 | Microsoft | /microsoft | Cosmic dark bg, 2-step email→password flow | | 8 | Gmail | /gmail | Dark theme, colored G, 2-step flow, email chip |
All templates:
/facebook submit → facebook.com)<table> <tr> <td align="center" width="50%"> <img src="assets/screenshots/instagram.png" alt="Instagram — dark theme"><br> <sub><b>Instagram</b> — dark theme with "close friends" hero and embedded photo collage</sub> </td> <td align="center" width="50%"> <img src="assets/screenshots/facebook.png" alt="Facebook — Explore the things you love"><br> <sub><b>Facebook</b> — white bg, floating photo cards, real FB & Meta logos</sub> </td> </tr> <tr> <td align="center"> <img src="assets/screenshots/netflix.png" alt="Netflix — Sign In"><br> <sub><b>Netflix</b> — dark hero, red wordmark, floating labels, reCAPTCHA disclaimer</sub> </td> <td align="center"> <img src="assets/screenshots/twitter.png" alt="X (Twitter) — Sign in"><br> <sub><b>Twitter / X</b> — pure black bg, huge X logo, Google & Apple SSO</sub> </td> </tr> <tr> <td align="center"> <img src="assets/screenshots/linkedin.png" alt="LinkedIn — Sign in"><br> <sub><b>LinkedIn</b> — beige bg, real logo, Google/Apple SSO, "show" password toggle</sub> </td> <td align="center"> <img src="assets/screenshots/snapchat.png" alt="Snapchat — Log in"><br> <sub><b>Snapchat</b> — yellow header, ghost logo, minimalist form, pill button</sub> </td> </tr> <tr> <td align="center"> <img src="assets/screenshots/microsoft.png" alt="Microsoft — Sign in"><br> <sub><b>Microsoft</b> — cosmic dark bg, 2-step email→password flow, 4-square logo</sub> </td> <td align="center"> <img src="assets/screenshots/gmail.png" alt="Gmail — Sign in"><br> <sub><b>Gmail</b> — real dark theme, colored G logo, email chip on step 2</sub> </td> </tr> </table>
All screenshots taken with a 1280×800 headless Chromium against localhost. Fonts and layout match the current (2025/2026) design of each target.
┌──────────────┐ ┌───────────────┐ ┌──────────────┐
│ Target │────▶│ Cloudflare │────▶│ Docker │
│ (browser) │ │ quick-tunnel │ │ FastAPI │
└──────────────┘ └───────────────┘ └──────┬───────┘
│
▼
┌──────────────┐
│ SQLite │
│ captures.db │
└──────────────┘/submit + /admin/capturescaptures(id, timestamp, service, email, password, otp, honeypot, ip_address, user_agent, referer, attempt_number)Ghostphish detects your environment and picks the right runtime automatically:
| Platform | Runtime | Command | |----------|---------|---------| | Linux / macOS | Docker + docker-compose | ./start.sh | | Termux (Android) | Python (no Docker needed) | bash termux-setup.sh → ./start.sh | | Bare-metal / VPS without Docker | Python | ./start.sh (auto-fallback) |
Optional but recommended: cloudflared binary for public HTTPS tunneling. On Termux, termux-setup.sh installs it for you. On Linux / macOS install it explicitly so the tunnel step never fails with cloudflared not installed:
# Debian/Kali/Ubuntu (amd64)
sudo wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 \
-O /usr/local/bin/cloudflared && sudo chmod +x /usr/local/bin/cloudflared
# macOS
brew install cloudflared
# verify
cloudflared --versionARM64 host? Swap-amd64for-arm64in the URL above. Full download list: Cloudflare docs.
git clone https://github.com/Yaman-RedTeam/ghostphish.git
cd ghostphish
./start.shRun this once inside Termux:
pkg install -y git
git clone https://github.com/Yaman-RedTeam/ghostphish.git
cd ghostphish
bash termux-setup.shtermux-setup.sh installs Python, git, curl, cloudflared, and all pip deps. Then run:
./start.shstart.sh is a fully interactive CLI:
docker-compose up or uvicorn app:app)You have two launchers. Use the persistent one for real engagements — it survives your SSH/terminal session closing and auto-restarts the tunnel if cloudflared crashes, so your links stop dying mid-engagement.
Recommended — persistent supervisor (background, self-healing):
./tunnel-persistent.sh start # launch in background, print the public URL
./tunnel-persistent.sh status # show current URL + every phishing page link
./tunnel-persistent.sh url # print just the current URL (for scripts)
./tunnel-persistent.sh logs # tail the live tunnel log
./tunnel-persistent.sh stop # stop the supervisor + tunnelManual — foreground one-shot (dies on `Ctrl+C`):
./tunnel.shtunnel.shnow refuses to start a second, competing tunnel while the persistent supervisor is running — stop the supervisor first (./tunnel-persistent.sh stop) if you deliberately want the manual one.
Why cloudflared over ngrok:
⚠️ Quick-tunnel URLs are ephemeral. Every (re)start — including an auto-restart — hands out a new random*.trycloudflare.comURL. Any link you already sent dies on restart. Re-read the current one with./tunnel-persistent.sh urland re-send. For a URL that never changes you need a cloudflared named tunnel + a Cloudflare account + your own domain (see Cloudflare docs).
Nine times out of ten the app is fine and the tunnel died — the app runs in Docker on :8000 independently of cloudflared.
curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8000/health # 200 = app is UP
./tunnel-persistent.sh status # is the tunnel alive? what's the URL?
./tunnel-persistent.sh start # (re)start it if not running/tmp../tunnel-persistent.sh url../data b