Reverse Engineering a Siemens Programmable Logic Controller for Funs and Vulns (CVE-2024-54089, CVE-2024-54090, & CVE-2025-40757)

Under the sweltering heat of the Hong Kong summer, we entered a looming building and kicked off what was supposed to be a simple penetration test. Little did we know, this ordeal would lead to panic-stricken emails, extra reports, and a few new CVEs.

This is a tale of the unexpected discovery of three CVEs in a Siemens logic controller, reverse engineering a bespoke architecture, and an authentication bypass obscured by proprietary file formats.

  • CVE-2024-54089 – Weak Encryption Mechanism Vulnerability in Apogee PXC and Talon TC Devices[1]
  • CVE-2024-54090 – Out-of-Bounds Read Vulnerability in Apogee PXC and Talon TC Devices[2]
  • CVE-2025-40757 – Information Disclosure Vulnerability in Apogee PXC and Talon TC Devices[3]

Background

Our story begins with a simple network penetration test. The objective was to test our client’s internal network for potential vulnerabilities which could allow an attacker to take over systems from the perimeter, affect internal systems, and/or pivot to other networks. After a bit of mundane scanning and spreadsheet wrestling, we came across a few devices marked as Operational Technology (OT).

Nessus detected BACnet devices on the network

Meet the Siemens Apogee/Talon PXC Modular – a programmable logic controller (PLC) designed to automate building controls, monitoring, and energy management. These devices are primarily used in HVAC (heating, ventilation, air conditioning) systems which may have complex requirements depending on the weather, season, and time of day.

PLCs are like the managers of a building automation system. Just as managers oversee teams, allocate resources, and report to higher ups, PLCs monitor sensor inputs, execute logic, and send alerts and telemetry back to a central system or workstation.

Corporate analogies aside, quick scans of the device revealed interesting ports: telnet, HTTP, and BACnet (UDP/47808).

Hidden in HTTP

Analysis of the HTTP server quickly revealed the presence of a path traversal bug in the HTTP server – which we later validated to be CVE-2017-9947. This 7-year-old vulnerability enables remote attackers with network access to the integrated HTTP server to obtain information on the structure of the FAT file system.

Exploitation of CVE-2017-9947 led to enumeration of the following files stored within the directory:

A few files piqued our interest, and we downloaded these with a special parameter. Upon opening 7002[.]db, we uncovered what appeared to be proprietary hex – mostly appearing unhelpful upon first glance – though housing some default credentials which may render themselves useful later…

python custom_decode_script.py 7002.db | xxd

Toying with Telnet

The telnet service was password-protected, but that would not stop us. With a bit of enumeration, we identified a user manual[4] specifying three (3) default credentials: HIGH:HIGH, MED:MED, and LOW:LOW. The first set of default credentials (HIGH:HIGH) rendered itself useless (for now), though the subsequent two default credentials enabled successful login to the Telnet service.

We’re in!

After a bit of exploration, we found we had permission to dump memory as MED!  

And here comes our first finding: what happens if we dump memory at a higher address?

Oh no! Connection lost.

Immediately, we double checked BACnet objects. Originally, over 900 objects were observed – now, only 17 remain. Needless to say, availability has gone out the window.

Current state of BACnet objects; only displaying hardware debug information.

Out of curiosity, we also tried logging into telnet as HIGH with the default password. This time, it worked!

We are HIGH! Oh no.

Let’s recap. We were initially unable to login as HIGH, but could login as MED. When we inputted a large address into the Dump Memory function, we lost the telnet connection. Further enumeration showed 99% of BACnet objects were missing, and the password for HIGH was reset.

Fast forward several months, and our discovery was formally recognized as CVE-2024-54090[5]:

A Peek at Memory and Some Déjà vu

After taking all the necessary screenshots for the first finding, we proceeded to double down on the Dump Memory function. What else could we uncover?1

We determined the memory range to be 0 to 0x03FF'FFFF, which precisely correlates with the 64MB SDRAM listed in the Technical Spec.[6] After obtaining the full dump, it’s time to see what’s inside! A simple strings (or od) operation revealed some familiar faces…

Output from od -A x -S 4 dump.bin | less. The od command will attach the memory location too; quite useful when reversing alongside another tool.

Huh, curious! These are similar to the strings we previously saw in the .db file. On a whim, we tried changing our MED password and dumping the 0xc10f99 region. And sure enough, instead of #kjD., new values appeared. Not only that, but other values around the region remain unchanged, which suggests this particular memory location is tied to the password we just changed.

At this point, we hypothesised these values to be encrypted passwords. If kjD. is our password for MED, then perhaps 1237 and f}W are the passwords for HIGH and LOW respectively? After a quick test, we confirmed f}W is likely the encrypted password for LOW. So where does that leave us with 1237?

On another whim, we tried logging in as HIGH with the password 1234, and…we’re in?! (again)

WHAT?!

In utter disbelief, we toyed around with other passwords, and well – you can see the results for yourself.

Sample plaintext/ciphertext pairs. Notice how passwords comprised solely of digits are easily guessable.

This leads us to our second finding, CVE-2024-54089[7]; a weak password encryption mechanism. At this point, it was confirmed an attacker could guess certain passwords.

