Disclaimer and warning!

This is not a encouragement to abuse any commercial services. Using the services in the way described in this post is highly likely in violation of their Terms Of Service.

This is strictly and exclusively for professional red teams performing authorized security testing.
Always ensure you have the proper authorization and do you own ethical and legal considerations before performing black box phishing operations.

If you do perform phishing simulation (whitebox phishing) for clients, this is NOT things you should do. I will write another post, another time, on how to use Phishing Club for phishing simulation, none of the methods described in this post is required or should be used for that. Phishing Club is suitable for both whitebox and blackbox phishing testing. This is for blackbox (red team phishing), if in doubt, read the post about whitebox vs blackbox phishing.

What we will do

I will be using Phishing Club to perform red team phishing, where I steal cookies via. a MITM phishing campaign and use it to hijack the session.

To do this I will setup production Phishing Club from scratch on DigitalOcean and hide it behind Cloudflare using their Proxy DNS, create and run a recon campaign and a MITM phishing campaign with live notifications on my phone. For the campaigns I will create simple emails, landing pages, evasion pages and MITM proxying. The campaigns will mostly be benign examples, as I want to showcase some of the blackbox features of Phishing Club, so this is not a guide on creating a Microsoft 365 MITM configuration.

I hope you enjoy the post, connect with me on LinkedIN, X or join the Phishing Club Discord Chat.

All infrastructure used in this post has been removed.

Table of contents

Installing on DigitalOcean

Lets start off by installing Phishing Club on DigitalOcean. Almost any provider will do, so there is no special reason or advantage to using DigitalOcean for MITM phishing, I just happend to have an account, so it was a lazy choice more than anything else. Any provider with sane linux OS options will work. Phishing Club's installer uses systemd, so a distro (such as Debian) that uses it is recommended.

Lets start by creating a droplet, which is what DigitalOcean calls a cloud VM / VPS.

DigitalOcean create droplet page
DigitalOcean - Create droplet page

On the Droplets page I have choosen:

Location
Frankfurt
Operating System
Debian 13 x64
Instance Type
2 GB / 2 Intel CPUs 90 GB NVMe SSDs 3 TB transfer at $24 per month

You can select another location, operating system and a lesser instance type, this really depends on what you want to do.

Consider that when doing MITM phishing, the machine will do an outgoing connection to the server that is being proxied. This means that the login, will be performed from that location, and not the location the target is on. Most defensive systems also inspect the logs and spot unusal login activity such as login from a VPS provider or a unexpected location. Phishing Club supports using HTTP/SOCKS proxies with proxy configuration to blend in, however I will not cover that in this post.

Give the Droplet a worthy hostname and click Create Droplet

DigitalOcean create droplet page showing 'Create' button
DigitalOcean - Create droplet page

Because I am going to use Cloudflare DNS proxying, I will be unable to use DigitalOcean's own firewall rules to add additional IP access control to the admin web interface. Dont worry, if you use a private dedicate IP or private VPN, you can add this to Phishing Clubs own configuration, later on.

Now I will install Phishing Club by SSH'ing into the newly created droplet and run the one line installer from the Phishing Club repository:

curl -fsSL https://raw.githubusercontent.com/phishingclub/phishingclub/main/install.sh | bash
SSHing into the server, running the one line installer and interactive installer
Quick install using interactive installer

This will download the latest version and start a interactive installer. I have choosen the following values:

HTTP Port
80
This port is used to serving phishing domains and pages via. in TLS terminated setups. I will be doing that, but the port has to be set anyway.
HTTPS Port
443
This port is used for serving all phishing domains and pages over HTTPS.
Admin Port
8443
This port is used for the administration web interface.
Admin Host
secret.phishing.company
This is the domain I will use to host the adminstration interface
Use Auto TLS
false
I choosen false because I want to use a self-signed certificate in combination with Cloudflare Proxy
ACME email
(empty)
Email for account handling LetsEncrypt and etc, read more at CertMagic

I picked 8443 for the administration server, as Cloudflare Proxy only allows a few HTTPS ports to be proxied:

HTTPS ports supported by Cloudflare
443 2053 2083 2087 2096 8443
Ports supported by Cloudflare, but with caching disabled
2052 2053 2082 2083 2086 2087 2095 2096 8880 8443
See the list on Cloudflare

Complete the process by clicking Install.

Installer running, adding dependencies, created systemd service and outputting server details
Install complete and server details output

