Post

RedLine Infostealer — Malware Analysis & Threat Intelligence

RedLine Infostealer — Malware Analysis & Threat Intelligence

Executive Summary

A result of analyze a 32-bit Windows executable that functions as a multi-stage loader for a .NET credential and cryptocurrency-wallet stealer. The sample uses process hollowing against AppLaunch.exe, a legitimate signed Microsoft .NET utility, to execute its payload under the identity of a trusted binary.

The loader is built with MinGW/GCC and employs a packed outer stub with eleven PE sections and three TLS callbacks that execute before the entry point. The final payload is a ~107 KB .NET 4.0 assembly whose capabilities center on harvesting browser credentials and cookies, cryptocurrency wallet data across at least seven browser-extension wallets, and Telegram session material.

Based on our Threat Intelligence result we attributed the malware to RedLine Infostealer based on the many indicators. The tooling — an AppLaunch-hollowing crypter fronting a commodity .NET stealer — is consistent with widely-distributed crimeware sold or shared among multiple operators, and the loader and payload should be tracked as separable components.

The second stage which is the infostealler extracted during malware analysis was not found as submitted sample in VT (until this moment), but after analyze it using private submission we can see clearly that it’s associated with many RedLine info stealer.

For defenders, the highest-confidence detection opportunity is behavioral rather than static: the creation of AppLaunch.exe in a suspended state by a non-.NET parent process, followed by remote memory writes and thread resumption, is a reliable and durable signature that survives repacking of the outer stub.

Key Findings

1.1 Sample Overview

AttributeLoader (Stage 1)Payload (Stage 2)
SHA-2565b08fb68dd6eaa0fd5ad1dbe4811dc24facd42c51131e6d2ca946f39626900ea514767bb66d0595bf8d68747970e14622f92e60e1e8637af80508945f0171a90
SHA-18ab345ce69b81ffa81bc1eba13892fbae8d4bc6c50b63a6a01a0328549e0c98276c1ce252056421d
MD5692d0ae039b3f97f30761a722d3138e0edb50a13766a91ce11b63ec449f5f90d
TypePE32 executablePE32 .NET assembly (IL-only)
Size~6.9 MB virtual109,568 bytes (reconstructed)
CompilerMinGW/GCC.NET Framework v4.0.30319
Sections113 (.text, .rsrc, .reloc)
Image base0x4000000x400000
Entry point0xa15da90x1adca (managed token 0x6000047)

Technical Analysis

In this section we will dive into the malware sample more technically, in this analysis we will use multiple ways to analyze the malware behavior:

Tool kit:

  1. PeBear
  2. Floss
  3. FakeNet
  4. x32DBG
  5. dnSpy
  6. Hollowing Hunter

Threat Intelligence Platforms:

  1. Virustotal (GTI Enterprise Version)
  2. Censys
  3. Recorded Future

Stage 1 - Loader

AttributeLoader (Stage 1)
SHA-2565b08fb68dd6eaa0fd5ad1dbe4811dc24facd42c51131e6d2ca946f39626900ea
SHA-18ab345ce69b81ffa81bc1eba13892fbae8d4bc6c
MD5692d0ae039b3f97f30761a722d3138e0
TypePE32 executable
Size~6.9 MB virtual
CompilerMinGW/GCC
Sections11
Image base0x400000
Entry point0xa15da9

The file have a invalid digital signature, it’s singed primary by “ESET, spol. s r. o.” on Monday, May 23, 2022 and nested details of its countersignature (timestamp) “DigiCert Timestamp 2022 -2” as shown in the digital signature details

RedLine analysis

Static Analysis

We will start our analysis with String or floss (which I prefer) to see the content of this sample from outside then we will dig deep later on and try to understand what this sample hide:

RedLine analysis

From here we can see some catchy long base64 encoded strings and if we try to decode it we will see:

RedLine analysis

these are crypto wallets addresses in different crypto vendors such as (YoroiWallet, Tronlink, iWallet, etc.).