In the next few sections, we will show how we discovered how to decrypt any password. We initially attempted to reverse the encryption with a black-box approach and tried our hands at differential cryptanalysis. After much deliberation and regret at not having played more cryptography-style CTF challenges, we decided it was time for a different approach.

Taking a Trip Down Memory Lane

To solidify the impact of our finding (and to properly crack the xor-based slop), we proceeded to reverse-engineer the memory dump.

Loading Memory

While strings and od can provide clues, they do so without much context. We loaded the entire 64MB memory dump into Ghidra and were greeted with this marvelous junk:

Oops, wrong endian. Let’s try loading the same file with Big Endian instead.

That’s more like it!

PowerPC supports both big and little endian, which determine the order of bytes being interpreted. If we specify the wrong endian, the disassembler cannot correctly parse instructions. Evidently, this particular PLC uses big endian.

From here, we can hunt for more vulnerabilities or dig deeper into our previous findings. For now, we’ll stick to reverse engineering the encryption algorithm. But where do we start?

libc: An Exercise in Reverse Engineering

Without symbols, standard C functions are expressed as mumbo jumbo. While these are tedious to reverse, it does help stretch our reversing brains a bit. For instance, the following function has over 600 cross-references (XREFs). If we can identify this function, we’ll have an easier time reversing other parts of code. What do you think this function is?

void FUN_008ba294(undefined *param_1, undefined *param_2, uint param_3)
{
  param_1 = param_1 + -1;
  param_2 = param_2 + -1;
  for (; param_3 != 0; param_3 = param_3 - 1) {
    param_2 = param_2 + 1;
    param_1 = param_1 + 1;
    *param_1 = *param_2;
  }
  return;
}

This is indeed memcpy. This copies param3-bytes from the memory at param2 to the memory at param1. The actual decompiled function is slightly more complicated with optimisations for copying the buffer by words (4 bytes) instead of byte-by-byte. To make our lives easier, we’ll edit the function signature with the appropriate names and types.

Here’s another function (over 1200 XREFs). What could this be?

char * FUN_008ba680(char *param_1)
{
  char cVar1;
  uint *puVar2;
  char *pcVar3;
  uint *puVar4;
  uint uVar5;
 
  uVar5 = 4U - (int)param_1 & 3;
  pcVar3 = param_1;
  while( true ) {
     if (uVar5 == 0) {
       puVar2 = (uint *)(pcVar3 + -4);
       do {
          puVar4 = puVar2;
          puVar2 = puVar4 + 1;
          uVar5 = *puVar2;
       } while ((uVar5 + 0xfefefeff & ~uVar5 & 0x80808080) == 0);
       pcVar3 = (char *)((int)puVar4 + 3);
       do {
          pcVar3 = pcVar3 + 1;
       } while (*pcVar3 != '\0');
       return pcVar3 + -(int)param_1;
     }
     cVar1 = *pcVar3;
     pcVar3 = pcVar3 + 1;
     if (cVar1 == '\0') break;
     uVar5 = uVar5 - 1;
  }
  return pcVar3 + (-1 - (int)param_1);
}

Hint: What is being returned and how is it computed?

Some lines might seem scary, but let’s work with what we observe and know:

  • param_1 operates on a char* and the null byte \0 is checked, so this is likely a string operation.
  • The return statement pcVar3 - 1 - param_1 is a good clue that the function is doing some kind of index-of or counting operation since param_1 is the start of the string. Analysing the operations, no other special operation is performed aside from incrementing pcVar3/pcVar4.
  • Hence, ignoring the weird constants in the nested while-loop, we can conclude with relative certainty this is our good friend strlen.
  • For the curious, the uVar5 + 0xfefefeff & ~uVar5 & 0x80808080 magic is some bitwise trickery to check for null bytes in a word.[8]

We continued hacking away at familiar functions before slowly, moving on to complex higher level functions.

A Note on RTOS

We tried finding the encryption function through different approaches. While noodling around, we came across the thread function running the telnet server (think: the main function / entrypoint of the thread). We were unable to drill down to our target (shakes fist – curse you indirection!), but this still posed a good opportunity to observe how the PLC works at the embedded level, and to revisit concepts of embedded software.

By correlating strings and the number 23 (the default telnet port), we determined functions relevant to socket programming.

For a bare metal system to handle multithreading, a common approach is to use an RTOS (Real-Time Operating System). The RTOS is often provided as a library/API containing threading and synchronisation primitives. It is also common to allocate space for a stack then call some create_task function with a function pointer to the entrypoint of the thread.

Once in a while, we come across interesting bits and pieces. As a side quest, we took a peek at other thread functions and uncovered the code for a debug server with a peculiar choice of port.

Our nmap scans did not reveal this port, so it is likely an artifact from internal testing. Still an interesting find though!

Uncovering the Encryption

After much trial and error, we were able to find the encryption function.

We started by again, searching for common phrases associated with login. This time we tried searching for one of the default users: HIGH. In one instance, the string was embedded among other strings such as “newPassword“, “oldPassword“, and “UserAccountPasswordReset” which suggests some kind of parsing/logging/error-handling related to password reset.

We followed XREFs to a relevant function and got our hands dirty.

Inside the reset_password function, we identified two similar code flows which operate on the old password and new password. In the screenshot below, the old password is converted to bytes and validated before being copied into the buffer at param_1 + 0x291. Later on, the same process is applied to the new password which is copied to param_1 + 0x17a.

