TL;DR

A Disney+ phishing email turns out to be one front door on a shared hosting box. This lab follows the whole path: decode the message, follow a three-hop redirect chain in Wireshark, then pull apart the credential harvester itself, stage one (identity data) and stage two (card data), from a HAR file and the raw JavaScript. The last stretch pivots from the single Disney+ page to what else the same server hosts, and it is a lot: ten more bank harvesters plus a hidden admin dashboard running on a random string instead of /admin.

Scenario

Deep Phish lab banner (blueteamlabs.online)
Deep Phish lab banner (blueteamlabs.online)
Original file
Deep Phish lab banner (blueteamlabs.online)

Dig into a phishing email and website to uncover more secrets… what will you find when digging around in network traffic and exposed JavaScript files?

The investigation

The impersonated service

Question (2 points). What online service is the email impersonating? (Format: Online Service Name)

Answer: Disney+

How I got there. We just look at the email. The message arrives dressed as a Disney+ account notice, subject “RE: Your account has been suspended”, and the display name is the giveaway.

Phishing email in Thunderbird, From "Disney+" with the display name flagged as forged
Phishing email in Thunderbird, From "Disney+" with the display name flagged as forged
Original file
Phishing email in Thunderbird, From "Disney+" with the display name flagged as forged

Sender name and real address

Question (2 points). What is the name of the sender, and what is the true sending email address? (Format: Name, mailbox@domain.tld)

Answer: Disney+, supp@agnisys.com

How I got there. To make sure we have accurate info we can open the email file in Notepad and search for “From”. The header shows the name is base64 encoded, and if we decode that we get the name Disney+ and the sender email right next to it: supp@agnisys.com.

Email source in Notepad, searching for the From header
Email source in Notepad, searching for the From header
Original file
Email source in Notepad, searching for the From header

At this point we should also note that there is a reply-to header, so any response will go back to that email.

Email source in Notepad, checking the Reply-To header
Email source in Notepad, checking the Reply-To header
Original file
Email source in Notepad, checking the Reply-To header

The targeted country

Question (2 points). To understand the phishing campaign, we should look for indicators that relate to an intended primary audience. Analyze the email content, what country are the primary targets most likely located in? (Format: Country)

Answer: Germany

How I got there. By looking at the contents of the email, especially the last section, we can see German, so we deduce that it is mostly geared towards Germany.

Email body in Thunderbird, the footer text is in German
Email body in Thunderbird, the footer text is in German
Original file
Email body in Thunderbird, the footer text is in German

The first URI

Question (2 points). What is the domain from the first URI that a HTTP GET request is sent to when clicking the link in the email? (Format: subdomains.domain.tld)

Answer: url1817.epoc.com.br

How I got there. Even though we can get the answer if we hover over the Continue button, a more reliable and safe way is to search for it in Notepad. After we have decoded the email from base64 we can search for the name of the button, and there we will find the URL.

Decoded email HTML in Notepad, the safelinks URL leading to the button target marked
Decoded email HTML in Notepad, the safelinks URL leading to the button target marked
Original file
Decoded email HTML in Notepad, the safelinks URL leading to the button target marked
Email in Thunderbird, the Continue button
Email in Thunderbird, the Continue button
Original file
Email in Thunderbird, the Continue button
CyberChef decoding the base64 body, the button URL visible
CyberChef decoding the base64 body, the button URL visible
Original file
CyberChef decoding the base64 body, the button URL visible

We can also verify that by going to the PCAP capture we have available and filtering for http.

Wireshark with filter http, the first GET goes to url1817.epoc.com.br
Wireshark with filter http, the first GET goes to url1817.epoc.com.br
Original file
Wireshark with filter http, the first GET goes to url1817.epoc.com.br

Correction. My original note said Furl1817.epoc.com.br. That leading F was a typing slip that made it into the answer line; the domain itself has no such character, and both the Notepad screenshot of the decoded HTML and the inksec.io writeup give url1817.epoc.com.br.

The response code

Question (3 points). What is the HTTP response code when accessing this first URI? (Format: XXX String)

Answer: 302 Found

How I got there. Let’s continue for now with Wireshark since it makes things easier. Right below the GET packet we have our answer: 302 Found.

Wireshark, the HTTP 302 response sitting directly under the GET
Wireshark, the HTTP 302 response sitting directly under the GET
Original file
Wireshark, the HTTP 302 response sitting directly under the GET

The open redirect

Question (2 points). What is the FIRST domain found in a specific HTTP header field related to the HTTP response code from the previous question? (Format: domain.tld)

Answer: jigsy.com

How I got there. If we open up the packet we can find the first URL that we get is jigsy.com.

Wireshark, the Location header pointing at jigsy.com/redirect.asp
Wireshark, the Location header pointing at jigsy.com/redirect.asp
Original file
Wireshark, the Location header pointing at jigsy.com/redirect.asp

The middle hop

Question (2 points). What is the destination domain that the first domain is redirecting the visitor to? (Format: domain.tld)

