TL;DR

A single fake Office login page, and eight questions answered without leaving the browser. The kit is real and it is broken: cloned with HTTrack from a cPanel default page, careless enough to leave the whole kit as a zip on an open directory listing, and wired so the form’s field names never match what the PHP reads. By the last question you hold the mirroring tool, the credential drop mailbox, the kit’s hash, and the reason victims never get redirected.

Scenario

Phishy lab banner (blueteamlabs.online)
Phishy lab banner (blueteamlabs.online)
Original file
Phishy lab banner (blueteamlabs.online)

You have been sent a phishing link. It is your task to investigate this website and find out everything you can about the site, the actor responsible, and perform threat intelligence work on the operator(s) of the phishing site.
Warning: the website and kit you see in the lab is REAL. Exercise caution when interacting with the malicious website and do not enter any sensitive information.
From only the phishing URL, find out all you can about the person responsible and bring them to justice. Visit the following site in your lab browser (Applications - Internet - Firefox Web Browser): securedocument.net/secure/L0GIN/protected/login/portal/index1.html?1614546319649

The investigation

The decoy page and the HTTrack signature

Question (4 points). The HTML page used on securedocument.net is a decoy. Where was this webpage mirrored from, and what tool was used? (Use the first part of the tool name only)

Answer: 61.221.12.26/cgi-sys/defaultwebpage.cgi, HTTrack

How I got there. I left this question alone at the start because I did not know how to tackle it, and came back after question 4. The move that unlocks it is walking backwards through the URL while viewing the source at every level. Strip the path down to the bare domain and the root of securedocument.net is a single line: a meta refresh pointing at /cgi-sys/. Go to that path and view the source, and the first comment has the answer: Mirrored from 61.221.12.26/cgi-sys/defaultwebpage.cgi by HTTrack Website Copier/3.x.

Root of securedocument.net: a meta refresh redirecting to /cgi-sys/
Root of securedocument.net: a meta refresh redirecting to /cgi-sys/
Original file
Root of securedocument.net: a meta refresh redirecting to /cgi-sys/
Source of securedocument.net/cgi-sys/: the "Mirrored from" comment names the source IP and HTTrack
Source of securedocument.net/cgi-sys/: the "Mirrored from" comment names the source IP and HTTrack
Original file
Source of securedocument.net/cgi-sys/: the "Mirrored from" comment names the source IP and HTTrack

The background image URL

Question (3 points). What is the full URL of the background image which is on the phishing landing page?

Answer: http://securedocument.net/secure/L0GIN/protected/login/portal/axCBhIt.png

How I got there. This is where I started after skipping question 1. Developer tools on the landing page lead to the css file, and in there the background jumps out: background: url('axCBhIt.png'). To verify, I appended the file name to the URL I was already in, removing the style.css part so I would not see the whole css file again. The spreadsheet image loaded on its own, and the address bar showed the complete URL.

style.css: the background is set to axCBhIt.png
style.css: the background is set to axCBhIt.png
Original file
style.css: the background is set to axCBhIt.png
The background image opened directly, full URL in the address bar
The background image opened directly, full URL in the address bar
Original file
The background image opened directly, full URL in the address bar

The page that processes the credentials

Question (3 points). What is the name of the php page which will process the stolen credentials?

Answer: jeff.php

How I got there. Quick one. Ctrl+U on the landing page and the form tag is right there: <form action="jeff.php" method="post">. Whatever the visitor types gets posted to jeff.php, so that is the page doing the processing.

index1.html source: the form posts to jeff.php
index1.html source: the form posts to jeff.php
Original file
index1.html source: the form posts to jeff.php

The leftover kit zip and its hash

Question (3 points). What is the SHA256 of the phishing kit in ZIP format? (Provide the last 6 characters)

Answer: fa5b48

How I got there. I started walking back from the URL and viewing the source at each level, in case a forgotten zip file was lying around somewhere. One was. The directory listing above index1.html is open, and it shows 0ff1cePh1sh.zip, 40K, dated 2021-02-18. Clicking it downloads the zip from securedocument.net/secure/0ff1cePh1sh.zip, and the terminal gives the hash:

sha256sum 0ff1cePh1sh.zip
c778236fa4731411ab2f8494eb5229309713cc7ead44922b4f496a2032fa5b48  0ff1cePh1sh.zip