As suspected, the code eventually calls a function on each buffer, which we confirmed performs in-place encryption – the very thing we were looking for!

The actual encryption process is rather straightforward to reverse. First, the password is converted to UPPERCASE.

It then performs multiple xor operations on the string, looping through each character. Each byte is xored with a variety of numbers. And interestingly, byte 0x2a (42) shows up multiple times. Coincidence?

Once we know the encryption process, it was trivial to reverse the decryption due to the use of xor.

For security reasons, we will not disclose the full algorithm here, but the gist is that we confirmed the algorithm is xor-based with a hard-coded key. An attacker with knowledge of the algorithm can decrypt any encrypted password on any affected device.

BAC(net) to the Future

This writeup would not be complete without a juicy OT attack. After reporting the first two vulnerabilities, we realised there was an obscure information leak hiding in plain sight…

BACnet is a building automation protocol which exposes an API to read/modify settings of a device. It typically runs on udp/47808 (0xBAC0) and is designed for lightweight and flexible communication between building controllers. We used JoelBender’s bacpypes Python library to interface with BACnet.[9] (Check out this resource to learn more about BACnet basics[10])

BACnet objects found by querying with bacpypes.

We followed this process when enumerating BACnet:

  1. Gather the Device ID. (nmap, Nessus, port scan)
  2. List objects on the device: ./samples/ReadObjectList.py
  3. Select objects and list properties: ./samples/ReadAllProperties.py

From here, we tested individual properties for read/write capability. Suffice it to say, BACnet network security hardly meets modern standards, but that is not our focus for this post.

Instead, we turn our attention to a few interesting BACnet objects specific to our targets:

Look familiar? Using a modified version of ReadWriteFile.py[11], we downloaded the files over BACnet. And surprise surprise – it holds the same contents as the .db found earlier in the HTTP server. But as we realised before, these files actually contain encrypted passwords; and since BACnet by nature does not have authentication, this means devices are susceptible to unauthenticated information disclosure. Anybody on the network can slurp out encrypted passwords. Alas, meet CVE-2025-40757:

The implications are huge! An attacker on the network could perform an authentication bypass by chaining the above issues: read the encrypted password from BACnet, decrypt/guess the plaintext, and login to telnet as a HIGH (admin) user. Even if telnet were disabled, the passwords could be used for spraying across other systems.

Once an attacker can login as HIGH, they could (conceptually) execute arbitrary assembly instructions with the built-in Write Memory feature or modify the embedded HTML to include an XSS snippet! More concerningly, they could compromise availability by tampering with device settings.

If anything, this goes to show how security by obscurity is insufficient.

Let’s Recap

TLDR;

  • We discovered MED/HIGH users can cause the affected device to enter a cold-start state, severely impacting availability. (CVE-2024-54090)
  • We reverse engineered the encryption mechanism for telnet passwords and confirmed it was xor-based. No encrypted passwords are safe. Moreover, if a password contains only digits, it is easily guessable in its encrypted form. Decryption works across affected devices due to a hard-coded key. (CVE-2024-54089)
  • We discovered an Information Disclosure vulnerability where encrypted passwords are disclosed over a BACnet file object. (CVE-2025-40757)
  • By chaining CVE-2025-40757 and CVE-2024-54089, we could perform an authentication bypass, allowing one to login as any user and tamper with the device.

Mitigations

Affected Devices:

  • Siemens APOGEE PXC Series (all versions)
  • Siemens TALON TC Series (all versions)

As of writing, no fix is planned by Siemens. The following mitigations and temporary workarounds can be applied instead:

  1. Disable telnet. According to Siemens, telnet should be disabled by default, but in our experience, it is not uncommon for site administrators to enable it for convenience. We recommend disabling telnet to mitigate these vulnerabilities.
  2. Change the default password for all accounts (HIGH, MED, LOW) even if unused. Choose strong passwords containing a mix of letters and digits.
    • Do not choose passwords comprised solely of digits.
    • Note that this does not prevent attackers with knowledge of the encryption algorithm from decrypting the passwords.
  3. Apply detective controls such as network monitoring to identify suspicious traffic.

Acknowledgements

Special thanks to Siemens ProductCERT team for coordinated disclosure. For more information on these vulnerabilities, please refer to the official advisories published by Siemens:

  • CVE-2024-54089 – Weak Encryption Mechanism Vulnerability in Apogee PXC and Talon TC Devices[12]
  • CVE-2024-54090 – Out-of-Bounds Read Vulnerability in Apogee PXC and Talon TC Devices[13]
  • CVE-2025-40757 – Information Disclosure Vulnerability in Apogee PXC and Talon TC Devices[14]

Further information

Feel free to contact us at [darklab dot cti at hk dot pwc dot com] for any further information.

  1. It is important to caveat that we did not have the firmware for this controller, nor was Ghidra MCP available at the time, so our testing was very much black box. Further, we faced several roadblocks: 1) All symbols, libc or otherwise, needed to be reversed manually. 2) Ghidra flow detection is a bit buggy with PowerPC. 3) Code may be incomplete, since it may be overwritten with data or loaded dynamically.

    Any function/variable names you see in our reversing process are a best guess based on limited information and patterns. In hindsight, our testers recognized there could have been alternative approaches taken, such as grabbing an appropriate libc.so and applying offsets, or reading up on prior research on Nucleus RTOS (which seems to be the underlying RTOS). ↩︎

