RedLine

RedLine 样本分析

1. 前言

VirusTotal样本信息

MalwareBazaar样本信息

unpacme解包文件

AnyRun检测结果

根据unpacme结果,逐个查看可知恶意载荷的SHA256为:b1d6c8d2b9498001f50dab84090b9caf31f864871cfc995ffea41c22d2da9d28

2. 恶意程序分析

2.1. CC交互

从函数入口开始分析,可以看到样本载入了配置文件:

后面会有动态解密过程,获取C&C服务器地址端口:45.9.20.182:52236

请求报文header格式如下:

{<Authorization xmlns="ns1">a272f3a2850ec3dccdaed97234b7c40e</Authorization>}

发送链接请求后等待服务器响应:

实例化参数列表如下:

实例化本地规则列表如下:

2.2. 主要功能

当服务器响应后,从报文中获取参数,并根据参数内容执行对应的功能函数,但作者在实例化函数列表时,对函数名混淆了:

不过好在每个函数的功能很明确,逐个函数进行功能确认后,可以得出真实的功能函数列表如下:

2.2.1. 获取硬件信息

2.2.2. 获取浏览器信息

会读取注册表已获取默认浏览器的信息

SOFTWARE\\WOW6432Node\\Clients\\StartMenuInternet
SOFTWARE\\Clients\\StartMenuInternet

2.2.3. 获取软件列表

通过查看注册表:SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall获取软件列表,再通过DisplayName获取软件名;DisplayVersion获取软件列表:

2.2.4. 获取杀毒防护软件列表

通过SystemInfoHelper.GetVs()函数已 WMI查询SELECT * FROM AntivirusProduct|AntiSpyWareProduct|FirewallProduct,并将获取到的杀软防护软件存放在ROOT\\SecurityCenterROOT\\SecurityCenter2WMI命名空间中

2.2.5. 获取进程列表

通过执行SELSystem.Text.RegularExpressionsECT * FRSystem.Text.RegularExpressionsOM Win32_PSystem.Text.RegularExpressionsrocess WSystem.Text.RegularExpressionshere SessSystem.Text.RegularExpressionsionId=''语句获取系统进程列表信息并按照IDProcessIDNameCommandLine形式存储

2.2.6. 获取本地安装的语言

2.2.7. 查询Telegram文件

如果配置文件中要求扫描Telegram,那么将对Telegram文件夹进行扫描

2.2.8. 扫描浏览器数据

如果配置文件中要求扫描浏览器,那么将执行ChromeGecko浏览器的数据扫描

其中Chrome浏览器将会查找Login DataWeb DataCookies路径,窃取Opera GX StableOpera GXAppData\\Roaming\\中的浏览器数据

Gecko浏览器则是窃取cookies.sqlite%USERPROFILE%\\AppData\\Roaming目录下的浏览器数据

2.2.9. 窃取文件数据

如果配置文件中设置了扫描文件选项,那么当接收到文件路径时,将对文件进行扫描

其中GetFiles函数覆盖了系统文件内容:\\Windows\\\\Program Files\\\\Program Files (x86)\\\\Program Data\\

2.2.10. 窃取FTP数据

如果配置文件中要求扫描FTP,则进行FileZilla文件扫描

扫描的路径是:{0}\\FileZilla\\recentservers.xml{0}\\FileZilla\\sitemanager.xml

窃密函数如下:

2.2.11. 窃取加密钱包

如果配置文件中要求窃取加密钱包,则会对BrEx.Init中已加密的钱包进行扫描

BrEx.Init中存储的是采用了base64编码的钱包字符串:

ZmZuYmVsZmRvZWlvaGVua2ppYm5tYWRqaWVoamhhamJ8WW9yb2lXYWxsZXQKaWJuZWpkZmptbWtwY25scGVia2xtbmtvZW9paG9mZWN8VHJvbmxpbmsKamJkYW9jbmVpaWlubWpiamxnYWxoY2VsZ2Jlam1uaWR8TmlmdHlXYWxsZXQKbmtiaWhmYmVvZ2FlYW9laGxlZm5rb2RiZWZncGdrbm58TWV0YW1hc2sKYWZiY2JqcGJwZmFkbGttaG1jbGhrZWVvZG1hbWNmbGN8TWF0aFdhbGxldApobmZhbmtub2NmZW9mYmRkZ2Npam5taG5mbmtkbmFhZHxDb2luYmFzZQpmaGJvaGltYWVsYm9ocGpiYmxkY25nY25hcG5kb2RqcHxCaW5hbmNlQ2hhaW4Kb2RiZnBlZWloZGtiaWhtb3BrYmptb29uZmFubGJmY2x8QnJhdmVXYWxsZXQKaHBnbGZoZ2ZuaGJncGpkZW5qZ21kZ29laWFwcGFmbG58R3VhcmRhV2FsbGV0CmJsbmllaWlmZmJvaWxsa25qbmVwb2dqaGtnbm9hcGFjfEVxdWFsV2FsbGV0CmNqZWxmcGxwbGViZGpqZW5sbHBqY2JsbWprZmNmZm5lfEpheHh4TGliZXJ0eQpmaWhrYWtmb2JrbWtqb2pwY2hwZmdjbWhmam5tbmZwaXxCaXRBcHBXYWxsZXQKa25jY2hkaWdvYmdoZW5iYmFkZG9qam5uYW9nZnBwZmp8aVdhbGxldAphbWttamptbWZsZGRvZ21ocGpsb2ltaXBib2ZuZmppaHxXb21iYXQKZmhpbGFoZWltZ2xpZ25kZGtqZ29ma2NiZ2VraGVuYmh8QXRvbWljV2FsbGV0Cm5sYm1ubmlqY25sZWdrampwY2ZqY2xtY2ZnZ2ZlZmRtfE1ld0N4Cm5hbmptZGtuaGtpbmlmbmtnZGNnZ2NmbmhkYWFtbW1qfEd1aWxkV2FsbGV0Cm5rZGRnbmNkamdqZmNkZGFtZmdjbWZubGhjY25pbWlnfFNhdHVybldhbGxldApmbmpobWtoaG1rYmpra2FibmRjbm5vZ2Fnb2dibmVlY3xSb25pbldhbGxldAphaWlmYm5iZm9icG1lZWtpcGhlZWlqaW1kcG5scGdwcHxUZXJyYVN0YXRpb24KZm5uZWdwaGxvYmpkcGtoZWNhcGtpampka2djamhraWJ8SGFybW9ueVdhbGxldAphZWFjaGtubWVmcGhlcGNjaW9uYm9vaGNrb25vZWVtZ3xDb2luOThXYWxsZXQKY2dlZW9kcGZhZ2pjZWVmaWVmbG1kZnBocGxrZW5sZmt8VG9uQ3J5c3RhbApwZGFkamtma2djYWZnYmNlaW1jcGJrYWxuZm5lcGJua3xLYXJkaWFDaGFpbg==

解码后的数据如下:

ffnbelfdoeiohenkjibnmadjiehjhajb|YoroiWallet
ibnejdfjmmkpcnlpebklmnkoeoihofec|Tronlink
jbdaocneiiinmjbjlgalhcelgbejmnid|NiftyWallet
nkbihfbeogaeaoehlefnkodbefgpgknn|Metamask
afbcbjpbpfadlkmhmclhkeeodmamcflc|MathWallet
hnfanknocfeofbddgcijnmhnfnkdnaad|Coinbase
fhbohimaelbohpjbbldcngcnapndodjp|BinanceChain
odbfpeeihdkbihmopkbjmoonfanlbfcl|BraveWallet
hpglfhgfnhbgpjdenjgmdgoeiappafln|GuardaWallet
blnieiiffboillknjnepogjhkgnoapac|EqualWallet
cjelfplplebdjjenllpjcblmjkfcffne|JaxxxLiberty
fihkakfobkmkjojpchpfgcmhfjnmnfpi|BitAppWallet
kncchdigobghenbbaddojjnnaogfppfj|iWallet
amkmjjmmflddogmhpjloimipbofnfjih|Wombat
fhilaheimglignddkjgofkcbgekhenbh|AtomicWallet
nlbmnnijcnlegkjjpcfjclmcfggfefdm|MewCx
nanjmdknhkinifnkgdcggcfnhdaammmj|GuildWallet
nkddgncdjgjfcddamfgcmfnlhccnimig|SaturnWallet
fnjhmkhhmkbjkkabndcnnogagogbneec|RoninWallet
aiifbnbfobpmeekipheeijimdpnlpgpp|TerraStation
fnnegphlobjdpkhecapkijjdkgcjhkib|HarmonyWallet
aeachknmefphepccionboohckonoeemg|Coin98Wallet
cgeeodpfagjceefieflmdfphplkenlfk|TonCrystal
pdadjkfkgcafgbceimcpbkalnfnepbnk|KardiaChain

2.2.12. 窃取Discord数据

如果配置文件中要求扫描Discord,则会扫描Discord文件,GetTokens()函数则是获取Tokens.txt

2.2.13. 窃取Steam数据

如果配置文件中要求扫描Steam,则会调用GameLauncher()窃取Steam登录凭证

GameLauncher()函数会扫描注册表Software\\Valve\\Steam中的SteamPath值获取安装路径,然后窃取*ssfn*config*.vdf文件。

2.2.14. 窃取VPN数据

如果配置文件中要求扫描VPN,则会对NordVPNOpenVPNProtonVPN进行文件窃取

针对NordVPN,首先从%USERPROFILE%\\AppData\\Local路径扫描NordVPN文件夹,获取user.config,然后再xml文件中匹配//setting[@name=\\Username\\]/value//setting[@name=\\Password\\]/value窃取用户密码,然后采用内置的解密函数CryptoHelper.DecryptBlob进行解密:

针对OpenVPN,首先从%USERPROFILE%\\AppData\\Roaming路径扫描OpenVPN Connect文件夹,进入profiles文件夹,然后扫描npvo*文件;

针对ProtonVPN,首先从%USERPROFILE%\\AppData\\Local路径扫描ProtonVPN文件夹,然后扫描npvo*文件。

2.2.15. 截取屏幕

如果配置中要求截取屏幕,则调用GdiHelper.GetImageBase()函数截取屏幕

2.2.16. 获取用户名

直接调用系统API获取用户名

2.2.17. 获取显示器大小

调用GdiHelper.MonitorSize()函数以获取显示器长宽大小

2.2.18. 获取系统版本

调用SystemInfoHelper.GetWindowsVersion()函数查询注册表:SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion,以获取用户系统版本信息

2.2.19. 获取自身路径

调用系统API获取当前运行路径

2.2.20. 获取硬件ID

根据当前用户关联的网络域名、当前线程相关联的用户名和Win32_DiskDrive对象信息计算MD5生成HardwareID

2.2.21. 获取时区

调用系统API获取主机所在的时区信息

2.3. 发送详情

当获取到上述数据后,会调用Send()函数,将扫描的详情进行填充,

其中PartsSender.GetLocalInfo()函数,会在主机上访问http://733s.komawai.ru/,该链接将返回主机的相关信息:

{"city":"***","country_code":"***","postal":null,"ip":"*.*.*.*"}

解析上述json文件,填充到发送请求中:

2.4. 远程下载

当上述的发送请求结束,将会调用TaskResolver()函数

该函数有四个方法:CommandLineUpdate()DownloadUpdate()DownloadAndExecuteUpdate()OpenUpdate()

DownloadAndExecuteUpdate()函数采用WebClient().DownloadFile()下载文件,并使用System.Diagnostics.Process.Start()运行