624f52cc31cd7ae5a311c9800b619386c9fd1a45af11b4e852391699ce36d3d8acrstealer: 624f52cc — Seventh signed sibling, module yCJjClxMaPcdOeL, static C2 absent
Executive Summary
Signed Go 1.26.2 PE32 executable, seventh confirmed sibling in the acrstealer cluster. Shares the me.muz.li / R13 Authenticode certificate chain and Go build ID pattern with six prior siblings, but introduces a new randomized module path (yCJjClxMaPcdOeL) and notably contains no hardcoded C2 IP or domain in static strings — unlike siblings 6871848b, c577c6c8, 16a4344d, d5655568, 1bfebf79, f93d8d79. CAPE detonation was unavailable (no Windows guest); behavior must be inferred from static structure and family knowledge.
What It Is
- Format: PE32 executable (GUI) Intel 80386, 7 sections, 2.56 MB ^[file.txt]
- Linker: Go 1.26.2,
GOARCH=386,GOOS=windows,CGO_ENABLED=0,-trimpath=true^[strings.txt:1673] ^[strings.txt:1675] - Go build ID:
YK-5mEjbS1w6cBJ47f5b/UCbaZ8h_8dz47nNQVBGX/tWecTUh9g0uq1LrKjv61/iGLFkKwyThCAEr7kuY2l^[strings.txt:8] - Module path:
yCJjClxMaPcdOeL(randomized) ^[strings.txt:1675] ^[strings.txt:6329] - Signing: Authenticode PKCS#7 certificate at raw offset
0x28FE08, size 2176 bytes ^[pefile.txt] ^[binwalk.txt]. Extracted cert: CN=me.muz.li, issuer=R13, valid 2026-05-07 to 2026-08-05 ^[cert.txt] - Sections: Standard Go PE layout —
.text(entropy 6.19),.rdata(7.30),.data,.idata,.reloc,.symtab(symbols present, not stripped),.rsrc(icons present, masquerade intact) ^[pefile.txt]
How It Works
Build / RE
The binary follows the documented golang-stealer-build-pattern with no toolchain deviation from prior siblings:
- Randomized
mainpackage function names (ssahuuggyuorgtw,ecppzih,kixdozthdxgft,rfjkbjeootysv,spsylhv,mectji,Lsqccdjshwxkrqt,sgpcqftnptrtiyx,avblzdavuo,hplrkrbyb,acxqzbqyfhjjpqi,fawqezqxezytt,thzilsldj,linwylufv,ahdfwhrrcrca,bmzxsogevuc,hcinhqctaysk,crpvgsvjpkwvm,qzezlypwabov,hmzyvqq,wcxulejijzlp,mtcobugeag,ifauedgo,rntbmkdslv) ^[r2:sym.main.ssahuuggyuorgtw] ^[r2:sym.main.rntbmkdslv] .rsrcsection contains multiple icons up to 256×256 PNG (rich icon set for social-engineering masquerade as "Pro Setup") ^[pefile.txt] ^[binwalk.txt].symtabsection present (not stripped) — contains full Go runtime symbols and type information ^[pefile.txt]- No external packer, no anti-debug VM checks in static strings. Standard Go runtime
math/rand,crypto/tls, andnet/httplinked. - Certificate chain identical to siblings
6871848b,c577c6c8,16a4344d,d5655568,1bfebf79,f93d8d79^[cert.txt]
Deploy / ATT&CK
Static-only inference — CAPE unavailable (no Windows guest) ^[dynamic-analysis.md].
From decompiled main.main at 0x49a540 ^[r2:sym.main.main]:
- Pseudo-random seeding: Reads current time, mixes with constants (
0xd7b17f80,0xd,0x3b9aca00), seedsmath/randRNG ^[r2:sym.main.main] - Intn calls: Generates two random integers (
Intn(0x1868f)≈ 100k,Intn(0x320)= 800) — likely used for C2 domain generation or payload path randomization ^[r2:sym.main.main] hcinhqctaysk: Performsmath.Sinand floating-point transform on RNG output — consistent with PRNG-based string/key decoding observed in prior siblings ^[r2:sym.main.hcinhqctaysk]rntbmkdslv: Orchestrator function callingrfjkbjeootysv→sgpcqftnptrtiyx→ssahuuggyuorgtw. The latter resolves Windows APIs viasyscall._LazyProc_.Callusing a concatenated string of API names (Go runtime lazy-loading pattern) ^[r2:sym.main.rntbmkdslv] ^[r2:sym.main.ssahuuggyuorgtw]
Notable absence: No static C2 strings (IP or domain) in the binary. This is a departure from siblings 6871848b–1bfebf79, which embedded 5.252.155.72, laserlogdnsop.icu, hertzfigblob.icu. C2 is likely runtime-decoded using the PRNG output, or fetched from an external source (e.g., a short-lived domain or IP list decoded/updated post-deployment). This is an opsec improvement.
Mapped TTPs (inferred from static + family knowledge):
- T1564.003 — Hide Artifacts: Masquerades as legitimate "Pro Setup" installer via rich icon resources ^[pefile.txt]
- T1071.001 — Application Layer Protocol: Web (TLS/HTTPS) inferred from
crypto/tls+net/httplinkage ^[strings.txt] - T1027 — Obfuscated Files or Information: PRNG-based string decoding (no hardcoded C2) ^[r2:sym.main.main]
- T1552.001 — Credentials In Files: Family-known browser credential theft (no static confirmation in this sample, but consistent with cluster)
Decompiled Behavior
Radare2 decompilation of main.main (0x49a540) reveals the entry flow:
- Seed
math/randwith time-derived 64-bit value - Call
Intntwice to generate runtime parameters - Pass result through
hcinhqctaysk(trigonometric transform) - Enter
rntbmkdslvwhich chains three sub-functions
Decompilation quality is limited — Go binaries compiled with -trimpath and active goroutine runtime produce fragmented pseudo-C with many orphan jumps. The main package functions beyond main.main have randomized names and no recovered type information in r2. No Ghidra deep-dive was available for this session. For string-level detail, the r2 output confirms API-lazy-loading via syscall._LazyProc_.Call with a concatenated name string.
C2 Infrastructure
Static: None observed. No IP addresses, domains, URLs, mutexes, or named pipes in strings output.
Inferred: C2 is runtime-resolved. Given family history, likely TLS over port 443. No further detail from static.
Interesting Tidbits
main.gofilename preserved in.gopclntab:yCJjClxMaPcdOeL/main.go— confirms randomized module path convention ^[strings.txt:6292]ssdeephash:49152:NJ/viHNnC7x7l8DKE8RuRqu2LVHGiIpRVNZB99:NJ/viHw7x7lXdRyiER/R9— near-identical to siblings (block size 49152) ^[ssdeep.txt]tlsh:88C58D01FD9784B2E402133299AAA2FF2335AC054F759B97EA587A7EF9776D11C32301^[tlsh.txt]- This sample is the first in the cluster to strip static C2 strings entirely — an opsec evolution. Future hunting should focus on the build ID prefix and certificate chain rather than domain indicators.
How To Mess With It (Homelab Replication)
Toolchain: Go 1.26.2, GOARCH=386, GOOS=windows, CGO_ENABLED=0, -trimpath=true, -ldflags="-s -w" to strip symbols (this sample did NOT strip, but you can)
Source skeleton:
package main
import (
"math/rand"
"time"
"math"
"net/http"
"crypto/tls"
)
func main() {
rng := rand.New(rand.NewSource(time.Now().UnixNano()))
_ = rng.Intn(100000)
_ = rng.Intn(800)
_ = math.Sin(float64(rng.Intn(100)))
// Your C2 logic here
}
Verification: Build and compare go version -m <binary> to match module path randomization pattern.
Deployable Signatures
YARA
rule ACRStealer_Go1262_Signed {
meta:
description = "ACR Stealer cluster - Go 1.26.2 signed PE32 with randomized module path"
author = "PacketPursuit"
date = "2026-05-29"
hash = "624f52cc31cd7ae5a311c9800b619386c9fd1a45af11b4e852391699ce36d3d8"
strings:
$go_build_id = "Go build ID: \"YK-5mEjbS1w6cBJ47f5b/"
$go_ver = "go1.26.2"
$mod_path = /path\t[A-Za-z]{15}\nmod\t[A-Za-z]{15}\t\(devel\)/
$cert_cn = "me.muz.li" ascii
$r13 = "R13" ascii
condition:
uint16(0) == 0x5A4D and
filesize < 5MB and
3 of them
}
Sigma (process creation)
title: ACR Stealer Execution
status: experimental
description: Detects execution of ACR Stealer signed Go binaries
logsource:
category: process_creation
product: windows
detection:
selection:
Image|endswith: '.exe'
Company|contains: 'me.muz.li'
condition: selection
falsepositives:
- None expected (self-signed rogue cert)
level: critical
IOCs
| Type | Value | Note |
|---|---|---|
| SHA-256 | 624f52cc31cd7ae5a311c9800b619386c9fd1a45af11b4e852391699ce36d3d8 |
This sample |
| SHA-1 | 7eebfb2755dc0d0123518ef13cb621082a04500a00beece37445f8a177d1d8a5 |
.text section |
| ssdeep | NJ/viHw7x7lXdRyiER/R9 |
Cluster fingerprint |
| TLSH | 88C58D01FD9784B2E402133299AAA2FF2335AC054F759B97EA587A7EF9776D11C32301 |
|
| Certificate CN | me.muz.li |
Self-signed / rogue cert |
| Certificate Issuer | R13 |
Consistent across cluster |
| Go build ID prefix | YK-5mEjbS1w6cBJ47f5b/ |
Go 1.26.2 cluster marker |
| Module path pattern | ^[A-Za-z]{15}$ |
Randomized 15-char string |
| File name | Pro Setup.exe |
Social engineering masquerade |
Behavioral Fingerprint
This binary is a Go 1.26.2 compiled PE32 with a 15-character randomized module path, signed with a self-signed Authenticode certificate (CN=me.muz.li, issuer=R13). On launch it seeds math/rand with the current system time, generates two pseudo-random integers, applies a trigonometric transform, and resolves Windows APIs via Go's lazy syscall loader. No hardcoded C2 strings are present; network destinations are likely runtime-decoded from the PRNG state. Rich icon resources present in .rsrc for installer masquerade.
References
- Family page: acrstealer
- Build pattern: golang-stealer-build-pattern
- Sibling analyses:
6871848b,c577c6c8,16a4344d,d5655568,1bfebf79,f93d8d79 - CAPE status: skipped — no Windows guest ^[dynamic-analysis.md]
Provenance
file.txt—filecommand outputpefile.txt— pefile library PE header dumpstrings.txt—strings -n 6(9883 lines)rabin2-info.txt— radare2rabin2 -I(Go, signed, PE32)binwalk.txt— binwalk embedded artefact scancert.txt— OpenSSL PKCS#7 cert extraction (CN=me.muz.li, issuer=R13)dynamic-analysis.md— CAPE sandbox status (skipped)- Radare2 decompilation:
main.main@0x49a540,main.hcinhqctaysk@0x497d60,main.rntbmkdslv@0x4984d0,main.ssahuuggyuorgtw@0x496350