Lurking Behind the Scenes: Keylogger Sites Impersonate Trusted Brokerage Firms for Account Takeover

In an era where digital security is rapidly evolving, cybercriminals are adapting just as quickly – finding new ways to exploit trust and user behaviour. Recent campaigns targeting stock trading accounts have revealed a critical truth: attackers are no longer just stealing credentials – they are orchestrating full account takeovers to commit high-impact financial fraud.

These attacks are financially motivated, aiming to take over user accounts and execute fraudulent trades for profit. This blog explores how threat actors are lurking behind the scenes – using keylogger sites that impersonate trusted brokerage firms to silently capture user input and hijack sessions. As the financial services industry continues to digitize, understanding these emerging threats is more important than ever.

The “Evil in Between” – Smishing Leads to Account Takeover

Since May 2025, Dark Lab has observed SMS phishing (“smishing”) activity impersonating various brokerage firms to target Hong Kong users. This includes the discovery of over 70 newly registered domains impersonating InteractiveBrokers via our continuous domain monitoring services. These messages are crafted to appear as legitimate communications from trusted securities brokerage firms such as InteractiveBrokers and Charles Schwab – urging users to update their tax-related form(s) (e.g., W-8BEN) to avoid service suspension.

Figure 1: Sample SMS message impersonating InteractiveBrokers

Upon clicking the link, the victim is directed to the phishing site, in this case impersonating InteractiveBrokers:

Figure 2: InteractiveBrokers Phishing Site (ibkrlogc[.]top)

The phishing site poses as an exact replica of InteractiveBroker’s login portal, deceiving the victim into trusting the site and inputting their username and password combination. It closely mimics not only the visual layout of the website, but further replicates the same login flow (e.g., provide credential, then redirected to page requesting multi-factor authentication). In some cases, the phishing site was observed to further redirect to another unrelated site impersonating InteractiveBrokers (e.g., interactivebrokers.2391[.]ltd) which we assessed was an attempt to prevent detection.  Analysis of the phishing sites revealed them to be operating as a keylogger, intended to capture and record a users’ keystrokes.

Figure 3: Keylogging functionality

When a user submits their valid username and password, the site captures the users’ keystrokes which triggers an automated process to redirect the obtained credentials to login via the legitimate InteractiveBrokers portal. However, in order to complete their login, the threat actor requires the victim to authenticate their login – via the multi-factor authentication (“MFA”) verification notification issued via the InteractiveBrokers mobile application.

To bypass MFA verification, the attacker has set up the phishing site to prompt the user to ‘verify’ their login attempt via their actual InteractiveBrokers mobile app – directly impersonating the actual InteractiveBrokers login process – after supplying their credentials. The user proceeds to check their InteractiveBrokers mobile app and subsequently clicks to verify the login, assuming the MFA  notification is intended for their login attempt – instead resulting in the threat actor’s successful login and subsequent account takeover.

Figure 4: Phishing site prompt to complete two-factor authentication
Figure 5: Multi-factor Authentication Notification on Victim Device
Figure 6: InteractiveBrokers Mobile App – Request to Authorise Login
Figure 7: Phishing Attack Diagram

A Modern Take on the Classic “Pump and Dump” Scheme?

Typically, phishing attacks are designed to harvest credentials – usernames, passwords, or even multi-factor authentication codes – which are then sold or reused for broader access. But in this case, we’re seeing a far more calculated and opportunistic approach. Instead of simply stealing login details, attackers are hijacking authenticated sessions and directly exploiting access to stock trading accounts.

Once inside, these accounts are used as tools in pump-and-dump” schemes – a form of market manipulation where attackers artificially inflate the price of low-volume stocks by placing coordinated buy orders across multiple compromised accounts. These fraudulent trades are made on the day of access close to the daily trading hour closure (e.g., close to 4:00PM HKT) – making it difficult for victims to become aware of the unauthorised trade and contact the relevant authorities in time to remediate (e.g., cancel) the transaction.  After driving up the price, they sell off their own holdings at a profit, leaving legitimate users with losses as the stock value crashes. This weaponisation of hijacked accounts marks a dangerous evolution in phishing tactics – one that blends social engineering with financial fraud at scale.

Figure 8: “Pump and Dump” Scheme at Play

Just How Widespread Is This?

While this blog focuses on the InteractiveBrokers impersonation campaign, we emphasize that this is not an isolated incident. Rather, it is part of a broader, opportunistic, and widespread attack pattern targeting various securities brokerage firms in Hong Kong.