Last six characters: fa5b48.

Directory listing of /secure/: 0ff1cePh1sh.zip left on the server
Directory listing of /secure/: 0ff1cePh1sh.zip left on the server
Original file
Directory listing of /secure/: 0ff1cePh1sh.zip left on the server
Downloading 0ff1cePh1sh.zip from the lab browser
Downloading 0ff1cePh1sh.zip from the lab browser
Original file
Downloading 0ff1cePh1sh.zip from the lab browser
sha256sum of the kit zip, ending fa5b48
sha256sum of the kit zip, ending fa5b48
Original file
sha256sum of the kit zip, ending fa5b48

Where the credential logs go

Question (3 points). What email address is setup to receive the phishing credential logs?

Answer: boris.smets@tfl-uk.co

How I got there. I skipped question 4 for a moment and jumped here, since this one answers itself once you click through: opening jeff.php, the file from question 3, shows the PHP, and the $recipient variable holds the address that receives the stolen credentials.

jeff.php source: \$recipient = boris.smets@tfl-uk.co
jeff.php source: \$recipient = boris.smets@tfl-uk.co
Original file
jeff.php source: \$recipient = boris.smets@tfl-uk.co

The timestamp function in the URL

Question (3 points). What is the function called to produce the PHP variable which appears in the index1.html URL?

Answer: Date().getTime()

How I got there. Skipped this one and went to the next first. Coming back, I walked backwards through the URL once more. The question sounds like it wants a PHP variable or a function inside the PHP, but that is not where the answer lives: the number at the top of the link, 1614546319649, is a fresh timestamp generated on every visit. The code that assembles the URL is at view-source:http://securedocument.net/secure/L0GIN/protected/login/portal/, where a short script redirects to index1.html? plus new Date().getTime(). I first assumed PHP put that number there; the source says it is client-side JavaScript.

The redirect script: window.location='index1.html?'+new Date().getTime()
The redirect script: window.location='index1.html?'+new Date().getTime()
Original file
The redirect script: window.location='index1.html?'+new Date().getTime()

The redirect after login

Question (3 points). What is the domain of the website which should appear once credentials are entered?

Answer: office.com

How I got there. This one I answered by trying it: submit the login form with the network tab open in dev tools. The browser fires a GET to www.office.com, initiated by jeff.php. The bottom of jeff.php confirms it in code: window.location='https://www.office.com/'.

Dev tools network tab: GET www.office.com, initiated by jeff.php
Dev tools network tab: GET www.office.com, initiated by jeff.php
Original file
Dev tools network tab: GET www.office.com, initiated by jeff.php

Why the kit is broken

Question (3 points). There is an error in this phishing kit. What variable name is wrong causing the phishing site to break? (Enter any of 4 potential answers)

Answer: userrr (any of userrr, passss, user1, pass1 accepted)

How I got there. At first I did not know where to look, so I went back to the zip from question 4. Then it clicked: I had already seen the broken result, the jeff.php tab spilling raw PHP text instead of redirecting. So compare the two files. jeff.php reads $_POST['user1'] and $_POST['pass1'], while the form fields in index1.html are named userrr and passss. The names never match, the credentials arrive as empty values, and the kit breaks. Comparing both files is also how you get the four accepted answers at once.

jeff.php expects \$_POST\['user1'\] and \$_POST\['pass1'\]
jeff.php expects \$_POST\['user1'\] and \$_POST\['pass1'\]
Original file
jeff.php expects \$_POST\['user1'\] and \$_POST\['pass1'\]
index1.html form fields are named userrr and passss
index1.html form fields are named userrr and passss
Original file
index1.html form fields are named userrr and passss

What this lab really tests

Whether you read a website like an investigator or like a user. Everything here comes from two moves: view the source, and walk the URL backwards one segment at a time. The mirroring comment, the leftover zip, and the variable mismatch are all invisible unless you go looking, and that habit carries over to real phishing triage, where the kit’s source is often the only thing you get.

Skills and techniques

  • Firefox: view-source (Ctrl+U), dev tools, Network tab
  • URL path walking to surface directory listings, leftover archives, and decoy pages
  • HTTrack cloning artifacts: “Mirrored from” comments, meta refresh stubs
  • Reading a PHP credential handler: $_POST fields, $recipient, window.location
  • sha256sum to fingerprint a retrieved kit archive