Also we can see readable strings wallet, Yandex, net.tcp://, base64 encoded string that i couldn’t decoded now (later we will see how to decode it):

RedLine analysis

RedLine analysis

And also an API subdomain for IP check website, which usually will used to check wither the local or remote IP if it’s working or not.

[File Information]

First thing we will notice about this malware sample are the unstandardized sections (in total 11):

RedLine analysis

And the entry point start from the customize section “(vl0=” where the malware packed as shown in DieNet this section had a high entropy:

RedLine analysis

which indicator of packing.

If moved to the Imports table we can see unclear unpacking patterns & injection too

in we will see more about this suspicious patterns in the dynamic part.

Let get into dynamic analysis.

Dynamic Analysis

In the dynamic analysis we will start with the break points, and the most interesting thing about that is the shown libraries & imports, which will find a clear pattern for unpacking/loading and injection hollowing.

Unpacking / loader chokepoints

1
2
3
4
5
6
VirtualProtect
GetProcAddress
LoadLibraryA
NtWriteVirtualMemory
VirtualAlloc
VirtualAllocEx

Injection / hollowing

1
2
3
4
CreateProcessInternalW
NtResumeThread
NtMapViewOfSection
WriteProcessMemory

so we will set a break points on all the mentioned imports pattern, that will help us through our analysis.

RedLine analysis

since we think of process hollowing let’s also open the process explorer to detect any spawning for a new process.

After many running we will know where the unpacking activity happened easily since in this sample the unpacking process takes a lot of time, after that we can see the first interesting step that malware will stop at in our analysis which is “GetProcAddress” and this api actually takes two arguments a handle to module and process name (Handle of Module, Get Procedure Address):

RedLine analysis

So let’s check the arguments panel in debugger:

RedLine analysis

Which resolving the address of VirtualProtect out of kerenel32. The more interesting is the stack panel which shows the process name clearly:

RedLine analysis

This show us clearly the target process path that the malware which to inject their malicious code into.

let’s understand how VirtualProtect works based on the official Microsoft API documentation.

RedLine analysis

Decoding the VirtualProtect(lpAddress, dwSize, flNewProtect, lpflOldProtect) args:

  • [esp] → return address (in the sample’s image — the payload/packer code calling it)
  • [esp+4]lpAddress (region being reprotected — the hollowing-code area)
  • [esp+8] → dwSize (In our case: 1918 bytes)
  • [esp+0xC]flNewProtect = PAGE_EXECUTE_READWRITE

This help us to understand that the target process which we can see in the stack is “AppLaunch.exe”. Moving forward to our next breakpoint, we will see it will stop at NtWriteVirtualMemory :

RedLine analysis

RedLine analysis

at the end of “NtWriteVirtualMemory” we can check the process hacker and we will find that “AppLanucher.exe” is already exist and be herisented from our malware:

RedLine analysis

Decoding NtWriteVirtualMemory(ProcessHandle, BaseAddress, Buffer, NumberOfBytesToWrite, *Written):

  • [esp] → return address
  • [esp+4] = 0x001A50CProcessHandle, this writes into another process (the child)
  • [esp+8] = 0x00370000BaseAddress (destination in the child)
  • [esp+0xC] = 0x01360000Buffer (source, in the parent — this is what we read)
  • [esp+0x10] = 0x00020000 → Size of bytes to write (this is the area that the malware allocate to write into in the target process)

We can see the handle and destination in the target process (later on this will help us to define the area that the malware live in the target process).

Also if we want to check the source and destination now to see the malware that will be injected we can check the address of

  1. [esp+0xC] ” for the source
  2. [esp+8]” for the destination

Source:

RedLine analysis

Destination:

RedLine analysis

In the source we can see clearly the “MZ” which is the well known magic byte for the Portable Executable beside of the DOS message and we can know that this is a executable code.

NOTE: it’s not recommended to export the executable at this stage otherwise you will face an issue with padding since the virtual size is different from the real image size, in our case it’s 0x20000 as we saw in the previous function at [esp+0x10] , and the problem is the null byte is between different areas so this is not the real malware size.

we can also reach to the area in the debugger through “Memory Map”:

RedLine analysis

As we can see it’s located at “0x01360000” with size “0x00020000” with permission ERW (Execution, Read, Write).

Network Analysis

before we move on I stopped here to run “Fakenet” which is a tool emulate DNS server to detect any network traffic interaction, so before the malware executed we can see any network activity the malware do:

RedLine analysis

After we establish our “fake” DNS server we can move on in the debugger and see suspicious network connections from the malware sample toward the IP “62.204.41[.]163” on port “137”:

RedLine analysis

And if we have check the properties from process hacker (TCP/IP), we can see the local address for our VM, and remote address that the malware try to reach to:

RedLine analysis

Extract the malware core

In this step we will use “Hollowing Hunter” tool to detect and extract the malware sample from the target process “AppLanch.exe”:

RedLine analysis

RedLine analysis

RedLine analysis

NOTE: I have tried to extract the sample in two ways: -

  1. During debugging “Dump_from_x32dbg.bin” and the size is 128KB.
  2. Using Hollowing Hunter “370000.AppLaunch.exe” and the size is 107KB.

Why this different when the samples are the exact same but extracted in different time?

The answer is mentioned in the previous note, but i want to add the key concept to understand this matter which is the virtual memory, we need to understand that there is a different between Virtual Size and Image Size, during the process execution in the memory it deal with the virtual addresses which is bigger, so if we try to extract the malware at this stage we need to deal with the “padding” and The padding isn’t only at the end. It’s between sections too. so we can’t just see how much is the virtual size and the image size and make a simple calculation with (A-B=C).

Can we dump the sample during debugging?

Yes of course, we can but we need to take in our consideration the points that we mentioned before, and do small anatomy process to extract the pure malware sample. (maybe we will do it later in another article)

However, if we check the sample with any static analysis tool we can see clearly it’s “.NET” file. So what is the best than dnspy to handle it, let’s open it and see what this sample try to hide:

RedLine analysis

First thing we can notice that the name of the sample is “Gruntling” which is the given name by the malware author.

RedLine analysis

On the side we can see in a plain text the name of the functions and most of them contains some well known VPN’s executable names such as (ProtonVPN, OpenVPN, NordApp) also Discord.

After play around with these functions, one of them was very interesting one which is “Arguments” and it contains (IP, ID, Key) and blank message, and from the context we can see base64 encoded string we tried to decode before in first step:

RedLine analysis

RedLine analysis

But it didn’t work, so i was thinking, wait we have a key, let’s try something simple like “XOR” for example and add the key:

RedLine analysis

And another base64 appear, so let’s add another base64 in cyberchef:

RedLine analysis

RedLine analysis

here we go, this is the same IP that the malware tried to connect to during execution and we detect that using “fakenet”.

I used the same to the ID to see what it contains and we found “fhac3254” which is appear to be the ID of the malware sample since most of these malware used in MaaS market:

RedLine analysis

Another interesting function was “BrEx” which contains array with base64 encoded string which is the one we saw before during the first step (contains wallets addresses):

RedLine analysis

Until this point I will stop the investigation since RedLine is well known infostealer it collect credential, wallets, , etc. and we all know RedLine capabilities, but one thing before we go, let’s check the dumped sample in Virustotal and see the result

I have used the private scan feature (only exist in enterprise version) to ensure that the sample doesn’t shown publicly (in case it’s not submitted before):

RedLine analysis

As we can see the file wasn’t submitted before, so it’s and from the detection page it matched with a lot of “RedLine” YARA rules:

RedLine analysis

from the network information, we can see the connection that was able to spot which is to the IP (62.204.41[.]163) with 15 detection and port 33457 and country HK categorized as C2.

From the lookup overview breakdown by region, we can identify that this sample speared in US, China, and South Korea in the first place.

RedLine analysis

also it connect with 157 other malware samples most of them also a redline, if we want to dig deep we can start check these samples and identify the other indicators that connect them together which will give us the capabilities to uncover more information about the attacker.

In URL section we can identify some of malicious DLL files downloaded from the attacker infra, which I assume it used in “DLL-Sideloading” attacks.

RedLine analysis

Summary

RedLine infostealer is well known type of malware, but still a lot of their core sample such as the one in our case, avoid the detection by hiding them self in benign software, which make these kind of samples very efficient to reused later on embedded into other benign software’s and the cycle keep moving.

MITRE ATT&CK Mapping

TacticTechniqueIDEvidence
Defense EvasionProcess HollowingT1055.012AppLaunch.exe suspended creation, remote write, resume
Defense EvasionObfuscated Files or InformationT1027Packed loader, string interleaving, AES-GCM config
Defense EvasionSystem Binary Proxy ExecutionT1218Execution under signed Microsoft binary
DiscoverySystem Information DiscoveryT1082GetWindowsVersion, AvailableLanguages
DiscoverySystem Network Configuration DiscoveryT1016GetDefaultIPv4Address, api.ip.sb
DiscoverySoftware DiscoveryT1518ListOfPrograms
DiscoveryDomain Trust DiscoveryT1482DomainExists
Credential AccessCredentials from Web BrowsersT1555.003Login Data, cookies.sqlite
Credential AccessSteal Web Session CookieT1539Cookies, Extension Cookies
CollectionData from Local SystemT1005Telegram tdata, *wallet*
ExfiltrationExfiltration Over C2 ChannelT1041WCF NetTcp transport

Detection & IOC’s

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
title: AppLaunch.exe Spawned by Non-Microsoft Parent
status: experimental
description: >
  Detects AppLaunch.exe created by a parent that is not a legitimate .NET
  build or deployment process. AppLaunch.exe is a common process hollowing
  target because it is Microsoft-signed and performs minimal work of its own.
references:
author: Mohammad Alattas
date: 28/08/202
tags:
  - attack.defense_evasion
  - attack.t1055.012   # Process Hollowing
  - attack.t1218       # Signed Binary Proxy Execution
logsource:
  category: process_creation
  product: windows
detection:
  selection:
    Image|endswith: '\AppLaunch.exe'
  filter_legit:
    ParentImage|endswith:
      - '\msbuild.exe'
      - '\devenv.exe'
      - '\mscorsvw.exe'
      - '\ngen.exe'
  filter_syspaths:
    ParentImage|startswith:
      - 'C:\Program Files\Microsoft Visual Studio\'
      - 'C:\Windows\Microsoft.NET\'
  condition: selection and not 1 of filter_*
falsepositives:
  - Legitimate .NET application deployment in developer environments
  - Custom build tooling invoking AppLaunch directly
level: high
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
title: Crypto Wallet Extension Directory Access by Non-Browser Process
status: experimental
description: >
  Detects access to cryptocurrency wallet browser extension storage by a
  process that is not the parent browser, consistent with infostealer
  collection activity.
author: Mohammad Alattas
date: 28/08/2026
tags:
  - attack.collection
  - attack.t1555.003   # Credentials from Web Browsers
logsource:
  category: file_access
  product: windows
detection:
  selection:
    TargetFilename|contains:
      - 'nkbihfbeogaeaoehlefnkodbefgpgknn'   # Metamask
      - 'fhbohimaelbohpjbbldcngcnapndodjp'   # Binance
      - 'hnfanknocfeofbddgcijnmhnfnkdnaad'   # Coinbase
      - 'ibnejdfjmmkpcnlpebklmnkoeoihofec'   # Tronlink
  filter_browsers:
    Image|endswith:
      - '\chrome.exe'
      - '\msedge.exe'
      - '\brave.exe'
      - '\opera.exe'
      - '\firefox.exe'
  condition: selection and not filter_browsers
falsepositives:
  - Browser profile backup and sync utilities
  - Endpoint DLP agents performing content inspection
level: high
This post is licensed under CC BY 4.0 by the author.