SYMBOLCOMMON_NAMEaka. SYNONYMS
win.kaolin_rat (Back to overview)

Kaolin RAT

aka: KaolinTea

Actor(s): Lazarus Group

VTCollection    

Kaolin RAT is a complex modular RAT, with Release_TMain_x64.dll as its internal DLL name.

The malware provides standard backdoor functionality, including manipulation and listing of files and processes, exchanging the configuration, collecting the victim’s system info, opening a TCP connection, and executing local commands and collecting their outputs.

Also, it is designed to execute additional DLL payloads in memory via specific exported functions:
- _DoMyFunc,
- _DoMyFunc2,
- _DoMyThread,
- _DoMyCommandWork.

Functionally, Kaolin RAT relies on an accompanying trojanized curl library to handle network and exfiltration operations, by importing functions such as:
- SendDataFromURL,
- ZipFolder,
- UnzipStr,
- curl wrappers.

For C&C communication, it employs AES encryption and attempts to evade network detection by randomly selecting words from a hardcoded custom dictionary to populate POST request parameters. The malware's name is derived from one of these dictionary words ("kaolin").

The Kaolin RAT has been observed in Lazarus campaigns as a late-stage payload — typically following loaders like RollFling, RollSling, and RollMid — and serves also as a delivery vector for the FudModule rootkit with a 0-day exploit.