Figure 9: Phishing sites impersonating Bright Smart Securities, Shi Rui Jin Rong, Futu Securities, Charles Schwab, Huatai Securities, SoFi
Phishing DomainBrand Impersonated
yc1113[.]comBright Smart Securities
yc1104[.]comBright Smart Securities
yc1103[.]comBright Smart Securities
yc1102[.]comBright Smart Securities
yc45742[.]comBright Smart Securities
yc46542[.]comBright Smart Securities
yc7897456151[.]comBright Smart Securities
yc94452[.]comBright Smart Securities
yc68888[.]comBright Smart Securities
yc89999[.]comBright Smart Securities
yczq2727[.]comBright Smart Securities
yczq626[.]comBright Smart Securities
yczq223[.]comBright Smart Securities
ycxha[.]shopBright Smart Securities
yccom[.]shopBright Smart Securities
yczjhk[.]comBright Smart Securities
security-center-schwab[.]23601[[.]]ripCharles Schwab
schwabhk[[.]]netCharles Schwab
guangdazq[.]vipEverBright
futubul[[.]]life/hkFutu
futunnhkg[[.]]cc/taxFutu
futunn-hkg[[.]]top/taxFutu
futubull[.]life/hkFutu
futunn-hkg[.]top/taxFutu
futu[.]it[.]com/hkFutu
futunn-hk[.]top/taxFutu
futunnl[.]sbs/hkFutu
futunn[.]sbs/taxFutu
futuhk[.]top/hkFutu
huatai8899[.]vipHuatai
huatai215[.]vipHuatai
huatai7898[.]vipHuatai
yagaskilz[.]comSoFi
webdock[.]cloudSoFi
sofi-banking[.]comSoFi
login-csx[.]pages[.]devSoFi
sofibank[.]ccSoFi
login3-ejh[.]pages[.]devSoFi
s0fi[.]onlineSoFi
sofie[.]pages[.]devSoFi
4everland[.]appSoFi
interactivebrokers[.]8148[[.]]ltdInteractiveBrokers
interactivebrokers[.]1014[.]ltdInteractiveBrokers
hk-ibkr[[.]]netInteractiveBrokers
ibkrlogc[[.]]topInteractiveBrokers
ibkr-rm[[.]]comInteractiveBrokers
interactivebrokers-hk[.]icuInteractiveBrokers
ibkrlne[.]infoInteractiveBrokers
ibkret[.]netInteractiveBrokers
ibkrbms[.]netInteractiveBrokers
hk-ibkr[.]netInteractiveBrokers
hkibkr[.]netInteractiveBrokers
ibkrhk[.]netInteractiveBrokers
interactivebrokerss[.]netInteractiveBrokers
moibkr[.]netInteractiveBrokers
ibkrsg[.]netInteractiveBrokers
ibkr-dse-gpt[.]onlineInteractiveBrokers
hk-ibkr[.]orgInteractiveBrokers
hkibkr[.]orgInteractiveBrokers
moibkr[.]orgInteractiveBrokers
ibkrsg[.]orgInteractiveBrokers
interactivebrokers-us[.]shopInteractiveBrokers
interactivebrokers-hk[.]shopInteractiveBrokers
ibkrmg[.]siteInteractiveBrokers
ibkrlni[.]siteInteractiveBrokers
ibkrlogin[.]topInteractiveBrokers
interactivebroker[.]topInteractiveBrokers
ibkrlogi[.]topInteractiveBrokers
hk-ibkr[.]topInteractiveBrokers
ibkrhk[.]topInteractiveBrokers
ibkrlogc[.]topInteractiveBrokers
ibkrlogm[.]topInteractiveBrokers
uibkr5[.]topInteractiveBrokers
ibkrloi[.]topInteractiveBrokers
5ibkr0[.]topInteractiveBrokers
ibkr-help[.]topInteractiveBrokers
ibkrlon[.]topInteractiveBrokers
interactivebrokeris[.]topInteractiveBrokers
ibkrb2[.]topInteractiveBrokers
ibkrz[.]topInteractiveBrokers
ibkrmod[.]topInteractiveBrokers
ibkrgin[.]topInteractiveBrokers
ibkr-hk[.]topInteractiveBrokers
ibkr-mbq[.]topInteractiveBrokers
ibkrmg[.]topInteractiveBrokers
ibkr-nrb[.]topInteractiveBrokers
ibkr-uec[.]topInteractiveBrokers
ibkr-yyk[.]topInteractiveBrokers
ibkr-zvx[.]topInteractiveBrokers
ibkrlni[.]topInteractiveBrokers
interactivebrokerls[.]topInteractiveBrokers
interactivebrokersss[.]topInteractiveBrokers
interactivebrokers[.]vipInteractiveBrokers
ibkrmor[.]vipInteractiveBrokers
hk-ibkr[.]xyzInteractiveBrokers
ibkr[.]xyzInteractiveBrokers
moibkr[.]xyzInteractiveBrokers
ibkr-api[.]xyzInteractiveBrokers
ibkr-mgr[.]xyzInteractiveBrokers
ndcdyn[.]interactivebrokers[.]com[.]sso-login[.]spaceInteractiveBrokers
ndcdyn[.]interactivebrokers[.]com[.]sso-login[.]inkInteractiveBrokers
ndcdyn[.]interactivebrokers[.]com[.]sso-login[.]workInteractiveBrokers
ibkrapp02[.]comInteractiveBrokers
ibkrapp07[.]comInteractiveBrokers
ibkr-global[.]orgInteractiveBrokers
ibkrmoo[.]topInteractiveBrokers
ibkrusa-a[.]topInteractiveBrokers
com-interactivebrokerseo[.]cfdInteractiveBrokers
com-interactivebrokerser[.]cfdInteractiveBrokers
com-interactivebrokersio[.]cfdInteractiveBrokers
ndcdyn[.]interactivebrokers[.]com[.]sso-login[.]clubInteractiveBrokers
ndcdyn[.]interactivebrokers[.]com[.]sso-login[.]xyzInteractiveBrokers
interactivebrokers[.]8148tdInteractiveBrokers
interactivebrokers[.]1014[.]ltdInteractiveBrokers
ibkr-rm[.]comInteractiveBrokers
ibkrmg[.]lolInteractiveBrokers
ibkrmog[.]latInteractiveBrokers
ibkrlgin[.]latInteractiveBrokers
ibkrlog[.]ccInteractiveBrokers