The installer creates a new user and group for Phishing Club, install it to /opt/phishingclub and adds a systemd unit boots up, if the server is restarted or etc.

Notice that the administrator password is output, but ignore it, because of the setup with Cloudflare there is additional configuration required, and a another password will be generated later.

Setting up Cloudflare

Many threat actors abuse Cloudflare's proxy functionality to hide their IP, benefit from Cloudflare's IP reputation and use their wildcard certificate. I will also do that but creating an account and adding domain(s) to it, I will not cover this in this post. Also I will only be using a single domain for everything. For a fully realistic and effective phishing operation, you will might need to setup multiple.

I will setup a configuration, that ensures I have full encryption between my targets and the phishing club instance: public certificates handled by Cloudflare, between the targets and Cloudflare, and self signed certificates between Cloudflare and our server.

Go to SSL/TLS and set Custom SSL/TLS to Full.

Configuring proxy TLS settings
Setting custom ssl/tls to Full

Next I setup DNS for my phishing and admin domain.
Add a A record for @ (root)
Add a A record for * (wildcard).

The first record ensures, I can place a website on the root of the domain for any curious people and bots that are looking to categorize the domain.

The second record make Cloudflare issue a wildcard certificate for *.phishing.company. This help aid in opsec, as public certificates, are public and automatically investigated by bots from both benign and malicious actors.

Configuring proxy DNS settings
Setting up DNS

With the server up and DNS proxying configured for Cloudflare, I am ready to configure and setup Phishing Club.

Configuring Phishing Club

Because Phishing Club is proxied behind Cloudflare, I need to do a bit of extra configuration.
First I must configure trusted proxies. This can not be skipped, because the administration cookies are bound to the IP of the connection logging in, and the incoming IP from Cloudflare to my server will switch between requests, which will invalidate the session and log me out. Furthermore this will ensure that the servers logs the correct IP in the admin audit log.

On the server edit /opt/phishingclub/config.json under the `ip_security.trust_proxies`, I add all of Cloudflare's CIDR's, at the moment that would be:

"173.245.48.0/20", "103.21.244.0/22", "103.22.200.0/22", "103.31.4.0/22", "141.101.64.0/18", "108.162.192.0/18", "190.93.240.0/20", "188.114.96.0/20", "197.234.240.0/22", "198.41.128.0/17", "162.158.0.0/15", "104.16.0.0/13", "104.24.0.0/14", "172.64.0.0/13", "131.0.72.0/22", "2400:cb00::/32", "2606:4700::/32", "2803:f800::/32", "2405:b500::/32", "2405:8100::/32", "2a06:98c0::/29", "2c0f:f248::/32"

And then I add the header to be trusted for forwarding the clients IP in the ip_security.trusted_ip_header by setting it to CF-Connecting-IP.

VIM open with phishing club config.json showing Cloudflare's ip ranges and trusted IP forward header
Add Cloudflares CIDR's and trusted IP forward header

I could also add my dedicated IP or private VPN IP to ip_security.admin_allowed, with this configured a visitor not from a allow listed IP, will get a 401 response when visiting the administration website.

The configuration changes require a restart of the service to take effect. When restarting Phishing Club, before completing the setup of a new admin account, it generates a new random password, so after restarting, I must get the password from the logs.

root@phishingclub:~# systemctl restart phishingclub.service
root@phishingclub:~# journalctl -u phishingclub.service -n 30 -r
			
Restarting Phishing Club via systemd and getting the password via. journalctl
Restarting Phishing Club and opening the logs to get the new admin password

Then I open the administration website, and login with username admin and the password.

Logging into the admin website of Phishing Club
Login on the admin URL with username admin and the random generated password

I then setup a new admin user. Consider using a random username and password of atleast 16 characters. Phishing Club also supports opting in for MFA or using SSO via. Microsoft.

On the next step, I will check Yes, install example templates.

Lastly I complete the setup by clicking Install.

Phishing Club is now installed and ready for use.

Phishing Club dashboard with menu pinned
New to Phishing Club? Pin the menu in the top left corner, to make it easier to navigate

Setup a decoy domain

When humans and bots visit our domain phishing.company, I want real content, that matches my domain name and places the domain in the right category.
In the menu, under Domains, click New Domain, add phishing.company and enable Self-signed certificate.

Adding and configuring a domain
Adding a decoy domain

Now I can add content to my website for the domain by clickingActions and Update page. This will open the editor, where I can add some AI slop or a nicely designed page.