References
2024-04-18AvastLuigino Camastra
From BYOVD to a 0-day: Unveiling Advanced Exploits in Cyber Recruiting Scams
FudModule Kaolin RAT
Yara Rules
[TLP:WHITE] win_kaolin_rat_auto (20260504 | Detects win.kaolin_rat.)
rule win_kaolin_rat_auto {

    meta:
        author = "Felix Bilstein - yara-signator at cocacoding dot com"
        date = "2026-05-04"
        version = "1"
        description = "Detects win.kaolin_rat."
        info = "autogenerated rule brought to you by yara-signator"
        tool = "yara-signator v0.6.0"
        signator_config = "callsandjumps;datarefs;binvalue"
        malpedia_reference = "https://malpedia.caad.fkie.fraunhofer.de/details/win.kaolin_rat"
        malpedia_rule_date = "20260422"
        malpedia_hash = "a182e35da64e6d71cb55f125c4d4225196523f14"
        malpedia_version = "20260504"
        malpedia_license = "CC BY-SA 4.0"
        malpedia_sharing = "TLP:WHITE"

    /* DISCLAIMER
     * The strings used in this rule have been automatically selected from the
     * disassembly of memory dumps and unpacked files, using YARA-Signator.
     * The code and documentation is published here:
     * https://github.com/fxb-cocacoding/yara-signator
     * As Malpedia is used as data source, please note that for a given
     * number of families, only single samples are documented.
     * This likely impacts the degree of generalization these rules will offer.
     * Take the described generation method also into consideration when you
     * apply the rules in your use cases and assign them confidence levels.
     */


    strings:
        $sequence_0 = { 4883ec20 488bd9 488bc2 488d0dc5d30200 0f57c0 488d5308 48890b }
            // n = 7, score = 100
            //   4883ec20             | mov                 ecx, dword ptr [eax]
            //   488bd9               | dec                 eax
            //   488bc2               | mov                 ebx, dword ptr [edx + 0x18]
            //   488d0dc5d30200       | lea                 eax, [ecx - 1]
            //   0f57c0               | dec                 eax
            //   488d5308             | arpl                cx, ax
            //   48890b               | dec                 eax

        $sequence_1 = { 4c8b75c8 488b75c0 4c8d4db0 4c8b7db0 4983fe10 4d0f43cf 488b0d???????? }
            // n = 7, score = 100
            //   4c8b75c8             | cmp                 dword ptr [ebp + 0x48], 0x10
            //   488b75c0             | dec                 eax
            //   4c8d4db0             | cmovae              eax, dword ptr [ebp + 0x30]
            //   4c8b7db0             | mov                 byte ptr [eax], 0
            //   4983fe10             | dec                 eax
            //   4d0f43cf             | mov                 ecx, dword ptr [eax + 0x20]
            //   488b0d????????       |                     

        $sequence_2 = { 4883f8ff 7512 ff15???????? 8bc8 e8???????? e9???????? 488d542468 }
            // n = 7, score = 100
            //   4883f8ff             | inc                 ecx
            //   7512                 | mov                 dword ptr [ecx + 0x24], eax
            //   ff15????????         |                     
            //   8bc8                 | dec                 ecx
            //   e8????????           |                     
            //   e9????????           |                     
            //   488d542468           | mov                 dword ptr [ecx + 8], edx

        $sequence_3 = { 448b05???????? 41c1e00a 48897df0 488975f8 c645e000 4c3905???????? 4c0f4205???????? }
            // n = 7, score = 100
            //   448b05????????       |                     
            //   41c1e00a             | inc                 edx
            //   48897df0             | mov                 byte ptr [edx + eax + 1], 0
            //   488975f8             | mov                 byte ptr [esp + 0x20], cl
            //   c645e000             | inc                 ecx
            //   4c3905????????       |                     
            //   4c0f4205????????     |                     

        $sequence_4 = { 48895c2408 48897c2410 8b01 488d3d3d700300 4533c0 4c8bda }
            // n = 6, score = 100
            //   48895c2408           | dec                 eax
            //   48897c2410           | cmp                 edx, 0x10
            //   8b01                 | dec                 eax
            //   488d3d3d700300       | cmovae              ebx, dword ptr [ebp - 0x18]
            //   4533c0               | dec                 eax
            //   4c8bda               | add                 ebx, ecx

        $sequence_5 = { 488b4220 48898810010000 488d0d43570300 488b4220 }
            // n = 4, score = 100
            //   488b4220             | mov                 dword ptr [eax + 0x170], ecx
            //   48898810010000       | dec                 eax
            //   488d0d43570300       | mov                 dword ptr [eax + 0x168], ecx
            //   488b4220             | dec                 eax

        $sequence_6 = { 77b9 442bc9 4183f90f 7779 428b8c8ed8bf0200 4803ce }
            // n = 6, score = 100
            //   77b9                 | dec                 ebp
            //   442bc9               | mov                 eax, esi
            //   4183f90f             | je                  0x3ef
            //   7779                 | movsx               edx, byte ptr [edi + eax]
            //   428b8c8ed8bf0200     | dec                 ebp
            //   4803ce               | mov                 eax, ebp

        $sequence_7 = { 480f43442460 66c704082e00 eb1f 48c744242001000000 4c8d0d76480300 ba01000000 488d4c2460 }
            // n = 7, score = 100
            //   480f43442460         | test                edx, edx
            //   66c704082e00         | jle                 0x1fc0
            //   eb1f                 | dec                 ecx
            //   48c744242001000000     | lea    edx, [ebx + 3]
            //   4c8d0d76480300       | nop                 dword ptr [eax]
            //   ba01000000           | movzx               eax, byte ptr [edx]
            //   488d4c2460           | inc                 esp

        $sequence_8 = { 57 4883ec20 33f6 488d1d281b0200 488d05391b0200 483bc3 481bff }
            // n = 7, score = 100
            //   57                   | add                 edx, esp
            //   4883ec20             | dec                 ecx
            //   33f6                 | mov                 ecx, edi
            //   488d1d281b0200       | dec                 ebp
            //   488d05391b0200       | add                 esi, esp
            //   483bc3               | xor                 esi, esi
            //   481bff               | test                edx, edx

        $sequence_9 = { 480f435590 488d442458 4889442420 41b93f000f00 4533c0 48c7c102000080 }
            // n = 6, score = 100
            //   480f435590           | jns                 0x132c
            //   488d442458           | inc                 ecx
            //   4889442420           | neg                 eax
            //   41b93f000f00         | nop                 dword ptr [eax + eax]
            //   4533c0               | inc                 esp
            //   48c7c102000080       | lea                 eax, [edi + 3]

    condition:
        7 of them and filesize < 581632
}
Download all Yara Rules