Conclusion

This attack highlights how modern threats rely less on breaking systems and more on bending user behaviour to the attacker’s will. By deploying keylogger sites that impersonate legitimate brokerage platforms, threat actors are silently capturing credentials and leveraging real-time user actions – such as MFA approvals – to gain full access to trading accounts.

These tactics are not isolated; similar campaigns have been observed impersonating other websites and e-commerce platforms, such as Carousell. The use of hijacked accounts in pump-and-dump schemes marks a dangerous evolution in financial cybercrime – one that blends social engineering, technical stealth, and market manipulation. As the financial services industry continues to modernize, it must invest in layered defences, phishing detection, and user education to stay ahead of these increasingly sophisticated threats. In the end, it’s not just about protecting credentials – it’s about protecting trust.

Recommendations

For Individuals

  • Be cautious with SMS links: Avoid clicking on links in unsolicited messages, especially those urging urgent action related to financial accounts.
  • Verify before you trust: Always access brokerage platforms by typing the URL directly or using a trusted app – not through links in messages.
  • Enable device-bound passkeys: Where possible, use passkeys that are tied to a specific device and require biometric verification.
  • Watch for unusual prompts: Be sceptical of unexpected MFA prompts or login verifications.
  • Monitor account activity: Set up alerts for logins, trades, and fund transfers to detect unauthorized activity early.
  • Report suspicious messages: Notify your brokerage firm if you receive suspicious communications claiming to be from them. If you attempted logon via a suspicious site, immediately change your password.

For Financial Institutions

Preventive Measures:

  • Use short-lived access tokens: Limit token lifespan (e.g., 15–30 minutes) to reduce the risk window if a token is compromised.
  • Bind tokens to client context: Associate tokens with IP address, device fingerprint, or User-Agent to prevent reuse from different environments.
  • Store tokens securely: Use HTTP-only, SameSite cookies instead of localStorage to protect against XSS and CSRF attacks.
  • Enforce secure transmission: Require HTTPS for all traffic and apply Secure and Strict-Transport-Security headers to prevent token leakage.
  • Added layer of MFA for new devices: Require an added layer of authentication (e.g., both mobile and email verification) for login attempts from new devices and/or IP addresses.
  • Trigger step-up authentication: Require re-authentication or biometric verification for high-risk actions like trading or fund transfers.
  • Take down phishing infrastructure: Work with threat intelligence providers and law enforcement to identify and dismantle phishing sites quickly.
  • Educate users on phishing tactics: Train users to recognize and report phishing attempts, especially those impersonating financial institutions.
  • Timeout limit for logon sessions: Enforce a timeout limit for each login session (e.g., 15 minutes) to minimise the window of opportunity for attackers to exploit taken over accounts.

Detective Measures:

  • Continuous Brand Reputation Monitoring: 24×7 young domain monitoring to proactively uncover potential phishing campaigns impersonating your organisation.
  • Monitor for anomalous behaviour: Detect unusual login patterns such as rapid IP switching, logins from new geographies, login attempts to multiple accounts via the same IP within a short period of time, or abnormal trading activity.
  • Maintain a token denylist: Revoke access tokens immediately when suspicious activity is detected or a session is flagged as compromised.
  • Log and audit token usage: Track token activity and integrate with SIEM systems to alert on suspicious behaviour or token reuse.

Further information

Feel free to contact us at [darklab dot cti at hk dot pwc dot com] for any further information.

Cyber Literacy in Hong Kong – a Public Good to Bridge the Talent Gap and Develop a Secure Digital Society

As the global cyber threat landscape continues to evolve, defenders will continue to play catch-up by finding ways to prevent, detect, respond and recover from cyber-attacks. However, we need to further democratize security and get citizens of all technical backgrounds more involved in order to fight back against latest threats that target both organizations and individuals alike.

The digital age has given rise to an urgent demand for cybersecurity professionals worldwide. However, this demand has surpassed the available workforce, resulting in a significant talent gap. The (ISC)² Cybersecurity Workforce Study 2022 reveals that despite a workforce of 4.7 million professionals, there are 3.4 million unfilled cybersecurity positions globally. [1] In the Asia Pacific region, where digital transformation is in full swing, the talent gap remains a concern. Nonetheless, there have been positive developments, with a 15.6% growth rate in the cybersecurity workforce. Singapore and South Korea stand out for their efforts in closing the talent gap within their countries. 

In this article, we will explore diverse cybersecurity career paths, examine the factors contributing to the closure of the talent gap in certain regions, and discuss steps Hong Kong can take to address this pressing issue. Understanding the global cybersecurity talent landscape is vital for building a stronger and more secure digital future. 

Understanding the Various Cybersecurity Roles and Responsibilities