Designing a decoy page
Adding content to our domain

Now when a bot or human inspects the website, it will show my nice content. Great!

Visiting the domain shows the content
Visiting the domain shows my content

However in many cases, it can be easier and more beneficial to reverse proxy and modify another website. So lets delete the domain I setup by clicking actions, Delete and Yes, Proceed in the delete modal.

Instead I will setup a reverse proxy by going to Proxies and clicking New Proxy.
I will be abusing phishing.club as a decoy domain and repurpose it a bit.

In Name I will add the name, in Start URL https://phishing.club, the Start URL will not actually be used as I will not be using the root domain in a phishing campaign, but it is required to fill.

global:
    tls:
        mode: self-signed
    access:
        mode: public
phishing.club:
    to: phishing.company
    rewrite:
        - name: change brand
          engine: regex
          find: Phishing Club
          replace: Phishing Company
          from: response_body
        - name: replace logo header
          engine: regex
          find: <img\s+class="logo[^>]*?/>
          replace: '<h1 style="color: white;text-decoration:none;">Phishing Company</h1>'
          from: response_body
        - name: replace logo footer
          engine: regex
          find: <img\s+class="footer-logo[^>]*?/>
          replace: '<h1 style="color: white;text-decoration:none;">Phishing Company</h1>'
          from: response_body
Phishing Club proxy configuration
Proxy configuration for phishing.club

You can read more about the proxy configuration in the guide but lets go over a some important things.

In the global section, which applies too all hosts, I added tls.mode: self-signed this ensures that all domains created from the configuration are setup with self signed certificates.

The access.mode: public ensures that anyone can visit the domains set in the configuration. By default access to proxied domains is denied and only allowed after visiting a lure URL.

The rest is a mapping between my domain and the proxied domain, along with a couple of content rewrite rules.

Now when I visit phishing.company, I can see it proxies phishing.club and performs the modifications I defined.

Phishing Club proxy configuration
phishing.club proxied on phishing.company with a few changes

With this out of the way, lets move on, and look at putting together a recon campaign.

Building a recon campaign

The purpose of a recon campaign is to retrieve information from the target. It is a excellent way, to find out what IP's the target could be connecting from, what bots are scanning or investigating links and etc.

To build a recon campaign, I only need to make a email and page the target can visit.

For this recon lure, I will start by creating a new subdomain.

Modal creating download.phishing.company domain
Creating the download.phishing.company domain

Instead of hosting content on the / path of the subdomain, I added a redirect to the root domain. Just in case someone or something visits the subdomain.

Next, I will upload a image to to the subdomain by clicking Assets, download.phishing.company and on New asset

I uploaded a image of a cute cat, and places it on a random path.

Cute cat
Cute lost cat

Now the image can be access and used by the url on the domain

Asset accessed via. URL
Cat image accessed via. the domain and choosen path

Now lets create a simple page that uses this asset. Go to Pages, click New Page and add the following HTML.

<!DOCTYPE html>
<html>
<body>
  <div>
    <img src="{{.BaseURL}}/2025/agivuqty/cat.jpg" width=600 />
  </div>
</body>
</html>
			
Cat page in editor
Cat page previewed in editor

Click Save and lets move on to adding an email. Click Email and New email.

I will create a very simple email.

Hi<br/><br/>
I am sorry to disturb, but have you seen my cat?<br/>
It was last seen around your property and afraid he might still be there.<br/><br/>
Here is a <a href={{.URL}}>image of him</a><br/><br/>
Cat email in editor
Cat email previewed in editor

As you might noticed, I set the Envelope From and From to dummy values. This is because I will not be sending this email via. SMTP, instead I will later send it via. a email service such as gmail or outlook manually. Phishing Club support delivery via. SMTP, API Sender (Customly defined requests), and custom delivery (do it yourself). Diving into SMTP and custom API delivery is outside the scope of this post.

Eventhough I will not be using a SMTP provider, it is still required for creating a template, so I will quickly create a Dummy SMTP template by clicking Configurations and New Configuration.

I will fill it out with dummy values as seen on this image.

SMTP config with dummy values
SMTP config with dummy values

Now I got everything I need to create a template. A template is a phishing lure with configuration that I can reuse across multiple campaigns. I will create one for the recon campaign by going to Templates and clicking New template.

For the template I will use the following values:

Name
Recon - Lost cat
Domain
download.phishing.club
SMTP Configuration
Dummy
SMTP Configuration
Dummy
Email
Lost cat
Landing
Lost cat Page
New template modal
Creating the recon tempalte

With this out the way, I am ready add some targets. Lets create 2 recipients and add them to a group. Click Recipients -> Overview and New recipient.

I added [email protected] and [email protected].

Create recipient modal
First recipient
Create recipient modal
Second recipient

Both recipients will be added to a group named VIPs by clicking Groups, New group.

Create group modal
VIPs group

Click the newly created group and click Add recipients, then add both recipients.

Add recipients to group modal
Add recipients to the group

Everything is now setup, so I will now create the recon phishing campaign.

Click Campaigns -> Overview and New Campaign. Name it Recon and select the Recon - Lost cat template.

Step 1 in create campaign modal
Name the campaign and select the recon template

Add the VIPs to the Recipient Groups.

Step 2 in create campaign modal
Select the recipients

Select Self Managed scheduling. This ensure I can deliver the lures myself, however and whenever I want.

Step 3 in create campaign modal
Mange the delivery yourself with self managed schduling

In the Miscellaneous section, check Save Browser Metadata, with this enabled extra data from a page visit is saved. Specificly the JA4 fingerprint, Sec-CH-UA-Platform header and Accept-Language header of the visitor. However with the setup where we proxy behind Cloudflare, I will not be able to read the JA4, because the JA4 will be that of Cloudflares proxy and not the recipients.

In the last step, click Create and then click on the campaign in the table afterwards, this will open the campaign page.

Lets start by delivering the a lure to one of the recipients. Go to the bottom of the campaign page and down to the Recipients Overview table. To the right of the recipient, click Actions, and select Copy email. This will copy the email I made earlier into the clipboard in rich a format. This makes it easy to paste complex HTML directly into other clients or places that support HTML.

Step 3 in create campaign modal
Mange the delivery yourself with self managed schduling

I created an Outlook email and pasted the email into it, and the clicked Send.

The recon mail pasted into Outlook
Phishing mail pasted into Outlook

The target gets the benign email and clicks the link.

Email landed in Proton inbox
Email landed in target Proton inbox
Email viewed in Proton
The target is curious about the cat and clicks the link
Recon landingpage visited - showing the page with the cat
The lost cat page has been visited

Now I have the information I wanted. By sending a couple of these recon mails, I can map out likely IP ranges, Geo IP locations, user agents and browser language. I could probably also spot if any defensive system visited the link by looking at unusal IP's, user agents or other information I do not expect from the target, and use this information in the MITM cookie capture campaign later on.

On the campaign page, I can keep an eye on the data coming on the campaign event timeline.

Campaign timeline with a hover event over the page visited event
The campaigm overview and timeline gives a quick overview of the campaign status

Go to the bottom of the page, to the Recipients overview table, and click on the recipient we sent the email. This will open a table with the recipients events. I can see that the user is on a linux platform, their browser user agent and have the language set to Danish. Useful.

Recipient events detailed
Overview of the recipients events

Lets check if the IP matches a location in our Phishing Club local geo location dataset. Expand the menu in the top by clicking the circle and clicking tools Enter the IP into the GeoIP Lookup.

GeoIP lookup shows the IP belong to the DK location
GeoIP tells of if a IP is associated to a location in our local dataset

Yes, the IP matches the geo location DK, I will use this information to create an filter for the MITM phishing campaign, so only visitors from a DK geo IP sees the real phishing page.

This concludes the recon campaign. Now I will continue and setup the MITM phishing campaign.

Conclusion

WOW, if you reached this, you either read the whole post or scrolled down to this part, in either case, thank you. I hope this post gave you some insight into some of the blackbox phishing capabilities of Phishing Club, despite the silly emails and pages. Beyond what we put together, Phishing Club does have more features and ways it can be used you might find interesting for your phishing needs, and more being developed.

If you want to try out Phishing Club, I highly recommend setting up the development environment and test everything before and after you put it into production. For the MITM part of the codebase, I am actively moving fast at times, so beware of bugs and help me by sending a DM on Discord.

Phishing Club is open source under APGL-3.0 and you can use it freely for commercial purposes, however if you modify it, you must publish the changes publicly or buy a commercial license to opt out. Support is provided on a best-effort, volunteer basis. For dedicated assistance, paid support and consulting is available.

Help me reaching more people with Phishing Club by sharing this post!