Answer: bedrockprop.com

How I got there. Right after the first URL that we found, it redirects us to bedrockprop.com.

The phishing site

Question (2 points). Coming to the end of the redirect chain, what is the domain of the actual phishing website currently being used by this campaign? (Format: domain.tld)

Answer: mypixar-ssl.com

How I got there. The packet right below is our final answer and the site that is doing the hosting of the phishing.

Wireshark, the HTTP GET that lands on mypixar-ssl.com
Wireshark, the HTTP GET that lands on mypixar-ssl.com
Original file
Wireshark, the HTTP GET that lands on mypixar-ssl.com

The heartbeat

Question (3 points). While browsing the website, it is requesting that the client’s browser send a ‘heartbeat’ to see if they are still connected. What is the Full Request URI for the heartbeat? (Format: http://domain.tld/path/to/something)

Answer: http://mypixar-ssl.com/user/online

How I got there. We can easily identify that in the POST request, or via the HTML code we can see in plain text from the above URL.

The heartbeat POST to /user/online
The heartbeat POST to /user/online
Original file
The heartbeat POST to /user/online

Server version and OS

Question (2 points). Investigate HTTP responses from the server. What is the server version and OS? (Format: string/x.x.xx (string))

Answer: Apache/2.4.29 (Ubuntu)

How I got there. We can go to any packet, especially a 200 OK packet, and analyse the logs.

Wireshark, the Server header on a 200 response
Wireshark, the Server header on a 200 response
Original file
Wireshark, the Server header on a 200 response

Correction. My original note said Apache/2.4.29 Ubuntu. The version is right but the format is not: the banner reports the OS inside parentheses, and the question’s format string asks for exactly that shape. Both the packet capture and the inksec.io writeup show Apache/2.4.29 (Ubuntu).

Landing page timestamp

Question (2 points). Upload the provided .HAR file to Chrome’s Developer Tools Network tab. At what time did the visitor receive a response for the GET request to retrieve the phishing site’s landing page? (Format: XXX, DD XXX YYYY HH:MM:SS GMT)

Answer: Sun, 09 Apr 2023 22:53:40 GMT By dragging and dropping the HAR file into the Network tab of Developer Tools we can open it. After we find the landing page among all the requests we can click it and view the exact date and time of its response in the Date header.

Chrome DevTools with the HAR loaded, the gg request's response headers, Date: Sun, 09 Apr 2023 22:53:40 GMT
Chrome DevTools with the HAR loaded, the gg request's response headers, Date: Sun, 09 Apr 2023 22:53:40 GMT
Original file
Chrome DevTools with the HAR loaded, the gg request's response headers, Date: Sun, 09 Apr 2023 22:53:40 GMT

Harvester stage one

Question (3 points). Identify and investigate the JavaScript file related to the first part of the credential harvester site. What information must be submitted by the visitor? (Format: string, string, string, …)

Answer: surname, name, address, dob, zipcode, city, tel

How I got there. We locate the login.js file and click preview to further analyse it. We can find the FormData() function and analyse what is in it.

The login.js request in DevTools
The login.js request in DevTools
Original file
The login.js request in DevTools
login.js source, the FormData fields
login.js source, the FormData fields
Original file
login.js source, the FormData fields

Harvester stage two

Question (3 points). Use another tool to identify and investigate the JavaScript related to the second part of the credential harvester. What information must be submitted? (Format: string, string, string)

Answer: cardNum, cvc, exp

How I got there. This one had me do some serious creative work. Since we need to analyse it with a different “tool”, let’s drop the HAR file and go to the HTML and JS files that the lab has pre-extracted for us.

The browser capture folder in File Explorer
The browser capture folder in File Explorer
Original file
The browser capture folder in File Explorer

Here we find many JS and HTML files, so in order to know where to look we go back to the HAR file and check where the original login.js is located (C:UsersBTLOTestDesktopInvestigationBrowser Capturemypixar-ssl.comjsorra).

DevTools showing the login.js request URL inside /js/orra/
DevTools showing the login.js request URL inside /js/orra/
Original file
DevTools showing the login.js request URL inside /js/orra/

After that we can see that there are not many more JS files, but there is one that immediately is suspicious to us: the credit.js file, previously not visible in the HAR file.

The orra folder in File Explorer, credit.js selected
The orra folder in File Explorer, credit.js selected
Original file
The orra folder in File Explorer, credit.js selected

After we open and analyse it we can finally deduce the answer from the code.

credit.js in Notepad, the cardNum, cvc and exp fields selected
credit.js in Notepad, the cardNum, cvc and exp fields selected
Original file
credit.js in Notepad, the cardNum, cvc and exp fields selected

The POST endpoint

Question (2 points). What endpoint does this data get POST’ed to? (Format: /something/something/something/)

Answer: /afrekenen/krediet/check/

How I got there. In the same JS file as before we can look and figure out the POST path that it is sending all the form data.

credit.js in Notepad, the POST path /afrekenen/krediet/check/ selected
credit.js in Notepad, the POST path /afrekenen/krediet/check/ selected
Original file
credit.js in Notepad, the POST path /afrekenen/krediet/check/ selected

Domain age

Question (1 point). According to the provided WHOIS report PDF for the phishing domain, how long had this domain been registered since the phishing email was received? (Format: X Days)

Answer: 41 Days

How I got there. We go and look at the original email in Thunderbird to see when it was received: 4/9/2023. Now let’s look at the WHOIS report and do the math: the domain was created on 2023-02-27, which lands 41 days before the email.

Thunderbird, the email received 4/9/2023
Thunderbird, the email received 4/9/2023
Original file
Thunderbird, the email received 4/9/2023
WHOIS record for mypixar-ssl.com, 41 days old, created 2023-02-27
WHOIS record for mypixar-ssl.com, 41 days old, created 2023-02-27
Original file
WHOIS record for mypixar-ssl.com, 41 days old, created 2023-02-27

Hosting IP and country

Question (2 points). At this time, what IP was this site hosted on, and what country is this in? (Format: x.x.x.x, country)

Answer: 213.226.123.49, Russia

How I got there. Again looking at the WHOIS report we get both answers.

WHOIS record, IP 213.226.123.49 located in Sankt-Peterburg, Russia
WHOIS record, IP 213.226.123.49 located in Sankt-Peterburg, Russia
Original file
WHOIS record, IP 213.226.123.49 located in Sankt-Peterburg, Russia

The R companies

Question (2 points). Let’s see if this website is hosting other phishing pages than just the one linked in the original email. Investigate the JavaScript files retrieved from the site. What are the names of the two companies that are being impersonated, beginning with ‘R’? (Format: Company, Company)

Answer: Rabobank, Regiobank

How I got there. To investigate that we can go back to the files. We have the clue that the companies start with “R”, so we immediately suspect and will first investigate the 2 folders that start with R.

File Explorer, the rabo and regio folders selected
File Explorer, the rabo and regio folders selected
Original file
File Explorer, the rabo and regio folders selected

Inside, the structure is very similar to the one we deduced earlier, so we open the identification.js file. There we can get info on the companies and even direct links.

identification.js in Notepad, the redirect to rabobank.nl selected
identification.js in Notepad, the redirect to rabobank.nl selected
Original file
identification.js in Notepad, the redirect to rabobank.nl selected

Counting the harvesters

Question (4 points). Excluding the original credential harvester, how many other harvesters are present on this website? (Format: Number of Harvesters)

Answer: 10

How I got there. Sadly we do have to click into every folder in the browser capture to verify if it is a credential harvester or not.

File Explorer, the ten harvester folders selected
File Explorer, the ten harvester folders selected
Original file
File Explorer, the ten harvester folders selected

The common industry

Question (2 points). What industry do all of these 10 impersonated companies have in common? (Format: Industry Name)

Answer: Bank

How I got there. They are all banking companies.

The admin dashboard

Question (4 points). Continue investigating the JavaScript. What is the URI of the site’s admin dashboard? (Format: http://domain.tld/something)

Answer: http://mypixar-ssl.com/lI1Dnoke7N

How I got there. After a lot of searching, it has been right under my nose: no normal /admin, not /dashboard, just a random string hidden in plain sight. In the login.js file there is a page that is being fetched; if we combine that with the URL that we already have we have our answer: http://mypixar-ssl.com/lI1Dnoke7N.

login.js in Notepad, the hidden page /lI1Dnoke7N selected
login.js in Notepad, the hidden page /lI1Dnoke7N selected
Original file
login.js in Notepad, the hidden page /lI1Dnoke7N selected

The dashboard template

Question (3 points). What is the name of the bootstrap template that is used for the admin dashboard? (Format: XX XXXXX X)

Answer: SB Admin 2

How I got there. For that we can open the file named sb-admin-2.min, and then we can clearly see the official template that is used.

sb-admin-2.min in Notepad, the "SB Admin 2" template header selected
sb-admin-2.min in Notepad, the "SB Admin 2" template header selected
Original file
sb-admin-2.min in Notepad, the "SB Admin 2" template header selected

What this lab really tests

Whether you can stay with one piece of infrastructure until it gives up everything. The email is the way in, but the questions keep pushing past it: packet-level redirect tracing, then HAR timelines, then raw JavaScript, then WHOIS. That is the DFIR habit worth keeping: an artifact is never just an answer, it is a pivot to the next artifact, and the case only closes when you know what else the attacker runs.

Skills and techniques

  • Email analysis: raw header reading in a text editor, RFC 2047 base64 display-name decoding, Reply-To vs From
  • CyberChef for decoding the base64 email body
  • Wireshark: http display filter, HTTP response codes, Location header, Server banner
  • Chrome DevTools: HAR import, initiator traces, response timestamps
  • JavaScript review: FormData field enumeration, fetch() endpoints, hidden admin routes
  • WHOIS pivots: domain age, hosting IP, geolocation