In cybersecurity, roles are categorized using the InfoSec color wheel, which highlights the roles and responsibilities of different teams. [2] The primary roles include the Red Team (offensive security), Blue Team (defensive security, remediation and orchestration), and Yellow Team (combining security and development expertise). Collaboration between these teams leads to secondary roles: Purple Team (maximizing Red Team’s results and enhancing Blue Team capabilities), Green Team (improving code-based defense via DevSecOps), and Orange Team (increasing security awareness in software development).

To understand the tasks, competencies, skills, and knowledge associated with these roles, we can refer to frameworks such as the National Initiative for Cybersecurity Education (NICE) Framework [3] or the European Cybersecurity Skills Framework (ECSF). [4] The NICE Framework provides comprehensive insights into cybersecurity roles, including roles like Red Team Operator, Blue Team Analyst, Secure Software Assessor, and Compliance Manager. Meanwhile, the ECSF outlines competencies and knowledge domains, and encompasses roles such as Cybersecurity Engineer, Incident Responder, and Risk Manager. These frameworks serve as valuable references for individuals seeking to understand the specific responsibilities and requirements of various cybersecurity roles.

By embracing the diverse range of cybersecurity roles and promoting collaboration among them, organizations can establish a strong cybersecurity posture. This collaborative approach ensures effective defense against evolving cyber threats and enables a comprehensive security strategy.

Hong Kong’s Progress and Areas for Improvement

In recent years, Hong Kong has made notable advancements in its cybersecurity landscape. The introduction of Hong Kong Monetary Authority’s Cyber Resilience Assessment Framework (C-RAF) [5] and the Professional Development Programme (PDP) [6] has expanded the roles of red and blue teams alongside traditional compliance functions. Additionally, the adoption of public cloud technologies has driven growth in design/architect and develop/build roles, which has helped to boost the capacity and capabilities of the yellow team.

However, Hong Kong still faces challenges, particularly in building a sufficient talent pool for red and blue team roles. While Singapore boasts over 2,000 qualified candidates with credentials like CREST Registered Penetration Tester (CRT) and Offensive Security Certified Professionals (OSCP), Hong Kong has fewer than 300 qualified professionals, indicating a significant talent gap. Singapore stands out for its proactive approach to talent development. While individual licensing is not mandatory, companies offering licensable cybersecurity services must seek accreditation. [7] Furthermore, the Monetary Authority of Singapore has invested SGD 400 million in the Financial Sector Development Fund to enhance digital workforce competencies, including cybersecurity expertise. [8]

To strengthen Hong Kong’s cybersecurity workforce, it is crucial to invest in specialized training programs, foster collaborations between academia and industry, and promote recognized certifications and qualifications. Emulating Singapore’s commitment to talent development can help Hong Kong address the evolving cyber threats effectively.

How to Address the Talent Gap?

To tackle the potential problems surrounding the lack of cybersecurity talent in Hong Kong, it is crucial to ensure that the investments made are targeted and effectively utilized. While Hong Kong’s investment in cybersecurity is comparable [9], if not higher, than other regions, it is essential to focus on areas that require more talent, particularly in the primary colors of red and blue teams, rather than the traditional “white” team roles.

The talent gap in red team roles is already significant, with Singapore experiencing a tenfold gap compared to Hong Kong. To stay competitive, it is vital to nurture these talents at an early stage, even as early as secondary or tertiary education. This can only happen if the Hong Kong government recognizes the value of “ethical hacking” as a form of innovative problem-solving and includes it in educational curricula. However, it is concerning that the 2023-24 Budget page does not even mention cybersecurity, and that feels like a “missed opportunity” that should be addressed in future budgets. [10]

While demand generation efforts such as local bug bounty programs like Cyberbay [11] are valuable, they can only be fully effective with a steady supply of skilled and qualified professionals. It is crucial for the government to prioritize cybersecurity in its policies and allocate resources for the development of cybersecurity talent. By recognizing the importance of cultivating cybersecurity skills and incorporating them into educational initiatives, Hong Kong can build a robust talent pool and foster an ecosystem that supports the growth of the cybersecurity industry. This will help Hong Kong keep pace with market demands and maintain its position as a leading cybersecurity hub.

Conclusion

To support the ecosystem, we need an uplift of all talents, but in particular the red and blue teams. Those talents are severely lacking in Hong Kong as words like “hacking” are frowned upon by parents as well as the private and public sector. While demand generation such as bug bounty programs and supply programs such as Cyber Academies can help, this would not change until we either enforce the need to have such talent through law or regulation, or to have education programs that have sufficiently low barrier to entry, at least from a cost perspective, given our assessment that cybersecurity knowledge is actually a common good.

Further information

Feel free to contact us at [darklab dot cti at hk dot pwc dot com] for any further information.

You Shall Not Pass(words)

A red teamer’s perspective on what is wrong with passwords, and how to make it right

“Your passwords are weak” is one of the most common observations that we find ourselves making in our red teaming work. It is often surprising to organisations. Our clients’ passwords meet their formal complexity requirements. However, a password compliant to password policies is not necessarily a strong password. Password policies are usually designed with respect to the available compliance features in Windows. Some of these, like the 20 years old Windows’ Password Complexity, are quite updated.

In the course of one red team engagement our offensive security professionals can encounter hundreds of weak passwords. Weak passwords allow hackers to infiltrate your network and to move laterally in your environment. In this article, we draw from our offensive security experience to illustrate common misconception about passwords, and what companies should do to enforce stronger ones.

Beyond a lengthy and repetitive approach

In 2017 the NIST Special Publication SP800-63-3 introduced an interesting concept, that complexity requirements and expiry dates are not necessary, and not effective, for memorised secrets like passwords.

This was published at a time where most security control guidelines still required corporate users to use complex passwords and change them periodically, sometimes as often as every month. Instead, NIST encouraged a new approach including using multi-factor authentication solutions wherever possible and checking passwords against dictionary lists, among others.

Microsoft has since implemented some of these suggestions within the Windows platform. From our experience, however, most organisations in Hong Kong and Asia Pacific still lack a full understanding of some of these technologies to apply them effectively. The first misconception is that short passwords and PINs are weak. This is an over-simplification of how security works. The strength of a password should be assessed alongside its potential exploitation techniques.

Length does not always matter

One example is the use of Windows PINs compared to Windows domain passwords. Their requirements should be different because their potential attack vectors are as well. While hashes of Windows passwords can be downloaded and bruteforced offline, PINs cannot. Also, PINs have a much smaller attack surface compared to a domain password.

Windows domain passwords are one of the most common ways to gain access to a target network and its resources in a Windows environment. Domain passwords must be complex because attackers can abuse each one of them at different points of a corporate network. For instance, during red team engagements we can typically conduct password spraying with a standard set of user passwords within the local network and sometimes against remote applications, such as Outlook Web Access. We can also leverage Windows functionalities to obtain password hashes, via Kerberoasting or LLMNR poisoning for instance, which we can then to decrypt by cracking them offline. Strong and complex passwords would be much harder, if not impossible, to crack and would be harder to guess in a password spraying attack.

On the contrary, a Windows PIN can only be used on a single Windows machine, and an attacker can be further slowed down by introducing a delay between failed attempts.

Does a long, complex PIN make sense in this case? A 12-character, complex Windows PIN which can only be entered (and therefore attempted by the attacker) on a physical machine is unnecessary. From a red teamer point of view, a 6- to 8-character PIN is sufficient for a Windows PIN environment.

While it takes only a few hours to bruteforce a hashed 8-character Windows password offline, it takes much longer to test potential PINs on premises on a Windows machine. Also, bruteforcing PIN is not practical because the TPM Anti-Hammering protection locks a PIN attempts for 24 hours after 32 wrong attempts. This is summarised in the graph below.

Therefore a Windows PIN, or any PIN tied to hardware devices like iOS devices:

Does not require length and complexity

Does not require frequent expiry dates

Bypassing passwords

There are other authentication solutions other than passwords and PINs. Some organisations use smartcards, which seem like an elegant solution. In effect, the “PIN” that users enter would unlock the content of the smartcard, which can subsequently be used to connect to domain resources.

The problem often lies with the implementation of these solutions. In most situation, the smartcard stores a NTLM hash that is unlocked by the user’s PIN. This NTLM hash is randomly generated and complex enough for it not to be cracked into cleartext format. However, the system never changes this NTLM hash which can therefore be used directly to authenticate to Windows domain resources via pass-the-hash. If this NTLM hash is compromised, it would allow persistent access by attackers for a long time.

For us red teamers, one way to get these hashes is via Net-NTLMv1 hashes that some organisations still use. NetLMv1 can be directly converted into NTLM, which can then be used for pass-the-hash activities. This is because Net-NTLMv1 relies on 3 separate DES encryptions, which can be cracked separately back into NTLM format due to their weak encryption algorithm.

Another solution to move beyond password authentication is Windows Hello for Business. This Microsoft solution would supposedly allow businesses to move into a password-less environment. In a nutshell, a Windows Hello for Business PIN or biometric authentication would unlock the credentials (stored as certificates or keys) within the PC. We have yet to see widespread adoption Windows Hello for Business though.

Trust but verify

For those of us that must still rely on windows domain passwords, an important addition would be to introduce a password checking process. Most organisations do this via complexity requirements built-in to Windows.

As our reader may have guessed by now, complexity requirements are not enough. Consider the following “strong” passwords that meets Windows complexity policies:

  • P@ssw0rd
  • P@$$w0rd
  • Username!July
  • July!2020

From an IT security controls or compliance person, these are good passwords that meet policy requirements. From a red teamer perspective, these are all very weak passwords.

From our experience, at least 70% of all passwords within an organisation are similarly weak passwords that nonetheless comply with password policies.

The problem could be addressed by increasing the complexity required by password policies. However, this would likely increase users’ frustration while not necessarily making life harder for an attacker.

To ensure that systems are secured with stronger passwords, organisations need a solution that takes into considerations real world scenarios. Consider a password audit exercise, which checks your users’ new and existing passwords against a list of:  

  • Known passwords from leaked data breaches
  • Most commonly used passwords
  • Passwords that contain references to the organisation, username, etc.

Fortunately for Windows users, such a functionality is provided with an Azure AD subscription.

For companies that do not use Azure AD, DarkLab also offers a solution with similar functionalities that relies on password blacklists from our Threat Intelligence practice.

Whatever solutions you choose, remember the key concepts we went through:

  • Longer is not always better
  • PINs are better than passwords
  • Passwordless solutions must be correctly implemented
  • Perform a password audit by checking your passwords against a blacklist, without adding unnecessary complexity!

Feel free to contact us at [darklab dot cti at hk dot pwc dot com] for any further information.